algebramix_doc 0.3
/Users/mourrain/Devel/mmx/algebramix/glue/glue_polynomial_p_adic_modular_integer.cpp
Go to the documentation of this file.
00001 
00002 #include <basix/vector.hpp>
00003 #include <numerix/integer.hpp>
00004 #include <basix/int.hpp>
00005 #include <numerix/modular.hpp>
00006 #include <numerix/modular_integer.hpp>
00007 #include <algebramix/vector_unrolled.hpp>
00008 #include <algebramix/vector_simd.hpp>
00009 #include <algebramix/vector_modular.hpp>
00010 #include <algebramix/p_expansion.hpp>
00011 #include <algebramix/p_expansion_modular_integer.hpp>
00012 #include <algebramix/p_adic.hpp>
00013 #include <algebramix/polynomial.hpp>
00014 #include <algebramix/polynomial_polynomial.hpp>
00015 #include <algebramix/polynomial_integer.hpp>
00016 #include <algebramix/polynomial_modular.hpp>
00017 #include <algebramix/polynomial_modular_integer.hpp>
00018 #include <algebramix/polynomial_p_adic.hpp>
00019 #include <algebramix/polynomial_schonhage.hpp>
00020 #include <basix/tuple.hpp>
00021 #include <basix/glue.hpp>
00022 
00023 #define int_literal(x) as_int (as_string (x))
00024 
00025 #define simple_p_expansion(C) polynomial<C, polynomial_carry_variant_helper<C>::PV>
00026 #define simple_as_p_expansion(C) as_p_expansion<C,Modulus_variant(C),modular_local>
00027 
00028 
00029 namespace mmx {
00030   static inline simple_p_expansion(mmx_modular(integer))
00031   integer_as_p_expansion(const integer& c, const modulus<integer>& p) {
00032     return simple_as_p_expansion(integer)(c, p); }
00033 }
00034 
00035 
00036 #define simple_p_adic(C) series<C, series_carry_variant_helper<C>::SV>
00037 
00038 namespace mmx {
00039     template<typename C> polynomial<C>
00040     polynomial_reverse (const vector<C>& v) {
00041       return polynomial<C> (reverse (v)); }
00042 
00043     template<typename C> polynomial<modular<modulus<C>, modular_local> >
00044     as_polynomial_modular (const polynomial<C>& f, const modulus<C>& p) {
00045       modular<modulus<C>, modular_local>::set_modulus (p);
00046       return as<polynomial<modular<modulus<C>, modular_local> > > (f); }
00047 
00048     template<typename C> vector<generic>
00049     wrap_subresultants (const polynomial<C>& f, const polynomial<C>& g) {
00050       return as<vector<generic> > (subresultants (f, g)); }
00051 
00052   }
00053 namespace mmx { POLYNOMIAL_GENERIC_USES_SCHONHAGE }
00054 
00055 namespace mmx {
00056   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00057   GLUE_1 (const tuple<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00058     return polynomial_reverse (as_vector (arg_1));
00059   }
00060   
00061   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00062   GLUE_2 (const tuple<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00063     return polynomial<simple_p_adic(mmx_modular(integer) ) > (as_vector (arg_1));
00064   }
00065   
00066   static void
00067   GLUE_3 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const generic &arg_2) {
00068     set_variable_name (arg_1, arg_2);
00069   }
00070   
00071   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00072   GLUE_4 (const simple_p_adic(mmx_modular(integer) ) &arg_1) {
00073     return polynomial<simple_p_adic(mmx_modular(integer) ) > (arg_1);
00074   }
00075   
00076   static iterator<generic>
00077   GLUE_5 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00078     return as<iterator<generic> > (iterate (arg_1));
00079   }
00080   
00081   static int
00082   GLUE_6 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00083     return N (arg_1);
00084   }
00085   
00086   static int
00087   GLUE_7 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00088     return deg (arg_1);
00089   }
00090   
00091   static simple_p_adic(mmx_modular(integer) )
00092   GLUE_8 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const int &arg_2) {
00093     return arg_1[arg_2];
00094   }
00095   
00096   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00097   GLUE_9 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00098     return -arg_1;
00099   }
00100   
00101   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00102   GLUE_10 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00103     return square (arg_1);
00104   }
00105   
00106   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00107   GLUE_11 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00108     return arg_1 + arg_2;
00109   }
00110   
00111   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00112   GLUE_12 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00113     return arg_1 - arg_2;
00114   }
00115   
00116   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00117   GLUE_13 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00118     return arg_1 * arg_2;
00119   }
00120   
00121   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00122   GLUE_14 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00123     return arg_1 + arg_2;
00124   }
00125   
00126   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00127   GLUE_15 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00128     return arg_1 + arg_2;
00129   }
00130   
00131   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00132   GLUE_16 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00133     return arg_1 - arg_2;
00134   }
00135   
00136   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00137   GLUE_17 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00138     return arg_1 - arg_2;
00139   }
00140   
00141   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00142   GLUE_18 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00143     return arg_1 * arg_2;
00144   }
00145   
00146   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00147   GLUE_19 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00148     return arg_1 * arg_2;
00149   }
00150   
00151   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00152   GLUE_20 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const int &arg_2) {
00153     return binpow (arg_1, arg_2);
00154   }
00155   
00156   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00157   GLUE_21 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const int &arg_2) {
00158     return lshiftz (arg_1, arg_2);
00159   }
00160   
00161   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00162   GLUE_22 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const int &arg_2) {
00163     return rshiftz (arg_1, arg_2);
00164   }
00165   
00166   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00167   GLUE_23 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00168     return derive (arg_1);
00169   }
00170   
00171   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00172   GLUE_24 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00173     return xderive (arg_1);
00174   }
00175   
00176   static simple_p_adic(mmx_modular(integer) )
00177   GLUE_25 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00178     return evaluate (arg_1, arg_2);
00179   }
00180   
00181   static simple_p_adic(mmx_modular(integer) )
00182   GLUE_26 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00183     return evaluate (arg_1, arg_2);
00184   }
00185   
00186   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00187   GLUE_27 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00188     return arg_1 / arg_2;
00189   }
00190   
00191   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00192   GLUE_28 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00193     return arg_1 / arg_2;
00194   }
00195   
00196   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00197   GLUE_29 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00198     return quo (arg_1, arg_2);
00199   }
00200   
00201   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00202   GLUE_30 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00203     return rem (arg_1, arg_2);
00204   }
00205   
00206   static bool
00207   GLUE_31 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00208     return divides (arg_1, arg_2);
00209   }
00210   
00211   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00212   GLUE_32 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2, const int &arg_3) {
00213     return subresultant (arg_1, arg_2, arg_3);
00214   }
00215   
00216   static vector<generic>
00217   GLUE_33 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00218     return wrap_subresultants (arg_1, arg_2);
00219   }
00220   
00221   static simple_p_adic(mmx_modular(integer) )
00222   GLUE_34 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00223     return resultant (arg_1, arg_2);
00224   }
00225   
00226   static simple_p_adic(mmx_modular(integer) )
00227   GLUE_35 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00228     return discriminant (arg_1);
00229   }
00230   
00231   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00232   GLUE_36 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00233     return integrate (arg_1);
00234   }
00235   
00236   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00237   GLUE_37 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_2) {
00238     return compose (arg_1, arg_2);
00239   }
00240   
00241   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00242   GLUE_38 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00243     return q_difference (arg_1, arg_2);
00244   }
00245   
00246   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00247   GLUE_39 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const int &arg_2) {
00248     return dilate (arg_1, arg_2);
00249   }
00250   
00251   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00252   GLUE_40 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00253     return shift (arg_1, arg_2);
00254   }
00255   
00256   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00257   GLUE_41 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00258     return graeffe (arg_1);
00259   }
00260   
00261   static polynomial<simple_p_adic(mmx_modular(integer) ) >
00262   GLUE_42 (const polynomial<mmx_modular(integer) > &arg_1) {
00263     return as<polynomial<simple_p_adic(mmx_modular(integer) ) > > (arg_1);
00264   }
00265   
00266   static polynomial<generic>
00267   GLUE_43 (const polynomial<simple_p_adic(mmx_modular(integer) ) > &arg_1) {
00268     return as<polynomial<generic> > (arg_1);
00269   }
00270   
00271   void
00272   glue_polynomial_p_adic_modular_integer () {
00273     static bool done = false;
00274     if (done) return;
00275     done = true;
00276     call_glue (string ("glue_vector_generic"));
00277     call_glue (string ("glue_p_adic_modular_integer"));
00278     call_glue (string ("glue_polynomial_modular_integer"));
00279     define_type<polynomial<simple_p_adic(mmx_modular(integer) ) > > (gen (lit ("Polynomial"), gen (lit ("P_adic"), gen (lit ("Modular"), lit ("Integer")))));
00280     define ("poly", GLUE_1);
00281     define ("polynomial", GLUE_2);
00282     define ("set_variable_name", GLUE_3);
00283     define_converter ("upgrade", GLUE_4, PENALTY_INCLUSION);
00284     define_converter (":>", GLUE_5, PENALTY_CAST);
00285     define ("#", GLUE_6);
00286     define ("deg", GLUE_7);
00287     define (".[]", GLUE_8);
00288     define ("-", GLUE_9);
00289     define ("square", GLUE_10);
00290     define ("+", GLUE_11);
00291     define ("-", GLUE_12);
00292     define ("*", GLUE_13);
00293     define ("+", GLUE_14);
00294     define ("+", GLUE_15);
00295     define ("-", GLUE_16);
00296     define ("-", GLUE_17);
00297     define ("*", GLUE_18);
00298     define ("*", GLUE_19);
00299     define ("^", GLUE_20);
00300     define ("<<", GLUE_21);
00301     define (">>", GLUE_22);
00302     define ("derive", GLUE_23);
00303     define ("xderive", GLUE_24);
00304     define ("eval", GLUE_25);
00305     define ("evaluate", GLUE_26);
00306     define ("/", GLUE_27);
00307     define ("div", GLUE_28);
00308     define ("quo", GLUE_29);
00309     define ("rem", GLUE_30);
00310     define ("divides?", GLUE_31);
00311     define ("subresultant", GLUE_32);
00312     define ("subresultants", GLUE_33);
00313     define ("resultant", GLUE_34);
00314     define ("discriminant", GLUE_35);
00315     define ("integrate", GLUE_36);
00316     define ("@", GLUE_37);
00317     define ("q_difference", GLUE_38);
00318     define ("dilate", GLUE_39);
00319     define ("shift", GLUE_40);
00320     define ("graeffe", GLUE_41);
00321     define_converter (":>", GLUE_42, PENALTY_INCLUSION);
00322     define_converter (":>", GLUE_43, PENALTY_PROMOTE_GENERIC);
00323   }
00324 }
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines