algebramix_doc 0.3
/Users/mourrain/Devel/mmx/algebramix/glue/glue_algebraic_number.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines