numerix_doc 0.4
|
00001 00002 #include <basix/int.hpp> 00003 #include <numerix/integer.hpp> 00004 #include <numerix/modular.hpp> 00005 #include <numerix/modular_integer.hpp> 00006 #include <basix/glue.hpp> 00007 00008 #define int_literal(x) as_int (as_string (x)) 00009 00010 namespace mmx { 00011 static generic 00012 GLUE_1 (const int &arg_1) { 00013 return integer_construct (arg_1); 00014 } 00015 00016 static modulus<int> 00017 GLUE_2 (const int &arg_1) { 00018 return modulus<int > (arg_1); 00019 } 00020 00021 static modulus<int> 00022 GLUE_3 (const int &arg_1) { 00023 return modulus<int > (arg_1); 00024 } 00025 00026 static int 00027 GLUE_4 (const modulus<int> &arg_1) { 00028 return *arg_1; 00029 } 00030 00031 static mmx_modular(int) 00032 GLUE_5 (const int &arg_1, const int &arg_2) { 00033 return (mmx_modular(int ) (arg_1, arg_2)); 00034 } 00035 00036 static mmx_modular(int) 00037 GLUE_6 (const int &arg_1, const modulus<int> &arg_2) { 00038 return (mmx_modular(int ) (arg_1, arg_2)); 00039 } 00040 00041 static mmx_modular(int) 00042 GLUE_7 (const int &arg_1, const modulus<int> &arg_2) { 00043 return (mmx_modular(int ) (arg_1, arg_2)); 00044 } 00045 00046 static modulus<int> 00047 GLUE_8 (const mmx_modular(int) &arg_1) { 00048 return get_modulus (arg_1); 00049 } 00050 00051 static int 00052 GLUE_9 (const mmx_modular(int) &arg_1) { 00053 return *arg_1; 00054 } 00055 00056 static mmx_modular(int) 00057 GLUE_10 (const mmx_modular(int) &arg_1) { 00058 return -arg_1; 00059 } 00060 00061 static mmx_modular(int) 00062 GLUE_11 (const mmx_modular(int) &arg_1) { 00063 return square (arg_1); 00064 } 00065 00066 static mmx_modular(int) 00067 GLUE_12 (const mmx_modular(int) &arg_1, const mmx_modular(int) &arg_2) { 00068 return arg_1 + arg_2; 00069 } 00070 00071 static mmx_modular(int) 00072 GLUE_13 (const mmx_modular(int) &arg_1, const mmx_modular(int) &arg_2) { 00073 return arg_1 - arg_2; 00074 } 00075 00076 static mmx_modular(int) 00077 GLUE_14 (const mmx_modular(int) &arg_1, const mmx_modular(int) &arg_2) { 00078 return arg_1 * arg_2; 00079 } 00080 00081 static mmx_modular(int) 00082 GLUE_15 (const int &arg_1, const mmx_modular(int) &arg_2) { 00083 return arg_1 + arg_2; 00084 } 00085 00086 static mmx_modular(int) 00087 GLUE_16 (const mmx_modular(int) &arg_1, const int &arg_2) { 00088 return arg_1 + arg_2; 00089 } 00090 00091 static mmx_modular(int) 00092 GLUE_17 (const int &arg_1, const mmx_modular(int) &arg_2) { 00093 return arg_1 - arg_2; 00094 } 00095 00096 static mmx_modular(int) 00097 GLUE_18 (const mmx_modular(int) &arg_1, const int &arg_2) { 00098 return arg_1 - arg_2; 00099 } 00100 00101 static mmx_modular(int) 00102 GLUE_19 (const int &arg_1, const mmx_modular(int) &arg_2) { 00103 return arg_1 * arg_2; 00104 } 00105 00106 static mmx_modular(int) 00107 GLUE_20 (const mmx_modular(int) &arg_1, const int &arg_2) { 00108 return arg_1 * arg_2; 00109 } 00110 00111 static mmx_modular(int) 00112 GLUE_21 (const mmx_modular(int) &arg_1, const mmx_modular(int) &arg_2) { 00113 return arg_1 / arg_2; 00114 } 00115 00116 static mmx_modular(int) 00117 GLUE_22 (const int &arg_1, const mmx_modular(int) &arg_2) { 00118 return arg_1 / arg_2; 00119 } 00120 00121 static mmx_modular(int) 00122 GLUE_23 (const mmx_modular(int) &arg_1, const int &arg_2) { 00123 return arg_1 / arg_2; 00124 } 00125 00126 static mmx_modular(int) 00127 GLUE_24 (const mmx_modular(int) &arg_1, const int &arg_2) { 00128 return binpow (arg_1, arg_2); 00129 } 00130 00131 void 00132 glue_modular_int () { 00133 static bool done = false; 00134 if (done) return; 00135 done = true; 00136 call_glue (string ("glue_int")); 00137 define_constructor<int > (GLUE_1); 00138 define_type<modulus<int> > (gen (lit ("Modulus"), lit ("Int"))); 00139 define_type<mmx_modular(int) > (gen (lit ("Modular"), lit ("Int"))); 00140 define ("modulus", GLUE_2); 00141 define_converter ("upgrade", GLUE_3, PENALTY_HOMOMORPHISM); 00142 define_converter (":>", GLUE_4, PENALTY_CAST); 00143 define ("modular", GLUE_5); 00144 define ("modular", GLUE_6); 00145 define ("mod", GLUE_7); 00146 define ("get_modulus", GLUE_8); 00147 define ("preimage", GLUE_9); 00148 define ("-", GLUE_10); 00149 define ("square", GLUE_11); 00150 define ("+", GLUE_12); 00151 define ("-", GLUE_13); 00152 define ("*", GLUE_14); 00153 define ("+", GLUE_15); 00154 define ("+", GLUE_16); 00155 define ("-", GLUE_17); 00156 define ("-", GLUE_18); 00157 define ("*", GLUE_19); 00158 define ("*", GLUE_20); 00159 define ("/", GLUE_21); 00160 define ("/", GLUE_22); 00161 define ("/", GLUE_23); 00162 define ("^", GLUE_24); 00163 } 00164 }