algebramix_doc 0.3
|
00001 00002 #include <basix/vector.hpp> 00003 #include <algebramix/polynomial.hpp> 00004 #include <algebramix/polynomial_polynomial.hpp> 00005 #include <algebramix/polynomial_schonhage.hpp> 00006 #include <basix/tuple.hpp> 00007 #include <basix/glue.hpp> 00008 00009 namespace mmx { 00010 template<typename C> polynomial<C> 00011 polynomial_reverse (const vector<C>& v) { 00012 return polynomial<C> (reverse (v)); } 00013 00014 template<typename C> polynomial<modular<modulus<C>, modular_local> > 00015 as_polynomial_modular (const polynomial<C>& f, const modulus<C>& p) { 00016 modular<modulus<C>, modular_local>::set_modulus (p); 00017 return as<polynomial<modular<modulus<C>, modular_local> > > (f); } 00018 00019 template<typename C> vector<generic> 00020 wrap_subresultants (const polynomial<C>& f, const polynomial<C>& g) { 00021 return as<vector<generic> > (subresultants (f, g)); } 00022 00023 } 00024 namespace mmx { POLYNOMIAL_GENERIC_USES_SCHONHAGE } 00025 00026 namespace mmx { 00027 static polynomial<generic> 00028 GLUE_1 (const tuple<generic> &arg_1) { 00029 return polynomial_reverse (as_vector (arg_1)); 00030 } 00031 00032 static polynomial<generic> 00033 GLUE_2 (const tuple<generic> &arg_1) { 00034 return polynomial<generic > (as_vector (arg_1)); 00035 } 00036 00037 static void 00038 GLUE_3 (const polynomial<generic> &arg_1, const generic &arg_2) { 00039 set_variable_name (arg_1, arg_2); 00040 } 00041 00042 static iterator<generic> 00043 GLUE_4 (const polynomial<generic> &arg_1) { 00044 return iterate (arg_1); 00045 } 00046 00047 static int 00048 GLUE_5 (const polynomial<generic> &arg_1) { 00049 return N (arg_1); 00050 } 00051 00052 static int 00053 GLUE_6 (const polynomial<generic> &arg_1) { 00054 return deg (arg_1); 00055 } 00056 00057 static generic 00058 GLUE_7 (const polynomial<generic> &arg_1, const int &arg_2) { 00059 return arg_1[arg_2]; 00060 } 00061 00062 static polynomial<generic> 00063 GLUE_8 (const polynomial<generic> &arg_1) { 00064 return -arg_1; 00065 } 00066 00067 static polynomial<generic> 00068 GLUE_9 (const polynomial<generic> &arg_1) { 00069 return square (arg_1); 00070 } 00071 00072 static polynomial<generic> 00073 GLUE_10 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00074 return arg_1 + arg_2; 00075 } 00076 00077 static polynomial<generic> 00078 GLUE_11 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00079 return arg_1 - arg_2; 00080 } 00081 00082 static polynomial<generic> 00083 GLUE_12 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00084 return arg_1 * arg_2; 00085 } 00086 00087 static polynomial<generic> 00088 GLUE_13 (const polynomial<generic> &arg_1, const int &arg_2) { 00089 return binpow (arg_1, arg_2); 00090 } 00091 00092 static polynomial<generic> 00093 GLUE_14 (const polynomial<generic> &arg_1, const int &arg_2) { 00094 return lshiftz (arg_1, arg_2); 00095 } 00096 00097 static polynomial<generic> 00098 GLUE_15 (const polynomial<generic> &arg_1, const int &arg_2) { 00099 return rshiftz (arg_1, arg_2); 00100 } 00101 00102 static polynomial<generic> 00103 GLUE_16 (const polynomial<generic> &arg_1) { 00104 return derive (arg_1); 00105 } 00106 00107 static polynomial<generic> 00108 GLUE_17 (const polynomial<generic> &arg_1) { 00109 return xderive (arg_1); 00110 } 00111 00112 static generic 00113 GLUE_18 (const polynomial<generic> &arg_1, const generic &arg_2) { 00114 return evaluate (arg_1, arg_2); 00115 } 00116 00117 static vector<generic> 00118 GLUE_19 (const polynomial<generic> &arg_1, const vector<generic> &arg_2) { 00119 return evaluate (arg_1, arg_2); 00120 } 00121 00122 static generic 00123 GLUE_20 (const polynomial<generic> &arg_1, const generic &arg_2) { 00124 return evaluate (arg_1, arg_2); 00125 } 00126 00127 static vector<generic> 00128 GLUE_21 (const polynomial<generic> &arg_1, const vector<generic> &arg_2) { 00129 return evaluate (arg_1, arg_2); 00130 } 00131 00132 static polynomial<generic> 00133 GLUE_22 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00134 return arg_1 / arg_2; 00135 } 00136 00137 static polynomial<generic> 00138 GLUE_23 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00139 return quo (arg_1, arg_2); 00140 } 00141 00142 static polynomial<generic> 00143 GLUE_24 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00144 return rem (arg_1, arg_2); 00145 } 00146 00147 static bool 00148 GLUE_25 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00149 return divides (arg_1, arg_2); 00150 } 00151 00152 static polynomial<generic> 00153 GLUE_26 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2, const int &arg_3) { 00154 return subresultant (arg_1, arg_2, arg_3); 00155 } 00156 00157 static vector<generic> 00158 GLUE_27 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00159 return wrap_subresultants (arg_1, arg_2); 00160 } 00161 00162 static generic 00163 GLUE_28 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00164 return resultant (arg_1, arg_2); 00165 } 00166 00167 static generic 00168 GLUE_29 (const polynomial<generic> &arg_1) { 00169 return discriminant (arg_1); 00170 } 00171 00172 static polynomial<generic> 00173 GLUE_30 (const polynomial<generic> &arg_1) { 00174 return integrate (arg_1); 00175 } 00176 00177 static polynomial<generic> 00178 GLUE_31 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00179 return compose (arg_1, arg_2); 00180 } 00181 00182 static polynomial<generic> 00183 GLUE_32 (const polynomial<generic> &arg_1, const generic &arg_2) { 00184 return q_difference (arg_1, arg_2); 00185 } 00186 00187 static polynomial<generic> 00188 GLUE_33 (const polynomial<generic> &arg_1, const int &arg_2) { 00189 return dilate (arg_1, arg_2); 00190 } 00191 00192 static polynomial<generic> 00193 GLUE_34 (const vector<generic> &arg_1) { 00194 return annulator (arg_1); 00195 } 00196 00197 static polynomial<generic> 00198 GLUE_35 (const vector<generic> &arg_1, const vector<generic> &arg_2) { 00199 return interpolate (arg_1, arg_2); 00200 } 00201 00202 static polynomial<generic> 00203 GLUE_36 (const polynomial<generic> &arg_1, const generic &arg_2) { 00204 return shift (arg_1, arg_2); 00205 } 00206 00207 static polynomial<generic> 00208 GLUE_37 (const polynomial<generic> &arg_1) { 00209 return graeffe (arg_1); 00210 } 00211 00212 static generic 00213 GLUE_38 (const polynomial<generic> &arg_1) { 00214 return contents (arg_1); 00215 } 00216 00217 static polynomial<generic> 00218 GLUE_39 (const polynomial<generic> &arg_1) { 00219 return primitive_part (arg_1); 00220 } 00221 00222 static polynomial<generic> 00223 GLUE_40 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00224 return gcd (arg_1, arg_2); 00225 } 00226 00227 static polynomial<generic> 00228 GLUE_41 (const polynomial<generic> &arg_1, const polynomial<generic> &arg_2) { 00229 return lcm (arg_1, arg_2); 00230 } 00231 00232 void 00233 glue_polynomial_generic () { 00234 static bool done = false; 00235 if (done) return; 00236 done = true; 00237 call_glue (string ("glue_vector_generic")); 00238 define_type<polynomial<generic> > (gen (lit ("Polynomial"), lit ("Generic"))); 00239 define ("poly", GLUE_1); 00240 define ("polynomial", GLUE_2); 00241 define ("set_variable_name", GLUE_3); 00242 define_converter (":>", GLUE_4, PENALTY_PROMOTE_GENERIC); 00243 define ("#", GLUE_5); 00244 define ("deg", GLUE_6); 00245 define (".[]", GLUE_7); 00246 define ("-", GLUE_8); 00247 define ("square", GLUE_9); 00248 define ("+", GLUE_10); 00249 define ("-", GLUE_11); 00250 define ("*", GLUE_12); 00251 define ("^", GLUE_13); 00252 define ("<<", GLUE_14); 00253 define (">>", GLUE_15); 00254 define ("derive", GLUE_16); 00255 define ("xderive", GLUE_17); 00256 define ("eval", GLUE_18); 00257 define ("eval", GLUE_19); 00258 define ("evaluate", GLUE_20); 00259 define ("evaluate", GLUE_21); 00260 define ("div", GLUE_22); 00261 define ("quo", GLUE_23); 00262 define ("rem", GLUE_24); 00263 define ("divides?", GLUE_25); 00264 define ("subresultant", GLUE_26); 00265 define ("subresultants", GLUE_27); 00266 define ("resultant", GLUE_28); 00267 define ("discriminant", GLUE_29); 00268 define ("integrate", GLUE_30); 00269 define ("@", GLUE_31); 00270 define ("q_difference", GLUE_32); 00271 define ("dilate", GLUE_33); 00272 define ("annulator", GLUE_34); 00273 define ("interpolate", GLUE_35); 00274 define ("shift", GLUE_36); 00275 define ("graeffe", GLUE_37); 00276 define ("contents", GLUE_38); 00277 define ("primitive_part", GLUE_39); 00278 define ("gcd", GLUE_40); 00279 define ("lcm", GLUE_41); 00280 } 00281 }