algebramix_doc 0.3
|
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 }