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 <numerix/rational.hpp> 00010 #include <numerix/floating.hpp> 00011 #include <basix/double.hpp> 00012 #include <numerix/complex.hpp> 00013 #include <numerix/complex_double.hpp> 00014 #include <numerix/ball.hpp> 00015 #include <numerix/ball_complex.hpp> 00016 #include <algebramix/vector_unrolled.hpp> 00017 #include <algebramix/vector_simd.hpp> 00018 #include <algebramix/vector_modular.hpp> 00019 #include <basix/compound.hpp> 00020 #include <basix/mmx_syntax.hpp> 00021 #include <basix/lisp_syntax.hpp> 00022 #include <basix/cpp_syntax.hpp> 00023 #include <basix/syntactic.hpp> 00024 #include <algebramix/polynomial.hpp> 00025 #include <algebramix/polynomial_polynomial.hpp> 00026 #include <algebramix/polynomial_integer.hpp> 00027 #include <algebramix/polynomial_rational.hpp> 00028 #include <algebramix/polynomial_modular.hpp> 00029 #include <algebramix/polynomial_modular_integer.hpp> 00030 #include <algebramix/polynomial_complex.hpp> 00031 #include <algebramix/polynomial_schonhage.hpp> 00032 #include <algebramix/algebraic.hpp> 00033 #include <algebramix/algebraic_number.hpp> 00034 #include <basix/glue.hpp> 00035 00036 #define int_literal(x) as_int (as_string (x)) 00037 #define is_generic_literal is<literal> 00038 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00039 #define gen_literal_access(f,v) access (as<generic> (f), v) 00040 #define double_literal(x) as_double (as_string (x)) 00041 #define is_generic_compound is<compound> 00042 #define compound_arguments(x) cdr (as_vector (x)) 00043 #define gen_compound_apply(f,v) gen (as<generic> (f), v) 00044 namespace mmx { 00045 template<typename C> polynomial<C> 00046 polynomial_reverse (const vector<C>& v) { 00047 return polynomial<C> (reverse (v)); } 00048 00049 template<typename C> polynomial<modular<modulus<C>, modular_local> > 00050 as_polynomial_modular (const polynomial<C>& f, const modulus<C>& p) { 00051 modular<modulus<C>, modular_local>::set_modulus (p); 00052 return as<polynomial<modular<modulus<C>, modular_local> > > (f); } 00053 00054 template<typename C> vector<generic> 00055 wrap_subresultants (const polynomial<C>& f, const polynomial<C>& g) { 00056 return as<vector<generic> > (subresultants (f, g)); } 00057 00058 } 00059 namespace mmx { POLYNOMIAL_GENERIC_USES_SCHONHAGE } 00060 00061 namespace mmx { 00062 static algebraic_real 00063 GLUE_1 (const rational &arg_1) { 00064 return algebraic_real (arg_1); 00065 } 00066 00067 static mmx_floating 00068 GLUE_2 (const algebraic_real &arg_1) { 00069 return as_floating (arg_1); 00070 } 00071 00072 static algebraic_real 00073 GLUE_3 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00074 return lcommon (arg_1, arg_2); 00075 } 00076 00077 static algebraic_real 00078 GLUE_4 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00079 return rcommon (arg_1, arg_2); 00080 } 00081 00082 static polynomial<rational> 00083 GLUE_5 (const algebraic_real &arg_1) { 00084 return annihilator (arg_1); 00085 } 00086 00087 static algebraic_real 00088 GLUE_6 (const algebraic_real &arg_1) { 00089 return normalize (arg_1); 00090 } 00091 00092 static algebraic_real 00093 GLUE_7 (const algebraic_real &arg_1) { 00094 return -arg_1; 00095 } 00096 00097 static algebraic_real 00098 GLUE_8 (const algebraic_real &arg_1) { 00099 return square (arg_1); 00100 } 00101 00102 static algebraic_real 00103 GLUE_9 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00104 return arg_1 + arg_2; 00105 } 00106 00107 static algebraic_real 00108 GLUE_10 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00109 return arg_1 - arg_2; 00110 } 00111 00112 static algebraic_real 00113 GLUE_11 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00114 return arg_1 * arg_2; 00115 } 00116 00117 static algebraic_real 00118 GLUE_12 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00119 return arg_1 / arg_2; 00120 } 00121 00122 static algebraic_real 00123 GLUE_13 (const rational &arg_1, const algebraic_real &arg_2) { 00124 return arg_1 + arg_2; 00125 } 00126 00127 static algebraic_real 00128 GLUE_14 (const algebraic_real &arg_1, const rational &arg_2) { 00129 return arg_1 + arg_2; 00130 } 00131 00132 static algebraic_real 00133 GLUE_15 (const rational &arg_1, const algebraic_real &arg_2) { 00134 return arg_1 - arg_2; 00135 } 00136 00137 static algebraic_real 00138 GLUE_16 (const algebraic_real &arg_1, const rational &arg_2) { 00139 return arg_1 - arg_2; 00140 } 00141 00142 static algebraic_real 00143 GLUE_17 (const rational &arg_1, const algebraic_real &arg_2) { 00144 return arg_1 * arg_2; 00145 } 00146 00147 static algebraic_real 00148 GLUE_18 (const algebraic_real &arg_1, const rational &arg_2) { 00149 return arg_1 * arg_2; 00150 } 00151 00152 static algebraic_real 00153 GLUE_19 (const rational &arg_1, const algebraic_real &arg_2) { 00154 return arg_1 / arg_2; 00155 } 00156 00157 static algebraic_real 00158 GLUE_20 (const algebraic_real &arg_1, const rational &arg_2) { 00159 return arg_1 / arg_2; 00160 } 00161 00162 static algebraic_real 00163 GLUE_21 (const algebraic_real &arg_1) { 00164 return sqrt (arg_1); 00165 } 00166 00167 static algebraic_real 00168 GLUE_22 (const algebraic_real &arg_1, const int &arg_2) { 00169 return root (arg_1, arg_2); 00170 } 00171 00172 static int 00173 GLUE_23 (const algebraic_real &arg_1) { 00174 return sign (arg_1); 00175 } 00176 00177 static bool 00178 GLUE_24 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00179 return arg_1 == arg_2; 00180 } 00181 00182 static bool 00183 GLUE_25 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00184 return arg_1 != arg_2; 00185 } 00186 00187 static bool 00188 GLUE_26 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00189 return arg_1 < arg_2; 00190 } 00191 00192 static bool 00193 GLUE_27 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00194 return arg_1 <= arg_2; 00195 } 00196 00197 static bool 00198 GLUE_28 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00199 return arg_1 > arg_2; 00200 } 00201 00202 static bool 00203 GLUE_29 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00204 return arg_1 >= arg_2; 00205 } 00206 00207 static bool 00208 GLUE_30 (const algebraic_real &arg_1, const rational &arg_2) { 00209 return arg_1 == arg_2; 00210 } 00211 00212 static bool 00213 GLUE_31 (const algebraic_real &arg_1, const rational &arg_2) { 00214 return arg_1 != arg_2; 00215 } 00216 00217 static bool 00218 GLUE_32 (const algebraic_real &arg_1, const rational &arg_2) { 00219 return arg_1 < arg_2; 00220 } 00221 00222 static bool 00223 GLUE_33 (const algebraic_real &arg_1, const rational &arg_2) { 00224 return arg_1 <= arg_2; 00225 } 00226 00227 static bool 00228 GLUE_34 (const algebraic_real &arg_1, const rational &arg_2) { 00229 return arg_1 > arg_2; 00230 } 00231 00232 static bool 00233 GLUE_35 (const algebraic_real &arg_1, const rational &arg_2) { 00234 return arg_1 >= arg_2; 00235 } 00236 00237 static bool 00238 GLUE_36 (const rational &arg_1, const algebraic_real &arg_2) { 00239 return arg_1 == arg_2; 00240 } 00241 00242 static bool 00243 GLUE_37 (const rational &arg_1, const algebraic_real &arg_2) { 00244 return arg_1 != arg_2; 00245 } 00246 00247 static bool 00248 GLUE_38 (const rational &arg_1, const algebraic_real &arg_2) { 00249 return arg_1 < arg_2; 00250 } 00251 00252 static bool 00253 GLUE_39 (const rational &arg_1, const algebraic_real &arg_2) { 00254 return arg_1 <= arg_2; 00255 } 00256 00257 static bool 00258 GLUE_40 (const rational &arg_1, const algebraic_real &arg_2) { 00259 return arg_1 > arg_2; 00260 } 00261 00262 static bool 00263 GLUE_41 (const rational &arg_1, const algebraic_real &arg_2) { 00264 return arg_1 >= arg_2; 00265 } 00266 00267 static algebraic_number 00268 GLUE_42 (const rational &arg_1) { 00269 return algebraic_number (arg_1); 00270 } 00271 00272 static algebraic_number 00273 GLUE_43 (const algebraic_real &arg_1) { 00274 return algebraic_number (arg_1); 00275 } 00276 00277 static complex<mmx_floating> 00278 GLUE_44 (const algebraic_number &arg_1) { 00279 return as_floating (arg_1); 00280 } 00281 00282 static algebraic_number 00283 GLUE_45 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00284 return lcommon (arg_1, arg_2); 00285 } 00286 00287 static algebraic_number 00288 GLUE_46 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00289 return rcommon (arg_1, arg_2); 00290 } 00291 00292 static polynomial<rational> 00293 GLUE_47 (const algebraic_number &arg_1) { 00294 return annihilator (arg_1); 00295 } 00296 00297 static algebraic_number 00298 GLUE_48 (const algebraic_number &arg_1) { 00299 return normalize (arg_1); 00300 } 00301 00302 static algebraic_number 00303 GLUE_49 (const algebraic_number &arg_1) { 00304 return -arg_1; 00305 } 00306 00307 static algebraic_number 00308 GLUE_50 (const algebraic_number &arg_1) { 00309 return square (arg_1); 00310 } 00311 00312 static algebraic_number 00313 GLUE_51 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00314 return arg_1 + arg_2; 00315 } 00316 00317 static algebraic_number 00318 GLUE_52 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00319 return arg_1 - arg_2; 00320 } 00321 00322 static algebraic_number 00323 GLUE_53 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00324 return arg_1 * arg_2; 00325 } 00326 00327 static algebraic_number 00328 GLUE_54 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00329 return arg_1 / arg_2; 00330 } 00331 00332 static algebraic_number 00333 GLUE_55 (const rational &arg_1, const algebraic_number &arg_2) { 00334 return arg_1 + arg_2; 00335 } 00336 00337 static algebraic_number 00338 GLUE_56 (const algebraic_number &arg_1, const rational &arg_2) { 00339 return arg_1 + arg_2; 00340 } 00341 00342 static algebraic_number 00343 GLUE_57 (const rational &arg_1, const algebraic_number &arg_2) { 00344 return arg_1 - arg_2; 00345 } 00346 00347 static algebraic_number 00348 GLUE_58 (const algebraic_number &arg_1, const rational &arg_2) { 00349 return arg_1 - arg_2; 00350 } 00351 00352 static algebraic_number 00353 GLUE_59 (const rational &arg_1, const algebraic_number &arg_2) { 00354 return arg_1 * arg_2; 00355 } 00356 00357 static algebraic_number 00358 GLUE_60 (const algebraic_number &arg_1, const rational &arg_2) { 00359 return arg_1 * arg_2; 00360 } 00361 00362 static algebraic_number 00363 GLUE_61 (const rational &arg_1, const algebraic_number &arg_2) { 00364 return arg_1 / arg_2; 00365 } 00366 00367 static algebraic_number 00368 GLUE_62 (const algebraic_number &arg_1, const rational &arg_2) { 00369 return arg_1 / arg_2; 00370 } 00371 00372 static algebraic_number 00373 GLUE_63 (const algebraic_number &arg_1) { 00374 return sqrt (arg_1); 00375 } 00376 00377 static algebraic_number 00378 GLUE_64 (const algebraic_number &arg_1, const int &arg_2) { 00379 return root (arg_1, arg_2); 00380 } 00381 00382 static bool 00383 GLUE_65 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00384 return arg_1 == arg_2; 00385 } 00386 00387 static bool 00388 GLUE_66 (const algebraic_number &arg_1, const algebraic_number &arg_2) { 00389 return arg_1 != arg_2; 00390 } 00391 00392 static bool 00393 GLUE_67 (const algebraic_number &arg_1, const rational &arg_2) { 00394 return arg_1 == arg_2; 00395 } 00396 00397 static bool 00398 GLUE_68 (const algebraic_number &arg_1, const rational &arg_2) { 00399 return arg_1 != arg_2; 00400 } 00401 00402 static bool 00403 GLUE_69 (const rational &arg_1, const algebraic_number &arg_2) { 00404 return arg_1 == arg_2; 00405 } 00406 00407 static bool 00408 GLUE_70 (const rational &arg_1, const algebraic_number &arg_2) { 00409 return arg_1 != arg_2; 00410 } 00411 00412 static algebraic_number 00413 GLUE_71 (const algebraic_real &arg_1, const algebraic_real &arg_2) { 00414 return gaussian (arg_1, arg_2); 00415 } 00416 00417 static algebraic_real 00418 GLUE_72 (const algebraic_number &arg_1) { 00419 return abs (arg_1); 00420 } 00421 00422 static algebraic_real 00423 GLUE_73 (const algebraic_number &arg_1) { 00424 return Re (arg_1); 00425 } 00426 00427 static algebraic_real 00428 GLUE_74 (const algebraic_number &arg_1) { 00429 return Im (arg_1); 00430 } 00431 00432 static algebraic_number 00433 GLUE_75 (const algebraic_number &arg_1) { 00434 return conj (arg_1); 00435 } 00436 00437 static algebraic_number 00438 GLUE_76 (const algebraic_number &arg_1) { 00439 return times_i (arg_1); 00440 } 00441 00442 static algebraic_number 00443 GLUE_77 (const algebraic_number &arg_1) { 00444 return over_i (arg_1); 00445 } 00446 00447 static algebraic_real 00448 GLUE_78 (const polynomial<rational> &arg_1, const mmx_ball(mmx_floating, mmx_floating) &arg_2) { 00449 return algebraic_real (arg_1, arg_2); 00450 } 00451 00452 static algebraic_real 00453 GLUE_79 (const polynomial<rational> &arg_1, const polynomial<rational> &arg_2, const mmx_ball(mmx_floating, mmx_floating) &arg_3) { 00454 return algebraic_real (arg_1, arg_2, arg_3); 00455 } 00456 00457 static mmx_ball(mmx_floating, mmx_floating) 00458 GLUE_80 (const algebraic_real &arg_1) { 00459 return as_ball (arg_1); 00460 } 00461 00462 static algebraic_number 00463 GLUE_81 (const polynomial<rational> &arg_1, const mmx_ball(mmx_floating, complex<mmx_floating> ) &arg_2) { 00464 return algebraic_number (arg_1, arg_2); 00465 } 00466 00467 static algebraic_number 00468 GLUE_82 (const polynomial<rational> &arg_1, const polynomial<rational> &arg_2, const mmx_ball(mmx_floating, complex<mmx_floating> ) &arg_3) { 00469 return algebraic_number (arg_1, arg_2, arg_3); 00470 } 00471 00472 static mmx_ball(mmx_floating, complex<mmx_floating> ) 00473 GLUE_83 (const algebraic_number &arg_1) { 00474 return as_ball (arg_1); 00475 } 00476 00477 void 00478 glue_algebraic_number () { 00479 static bool done = false; 00480 if (done) return; 00481 done = true; 00482 call_glue (string ("glue_ball_floating")); 00483 call_glue (string ("glue_polynomial_rational")); 00484 call_glue (string ("glue_algebraic_generic")); 00485 define_type<algebraic_real > (lit ("Algebraic_real")); 00486 define_converter ("upgrade", GLUE_1, PENALTY_INCLUSION); 00487 define_converter ("upgrade", GLUE_2, PENALTY_INCLUSION); 00488 define ("lcommon", GLUE_3); 00489 define ("rcommon", GLUE_4); 00490 define ("annihilator", GLUE_5); 00491 define ("normalize", GLUE_6); 00492 define ("-", GLUE_7); 00493 define ("square", GLUE_8); 00494 define ("+", GLUE_9); 00495 define ("-", GLUE_10); 00496 define ("*", GLUE_11); 00497 define ("/", GLUE_12); 00498 define ("+", GLUE_13); 00499 define ("+", GLUE_14); 00500 define ("-", GLUE_15); 00501 define ("-", GLUE_16); 00502 define ("*", GLUE_17); 00503 define ("*", GLUE_18); 00504 define ("/", GLUE_19); 00505 define ("/", GLUE_20); 00506 define ("sqrt", GLUE_21); 00507 define ("root", GLUE_22); 00508 define ("sign", GLUE_23); 00509 define ("=", GLUE_24); 00510 define ("!=", GLUE_25); 00511 define ("<", GLUE_26); 00512 define ("<=", GLUE_27); 00513 define (">", GLUE_28); 00514 define (">=", GLUE_29); 00515 define ("=", GLUE_30); 00516 define ("!=", GLUE_31); 00517 define ("<", GLUE_32); 00518 define ("<=", GLUE_33); 00519 define (">", GLUE_34); 00520 define (">=", GLUE_35); 00521 define ("=", GLUE_36); 00522 define ("!=", GLUE_37); 00523 define ("<", GLUE_38); 00524 define ("<=", GLUE_39); 00525 define (">", GLUE_40); 00526 define (">=", GLUE_41); 00527 define_type<algebraic_number > (lit ("Algebraic_number")); 00528 define_converter ("upgrade", GLUE_42, PENALTY_INCLUSION); 00529 define_converter ("upgrade", GLUE_43, PENALTY_INCLUSION); 00530 define_converter ("upgrade", GLUE_44, PENALTY_INCLUSION); 00531 define ("lcommon", GLUE_45); 00532 define ("rcommon", GLUE_46); 00533 define ("annihilator", GLUE_47); 00534 define ("normalize", GLUE_48); 00535 define ("-", GLUE_49); 00536 define ("square", GLUE_50); 00537 define ("+", GLUE_51); 00538 define ("-", GLUE_52); 00539 define ("*", GLUE_53); 00540 define ("/", GLUE_54); 00541 define ("+", GLUE_55); 00542 define ("+", GLUE_56); 00543 define ("-", GLUE_57); 00544 define ("-", GLUE_58); 00545 define ("*", GLUE_59); 00546 define ("*", GLUE_60); 00547 define ("/", GLUE_61); 00548 define ("/", GLUE_62); 00549 define ("sqrt", GLUE_63); 00550 define ("root", GLUE_64); 00551 define ("=", GLUE_65); 00552 define ("!=", GLUE_66); 00553 define ("=", GLUE_67); 00554 define ("!=", GLUE_68); 00555 define ("=", GLUE_69); 00556 define ("!=", GLUE_70); 00557 define ("complex", GLUE_71); 00558 define ("abs", GLUE_72); 00559 define ("Re", GLUE_73); 00560 define ("Im", GLUE_74); 00561 define ("conj", GLUE_75); 00562 define ("times_i", GLUE_76); 00563 define ("over_i", GLUE_77); 00564 define ("algebraic", GLUE_78); 00565 define ("algebraic", GLUE_79); 00566 define_converter ("upgrade", GLUE_80, PENALTY_INCLUSION); 00567 define ("algebraic", GLUE_81); 00568 define ("algebraic", GLUE_82); 00569 define_converter ("upgrade", GLUE_83, PENALTY_INCLUSION); 00570 } 00571 }