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/permutation.hpp> 00013 #include <numerix/rational.hpp> 00014 #include <basix/row_tuple.hpp> 00015 #include <algebramix/matrix.hpp> 00016 #include <algebramix/matrix_ring_naive.hpp> 00017 #include <algebramix/matrix_integer.hpp> 00018 #include <algebramix/matrix_modular_integer.hpp> 00019 #include <algebramix/matrix_quotient.hpp> 00020 #include <basix/tuple.hpp> 00021 #include <basix/alias.hpp> 00022 #include <basix/glue.hpp> 00023 00024 #define int_literal(x) as_int (as_string (x)) 00025 #define is_generic_literal is<literal> 00026 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00027 #define gen_literal_access(f,v) access (as<generic> (f), v) 00028 #define identity_matrix_integer identity_matrix<integer> 00029 #define hilbert_matrix_rational hilbert_matrix<rational> 00030 00031 namespace mmx { 00032 template<typename C> matrix<C> 00033 matrix_new (const vector<row_tuple<C> >& t) { 00034 if (N(t) == 0) return matrix<C> (); 00035 nat i, j, rows= N(t), cols= N(t[0]); 00036 C dummy= zero_cst<C> (); 00037 matrix<C> r (dummy, rows, cols); 00038 for (i=0; i<rows; i++) { 00039 ASSERT (N(t[i]) == cols, "unequal row lengths"); 00040 for (j=0; j<cols; j++) 00041 r(i,j)= t[i][j]; 00042 } 00043 return r; 00044 } 00045 00046 template<typename C> matrix<C> 00047 matrix_new (const vector<C>& t) { 00048 nat j, rows= 1, cols= N(t); 00049 C dummy= zero_cst<C> (); 00050 matrix<C> r (dummy, rows, cols); 00051 for (j=0; j<cols; j++) 00052 r(0,j)= t[j]; 00053 return r; 00054 } 00055 00056 template<typename C> vector<generic> 00057 wrap_column_reduced_echelon_with_permutation (const matrix<C>& m) { 00058 permutation permut; 00059 generic tp=as<generic> (column_reduced_echelon (m, permut)); 00060 return vec (tp, as<generic> (permut)); 00061 } 00062 00063 template<typename C> vector<generic> 00064 wrap_column_reduced_echelon_with_transform (const matrix<C>& m) { 00065 matrix<C> k; 00066 generic tp=as<generic> (column_reduced_echelon (m, k)); 00067 return vec (tp, as<generic> (k)); 00068 } 00069 00070 template<typename C> vector<generic> 00071 wrap_row_reduced_echelon_with_transform (const matrix<C>& m) { 00072 matrix<C> k; 00073 generic tp=as<generic> (row_reduced_echelon (m, k)); 00074 return vec (tp, as<generic> (k)); 00075 } 00076 } 00077 00078 00079 namespace mmx { 00080 static row_tuple<generic> 00081 GLUE_1 (const row_tuple<mmx_modular(integer) > &arg_1) { 00082 return as<row_tuple<generic> > (arg_1); 00083 } 00084 00085 static matrix<generic> 00086 GLUE_2 (const matrix<mmx_modular(integer) > &arg_1) { 00087 return as<matrix<generic> > (arg_1); 00088 } 00089 00090 static row_tuple<mmx_modular(integer) > 00091 GLUE_3 (const tuple<mmx_modular(integer) > &arg_1) { 00092 return row_tuple<mmx_modular(integer) > (as_vector (arg_1)); 00093 } 00094 00095 static matrix<mmx_modular(integer) > 00096 GLUE_4 (const tuple<mmx_modular(integer) > &arg_1) { 00097 return matrix_new (as_vector (arg_1)); 00098 } 00099 00100 static matrix<mmx_modular(integer) > 00101 GLUE_5 (const tuple<row_tuple<mmx_modular(integer) > > &arg_1) { 00102 return matrix_new (as_vector (arg_1)); 00103 } 00104 00105 static matrix<mmx_modular(integer) > 00106 GLUE_6 (const tuple<row_tuple<mmx_modular(integer) > > &arg_1) { 00107 return matrix_new (as_vector (arg_1)); 00108 } 00109 00110 static int 00111 GLUE_7 (const matrix<mmx_modular(integer) > &arg_1) { 00112 return N (arg_1); 00113 } 00114 00115 static int 00116 GLUE_8 (const matrix<mmx_modular(integer) > &arg_1) { 00117 return rows (arg_1); 00118 } 00119 00120 static int 00121 GLUE_9 (const matrix<mmx_modular(integer) > &arg_1) { 00122 return cols (arg_1); 00123 } 00124 00125 static mmx_modular(integer) 00126 GLUE_10 (const matrix<mmx_modular(integer) > &arg_1, const int &arg_2, const int &arg_3) { 00127 return arg_1 (arg_2, arg_3); 00128 } 00129 00130 static alias<mmx_modular(integer) > 00131 GLUE_11 (const alias<matrix<mmx_modular(integer) > > &arg_1, const int &arg_2, const int &arg_3) { 00132 return alias_access<mmx_modular(integer) > (arg_1, arg_2, arg_3); 00133 } 00134 00135 static matrix<mmx_modular(integer) > 00136 GLUE_12 (const matrix<mmx_modular(integer) > &arg_1, const int &arg_2, const int &arg_3, const int &arg_4, const int &arg_5) { 00137 return range (arg_1, arg_2, arg_3, arg_4, arg_5); 00138 } 00139 00140 static vector<mmx_modular(integer) > 00141 GLUE_13 (const matrix<mmx_modular(integer) > &arg_1, const int &arg_2) { 00142 return row (arg_1, arg_2); 00143 } 00144 00145 static vector<mmx_modular(integer) > 00146 GLUE_14 (const matrix<mmx_modular(integer) > &arg_1, const int &arg_2) { 00147 return column (arg_1, arg_2); 00148 } 00149 00150 static matrix<mmx_modular(integer) > 00151 GLUE_15 (const matrix<mmx_modular(integer) > &arg_1) { 00152 return transpose (arg_1); 00153 } 00154 00155 static matrix<mmx_modular(integer) > 00156 GLUE_16 (const matrix<mmx_modular(integer) > &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00157 return horizontal_join (arg_1, arg_2); 00158 } 00159 00160 static matrix<mmx_modular(integer) > 00161 GLUE_17 (const matrix<mmx_modular(integer) > &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00162 return vertical_join (arg_1, arg_2); 00163 } 00164 00165 static matrix<mmx_modular(integer) > 00166 GLUE_18 (const matrix<mmx_modular(integer) > &arg_1, const permutation &arg_2) { 00167 return arg_1 * arg_2; 00168 } 00169 00170 static matrix<mmx_modular(integer) > 00171 GLUE_19 (const permutation &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00172 return arg_1 * arg_2; 00173 } 00174 00175 static matrix<mmx_modular(integer) > 00176 GLUE_20 (const mmx_modular(integer) &arg_1, const int &arg_2, const int &arg_3) { 00177 return fill_matrix (arg_1, arg_2, arg_3); 00178 } 00179 00180 static matrix<mmx_modular(integer) > 00181 GLUE_21 (const mmx_modular(integer) &arg_1, const int &arg_2) { 00182 return jordan_matrix (arg_1, arg_2); 00183 } 00184 00185 static matrix<mmx_modular(integer) > 00186 GLUE_22 (const vector<mmx_modular(integer) > &arg_1) { 00187 return toeplitz_matrix (arg_1); 00188 } 00189 00190 static matrix<mmx_modular(integer) > 00191 GLUE_23 (const vector<mmx_modular(integer) > &arg_1) { 00192 return hankel_matrix (arg_1); 00193 } 00194 00195 static matrix<mmx_modular(integer) > 00196 GLUE_24 (const vector<mmx_modular(integer) > &arg_1, const vector<mmx_modular(integer) > &arg_2) { 00197 return tensor_matrix (arg_1, arg_2); 00198 } 00199 00200 static matrix<mmx_modular(integer) > 00201 GLUE_25 (const vector<mmx_modular(integer) > &arg_1) { 00202 return vandermonde (arg_1); 00203 } 00204 00205 static matrix<mmx_modular(integer) > 00206 GLUE_26 (const matrix<mmx_modular(integer) > &arg_1) { 00207 return -arg_1; 00208 } 00209 00210 static matrix<mmx_modular(integer) > 00211 GLUE_27 (const matrix<mmx_modular(integer) > &arg_1) { 00212 return square (arg_1); 00213 } 00214 00215 static matrix<mmx_modular(integer) > 00216 GLUE_28 (const matrix<mmx_modular(integer) > &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00217 return arg_1 + arg_2; 00218 } 00219 00220 static matrix<mmx_modular(integer) > 00221 GLUE_29 (const matrix<mmx_modular(integer) > &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00222 return arg_1 - arg_2; 00223 } 00224 00225 static matrix<mmx_modular(integer) > 00226 GLUE_30 (const matrix<mmx_modular(integer) > &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00227 return arg_1 * arg_2; 00228 } 00229 00230 static matrix<mmx_modular(integer) > 00231 GLUE_31 (const mmx_modular(integer) &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00232 return arg_1 + arg_2; 00233 } 00234 00235 static matrix<mmx_modular(integer) > 00236 GLUE_32 (const matrix<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) { 00237 return arg_1 + arg_2; 00238 } 00239 00240 static matrix<mmx_modular(integer) > 00241 GLUE_33 (const mmx_modular(integer) &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00242 return arg_1 - arg_2; 00243 } 00244 00245 static matrix<mmx_modular(integer) > 00246 GLUE_34 (const matrix<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) { 00247 return arg_1 - arg_2; 00248 } 00249 00250 static matrix<mmx_modular(integer) > 00251 GLUE_35 (const mmx_modular(integer) &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00252 return arg_1 * arg_2; 00253 } 00254 00255 static matrix<mmx_modular(integer) > 00256 GLUE_36 (const matrix<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) { 00257 return arg_1 * arg_2; 00258 } 00259 00260 static vector<mmx_modular(integer) > 00261 GLUE_37 (const matrix<mmx_modular(integer) > &arg_1, const vector<mmx_modular(integer) > &arg_2) { 00262 return arg_1 * arg_2; 00263 } 00264 00265 static vector<mmx_modular(integer) > 00266 GLUE_38 (const vector<mmx_modular(integer) > &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00267 return arg_1 * arg_2; 00268 } 00269 00270 static bool 00271 GLUE_39 (const matrix<mmx_modular(integer) > &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00272 return arg_1 == arg_2; 00273 } 00274 00275 static bool 00276 GLUE_40 (const matrix<mmx_modular(integer) > &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00277 return arg_1 != arg_2; 00278 } 00279 00280 static bool 00281 GLUE_41 (const matrix<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) { 00282 return arg_1 == arg_2; 00283 } 00284 00285 static bool 00286 GLUE_42 (const matrix<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) { 00287 return arg_1 != arg_2; 00288 } 00289 00290 static bool 00291 GLUE_43 (const mmx_modular(integer) &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00292 return arg_1 == arg_2; 00293 } 00294 00295 static bool 00296 GLUE_44 (const mmx_modular(integer) &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00297 return arg_1 != arg_2; 00298 } 00299 00300 static matrix<mmx_modular(integer) > 00301 GLUE_45 (const mmx_modular(integer) &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00302 return arg_1 / arg_2; 00303 } 00304 00305 static matrix<mmx_modular(integer) > 00306 GLUE_46 (const matrix<mmx_modular(integer) > &arg_1, const mmx_modular(integer) &arg_2) { 00307 return arg_1 / arg_2; 00308 } 00309 00310 static matrix<mmx_modular(integer) > 00311 GLUE_47 (const matrix<mmx_modular(integer) > &arg_1, const matrix<mmx_modular(integer) > &arg_2) { 00312 return krylov (arg_1, arg_2); 00313 } 00314 00315 static mmx_modular(integer) 00316 GLUE_48 (const matrix<mmx_modular(integer) > &arg_1) { 00317 return det (arg_1); 00318 } 00319 00320 static matrix<mmx_modular(integer) > 00321 GLUE_49 (const matrix<mmx_modular(integer) > &arg_1) { 00322 return row_echelon (arg_1); 00323 } 00324 00325 static matrix<mmx_modular(integer) > 00326 GLUE_50 (const matrix<mmx_modular(integer) > &arg_1) { 00327 return column_echelon (arg_1); 00328 } 00329 00330 static matrix<mmx_modular(integer) > 00331 GLUE_51 (const matrix<mmx_modular(integer) > &arg_1) { 00332 return row_reduced_echelon (arg_1); 00333 } 00334 00335 static matrix<mmx_modular(integer) > 00336 GLUE_52 (const matrix<mmx_modular(integer) > &arg_1) { 00337 return column_reduced_echelon (arg_1); 00338 } 00339 00340 static vector<generic> 00341 GLUE_53 (const matrix<mmx_modular(integer) > &arg_1) { 00342 return wrap_row_reduced_echelon_with_transform (arg_1); 00343 } 00344 00345 static vector<generic> 00346 GLUE_54 (const matrix<mmx_modular(integer) > &arg_1) { 00347 return wrap_column_reduced_echelon_with_transform (arg_1); 00348 } 00349 00350 static vector<generic> 00351 GLUE_55 (const matrix<mmx_modular(integer) > &arg_1) { 00352 return wrap_column_reduced_echelon_with_permutation (arg_1); 00353 } 00354 00355 static matrix<mmx_modular(integer) > 00356 GLUE_56 (const matrix<mmx_modular(integer) > &arg_1) { 00357 return kernel (arg_1); 00358 } 00359 00360 static matrix<mmx_modular(integer) > 00361 GLUE_57 (const matrix<mmx_modular(integer) > &arg_1) { 00362 return image (arg_1); 00363 } 00364 00365 static int 00366 GLUE_58 (const matrix<mmx_modular(integer) > &arg_1) { 00367 return rank (arg_1); 00368 } 00369 00370 static matrix<mmx_modular(integer) > 00371 GLUE_59 (const matrix<mmx_modular(integer) > &arg_1) { 00372 return invert (arg_1); 00373 } 00374 00375 void 00376 glue_matrix_modular_integer () { 00377 static bool done = false; 00378 if (done) return; 00379 done = true; 00380 call_glue (string ("glue_vector_modular_integer")); 00381 call_glue (string ("glue_matrix_integer")); 00382 define_type<row_tuple<mmx_modular(integer) > > (gen (lit ("Row"), gen (lit ("Modular"), lit ("Integer")))); 00383 define_type<matrix<mmx_modular(integer) > > (gen (lit ("Matrix"), gen (lit ("Modular"), lit ("Integer")))); 00384 define_converter (":>", GLUE_1, PENALTY_PROMOTE_GENERIC); 00385 define_converter (":>", GLUE_2, PENALTY_PROMOTE_GENERIC); 00386 define ("(.)", GLUE_3); 00387 define ("matrix", GLUE_4); 00388 define ("matrix", GLUE_5); 00389 define ("[]", GLUE_6); 00390 define ("#", GLUE_7); 00391 define ("rows", GLUE_8); 00392 define ("columns", GLUE_9); 00393 define (".[]", GLUE_10); 00394 define (".[]", GLUE_11); 00395 define (".[]", GLUE_12); 00396 define ("row", GLUE_13); 00397 define ("column", GLUE_14); 00398 define ("transpose", GLUE_15); 00399 define ("horizontal_join", GLUE_16); 00400 define ("vertical_join", GLUE_17); 00401 define ("*", GLUE_18); 00402 define ("*", GLUE_19); 00403 define ("fill_matrix", GLUE_20); 00404 define ("jordan_matrix", GLUE_21); 00405 define ("toeplitz_matrix", GLUE_22); 00406 define ("hankel_matrix", GLUE_23); 00407 define ("tensor_matrix", GLUE_24); 00408 define ("vandermonde", GLUE_25); 00409 define ("-", GLUE_26); 00410 define ("square", GLUE_27); 00411 define ("+", GLUE_28); 00412 define ("-", GLUE_29); 00413 define ("*", GLUE_30); 00414 define ("+", GLUE_31); 00415 define ("+", GLUE_32); 00416 define ("-", GLUE_33); 00417 define ("-", GLUE_34); 00418 define ("*", GLUE_35); 00419 define ("*", GLUE_36); 00420 define ("*", GLUE_37); 00421 define ("*", GLUE_38); 00422 define ("=", GLUE_39); 00423 define ("!=", GLUE_40); 00424 define ("=", GLUE_41); 00425 define ("!=", GLUE_42); 00426 define ("=", GLUE_43); 00427 define ("!=", GLUE_44); 00428 define ("/", GLUE_45); 00429 define ("/", GLUE_46); 00430 define ("krylov", GLUE_47); 00431 define ("det", GLUE_48); 00432 define ("row_echelon", GLUE_49); 00433 define ("column_echelon", GLUE_50); 00434 define ("row_reduced_echelon", GLUE_51); 00435 define ("column_reduced_echelon", GLUE_52); 00436 define ("row_reduced_echelon_with_transform", GLUE_53); 00437 define ("column_reduced_echelon_with_transform", GLUE_54); 00438 define ("column_reduced_echelon_with_permutation", GLUE_55); 00439 define ("ker", GLUE_56); 00440 define ("im", GLUE_57); 00441 define ("rank", GLUE_58); 00442 define ("invert", GLUE_59); 00443 } 00444 }