algebramix_doc 0.3
/Users/mourrain/Devel/mmx/algebramix/include/algebramix/polynomial_modular.hpp
Go to the documentation of this file.
00001 
00002 /******************************************************************************
00003 * MODULE     : polynomial_modular.hpp
00004 * DESCRIPTION: Multiplying modular polynomials by lifting and reduction
00005 * COPYRIGHT  : (C) 2009  Joris van der Hoeven and Gregoire Lecerf
00006 *******************************************************************************
00007 * This software falls under the GNU general public license and comes WITHOUT
00008 * ANY WARRANTY WHATSOEVER. See the file $TEXMACS_PATH/LICENSE for more details.
00009 * If you don't have this file, write to the Free Software Foundation, Inc.,
00010 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00011 ******************************************************************************/
00012 
00013 #ifndef __MMX_POLYNOMIAL_MODULAR_HPP
00014 #define __MMX_POLYNOMIAL_MODULAR_HPP
00015 #include <algebramix/polynomial_dicho.hpp>
00016 
00017 namespace mmx {
00018 #define TMPL template<typename I, typename MoV, typename MaV>
00019 #define M modular<modulus<I, MoV>, MaV>
00020 #define C Lift_type(M)
00021 
00022 /******************************************************************************
00023 * Variant for modular polynomials
00024 ******************************************************************************/
00025 
00026 template<typename V>
00027 struct polynomial_modular: public V {
00028   typedef typename V::Vec Vec;
00029   typedef typename V::Naive Naive;
00030   typedef typename V::Positive Positive;
00031   typedef polynomial_modular<typename V::No_simd> No_simd;
00032   typedef polynomial_modular<typename V::No_thread> No_thread;
00033   typedef polynomial_modular<typename V::No_scaled> No_scaled;
00034 };
00035 
00036 template<typename F, typename V, typename W>
00037 struct implementation<F,V,polynomial_modular<W> >:
00038   public implementation<F,V,W> {};
00039 
00040 template<typename F, typename V, typename W>
00041 struct polynomial_variant_helper<modular<modulus<F,V>, W> > {
00042   typedef polynomial_modular<polynomial_dicho<polynomial_naive> > PV;
00043 };
00044 
00045 /******************************************************************************
00046 * Multiplication of modular polynomials
00047 ******************************************************************************/
00048 
00049 template<typename V, typename W>
00050 struct implementation<polynomial_multiply,V,polynomial_modular<W> >:
00051   public implementation<polynomial_linear,V>
00052 {
00053   typedef implementation<polynomial_multiply,W> Fallback;
00054 
00055 template<typename K> static inline void
00056 mul (K* dest, const K* s1, const K* s2, nat n1, nat n2) {
00057   Fallback::mul (dest, s1, s2, n1, n2);
00058 }
00059   
00060 template<typename K> static inline void
00061 square (K* dest, const K* s1, nat n1) {
00062   Fallback::square (dest, s1, n1);
00063 }
00064   
00065 TMPL static inline void
00066 mul (M* dest, const M* s1, const M* s2, nat n1, nat n2) {
00067   typedef typename Polynomial_variant (C) CV;
00068   typedef implementation<vector_linear,CV> Vec_C;
00069   typedef implementation<polynomial_multiply,CV> Pol_C;
00070 
00071   nat nd  = n1 + n2 - 1;
00072   nat spc1= aligned_size<C,CV> (n1);
00073   nat spc2= aligned_size<C,CV> (n2);
00074   nat spcd= aligned_size<C,CV> (nd);
00075   nat spc = spc1 + spc2 + spcd;
00076   C* x1= mmx_new<C> (spc);
00077   C* x2= x1 + spc1;
00078   C* xd= x2 + spc2;
00079   Vec_C::template vec_unary<lift_op> (x1, s1, n1);
00080   Vec_C::template vec_unary<lift_op> (x2, s2, n2);
00081   Pol_C::mul (xd, x1, x2, n1, n2);
00082   Vec_C::template vec_unary<project_op> (dest, xd, nd);
00083   mmx_delete<C> (x1, spc);
00084 }
00085 
00086 TMPL static inline void
00087 square (M* dest, const M* s1, nat n1) {
00088   typedef typename Polynomial_variant (C) CV;
00089   typedef implementation<vector_linear,CV> Vec_C;
00090   typedef implementation<polynomial_multiply,CV> Pol_C;
00091 
00092   nat nd  = n1 + n1 - 1;
00093   nat spc1= aligned_size<C,CV> (n1);
00094   nat spcd= aligned_size<C,CV> (nd);
00095   nat spc = spc1 + spcd;
00096   C* x1= mmx_new<C> (spc);
00097   C* xd= x1 + spc1;
00098   Vec_C::template vec_unary<lift_op> (x1, s1, n1);
00099   Pol_C::square (xd, x1, n1);
00100   Vec_C::template vec_unary<project_op> (dest, xd, nd);
00101   mmx_delete<C> (x1, spc);
00102 }
00103 
00104 }; // implementation<polynomial_multiply,V,polynomial_modular<CV> >
00105 
00106 #undef TMPL
00107 #undef M
00108 #undef C
00109 
00110 } // namespace mmx
00111 #endif // __MMX_POLYNOMIAL_MODULAR_HPP
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines