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 }