algebramix_doc 0.3
/Users/mourrain/Devel/mmx/algebramix/glue/glue_p_adic_modular_integer.cpp
Go to the documentation of this file.
00001 
00002 #include <numerix/integer.hpp>
00003 #include <basix/int.hpp>
00004 #include <numerix/modular.hpp>
00005 #include <numerix/modular_integer.hpp>
00006 #include <basix/vector.hpp>
00007 #include <algebramix/vector_unrolled.hpp>
00008 #include <algebramix/vector_simd.hpp>
00009 #include <algebramix/vector_modular.hpp>
00010 #include <algebramix/p_expansion.hpp>
00011 #include <algebramix/p_expansion_modular_integer.hpp>
00012 #include <algebramix/p_adic.hpp>
00013 #include <basix/tuple.hpp>
00014 #include <basix/glue.hpp>
00015 
00016 #define int_literal(x) as_int (as_string (x))
00017 
00018 #define simple_p_expansion(C) polynomial<C, polynomial_carry_variant_helper<C>::PV>
00019 #define simple_as_p_expansion(C) as_p_expansion<C,Modulus_variant(C),modular_local>
00020 
00021 
00022 namespace mmx {
00023   static inline simple_p_expansion(mmx_modular(integer))
00024   integer_as_p_expansion(const integer& c, const modulus<integer>& p) {
00025     return simple_as_p_expansion(integer)(c, p); }
00026 }
00027 
00028 
00029 #define simple_p_adic(C) series<C, series_carry_variant_helper<C>::SV>
00030 
00031 
00032 namespace mmx {
00033   static void
00034   GLUE_1 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const generic &arg_2) {
00035     set_variable_name (arg_1, arg_2);
00036   }
00037   
00038   static void
00039   GLUE_2 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00040     set_output_order (arg_1, arg_2);
00041   }
00042   
00043   static void
00044   GLUE_3 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00045     set_cancel_order (arg_1, arg_2);
00046   }
00047   
00048   static void
00049   GLUE_4 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const bool &arg_2) {
00050     set_formula_output (arg_1, arg_2);
00051   }
00052   
00053   static simple_p_adic(mmx_modular(integer) )
00054   GLUE_5 (const tuple<mmx_modular(integer) > &arg_1) {
00055     return (simple_p_adic(mmx_modular(integer) ) (as_vector (arg_1)));
00056   }
00057   
00058   static simple_p_adic(mmx_modular(integer) )
00059   GLUE_6 (const mmx_modular(integer) &arg_1) {
00060     return (simple_p_adic(mmx_modular(integer) ) (arg_1));
00061   }
00062   
00063   static iterator<generic>
00064   GLUE_7 (const simple_p_adic(mmx_modular(integer) ) &arg_1) {
00065     return as<iterator<generic> > (iterate (arg_1));
00066   }
00067   
00068   static mmx_modular(integer)
00069   GLUE_8 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00070     return arg_1[arg_2];
00071   }
00072   
00073   static simple_p_expansion(mmx_modular(integer) )
00074   GLUE_9 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2, const int &arg_3) {
00075     return range (arg_1, arg_2, arg_3);
00076   }
00077   
00078   static simple_p_adic(mmx_modular(integer) )
00079   GLUE_10 (const simple_p_adic(mmx_modular(integer) ) &arg_1) {
00080     return -arg_1;
00081   }
00082   
00083   static simple_p_adic(mmx_modular(integer) )
00084   GLUE_11 (const simple_p_adic(mmx_modular(integer) ) &arg_1) {
00085     return square (arg_1);
00086   }
00087   
00088   static simple_p_adic(mmx_modular(integer) )
00089   GLUE_12 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00090     return arg_1 + arg_2;
00091   }
00092   
00093   static simple_p_adic(mmx_modular(integer) )
00094   GLUE_13 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00095     return arg_1 - arg_2;
00096   }
00097   
00098   static simple_p_adic(mmx_modular(integer) )
00099   GLUE_14 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00100     return arg_1 * arg_2;
00101   }
00102   
00103   static simple_p_adic(mmx_modular(integer) )
00104   GLUE_15 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00105     return arg_1 + arg_2;
00106   }
00107   
00108   static simple_p_adic(mmx_modular(integer) )
00109   GLUE_16 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) {
00110     return arg_1 + arg_2;
00111   }
00112   
00113   static simple_p_adic(mmx_modular(integer) )
00114   GLUE_17 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00115     return arg_1 - arg_2;
00116   }
00117   
00118   static simple_p_adic(mmx_modular(integer) )
00119   GLUE_18 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) {
00120     return arg_1 - arg_2;
00121   }
00122   
00123   static simple_p_adic(mmx_modular(integer) )
00124   GLUE_19 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00125     return arg_1 * arg_2;
00126   }
00127   
00128   static simple_p_adic(mmx_modular(integer) )
00129   GLUE_20 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) {
00130     return arg_1 * arg_2;
00131   }
00132   
00133   static simple_p_adic(mmx_modular(integer) )
00134   GLUE_21 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00135     return binpow (arg_1, arg_2);
00136   }
00137   
00138   static simple_p_adic(mmx_modular(integer) )
00139   GLUE_22 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00140     return arg_1 / arg_2;
00141   }
00142   
00143   static simple_p_adic(mmx_modular(integer) )
00144   GLUE_23 (const mmx_modular(integer) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00145     return arg_1 / arg_2;
00146   }
00147   
00148   static simple_p_adic(mmx_modular(integer) )
00149   GLUE_24 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const mmx_modular(integer) &arg_2) {
00150     return arg_1 / arg_2;
00151   }
00152   
00153   static simple_p_adic(mmx_modular(integer) )
00154   GLUE_25 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00155     return gcd (arg_1, arg_2);
00156   }
00157   
00158   static simple_p_adic(mmx_modular(integer) )
00159   GLUE_26 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const simple_p_adic(mmx_modular(integer) ) &arg_2) {
00160     return lcm (arg_1, arg_2);
00161   }
00162   
00163   static simple_p_adic(mmx_modular(integer) )
00164   GLUE_27 (const simple_p_adic(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00165     return separable_root (arg_1, arg_2);
00166   }
00167   
00168   static simple_p_adic(mmx_modular(integer) )
00169   GLUE_28 (const simple_p_adic(mmx_modular(integer) ) &arg_1) {
00170     return pth_root (arg_1);
00171   }
00172   
00173   void
00174   glue_p_adic_modular_integer () {
00175     static bool done = false;
00176     if (done) return;
00177     done = true;
00178     call_glue (string ("glue_integer"));
00179     call_glue (string ("glue_modular_integer"));
00180     call_glue (string ("glue_p_expansion_modular_integer"));
00181     define_type<simple_p_adic(mmx_modular(integer) ) > (gen (lit ("P_adic"), gen (lit ("Modular"), lit ("Integer"))));
00182     define ("set_variable_name", GLUE_1);
00183     define ("set_output_order", GLUE_2);
00184     define ("set_cancel_order", GLUE_3);
00185     define ("set_formula_output", GLUE_4);
00186     define ("p_adic", GLUE_5);
00187     define_converter ("upgrade", GLUE_6, PENALTY_INCLUSION);
00188     define_converter (":>", GLUE_7, PENALTY_CAST);
00189     define (".[]", GLUE_8);
00190     define (".[]", GLUE_9);
00191     define ("-", GLUE_10);
00192     define ("square", GLUE_11);
00193     define ("+", GLUE_12);
00194     define ("-", GLUE_13);
00195     define ("*", GLUE_14);
00196     define ("+", GLUE_15);
00197     define ("+", GLUE_16);
00198     define ("-", GLUE_17);
00199     define ("-", GLUE_18);
00200     define ("*", GLUE_19);
00201     define ("*", GLUE_20);
00202     define ("^", GLUE_21);
00203     define ("/", GLUE_22);
00204     define ("/", GLUE_23);
00205     define ("/", GLUE_24);
00206     define ("gcd", GLUE_25);
00207     define ("lcm", GLUE_26);
00208     define ("separable_root", GLUE_27);
00209     define ("pth_root", GLUE_28);
00210   }
00211 }
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines