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 <basix/tuple.hpp>
00013 #include <basix/alias.hpp>
00014 #include <basix/glue.hpp>
00015 
00016 #define int_literal(x) as_int (as_string (x))
00017 #define is_generic_literal is<literal>
00018 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00019 #define gen_literal_access(f,v) access (as<generic> (f), v)
00020 
00021 namespace mmx {
00022   static vector<mmx_modular(integer) >
00023   GLUE_1 (const tuple<mmx_modular(integer) > &arg_1) {
00024     return vector<mmx_modular(integer) > (as_vector (arg_1));
00025   }
00026   
00027   static vector<mmx_modular(integer) >
00028   GLUE_2 (const tuple<mmx_modular(integer) > &arg_1) {
00029     return vector<mmx_modular(integer) > (as_vector (arg_1));
00030   }
00031   
00032   static iterator<generic>
00033   GLUE_3 (const vector<mmx_modular(integer) > &arg_1) {
00034     return as<iterator<generic> > (iterate (arg_1));
00035   }
00036   
00037   static int
00038   GLUE_4 (const vector<mmx_modular(integer) > &arg_1) {
00039     return N (arg_1);
00040   }
00041   
00042   static mmx_modular(integer)
00043   GLUE_5 (const vector<mmx_modular(integer) > &arg_1, const int &arg_2) {
00044     return arg_1[arg_2];
00045   }
00046   
00047   static alias<mmx_modular(integer) >
00048   GLUE_6 (const alias<vector<mmx_modular(integer) > > &arg_1, const int &arg_2) {
00049     return alias_access<mmx_modular(integer) > (arg_1, arg_2);
00050   }
00051   
00052   static vector<mmx_modular(integer) >
00053   GLUE_7 (const vector<mmx_modular(integer) > &arg_1, const int &arg_2, const int &arg_3) {
00054     return range (arg_1, arg_2, arg_3);
00055   }
00056   
00057   static vector<mmx_modular(integer) >
00058   GLUE_8 (const vector<mmx_modular(integer) > &arg_1) {
00059     return reverse (arg_1);
00060   }
00061   
00062   static vector<mmx_modular(integer) >
00063   GLUE_9 (const vector<mmx_modular(integer) > &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00064     return append (arg_1, arg_2);
00065   }
00066   
00067   static alias<vector<mmx_modular(integer) > >
00068   GLUE_10 (const alias<vector<mmx_modular(integer) > > &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00069     return alias_write (arg_1, arg_2);
00070   }
00071   
00072   static vector<mmx_modular(integer) >
00073   GLUE_11 (const mmx_modular(integer) &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00074     return cons (arg_1, arg_2);
00075   }
00076   
00077   static mmx_modular(integer)
00078   GLUE_12 (const vector<mmx_modular(integer) > &arg_1) {
00079     return car (arg_1);
00080   }
00081   
00082   static vector<mmx_modular(integer) >
00083   GLUE_13 (const vector<mmx_modular(integer) > &arg_1) {
00084     return cdr (arg_1);
00085   }
00086   
00087   static bool
00088   GLUE_14 (const vector<mmx_modular(integer) > &arg_1) {
00089     return is_nil (arg_1);
00090   }
00091   
00092   static bool
00093   GLUE_15 (const vector<mmx_modular(integer) > &arg_1) {
00094     return is_atom (arg_1);
00095   }
00096   
00097   static vector<mmx_modular(integer) >
00098   GLUE_16 (const vector<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) {
00099     return insert (arg_1, arg_2);
00100   }
00101   
00102   static int
00103   GLUE_17 (const vector<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) {
00104     return find (arg_1, arg_2);
00105   }
00106   
00107   static bool
00108   GLUE_18 (const vector<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) {
00109     return contains (arg_1, arg_2);
00110   }
00111   
00112   static vector<generic>
00113   GLUE_19 (const vector<mmx_modular(integer) > &arg_1) {
00114     return as<vector<generic> > (arg_1);
00115   }
00116   
00117   static vector<mmx_modular(integer) >
00118   GLUE_20 (const vector<mmx_modular(integer) > &arg_1) {
00119     return -arg_1;
00120   }
00121   
00122   static vector<mmx_modular(integer) >
00123   GLUE_21 (const vector<mmx_modular(integer) > &arg_1) {
00124     return square (arg_1);
00125   }
00126   
00127   static vector<mmx_modular(integer) >
00128   GLUE_22 (const vector<mmx_modular(integer) > &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00129     return arg_1 + arg_2;
00130   }
00131   
00132   static vector<mmx_modular(integer) >
00133   GLUE_23 (const vector<mmx_modular(integer) > &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00134     return arg_1 - arg_2;
00135   }
00136   
00137   static vector<mmx_modular(integer) >
00138   GLUE_24 (const vector<mmx_modular(integer) > &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00139     return arg_1 * arg_2;
00140   }
00141   
00142   static vector<mmx_modular(integer) >
00143   GLUE_25 (const mmx_modular(integer) &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00144     return arg_1 + arg_2;
00145   }
00146   
00147   static vector<mmx_modular(integer) >
00148   GLUE_26 (const vector<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) {
00149     return arg_1 + arg_2;
00150   }
00151   
00152   static vector<mmx_modular(integer) >
00153   GLUE_27 (const mmx_modular(integer) &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00154     return arg_1 - arg_2;
00155   }
00156   
00157   static vector<mmx_modular(integer) >
00158   GLUE_28 (const vector<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) {
00159     return arg_1 - arg_2;
00160   }
00161   
00162   static vector<mmx_modular(integer) >
00163   GLUE_29 (const mmx_modular(integer) &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00164     return arg_1 * arg_2;
00165   }
00166   
00167   static vector<mmx_modular(integer) >
00168   GLUE_30 (const vector<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) {
00169     return arg_1 * arg_2;
00170   }
00171   
00172   static mmx_modular(integer)
00173   GLUE_31 (const vector<mmx_modular(integer) > &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00174     return dot (arg_1, arg_2);
00175   }
00176   
00177   static mmx_modular(integer)
00178   GLUE_32 (const vector<mmx_modular(integer) > &arg_1) {
00179     return big_mul (arg_1);
00180   }
00181   
00182   static mmx_modular(integer)
00183   GLUE_33 (const vector<mmx_modular(integer) > &arg_1) {
00184     return big_add (arg_1);
00185   }
00186   
00187   static bool
00188   GLUE_34 (const vector<mmx_modular(integer) > &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00189     return arg_1 == arg_2;
00190   }
00191   
00192   static bool
00193   GLUE_35 (const vector<mmx_modular(integer) > &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00194     return arg_1 != arg_2;
00195   }
00196   
00197   static bool
00198   GLUE_36 (const vector<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) {
00199     return arg_1 == arg_2;
00200   }
00201   
00202   static bool
00203   GLUE_37 (const vector<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) {
00204     return arg_1 != arg_2;
00205   }
00206   
00207   static bool
00208   GLUE_38 (const mmx_modular(integer) &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00209     return arg_1 == arg_2;
00210   }
00211   
00212   static bool
00213   GLUE_39 (const mmx_modular(integer) &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00214     return arg_1 != arg_2;
00215   }
00216   
00217   static vector<mmx_modular(integer) >
00218   GLUE_40 (const vector<mmx_modular(integer) > &arg_1) {
00219     return invert (arg_1);
00220   }
00221   
00222   static vector<mmx_modular(integer) >
00223   GLUE_41 (const vector<mmx_modular(integer) > &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00224     return arg_1 / arg_2;
00225   }
00226   
00227   static vector<mmx_modular(integer) >
00228   GLUE_42 (const mmx_modular(integer) &arg_1, const vector<mmx_modular(integer) > &arg_2) {
00229     return arg_1 / arg_2;
00230   }
00231   
00232   static vector<mmx_modular(integer) >
00233   GLUE_43 (const vector<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) {
00234     return arg_1 / arg_2;
00235   }
00236   
00237   void
00238   glue_vector_modular_integer () {
00239     static bool done = false;
00240     if (done) return;
00241     done = true;
00242     call_glue (string ("glue_modular_integer"));
00243     call_glue (string ("glue_vector_integer"));
00244     define_type<vector<mmx_modular(integer) > > (gen (lit ("Vector"), gen (lit ("Modular"), lit ("Integer"))));
00245     define ("vector", GLUE_1);
00246     define ("[]", GLUE_2);
00247     define_converter (":>", GLUE_3, PENALTY_CAST);
00248     define ("#", GLUE_4);
00249     define (".[]", GLUE_5);
00250     define (".[]", GLUE_6);
00251     define (".[]", GLUE_7);
00252     define ("reverse", GLUE_8);
00253     define ("><", GLUE_9);
00254     define ("<<", GLUE_10);
00255     define ("cons", GLUE_11);
00256     define ("car", GLUE_12);
00257     define ("cdr", GLUE_13);
00258     define ("nil?", GLUE_14);
00259     define ("atom?", GLUE_15);
00260     define ("insert", GLUE_16);
00261     define ("find", GLUE_17);
00262     define ("contains?", GLUE_18);
00263     define_converter (":>", GLUE_19, PENALTY_PROMOTE_GENERIC);
00264     define ("-", GLUE_20);
00265     define ("square", GLUE_21);
00266     define ("+", GLUE_22);
00267     define ("-", GLUE_23);
00268     define ("*", GLUE_24);
00269     define ("+", GLUE_25);
00270     define ("+", GLUE_26);
00271     define ("-", GLUE_27);
00272     define ("-", GLUE_28);
00273     define ("*", GLUE_29);
00274     define ("*", GLUE_30);
00275     define ("dot", GLUE_31);
00276     define ("big_mul", GLUE_32);
00277     define ("big_add", GLUE_33);
00278     define ("=", GLUE_34);
00279     define ("!=", GLUE_35);
00280     define ("=", GLUE_36);
00281     define ("!=", GLUE_37);
00282     define ("=", GLUE_38);
00283     define ("!=", GLUE_39);
00284     define ("invert", GLUE_40);
00285     define ("/", GLUE_41);
00286     define ("/", GLUE_42);
00287     define ("/", GLUE_43);
00288   }
00289 }