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