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 }