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 <algebramix/vector_unrolled.hpp>
00010 #include <algebramix/vector_simd.hpp>
00011 #include <algebramix/vector_modular.hpp>
00012 #include <algebramix/p_expansion.hpp>
00013 #include <algebramix/p_expansion_modular_integer.hpp>
00014 #include <basix/tuple.hpp>
00015 #include <basix/glue.hpp>
00016 
00017 #define int_literal(x) as_int (as_string (x))
00018 #define is_generic_literal is<literal>
00019 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00020 #define gen_literal_access(f,v) access (as<generic> (f), v)
00021 
00022 #define simple_p_expansion(C) polynomial<C, polynomial_carry_variant_helper<C>::PV>
00023 #define simple_as_p_expansion(C) as_p_expansion<C,Modulus_variant(C),modular_local>
00024 
00025 
00026 namespace mmx {
00027   static inline simple_p_expansion(mmx_modular(integer))
00028   integer_as_p_expansion(const integer& c, const modulus<integer>& p) {
00029     return simple_as_p_expansion(integer)(c, p); }
00030 }
00031 
00032 
00033 namespace mmx {
00034   static simple_p_expansion(mmx_modular(integer) )
00035   GLUE_1 (const tuple<mmx_modular(integer) > &arg_1) {
00036     return (simple_p_expansion(mmx_modular(integer) ) (as_vector (arg_1)));
00037   }
00038   
00039   static void
00040   GLUE_2 (const simple_p_expansion(mmx_modular(integer) ) &arg_1, const generic &arg_2) {
00041     set_variable_name (arg_1, arg_2);
00042   }
00043   
00044   static iterator<generic>
00045   GLUE_3 (const simple_p_expansion(mmx_modular(integer) ) &arg_1) {
00046     return as<iterator<generic> > (iterate (arg_1));
00047   }
00048   
00049   static int
00050   GLUE_4 (const simple_p_expansion(mmx_modular(integer) ) &arg_1) {
00051     return N (arg_1);
00052   }
00053   
00054   static int
00055   GLUE_5 (const simple_p_expansion(mmx_modular(integer) ) &arg_1) {
00056     return deg (arg_1);
00057   }
00058   
00059   static mmx_modular(integer)
00060   GLUE_6 (const simple_p_expansion(mmx_modular(integer) ) &arg_1, const int &arg_2) {
00061     return arg_1[arg_2];
00062   }
00063   
00064   static integer
00065   GLUE_7 (const simple_p_expansion(mmx_modular(integer) ) &arg_1) {
00066     return as<integer > (arg_1);
00067   }
00068   
00069   static simple_p_expansion(mmx_modular(integer) )
00070   GLUE_8 (const integer &arg_1, const modulus<integer> &arg_2) {
00071     return integer_as_p_expansion (arg_1, arg_2);
00072   }
00073   
00074   void
00075   glue_p_expansion_modular_integer () {
00076     static bool done = false;
00077     if (done) return;
00078     done = true;
00079     call_glue (string ("glue_basix_vector_generic"));
00080     call_glue (string ("glue_modular_integer"));
00081     call_glue (string ("glue_vector_modular_integer"));
00082     define_type<simple_p_expansion(mmx_modular(integer) ) > (gen (lit ("P_expansion"), gen (lit ("Modular"), lit ("Integer"))));
00083     define ("p_expansion", GLUE_1);
00084     define ("set_variable_name", GLUE_2);
00085     define_converter (":>", GLUE_3, PENALTY_CAST);
00086     define ("#", GLUE_4);
00087     define ("deg", GLUE_5);
00088     define (".[]", GLUE_6);
00089     define ("integer", GLUE_7);
00090     define ("p_expansion", GLUE_8);
00091   }
00092 }