algebramix_doc 0.3
|
00001 00002 #include <numerix/integer.hpp> 00003 #include <numerix/rational.hpp> 00004 #include <numerix/floating.hpp> 00005 #include <basix/double.hpp> 00006 #include <numerix/complex.hpp> 00007 #include <numerix/complex_double.hpp> 00008 #include <numerix/ball.hpp> 00009 #include <numerix/ball_complex.hpp> 00010 #include <basix/vector.hpp> 00011 #include <algebramix/polynomial.hpp> 00012 #include <algebramix/polynomial_polynomial.hpp> 00013 #include <algebramix/polynomial_integer.hpp> 00014 #include <algebramix/polynomial_rational.hpp> 00015 #include <algebramix/polynomial_complex.hpp> 00016 #include <algebramix/polynomial_schonhage.hpp> 00017 #include <algebramix/algebraic.hpp> 00018 #include <algebramix/algebraic_number.hpp> 00019 #include <basix/glue.hpp> 00020 00021 #define double_literal(x) as_double (as_string (x)) 00022 namespace mmx { 00023 template<typename C> polynomial<C> 00024 polynomial_reverse (const vector<C>& v) { 00025 return polynomial<C> (reverse (v)); } 00026 00027 template<typename C> polynomial<modular<modulus<C>, modular_local> > 00028 as_polynomial_modular (const polynomial<C>& f, const modulus<C>& p) { 00029 modular<modulus<C>, modular_local>::set_modulus (p); 00030 return as<polynomial<modular<modulus<C>, modular_local> > > (f); } 00031 00032 template<typename C> vector<generic> 00033 wrap_subresultants (const polynomial<C>& f, const polynomial<C>& g) { 00034 return as<vector<generic> > (subresultants (f, g)); } 00035 00036 } 00037 namespace mmx { POLYNOMIAL_GENERIC_USES_SCHONHAGE } 00038 00039 namespace mmx { 00040 static algebraic_real 00041 GLUE_1 (const polynomial<rational> &arg_1, const mmx_ball(mmx_floating, mmx_floating) &arg_2) { 00042 return algebraic_real (arg_1, arg_2); 00043 } 00044 00045 static algebraic_real 00046 GLUE_2 (const polynomial<rational> &arg_1, const polynomial<rational> &arg_2, const mmx_ball(mmx_floating, mmx_floating) &arg_3) { 00047 return algebraic_real (arg_1, arg_2, arg_3); 00048 } 00049 00050 static algebraic_real 00051 GLUE_3 (const rational &arg_1) { 00052 return algebraic_real (arg_1); 00053 } 00054 00055 static mmx_floating 00056 GLUE_4 (const algebraic_real &arg_1) { 00057 return as_floating (arg_1); 00058 } 00059 00060 static mmx_ball(mmx_floating, mmx_floating) 00061 GLUE_5 (const algebraic_real &arg_1) { 00062 return as_ball (arg_1); 00063 } 00064 00065 static polynomial<rational> 00066 GLUE_6 (const algebraic_real &arg_1) { 00067 return annihilator (arg_1); 00068 } 00069 00070 static algebraic_real 00071 GLUE_7 (const algebraic_real &arg_1) { 00072 return normalize (arg_1); 00073 } 00074 00075 static algebraic_real 00076 GLUE_8 (const algebraic_real &arg_1) { 00077 return -arg_1; 00078 } 00079 00080 static algebraic_real 00081 GLUE_9 (const algebraic_real &arg_1) { 00082 return square (arg_1); 00083 } 00084 00085 static algebraic_real 00086 GLUE_10 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00087 return arg_1 + arg_2; 00088 } 00089 00090 static algebraic_real 00091 GLUE_11 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00092 return arg_1 - arg_2; 00093 } 00094 00095 static algebraic_real 00096 GLUE_12 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00097 return arg_1 * arg_2; 00098 } 00099 00100 static algebraic_real 00101 GLUE_13 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00102 return arg_1 / arg_2; 00103 } 00104 00105 static algebraic_real 00106 GLUE_14 (const rational &arg_1, const algebraic_real &arg_2) { 00107 return arg_1 + arg_2; 00108 } 00109 00110 static algebraic_real 00111 GLUE_15 (const algebraic_real &arg_1, const rational &arg_2) { 00112 return arg_1 + arg_2; 00113 } 00114 00115 static algebraic_real 00116 GLUE_16 (const rational &arg_1, const algebraic_real &arg_2) { 00117 return arg_1 - arg_2; 00118 } 00119 00120 static algebraic_real 00121 GLUE_17 (const algebraic_real &arg_1, const rational &arg_2) { 00122 return arg_1 - arg_2; 00123 } 00124 00125 static algebraic_real 00126 GLUE_18 (const rational &arg_1, const algebraic_real &arg_2) { 00127 return arg_1 * arg_2; 00128 } 00129 00130 static algebraic_real 00131 GLUE_19 (const algebraic_real &arg_1, const rational &arg_2) { 00132 return arg_1 * arg_2; 00133 } 00134 00135 static algebraic_real 00136 GLUE_20 (const rational &arg_1, const algebraic_real &arg_2) { 00137 return arg_1 / arg_2; 00138 } 00139 00140 static algebraic_real 00141 GLUE_21 (const algebraic_real &arg_1, const rational &arg_2) { 00142 return arg_1 / arg_2; 00143 } 00144 00145 static algebraic_real 00146 GLUE_22 (const algebraic_real &arg_1) { 00147 return sqrt (arg_1); 00148 } 00149 00150 static algebraic_real 00151 GLUE_23 (const algebraic_real &arg_1, const int &arg_2) { 00152 return root (arg_1, arg_2); 00153 } 00154 00155 static int 00156 GLUE_24 (const algebraic_real &arg_1) { 00157 return sign (arg_1); 00158 } 00159 00160 static bool 00161 GLUE_25 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00162 return arg_1 < arg_2; 00163 } 00164 00165 static bool 00166 GLUE_26 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00167 return arg_1 <= arg_2; 00168 } 00169 00170 static bool 00171 GLUE_27 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00172 return arg_1 > arg_2; 00173 } 00174 00175 static bool 00176 GLUE_28 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00177 return arg_1 >= arg_2; 00178 } 00179 00180 static algebraic_number 00181 GLUE_29 (const polynomial<rational> &arg_1, const mmx_ball(mmx_floating, complex<mmx_floating> ) &arg_2) { 00182 return algebraic_number (arg_1, arg_2); 00183 } 00184 00185 static algebraic_number 00186 GLUE_30 (const polynomial<rational> &arg_1, const polynomial<rational> &arg_2, const mmx_ball(mmx_floating, complex<mmx_floating> ) &arg_3) { 00187 return algebraic_number (arg_1, arg_2, arg_3); 00188 } 00189 00190 static algebraic_number 00191 GLUE_31 (const rational &arg_1) { 00192 return algebraic_number (arg_1); 00193 } 00194 00195 static algebraic_number 00196 GLUE_32 (const algebraic_real &arg_1) { 00197 return algebraic_number (arg_1); 00198 } 00199 00200 static complex<mmx_floating> 00201 GLUE_33 (const algebraic_number &arg_1) { 00202 return as_floating (arg_1); 00203 } 00204 00205 static mmx_ball(mmx_floating, complex<mmx_floating> ) 00206 GLUE_34 (const algebraic_number &arg_1) { 00207 return as_ball (arg_1); 00208 } 00209 00210 static polynomial<rational> 00211 GLUE_35 (const algebraic_number &arg_1) { 00212 return annihilator (arg_1); 00213 } 00214 00215 static algebraic_number 00216 GLUE_36 (const algebraic_number &arg_1) { 00217 return normalize (arg_1); 00218 } 00219 00220 static algebraic_number 00221 GLUE_37 (const algebraic_number &arg_1) { 00222 return -arg_1; 00223 } 00224 00225 static algebraic_number 00226 GLUE_38 (const algebraic_number &arg_1) { 00227 return square (arg_1); 00228 } 00229 00230 static algebraic_number 00231 GLUE_39 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00232 return arg_1 + arg_2; 00233 } 00234 00235 static algebraic_number 00236 GLUE_40 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00237 return arg_1 - arg_2; 00238 } 00239 00240 static algebraic_number 00241 GLUE_41 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00242 return arg_1 * arg_2; 00243 } 00244 00245 static algebraic_number 00246 GLUE_42 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00247 return arg_1 / arg_2; 00248 } 00249 00250 static algebraic_number 00251 GLUE_43 (const rational &arg_1, const algebraic_number &arg_2) { 00252 return arg_1 + arg_2; 00253 } 00254 00255 static algebraic_number 00256 GLUE_44 (const algebraic_number &arg_1, const rational &arg_2) { 00257 return arg_1 + arg_2; 00258 } 00259 00260 static algebraic_number 00261 GLUE_45 (const rational &arg_1, const algebraic_number &arg_2) { 00262 return arg_1 - arg_2; 00263 } 00264 00265 static algebraic_number 00266 GLUE_46 (const algebraic_number &arg_1, const rational &arg_2) { 00267 return arg_1 - arg_2; 00268 } 00269 00270 static algebraic_number 00271 GLUE_47 (const rational &arg_1, const algebraic_number &arg_2) { 00272 return arg_1 * arg_2; 00273 } 00274 00275 static algebraic_number 00276 GLUE_48 (const algebraic_number &arg_1, const rational &arg_2) { 00277 return arg_1 * arg_2; 00278 } 00279 00280 static algebraic_number 00281 GLUE_49 (const rational &arg_1, const algebraic_number &arg_2) { 00282 return arg_1 / arg_2; 00283 } 00284 00285 static algebraic_number 00286 GLUE_50 (const algebraic_number &arg_1, const rational &arg_2) { 00287 return arg_1 / arg_2; 00288 } 00289 00290 static algebraic_number 00291 GLUE_51 (const algebraic_number &arg_1) { 00292 return sqrt (arg_1); 00293 } 00294 00295 static algebraic_number 00296 GLUE_52 (const algebraic_number &arg_1, const int &arg_2) { 00297 return root (arg_1, arg_2); 00298 } 00299 00300 static algebraic_number 00301 GLUE_53 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00302 return gaussian (arg_1, arg_2); 00303 } 00304 00305 static algebraic_real 00306 GLUE_54 (const algebraic_number &arg_1) { 00307 return abs (arg_1); 00308 } 00309 00310 static algebraic_real 00311 GLUE_55 (const algebraic_number &arg_1) { 00312 return Re (arg_1); 00313 } 00314 00315 static algebraic_real 00316 GLUE_56 (const algebraic_number &arg_1) { 00317 return Im (arg_1); 00318 } 00319 00320 static algebraic_number 00321 GLUE_57 (const algebraic_number &arg_1) { 00322 return conj (arg_1); 00323 } 00324 00325 static algebraic_number 00326 GLUE_58 (const algebraic_number &arg_1) { 00327 return times_i (arg_1); 00328 } 00329 00330 static algebraic_number 00331 GLUE_59 (const algebraic_number &arg_1) { 00332 return over_i (arg_1); 00333 } 00334 00335 void 00336 glue_algebraic_number () { 00337 static bool done = false; 00338 if (done) return; 00339 done = true; 00340 call_glue (string ("glue_ball_floating")); 00341 call_glue (string ("glue_polynomial_rational")); 00342 call_glue (string ("glue_algebraic_generic")); 00343 define_type<algebraic_real > (lit ("Algebraic_real")); 00344 define ("algebraic", GLUE_1); 00345 define ("algebraic", GLUE_2); 00346 define_converter ("upgrade", GLUE_3, PENALTY_INCLUSION); 00347 define_converter ("upgrade", GLUE_4, PENALTY_INCLUSION); 00348 define_converter ("upgrade", GLUE_5, PENALTY_INCLUSION); 00349 define ("annihilator", GLUE_6); 00350 define ("normalize", GLUE_7); 00351 define ("-", GLUE_8); 00352 define ("square", GLUE_9); 00353 define ("+", GLUE_10); 00354 define ("-", GLUE_11); 00355 define ("*", GLUE_12); 00356 define ("/", GLUE_13); 00357 define ("+", GLUE_14); 00358 define ("+", GLUE_15); 00359 define ("-", GLUE_16); 00360 define ("-", GLUE_17); 00361 define ("*", GLUE_18); 00362 define ("*", GLUE_19); 00363 define ("/", GLUE_20); 00364 define ("/", GLUE_21); 00365 define ("sqrt", GLUE_22); 00366 define ("root", GLUE_23); 00367 define ("sign", GLUE_24); 00368 define ("<", GLUE_25); 00369 define ("<=", GLUE_26); 00370 define (">", GLUE_27); 00371 define (">=", GLUE_28); 00372 define_type<algebraic_number > (lit ("Algebraic_number")); 00373 define ("algebraic", GLUE_29); 00374 define ("algebraic", GLUE_30); 00375 define_converter ("upgrade", GLUE_31, PENALTY_INCLUSION); 00376 define_converter ("upgrade", GLUE_32, PENALTY_INCLUSION); 00377 define_converter ("upgrade", GLUE_33, PENALTY_INCLUSION); 00378 define_converter ("upgrade", GLUE_34, PENALTY_INCLUSION); 00379 define ("annihilator", GLUE_35); 00380 define ("normalize", GLUE_36); 00381 define ("-", GLUE_37); 00382 define ("square", GLUE_38); 00383 define ("+", GLUE_39); 00384 define ("-", GLUE_40); 00385 define ("*", GLUE_41); 00386 define ("/", GLUE_42); 00387 define ("+", GLUE_43); 00388 define ("+", GLUE_44); 00389 define ("-", GLUE_45); 00390 define ("-", GLUE_46); 00391 define ("*", GLUE_47); 00392 define ("*", GLUE_48); 00393 define ("/", GLUE_49); 00394 define ("/", GLUE_50); 00395 define ("sqrt", GLUE_51); 00396 define ("root", GLUE_52); 00397 define ("complex", GLUE_53); 00398 define ("abs", GLUE_54); 00399 define ("Re", GLUE_55); 00400 define ("Im", GLUE_56); 00401 define ("conj", GLUE_57); 00402 define ("times_i", GLUE_58); 00403 define ("over_i", GLUE_59); 00404 } 00405 }