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 }