19namespace layer1_foundations {
20namespace linear_algebra {
28linear_algebra::~linear_algebra()
34 int f_v = (verbose_level >= 1);
37 cout <<
"linear_algebra::init" << endl;
41 cout <<
"linear_algebra::init done" << endl;
45void linear_algebra::copy_matrix(
int *A,
int *B,
int ma,
int na)
51void linear_algebra::reverse_matrix(
int *A,
int *B,
int m,
int n)
55 for (i = 0; i < m; i++) {
56 for (j = 0; j < n; j++) {
57 B[i * n + j] = A[(m - 1 - i) * n + (n - 1 - j)];
62void linear_algebra::identity_matrix(
int *A,
int n)
66 for (i = 0; i < n; i++) {
67 for (j = 0; j < n; j++) {
78int linear_algebra::is_identity_matrix(
int *A,
int n)
82 for (i = 0; i < n; i++) {
83 for (j = 0; j < n; j++) {
85 if (A[i * n + j] != 1) {
99int linear_algebra::is_diagonal_matrix(
int *A,
int n)
106int linear_algebra::is_scalar_multiple_of_identity_matrix(
107 int *A,
int n,
int &scalar)
114 scalar = A[0 * n + 0];
115 for (i = 1; i < n; i++) {
116 if (A[i * n + i] != scalar) {
123void linear_algebra::diagonal_matrix(
int *A,
int n,
int alpha)
127 for (i = 0; i < n; i++) {
128 for (j = 0; j < n; j++) {
130 A[i * n + j] = alpha;
139void linear_algebra::matrix_minor(
int f_semilinear,
140 int *A,
int *B,
int n,
int f,
int l)
147 cout <<
"linear_algebra::matrix_minor f + l > n" << endl;
150 for (i = 0; i < l; i++) {
151 for (j = 0; j < l; j++) {
152 B[i * l + j] = A[(f + i) * n + (f + j)];
160void linear_algebra::mult_vector_from_the_left(
int *v,
161 int *A,
int *vA,
int m,
int n)
169void linear_algebra::mult_vector_from_the_right(
int *A,
170 int *v,
int *Av,
int m,
int n)
178void linear_algebra::mult_matrix_matrix(
179 int *A,
int *B,
int *C,
180 int m,
int n,
int o,
int verbose_level)
184 int f_v = (verbose_level >= 1);
185 int f_vv = (verbose_level >= 2);
189 cout <<
"linear_algebra::mult_matrix_matrix" << endl;
192 cout <<
"A=" << endl;
194 cout <<
"B=" << endl;
198 for (i = 0; i < m; i++) {
199 for (j = 0; j < o; j++) {
201 for (k = 0; k < n; k++) {
202 b =
F->
mult(A[i * n + k], B[k * o + j]);
209 cout <<
"linear_algebra::mult_matrix_matrix done" << endl;
213void linear_algebra::semilinear_matrix_mult(
int *A,
int *B,
int *AB,
int n)
216 int i, j, k, a, b, ab, c, f1, f2, f1inv;
223 f1inv = NT.
mod(-f1,
F->
e);
226 for (i = 0; i < n; i++) {
227 for (j = 0; j < n; j++) {
229 for (k = 0; k < n; k++) {
241 AB[n * n] = NT.
mod(f1 + f2,
F->
e);
246void linear_algebra::semilinear_matrix_mult_memory_given(
247 int *A,
int *B,
int *AB,
int *tmp_B,
int n,
int verbose_level)
250 int f_v = (verbose_level >= 1);
251 int f_vv = (verbose_level >= 2);
252 int i, j, k, a, b, ab, c, f1, f2, f1inv;
257 cout <<
"linear_algebra::semilinear_matrix_mult_memory_given" << endl;
262 f1inv = NT.
mod(-f1,
F->
e);
264 cout <<
"linear_algebra::semilinear_matrix_mult_memory_given f1=" << f1 << endl;
265 cout <<
"linear_algebra::semilinear_matrix_mult_memory_given f2=" << f2 << endl;
266 cout <<
"linear_algebra::semilinear_matrix_mult_memory_given f1inv=" << f1inv << endl;
271 for (i = 0; i < n; i++) {
272 for (j = 0; j < n; j++) {
274 for (k = 0; k < n; k++) {
286 AB[n * n] = NT.
mod(f1 + f2,
F->
e);
290 cout <<
"linear_algebra::semilinear_matrix_mult_memory_given done" << endl;
294void linear_algebra::matrix_mult_affine(
int *A,
int *B,
int *AB,
295 int n,
int verbose_level)
297 int f_v = (verbose_level >= 1);
298 int f_vv = (verbose_level >= 2);
303 cout <<
"linear_algebra::matrix_mult_affine" << endl;
312 cout <<
"A1=" << endl;
314 cout <<
"b1=" << endl;
316 cout <<
"A2=" << endl;
318 cout <<
"b2=" << endl;
324 cout <<
"A3=" << endl;
329 cout <<
"b3=" << endl;
334 cout <<
"b3 after adding b2=" << endl;
339 cout <<
"linear_algebra::matrix_mult_affine done" << endl;
343void linear_algebra::semilinear_matrix_mult_affine(
344 int *A,
int *B,
int *AB,
int n)
346 int f1, f2, f12, f1inv;
362 f12 = NT.
mod(f1 + f2,
F->
e);
363 f1inv = NT.
mod(
F->
e - f1,
F->
e);
378int linear_algebra::matrix_determinant(
int *A,
int n,
int verbose_level)
380 int f_v = (verbose_level >= 1);
381 int f_vv = (verbose_level >= 2);
382 int i, j, eps = 1, a, det, det1, det2;
386 cout <<
"linear_algebra::matrix_determinant" << endl;
392 cout <<
"linear_algebra::matrix_determinant determinant of " << endl;
400 for (i = 0; i < n; i++) {
401 if (Tmp[i * n + 0]) {
413 for (j = 0; j < n; j++) {
415 Tmp[0 * n + j] = Tmp[i * n + j];
424 det = Tmp[0 * n + 0];
427 for (i = 1; i < n; i++) {
436 cout <<
"linear_algebra::matrix_determinant after Gauss " << endl;
438 cout <<
"linear_algebra::matrix_determinant det= " << det << endl;
443 for (i = 1; i < n; i++) {
444 for (j = 1; j < n; j++) {
445 Tmp1[(i - 1) * (n - 1) + j - 1] = Tmp[i * n + j];
449 cout <<
"linear_algebra::matrix_determinant computing determinant of " << endl;
454 cout <<
"as " << det1 << endl;
458 det2 =
F->
mult(det, det1);
463 cout <<
"linear_algebra::matrix_determinant determinant is " << det2 << endl;
468 int *Tmp, *Tmp_basecols, *P, *perm;
469 int rk, det, i, j, eps;
476 for (i = 0; i < n; i++) {
477 for (j = 0; j < n; j++) {
486 cout <<
"before Gauss:" << endl;
487 print_integer_matrix_width(cout, Tmp, n, n, n, 2);
490 FALSE , Tmp_basecols,
491 TRUE , P, n, n, n, verbose_level - 2);
492 cout <<
"after Gauss:" << endl;
493 print_integer_matrix_width(cout, Tmp, n, n, n, 2);
494 cout <<
"P:" << endl;
495 print_integer_matrix_width(cout, P, n, n, n, 2);
500 for (i = 0; i < n; i++) {
501 for (j = 0; j < n; j++) {
508 cout <<
"permutation : ";
509 perm_print_list(cout, perm, n);
510 perm_print(cout, perm, n);
512 eps = perm_signum(perm, n);
515 for (i = 0; i < n; i++) {
516 det = mult(det, Tmp[i * n + i]);
519 det = mult(det, negate(1));
522 cout <<
"det=" << det << endl;
531 cout <<
"linear_algebra::matrix_determinant done" << endl;
535void linear_algebra::matrix_inverse(
int *A,
int *Ainv,
int n,
538 int f_v = (verbose_level >= 1);
539 int *Tmp, *Tmp_basecols;
542 cout <<
"linear_algebra::matrix_inverse" << endl;
552 cout <<
"linear_algebra::matrix_inverse done" << endl;
556void linear_algebra::matrix_invert(
int *A,
int *Tmp,
int *Tmp_basecols,
557 int *Ainv,
int n,
int verbose_level)
562 int f_v = (verbose_level >= 1);
563 int f_vv = (verbose_level >= 2);
566 cout <<
"linear_algebra::matrix_invert" << endl;
575 TRUE , Ainv, n, n, n, verbose_level - 2);
577 cout <<
"linear_algebra::matrix_invert not invertible" << endl;
578 cout <<
"input matrix:" << endl;
580 cout <<
"Tmp matrix:" << endl;
582 cout <<
"rk=" << rk << endl;
586 cout <<
"the inverse is" << endl;
590 cout <<
"linear_algebra::matrix_invert done" << endl;
594void linear_algebra::semilinear_matrix_invert(
int *A,
595 int *Tmp,
int *Tmp_basecols,
int *Ainv,
int n,
601 int f_v = (verbose_level >= 1);
602 int f_vv = (verbose_level >= 2);
606 cout <<
"linear_algebra::semilinear_matrix_invert" << endl;
610 cout <<
"frobenius: " << A[n * n] << endl;
612 matrix_invert(A, Tmp, Tmp_basecols, Ainv, n, verbose_level - 1);
615 finv = NT.
mod(-f,
F->
e);
618 cout <<
"the inverse is" << endl;
620 cout <<
"frobenius: " << Ainv[n * n] << endl;
623 cout <<
"linear_algebra::semilinear_matrix_invert done" << endl;
627void linear_algebra::semilinear_matrix_invert_affine(
int *A,
628 int *Tmp,
int *Tmp_basecols,
int *Ainv,
int n,
635 int f_v = (verbose_level >= 1);
636 int f_vv = (verbose_level >= 2);
640 cout <<
"linear_algebra::semilinear_matrix_invert_affine" << endl;
646 cout <<
" frobenius: " << A[n * n + n] << endl;
650 matrix_invert(A, Tmp, Tmp_basecols, Ainv, n, verbose_level - 1);
652 finv = NT.
mod(-f,
F->
e);
661 Ainv[n * n + n] = finv;
663 cout <<
"the inverse is" << endl;
667 cout <<
" frobenius: " << Ainv[n * n + n] << endl;
670 cout <<
"linear_algebra::semilinear_matrix_invert_affine done" << endl;
675void linear_algebra::matrix_invert_affine(
int *A,
676 int *Tmp,
int *Tmp_basecols,
int *Ainv,
int n,
682 int f_v = (verbose_level >= 1);
683 int f_vv = (verbose_level >= 2);
686 cout <<
"linear_algebra::matrix_invert_affine" << endl;
696 matrix_invert(A, Tmp, Tmp_basecols, Ainv, n, verbose_level - 1);
703 cout <<
"the inverse is" << endl;
710 cout <<
"linear_algebra::matrix_invert_affine done" << endl;
715void linear_algebra::projective_action_from_the_right(
int f_semilinear,
716 int *v,
int *A,
int *vA,
int n,
721 int f_v = (verbose_level >= 1);
724 cout <<
"linear_algebra::projective_action_from_the_right" << endl;
733 cout <<
"linear_algebra::projective_action_from_the_right done" << endl;
737void linear_algebra::general_linear_action_from_the_right(
int f_semilinear,
738 int *v,
int *A,
int *vA,
int n,
741 int f_v = (verbose_level >= 1);
744 cout <<
"linear_algebra::general_linear_action_from_the_right"
754 cout <<
"linear_algebra::general_linear_action_from_the_right done"
760void linear_algebra::semilinear_action_from_the_right(
761 int *v,
int *A,
int *vA,
int n)
771void linear_algebra::semilinear_action_from_the_left(
772 int *A,
int *v,
int *Av,
int n)
782void linear_algebra::affine_action_from_the_right(
783 int f_semilinear,
int *v,
int *A,
int *vA,
int n)
796void linear_algebra::zero_vector(
int *A,
int m)
800 for (i = 0; i < m; i++) {
805void linear_algebra::all_one_vector(
int *A,
int m)
809 for (i = 0; i < m; i++) {
814void linear_algebra::support(
int *A,
int m,
int *&support,
int &size)
820 for (i = 0; i < m; i++) {
827void linear_algebra::characteristic_vector(
int *A,
int m,
int *set,
int size)
832 for (i = 0; i < size; i++) {
837int linear_algebra::is_zero_vector(
int *A,
int m)
841 for (i = 0; i < m; i++) {
849void linear_algebra::add_vector(
int *A,
int *B,
int *C,
int m)
853 for (i = 0; i < m; i++) {
854 C[i] =
F->
add(A[i], B[i]);
858void linear_algebra::linear_combination_of_vectors(
859 int a,
int *A,
int b,
int *B,
int *C,
int len)
863 for (i = 0; i < len; i++) {
868void linear_algebra::linear_combination_of_three_vectors(
869 int a,
int *A,
int b,
int *B,
int c,
int *C,
int *D,
int len)
873 for (i = 0; i < len; i++) {
878void linear_algebra::negate_vector(
int *A,
int *B,
int m)
882 for (i = 0; i < m; i++) {
887void linear_algebra::negate_vector_in_place(
int *A,
int m)
891 for (i = 0; i < m; i++) {
896void linear_algebra::scalar_multiply_vector_in_place(
int c,
int *A,
int m)
900 for (i = 0; i < m; i++) {
901 A[i] =
F->
mult(c, A[i]);
905void linear_algebra::vector_frobenius_power_in_place(
int *A,
int m,
int f)
909 for (i = 0; i < m; i++) {
914int linear_algebra::dot_product(
int len,
int *v,
int *w)
918 for (i = 0; i < len; i++) {
919 b =
F->
mult(v[i], w[i]);
925void linear_algebra::transpose_matrix(
int *A,
int *At,
int ma,
int na)
929 for (i = 0; i < ma; i++) {
930 for (j = 0; j < na; j++) {
931 At[j * ma + i] = A[i * na + j];
936void linear_algebra::transpose_matrix_in_place(
int *A,
int m)
940 for (i = 0; i < m; i++) {
941 for (j = i + 1; j < m; j++) {
943 A[i * m + j] = A[j * m + i];
949void linear_algebra::invert_matrix(
int *A,
int *A_inv,
int n,
int verbose_level)
951 int f_v = (verbose_level >= 1);
956 cout <<
"linear_algebra::invert_matrix" << endl;
967 cout <<
"linear_algebra::invert_matrix done" << endl;
971void linear_algebra::invert_matrix_memory_given(
int *A,
int *A_inv,
int n,
972 int *tmp_A,
int *tmp_basecols,
int verbose_level)
974 int f_v = (verbose_level >= 1);
980 cout <<
"linear_algebra::invert_matrix_memory_given" << endl;
983 base_cols = tmp_basecols;
986 for (i = 0; i < n; i++) {
987 for (j = 0; j < n; j++) {
994 A_inv[i * n + j] = a;
1002 TRUE , A_inv, n, n, n, 0 );
1004 cout <<
"linear_algebra::invert_matrix "
1005 "matrix is not invertible, the rank is " << rk << endl;
1010 cout <<
"linear_algebra::invert_matrix_memory_given done" << endl;
1014void linear_algebra::transform_form_matrix(
int *A,
1015 int *Gram,
int *new_Gram,
int d,
int verbose_level)
1018 int f_v = (verbose_level >= 1);
1022 cout <<
"linear_algebra::transform_form_matrix" << endl;
1034 cout <<
"linear_algebra::transform_form_matrix done" << endl;
1038int linear_algebra::rank_of_matrix(
int *A,
int m,
int verbose_level)
1040 int f_v = (verbose_level >= 1);
1041 int *B, *base_cols, rk;
1044 cout <<
"linear_algebra::rank_of_matrix" << endl;
1050 m, B, base_cols, verbose_level);
1055 cout <<
"linear_algebra::rank_of_matrix done" << endl;
1060int linear_algebra::rank_of_matrix_memory_given(
int *A,
1061 int m,
int *B,
int *base_cols,
int verbose_level)
1063 int f_v = (verbose_level >= 1);
1064 int f_vv = (verbose_level >= 2);
1068 cout <<
"linear_algebra::rank_of_matrix_memory_given" << endl;
1074 cout <<
"the matrix ";
1079 cout <<
"has rank " << rk << endl;
1082 cout <<
"linear_algebra::rank_of_matrix_memory_given done" << endl;
1087int linear_algebra::rank_of_rectangular_matrix(
int *A,
1088 int m,
int n,
int verbose_level)
1090 int f_v = (verbose_level >= 1);
1095 cout <<
"linear_algebra::rank_of_rectangular_matrix" << endl;
1101 A, m, n, B, base_cols, verbose_level);
1106 cout <<
"linear_algebra::rank_of_rectangular_matrix done" << endl;
1111int linear_algebra::rank_of_rectangular_matrix_memory_given(
1112 int *A,
int m,
int n,
int *B,
int *base_cols,
1115 int f_v = (verbose_level >= 1);
1116 int f_vv = (verbose_level >= 2);
1120 cout <<
"linear_algebra::rank_of_rectangular_matrix_memory_given" << endl;
1129 cout <<
"the matrix ";
1134 cout <<
"has rank " << rk << endl;
1138 cout <<
"linear_algebra::rank_of_rectangular_matrix_memory_given done" << endl;
1143int linear_algebra::rank_and_basecols(
int *A,
int m,
1144 int *base_cols,
int verbose_level)
1146 int f_v = (verbose_level >= 1);
1147 int f_vv = (verbose_level >= 2);
1151 cout <<
"linear_algebra::rank_and_basecols" << endl;
1158 cout <<
"the matrix ";
1163 cout <<
"has rank " << rk << endl;
1167 cout <<
"linear_algebra::rank_and_basecols done" << endl;
1172void linear_algebra::Gauss_step(
int *v1,
int *v2,
1173 int len,
int idx,
int verbose_level)
1178 int f_v = (verbose_level >= 1);
1182 cout <<
"linear_algebra::Gauss_step" << endl;
1185 cout <<
"before:" << endl;
1190 cout <<
"pivot column " << idx << endl;
1197 for (i = 0; i < len; i++) {
1206 for (i = 0; i < len; i++) {
1207 v2[i] =
F->
add(
F->
mult(v1[i], a), v2[i]);
1211 cout <<
"linear_algebra::Gauss_step after:" << endl;
1218 cout <<
"linear_algebra::Gauss_step done" << endl;
1222void linear_algebra::Gauss_step_make_pivot_one(
int *v1,
int *v2,
1223 int len,
int idx,
int verbose_level)
1228 int f_v = (verbose_level >= 1);
1232 cout <<
"linear_algebra::Gauss_step_make_pivot_one" << endl;
1235 cout <<
"before:" << endl;
1240 cout <<
"pivot column " << idx << endl;
1247 for (i = 0; i < len; i++) {
1256 for (i = 0; i < len; i++) {
1257 v2[i] =
F->
add(
F->
mult(v1[i], a), v2[i]);
1261 cout <<
"linear_algebra::Gauss_step_make_pivot_one after: v1[idx] == 0" << endl;
1267 for (i = 0; i < len; i++) {
1268 v1[i] =
F->
mult(av, v1[i]);
1272 cout <<
"linear_algebra::Gauss_step_make_pivot_one after:" << endl;
1279 cout <<
"linear_algebra::Gauss_step_make_pivot_one done" << endl;
1283void linear_algebra::extend_basis(
int m,
int n,
int *Basis,
1290 int f_v = (verbose_level >= 1);
1298 cout <<
"linear_algebra::extend_basis" << endl;
1301 cout <<
"matrix:" << endl;
1311 base_cols, embedding, verbose_level);
1313 cout <<
"linear_algebra::extend_basis rk != m" << endl;
1316 for (i = rk; i < n; i++) {
1317 j = embedding[i - rk];
1318 Basis[i * n + j] = 1;
1325 cout <<
"linear_algebra::extend_basis done" << endl;
1329int linear_algebra::base_cols_and_embedding(
int m,
int n,
int *A,
1330 int *base_cols,
int *embedding,
int verbose_level)
1335 int f_v = (verbose_level >= 1);
1342 cout <<
"linear_algebra::base_cols_and_embedding" << endl;
1345 cout <<
"matrix A:" << endl;
1350 rk =
Gauss_simple(B, m, n, base_cols, verbose_level - 3);
1352 for (i = 0; i < n; i++) {
1358 cout <<
"j != n - rk" << endl;
1359 cout <<
"j=" << j << endl;
1360 cout <<
"rk=" << rk << endl;
1361 cout <<
"n=" << n << endl;
1365 cout <<
"linear_algebra::base_cols_and_embedding" << endl;
1366 cout <<
"rk=" << rk << endl;
1367 cout <<
"base_cols:" << endl;
1370 cout <<
"embedding:" << endl;
1376 cout <<
"linear_algebra::base_cols_and_embedding done" << endl;
1381int linear_algebra::Gauss_easy(
int *A,
int m,
int n)
1392int linear_algebra::Gauss_easy_memory_given(
int *A,
1393 int m,
int n,
int *base_cols)
1404int linear_algebra::Gauss_simple(
int *A,
int m,
int n,
1405 int *base_cols,
int verbose_level)
1409 int f_v = (verbose_level >= 1);
1413 cout <<
"linear_algebra::Gauss_simple before Gauss_int" << endl;
1416 FALSE, NULL, m, n, n, verbose_level);
1418 cout <<
"linear_algebra::Gauss_simple after Gauss_int" << endl;
1423void linear_algebra::kernel_columns(
int n,
int nb_base_cols,
1424 int *base_cols,
int *kernel_cols)
1431 for (i = 0; i < n; i++) {
1432 if (j < nb_base_cols && i == base_cols[j]) {
1436 kernel_cols[k++] = i;
1441void linear_algebra::matrix_get_kernel_as_int_matrix(
int *M,
1442 int m,
int n,
int *base_cols,
int nb_base_cols,
1445 int f_v = (verbose_level >= 1);
1447 int kernel_m, kernel_n;
1450 cout <<
"linear_algebra::matrix_get_kernel_as_int_matrix" << endl;
1452 K =
NEW_int(n * (n - nb_base_cols));
1454 kernel_m, kernel_n, K, verbose_level);
1458 cout <<
"linear_algebra::matrix_get_kernel_as_int_matrix done" << endl;
1462void linear_algebra::matrix_get_kernel(
int *M,
1463 int m,
int n,
int *base_cols,
int nb_base_cols,
1464 int &kernel_m,
int &kernel_n,
int *kernel,
int verbose_level)
1468 int f_v = (verbose_level >= 1);
1469 int r, k, i, j, ii, iii, a, b;
1474 cout <<
"linear_algebra::matrix_get_kernel" << endl;
1476 if (kernel == NULL) {
1477 cout <<
"linear_algebra::matrix_get_kernel kernel == NULL" << endl;
1496 for (i = 0; i < n; i++) {
1512 cout <<
"linear_algebra::matrix_get_kernel ii != k" << endl;
1524 for (i = 0; i < n; i++) {
1526 for (iii = 0; iii < k; iii++) {
1528 kernel[i * kernel_n + iii] = M[j * n + a];
1539 for (iii = 0; iii < k; iii++) {
1541 kernel[i * kernel_n + iii] = m_one;
1544 kernel[i * kernel_n + iii] = 0;
1551 cout <<
"linear_algebra::matrix_get_kernel done" << endl;
1556int linear_algebra::perp(
int n,
int k,
int *A,
int *Gram,
int verbose_level)
1558 int f_v = (verbose_level >= 1);
1563 int kernel_m, kernel_n, i, j;
1566 cout <<
"linear_algebra::perp" << endl;
1575 FALSE , NULL , k, n, n,
1578 if (nb_base_cols != k) {
1579 cout <<
"linear_algebra::perp nb_base_cols != k" << endl;
1580 cout <<
"need to copy B back to A to be safe." << endl;
1585 kernel_m, kernel_n, K, 0 );
1587 for (j = 0; j < kernel_n; j++) {
1588 for (i = 0; i < n; i++) {
1589 A[(k + j) * n + i] = K[i * kernel_n + j];
1598 cout <<
"linear_algebra::perp done" << endl;
1600 return nb_base_cols;
1603int linear_algebra::RREF_and_kernel(
int n,
int k,
1604 int *A,
int verbose_level)
1606 int f_v = (verbose_level >= 1);
1611 int kernel_m, kernel_n, i, j, m;
1614 cout <<
"linear_algebra::RREF_and_kernel n=" << n
1615 <<
" k=" << k << endl;
1632 cout <<
"linear_algebra::RREF_and_kernel before Gauss_int" << endl;
1636 FALSE , NULL , k, n, n, 0 );
1638 cout <<
"linear_algebra::RREF_and_kernel after Gauss_int, "
1639 "rank = " << nb_base_cols << endl;
1643 cout <<
"linear_algebra::RREF_and_kernel "
1644 "before matrix_get_kernel" << endl;
1647 kernel_m, kernel_n, K, 0 );
1648 for (j = 0; j < kernel_n; j++) {
1649 for (i = 0; i < n; i++) {
1650 A[(nb_base_cols + j) * n + i] = K[i * kernel_n + j];
1659 cout <<
"linear_algebra::RREF_and_kernel done" << endl;
1661 return nb_base_cols;
1664int linear_algebra::perp_standard(
int n,
int k,
1665 int *A,
int verbose_level)
1667 int f_v = (verbose_level >= 1);
1674 cout <<
"linear_algebra::perp_standard" << endl;
1686 cout <<
"linear_algebra::perp_standard done" << endl;
1688 return nb_base_cols;
1691int linear_algebra::perp_standard_with_temporary_data(
1692 int n,
int k,
int *A,
1693 int *B,
int *K,
int *base_cols,
1696 int f_v = (verbose_level >= 1);
1701 int kernel_m, kernel_n, i, j;
1704 cout <<
"linear_algebra::perp_standard_temporary_data" << endl;
1712 cout <<
"linear_algebra::perp_standard_temporary_data" << endl;
1713 cout <<
"B=" << endl;
1715 cout <<
"finite_field::perp_standard_temporary_data before Gauss_int" << endl;
1719 FALSE , NULL , k, n, n,
1722 cout <<
"linear_algebra::perp_standard_temporary_data after Gauss_int" << endl;
1725 kernel_m, kernel_n, K, 0 );
1727 cout <<
"linear_algebra::perp_standard_temporary_data "
1728 "after matrix_get_kernel" << endl;
1729 cout <<
"kernel_m = " << kernel_m << endl;
1730 cout <<
"kernel_n = " << kernel_n << endl;
1735 for (j = 0; j < kernel_n; j++) {
1736 for (i = 0; i < n; i++) {
1737 A[(nb_base_cols + j) * n + i] = K[i * kernel_n + j];
1741 cout <<
"linear_algebra::perp_standard_temporary_data" << endl;
1742 cout <<
"A=" << endl;
1751 cout <<
"linear_algebra::perp_standard_temporary_data done" << endl;
1753 return nb_base_cols;
1756int linear_algebra::intersect_subspaces(
int n,
int k1,
1757 int *A,
int k2,
int *B,
1758 int &k3,
int *intersection,
int verbose_level)
1760 int f_v = (verbose_level >= 1);
1761 int *AA, *BB, *CC, r1, r2, r3;
1774 cout <<
"linear_algebra::intersect_subspaces AA=" << endl;
1778 AA, B1, K, base_cols, 0);
1780 cout <<
"linear_algebra::intersect_subspaces AA=" << endl;
1784 cout <<
"linear_algebra::intersect_subspaces not a base, "
1785 "rank is too small" << endl;
1786 cout <<
"k1=" << k1 << endl;
1787 cout <<
"r1=" << r1 << endl;
1791 cout <<
"linear_algebra::intersect_subspaces BB=" << endl;
1796 cout <<
"linear_algebra::intersect_subspaces BB=" << endl;
1800 cout <<
"linear_algebra::intersect_subspaces not a base, "
1801 "rank is too small" << endl;
1802 cout <<
"k2=" << k2 << endl;
1803 cout <<
"r2=" << r2 << endl;
1809 Int_vec_copy(BB + k2 * n, CC + (n - k1) * n, (n - k2) * n);
1810 k3 = (n - k1) + (n - k2);
1812 cout <<
"linear_algebra::intersect_subspaces CC=" << endl;
1814 cout <<
"k3=" << k3 << endl;
1830 cout <<
"linear_algebra::intersect_subspaces n=" << n
1831 <<
" dim A =" << r1 <<
" dim B =" << r2
1832 <<
" dim intersection =" << n - r3 << endl;
1839int linear_algebra::n_choose_k_mod_p(
int n,
int k,
int verbose_level)
1841 int f_v = (verbose_level >= 1);
1842 int f_vv = (verbose_level >= 2);
1843 int n1, k1, c, cc = 0, cv, c1 = 1, c2 = 1, i;
1851 for (i = 0; i < k1; i++) {
1852 c1 =
F->
mult(c1, (n1 - i) %
F->
p);
1853 c2 =
F->
mult(c2, (1 + i) %
F->
p);
1857 cc =
F->
mult(c1, cv);
1860 cout <<
"{" << n1 <<
"\\atop " << k1 <<
"} mod "
1861 <<
F->
p <<
" = " << cc << endl;
1864 n = (n - n1) /
F->
p;
1865 k = (k - k1) /
F->
p;
1868 cout <<
"{" << n <<
"\\atop " << k <<
"} mod "
1869 <<
F->
p <<
" = " << endl;
1875void linear_algebra::Dickson_polynomial(
int *map,
int *coeffs)
1887 for (i = 1; i <=
F->
q - 2; i++) {
1889 for (x = 1; x <
F->
q; x++) {
1892 a =
F->
mult(map[x], xi);
1900 for (x = 0; x <
F->
q; x++) {
1901 c =
F->
add(c, map[x]);
1906void linear_algebra::projective_action_on_columns_from_the_left(
1907 int *A,
int *M,
int m,
int n,
int *perm,
1910 int f_v = (verbose_level >= 1);
1911 int f_vv = (verbose_level >= 2);
1918 cout <<
"linear_algebra::projective_action_on_columns_from_the_left" << endl;
1921 cout <<
"A:" << endl;
1926 cout <<
"M:" << endl;
1932 for (j = 0; j < n; j++) {
1937 cout <<
"A*M:" << endl;
1941 for (i = 0; i < n; i++) {
1943 for (j = 0; j < n; j++) {
1951 cout <<
"linear_algebra::projective_action_on_columns_"
1952 "from_the_left could not find image" << endl;
1953 cout <<
"i=" << i << endl;
1954 cout <<
"M:" << endl;
1956 cout <<
"A * M:" << endl;
1971int linear_algebra::evaluate_bilinear_form(
int n,
1972 int *v1,
int *v2,
int *Gram)
1983int linear_algebra::evaluate_standard_hyperbolic_bilinear_form(
1984 int n,
int *v1,
int *v2)
1989 cout <<
"linear_algebra::evaluate_standard_hyperbolic_bilinear_form "
1990 "n must be even" << endl;
1995 for (i = 0; i < n2; i++) {
1996 a =
F->
mult(v1[2 * i + 0], v2[2 * i + 1]);
1997 b =
F->
mult(v1[2 * i + 1], v2[2 * i + 0]);
2004int linear_algebra::evaluate_quadratic_form(
int n,
int nb_terms,
2005 int *i,
int *j,
int *coeff,
int *x)
2007 int k, xi, xj, a, c, d;
2010 for (k = 0; k < nb_terms; k++) {
2020void linear_algebra::find_singular_vector_brute_force(
int n,
2022 int *form_i,
int *form_j,
int *form_coeff,
int *Gram,
2023 int *vec,
int verbose_level)
2025 int f_v = (verbose_level >= 1);
2031 cout <<
"linear_algebra::find_singular_vector_brute_force" << endl;
2035 for (i = 2; i < N; i++) {
2038 form_i, form_j, form_coeff, v1);
2043 cout <<
"form value a=" << a << endl;
2050 cout <<
"linear_algebra::find_singular_vector_brute_force "
2051 "did not find a singular vector" << endl;
2058void linear_algebra::find_singular_vector(
int n,
int form_nb_terms,
2059 int *form_i,
int *form_j,
int *form_coeff,
int *Gram,
2060 int *vec,
int verbose_level)
2062 int f_v = (verbose_level >= 1);
2063 int f_vv = (verbose_level >= 2);
2064 int a, b, c, d, r3, x, y, i, k3;
2065 int *v1, *v2, *v3, *v2_coords, *v3_coords, *intersection;
2069 cout <<
"linear_algebra::find_singular_vector" << endl;
2072 cout <<
"linear_algebra::find_singular_vector n < 3" << endl;
2080 intersection =
NEW_int(n * n);
2085 form_i, form_j, form_coeff, v1);
2090 cout <<
"form value a=" << a << endl;
2096 perp(n, 1, v1, Gram, 0 );
2098 cout <<
"v1 perp:" << endl;
2105 form_i, form_j, form_coeff, v2);
2107 cout <<
"vector v2=";
2110 cout <<
"form value b=" << b << endl;
2116 perp(n, 1, v2, Gram, 0 );
2118 cout <<
"v2 perp:" << endl;
2122 k3, intersection, verbose_level);
2124 cout <<
"intersection has dimension " << r3 << endl;
2128 cout <<
"r3 = " << r3 <<
" should be " << n - 2 << endl;
2135 form_i, form_j, form_coeff, v3);
2140 cout <<
"form value c=" << c << endl;
2147 cout <<
"calling abc2xy" << endl;
2148 cout <<
"a=" << a << endl;
2149 cout <<
"b=" << b << endl;
2150 cout <<
"c=" <<
F->
negate(c) << endl;
2154 cout <<
"x=" << x << endl;
2155 cout <<
"y=" << y << endl;
2159 for (i = 0; i < n; i++) {
2160 vec[i] =
F->
add(
F->
add(v1[i], v2[i]), v3[i]);
2163 cout <<
"singular vector vec=";
2168 form_i, form_j, form_coeff, vec);
2170 cout <<
"is non-singular, error! d=" << d << endl;
2171 cout <<
"singular vector vec=";
2184 cout <<
"linear_algebra::find_singular_vector done" << endl;
2188void linear_algebra::complete_hyperbolic_pair(
2189 int n,
int form_nb_terms,
2190 int *form_i,
int *form_j,
int *form_coeff,
int *Gram,
2191 int *vec1,
int *vec2,
int verbose_level)
2193 int f_v = (verbose_level >= 1);
2194 int f_vv = (verbose_level >= 2);
2202 cout <<
"linear_algebra::complete_hyperbolic_pair" << endl;
2208 cout <<
"Gram=" << endl;
2219 for (i = n - 1; i >= 0; i--) {
2226 cout <<
"linear_algebra::complete_hyperbolic_pair i == -1" << endl;
2233 N = nb_AG_elements(n, q);
2235 cout <<
"number of elements in AG(" << n <<
","
2236 << q <<
")=" << N << endl;
2238 for (i = 1; i < N; i++) {
2240 cout <<
"unranking vector " << i <<
" / "
2241 << N <<
" in the affine geometry" << endl;
2243 AG_element_unrank(q, v1, 1, n, i);
2246 int_vec_print(cout, v1, n);
2251 cout <<
"i=" << i <<
" trying vector ";
2252 int_vec_print(cout, v1, n);
2253 cout <<
" form value a=" << a << endl;
2259 cout <<
"linear_algebra::complete_hyperbolic_pair "
2260 "did not find a vector whose dot product is non-zero " << endl;
2268 cout <<
"normalized ";
2273 form_i, form_j, form_coeff, v1);
2275 for (i = 0; i < n; i++) {
2276 vec2[i] =
F->
add(
F->
mult(b, vec1[i]), v1[i]);
2279 cout <<
"linear_algebra::complete_hyperbolic_pair" << endl;
2286 cout <<
"dot product is not 1, error" << endl;
2287 cout <<
"c=" << c << endl;
2298 cout <<
"linear_algebra::complete_hyperbolic_pair done" << endl;
2303void linear_algebra::find_hyperbolic_pair(
int n,
int form_nb_terms,
2304 int *form_i,
int *form_j,
int *form_coeff,
int *Gram,
2305 int *vec1,
int *vec2,
int verbose_level)
2307 int f_v = (verbose_level >= 1);
2308 int f_vv = (verbose_level >= 2);
2311 cout <<
"linear_algebra::find_hyperbolic_pair" << endl;
2315 form_i, form_j, form_coeff, Gram,
2316 vec1, verbose_level);
2320 form_i, form_j, form_coeff, Gram,
2321 vec1, verbose_level);
2324 cout <<
"linear_algebra::find_hyperbolic_pair, "
2325 "found singular vector" << endl;
2328 cout <<
"calling complete_hyperbolic_pair" << endl;
2331 form_i, form_j, form_coeff, Gram,
2332 vec1, vec2, verbose_level);
2334 cout <<
"linear_algebra::find_hyperbolic_pair done" << endl;
2338void linear_algebra::restrict_quadratic_form_list_coding(
2339 int k,
int n,
int *basis,
2340 int form_nb_terms,
int *form_i,
int *form_j,
int *form_coeff,
2341 int &restricted_form_nb_terms,
int *&restricted_form_i,
2342 int *&restricted_form_j,
int *&restricted_form_coeff,
2345 int f_v = (verbose_level >= 1);
2346 int f_vv = (verbose_level >= 2);
2347 int *C, *D, h, i, j, c;
2350 cout <<
"linear_algebra::restrict_quadratic_form_list_coding" << endl;
2355 for (h = 0; h < form_nb_terms; h++) {
2362 cout <<
"linear_algebra::restrict_quadratic_form_list_coding "
2368 cout <<
"linear_algebra::restrict_quadratic_form_list_coding "
2372 restricted_form_nb_terms = 0;
2373 restricted_form_i =
NEW_int(k * k);
2374 restricted_form_j =
NEW_int(k * k);
2375 restricted_form_coeff =
NEW_int(k * k);
2376 for (i = 0; i < k; i++) {
2377 for (j = 0; j < k; j++) {
2382 restricted_form_i[restricted_form_nb_terms] = i;
2383 restricted_form_j[restricted_form_nb_terms] = j;
2384 restricted_form_coeff[restricted_form_nb_terms] = c;
2385 restricted_form_nb_terms++;
2391 cout <<
"linear_algebra::restrict_quadratic_form_list_coding done" << endl;
2395void linear_algebra::restrict_quadratic_form(
int k,
int n,
2396 int *basis,
int *C,
int *D,
2399 int f_v = (verbose_level >= 1);
2400 int f_vv = (verbose_level >= 2);
2401 int i, j, lambda, mu, a1, a2, d, c;
2404 cout <<
"linear_algebra::restrict_quadratic_form" << endl;
2407 cout <<
"linear_algebra::restrict_quadratic_form" << endl;
2411 for (lambda = 0; lambda < k; lambda++) {
2412 for (mu = 0; mu < k; mu++) {
2414 for (i = 0; i < n; i++) {
2415 for (j = i; j < n; j++) {
2416 a1 = basis[lambda * n + i];
2417 a2 = basis[mu * n + j];
2423 D[mu * k + lambda] =
F->
add(D[mu * k + lambda], d);
2426 D[lambda * k + mu] =
F->
add(D[lambda * k + mu], d);
2434 cout <<
"linear_algebra::restrict_quadratic_form" << endl;
2438int linear_algebra::compare_subspaces_ranked(
2439 int *set1,
int *set2,
int size,
2440 int vector_space_dimension,
int verbose_level)
2445 int f_v = (verbose_level >= 1);
2446 int f_vv = (verbose_level >= 2);
2455 cout <<
"linear_algebra::compare_subspaces_ranked" << endl;
2458 cout <<
"linear_algebra::compare_subspaces_ranked" << endl;
2466 M1 =
NEW_int(size * vector_space_dimension);
2467 M2 =
NEW_int(size * vector_space_dimension);
2468 base_cols1 =
NEW_int(vector_space_dimension);
2469 base_cols2 =
NEW_int(vector_space_dimension);
2470 for (i = 0; i < size; i++) {
2472 M1 + i * vector_space_dimension,
2473 1, vector_space_dimension, set1[i]);
2475 M2 + i * vector_space_dimension,
2476 1, vector_space_dimension, set2[i]);
2479 cout <<
"matrix1:" << endl;
2481 vector_space_dimension, vector_space_dimension,
F->
log10_of_q);
2482 cout <<
"matrix2:" << endl;
2484 vector_space_dimension, vector_space_dimension,
F->
log10_of_q);
2491 cout <<
"after Gauss" << endl;
2492 cout <<
"matrix1:" << endl;
2494 vector_space_dimension, vector_space_dimension,
F->
log10_of_q);
2495 cout <<
"rank1=" << rk1 << endl;
2496 cout <<
"base_cols1: ";
2499 cout <<
"matrix2:" << endl;
2501 vector_space_dimension, vector_space_dimension,
F->
log10_of_q);
2502 cout <<
"rank2=" << rk2 << endl;
2503 cout <<
"base_cols2: ";
2509 cout <<
"the ranks differ, so the subspaces are not equal, "
2510 "we return 1" << endl;
2515 for (i = 0; i < rk1; i++) {
2516 if (base_cols1[i] != base_cols2[i]) {
2518 cout <<
"the base_cols differ in entry " << i
2519 <<
", so the subspaces are not equal, "
2520 "we return 1" << endl;
2526 for (i = 0; i < size * vector_space_dimension; i++) {
2527 if (M1[i] != M2[i]) {
2529 cout <<
"the matrices differ in entry " << i
2530 <<
", so the subspaces are not equal, "
2531 "we return 1" << endl;
2538 cout <<
"the subspaces are equal, we return 0" << endl;
2547 cout <<
"linear_algebra::compare_subspaces_ranked done" << endl;
2552int linear_algebra::compare_subspaces_ranked_with_unrank_function(
2553 int *set1,
int *set2,
int size,
2554 int vector_space_dimension,
2555 void (*unrank_point_func)(
int *v,
int rk,
void *data),
2556 void *rank_point_data,
2562 int f_v = (verbose_level >= 1);
2563 int f_vv = (verbose_level >= 2);
2572 cout <<
"linear_algebra::compare_subspaces_ranked_with_unrank_function" << endl;
2575 cout <<
"linear_algebra::compare_subspaces_ranked_with_unrank_function" << endl;
2583 M1 =
NEW_int(size * vector_space_dimension);
2584 M2 =
NEW_int(size * vector_space_dimension);
2585 base_cols1 =
NEW_int(vector_space_dimension);
2586 base_cols2 =
NEW_int(vector_space_dimension);
2587 for (i = 0; i < size; i++) {
2588 (*unrank_point_func)(M1 + i * vector_space_dimension,
2589 set1[i], rank_point_data);
2590 (*unrank_point_func)(M2 + i * vector_space_dimension,
2591 set2[i], rank_point_data);
2593 PG_element_unrank_modified(*
this, M1 + i * vector_space_dimension,
2594 1, vector_space_dimension, set1[i]);
2595 PG_element_unrank_modified(*
this, M2 + i * vector_space_dimension,
2596 1, vector_space_dimension, set2[i]);
2600 cout <<
"matrix1:" << endl;
2602 vector_space_dimension, vector_space_dimension,
2604 cout <<
"matrix2:" << endl;
2606 vector_space_dimension, vector_space_dimension,
2610 vector_space_dimension, base_cols1,
2613 vector_space_dimension, base_cols2,
2616 cout <<
"after Gauss" << endl;
2617 cout <<
"matrix1:" << endl;
2619 vector_space_dimension, vector_space_dimension,
2621 cout <<
"rank1=" << rk1 << endl;
2622 cout <<
"base_cols1: ";
2625 cout <<
"matrix2:" << endl;
2627 vector_space_dimension, vector_space_dimension,
2629 cout <<
"rank2=" << rk2 << endl;
2630 cout <<
"base_cols2: ";
2636 cout <<
"the ranks differ, so the subspaces are not equal, "
2637 "we return 1" << endl;
2642 for (i = 0; i < rk1; i++) {
2643 if (base_cols1[i] != base_cols2[i]) {
2645 cout <<
"the base_cols differ in entry " << i
2646 <<
", so the subspaces are not equal, "
2647 "we return 1" << endl;
2653 for (i = 0; i < size * vector_space_dimension; i++) {
2654 if (M1[i] != M2[i]) {
2656 cout <<
"the matrices differ in entry " << i
2657 <<
", so the subspaces are not equal, "
2658 "we return 1" << endl;
2665 cout <<
"the subspaces are equal, we return 0" << endl;
2674 cout <<
"linear_algebra::compare_subspaces_ranked_with_unrank_function done" << endl;
2679int linear_algebra::Gauss_canonical_form_ranked(
2680 int *set1,
int *set2,
int size,
2681 int vector_space_dimension,
int verbose_level)
2686 int f_v = (verbose_level >= 1);
2687 int f_vv = (verbose_level >= 2);
2694 cout <<
"linear_algebra::Gauss_canonical_form_ranked" << endl;
2697 cout <<
"linear_algebra::Gauss_canonical_form_ranked" << endl;
2702 M =
NEW_int(size * vector_space_dimension);
2703 base_cols =
NEW_int(vector_space_dimension);
2704 for (i = 0; i < size; i++) {
2706 M + i * vector_space_dimension,
2707 1, vector_space_dimension,
2711 cout <<
"matrix:" << endl;
2713 vector_space_dimension, vector_space_dimension,
2717 vector_space_dimension, base_cols,
2720 cout <<
"after Gauss" << endl;
2721 cout <<
"matrix:" << endl;
2723 vector_space_dimension, vector_space_dimension,
2725 cout <<
"rank=" << rk << endl;
2726 cout <<
"base_cols: ";
2731 for (i = 0; i < rk; i++) {
2733 M + i * vector_space_dimension,
2734 1, vector_space_dimension,
2742 cout <<
"linear_algebra::Gauss_canonical_form_ranked done" << endl;
2748int linear_algebra::lexleast_canonical_form_ranked(
2749 int *set1,
int *set2,
int size,
2750 int vector_space_dimension,
int verbose_level)
2756 int f_v = (verbose_level >= 1);
2757 int f_vv = (verbose_level >= 2);
2765 int *list_of_ranks_PG;
2766 int *list_of_ranks_PG_sorted;
2769 int i, j, h, N, a, sz, Sz;
2776 cout <<
"linear_algebra::lexleast_canonical_form_ranked" << endl;
2779 cout <<
"linear_algebra::lexleast_canonical_form_ranked" << endl;
2784 tmp =
NEW_int(vector_space_dimension);
2785 M1 =
NEW_int(size * vector_space_dimension);
2786 base_cols =
NEW_int(vector_space_dimension);
2787 for (i = 0; i < size; i++) {
2789 1, vector_space_dimension, set1[i]);
2792 cout <<
"matrix:" << endl;
2794 vector_space_dimension, vector_space_dimension,
2803 cout <<
"after Gauss" << endl;
2804 cout <<
"matrix:" << endl;
2806 vector_space_dimension, vector_space_dimension,
2808 cout <<
"rank=" << rk << endl;
2809 cout <<
"base_cols: ";
2814 M2 =
NEW_int(N * vector_space_dimension);
2816 list_of_ranks_PG =
NEW_int(N);
2817 list_of_ranks_PG_sorted =
NEW_int(N);
2820 list_of_ranks_PG[0] = -1;
2821 for (a = 0; a < N; a++) {
2824 1, rk, vector_space_dimension,
2827 vector_space_dimension);
2832 M2 + a * vector_space_dimension, 1,
2833 vector_space_dimension, list_of_ranks_PG[a]);
2835 size_list, list_of_ranks_PG[a], idx)) {
2836 for (h = size_list; h > idx; h--) {
2837 list_of_ranks_PG_sorted[h] = list_of_ranks_PG_sorted[h - 1];
2839 list_of_ranks_PG_sorted[idx] = list_of_ranks_PG[a];
2844 cout <<
"expanded matrix with all elements in the space:" << endl;
2846 vector_space_dimension, vector_space_dimension,
2848 cout <<
"list_of_ranks:" << endl;
2851 cout <<
"list_of_ranks_PG:" << endl;
2854 cout <<
"list_of_ranks_PG_sorted:" << endl;
2858 f_allowed =
NEW_int(size_list);
2859 for (i = 0; i < size_list; i++) {
2860 f_allowed[i] =
TRUE;
2864 for (i = 0; i < rk; i++) {
2866 cout <<
"step " << i <<
" ";
2867 cout <<
" list_of_ranks_PG_sorted=";
2870 cout <<
"f_allowed=";
2874 for (a = 0; a < size_list; a++) {
2880 cout <<
"choosing a=" << a <<
" list_of_ranks_PG_sorted[a]="
2881 << list_of_ranks_PG_sorted[a] << endl;
2883 basis_vectors[i] = list_of_ranks_PG_sorted[a];
2885 1, vector_space_dimension, basis_vectors[i]);
2888 cout <<
"step " << i
2889 <<
" basis_vector=" << basis_vectors[i] <<
" : ";
2891 vector_space_dimension);
2892 cout <<
" sz=" << sz <<
" Sz=" << Sz << endl;
2894 for (h = 0; h < size_list; h++) {
2895 if (list_of_ranks_PG_sorted[h] == basis_vectors[i]) {
2897 cout <<
"disallowing " << h << endl;
2899 f_allowed[h] =
FALSE;
2903 for (j = sz; j < Sz; j++) {
2906 cout <<
"j=" << j <<
" v=";
2911 for (h = 0; h < i + 1; h++) {
2916 int_vec_print(cout, w, i + 1);
2921 vector_space_dimension,
2929 vector_space_dimension, a);
2931 cout <<
"has rank " << a << endl;
2933 for (h = 0; h < size_list; h++) {
2934 if (list_of_ranks_PG_sorted[h] == a) {
2936 cout <<
"disallowing " << h << endl;
2938 f_allowed[h] =
FALSE;
2946 cout <<
"basis_vectors by rank: ";
2951 cout <<
"basis_vectors by coordinates: " << endl;
2953 vector_space_dimension, vector_space_dimension,
2958 for (i = 0; i < rk; i++) {
2960 1, vector_space_dimension, set2[i]);
2963 cout <<
"basis_vectors by rank again (double check): ";
2981 cout <<
"linear_algebra::lexleast_canonical_form_ranked done" << endl;
2987void linear_algebra::exterior_square(
int *An,
int *An2,
int n,
int verbose_level)
2989 int f_v = (verbose_level >= 1);
2993 cout <<
"linear_algebra::exterior_square" << endl;
2995 int i, j, k, l, ij, kl;
2996 int aki, alj, akj, ali;
3002 cout <<
"linear_algebra::exterior_square input matrix:" << endl;
3007 n2 = (n * (n - 1)) >> 1;
3009 for (i = 0; i < n; i++) {
3010 for (j = i + 1; j < n; j++) {
3011 ij = Combi.
ij2k(i, j, n);
3014 for (k = 0; k < n; k++) {
3015 for (l = k + 1; l < n; l++) {
3016 kl = Combi.
ij2k(k, l, n);
3022 aki = An[k * n + i];
3023 alj = An[l * n + j];
3024 akj = An[k * n + j];
3025 ali = An[l * n + i];
3028 aki = An[i * n + k];
3029 alj = An[j * n + l];
3030 akj = An[j * n + k];
3031 ali = An[i * n + l];
3033 u =
F->
mult(aki, alj);
3034 v =
F->
mult(akj, ali);
3039 An2[ij * n2 + kl] = w;
3046 cout <<
"linear_algebra::exterior_square output matrix:" << endl;
3051 cout <<
"linear_algebra::exterior_square done" << endl;
3055void linear_algebra::lift_to_Klein_quadric(
int *A4,
int *A6,
int verbose_level)
3057 int f_v = (verbose_level >= 1);
3061 cout <<
"linear_algebra::lift_to_Klein_quadric" << endl;
3079 for (i = 0; i < 6; i++) {
3084 for (i = 0; i < 6; i++) {
3088 cout <<
"linear_algebra::lift_to_Klein_quadric" << endl;
global functions related to finite fields, irreducible polynomials and such
int is_diagonal_matrix(int *A, int n)
a collection of combinatorial functions
void perm_print_with_cycle_length(std::ostream &ost, int *a, int n)
int ij2k(int i, int j, int n)
void allocate_and_init(int m, int n, int *Mtx)
void complement(int *v, int n, int k)
a collection of functions related to sorted vectors
int int_vec_compare_stride(int *p, int *q, int len, int stride)
int int_vec_search(int *v, int len, int a, int &idx)
void PG_element_rank_modified(int *v, int stride, int len, int &a)
void PG_element_normalize_from_front(int *v, int stride, int len)
void PG_element_unrank_modified(int *v, int stride, int len, int a)
int frobenius_power(int a, int frob_power)
int add3(int i1, int i2, int i3)
void klein_to_wedge(int *K, int *W)
long int nb_calls_to_mult_matrix_matrix
void abc2xy(int a, int b, int c, int &x, int &y, int verbose_level)
void wedge_to_klein(int *W, int *K)
various functions related to geometries
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
long int nb_AG_elements(int n, int q)
long int AG_element_rank(int q, int *v, int stride, int len)
linear algebra over a finite field
void mult_vector_from_the_left(int *v, int *A, int *vA, int m, int n)
void find_singular_vector_brute_force(int n, int form_nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram, int *vec, int verbose_level)
field_theory::finite_field * F
void find_singular_vector(int n, int form_nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram, int *vec, int verbose_level)
int rank_of_rectangular_matrix_memory_given(int *A, int m, int n, int *B, int *base_cols, int verbose_level)
void exterior_square(int *An, int *An2, int n, int verbose_level)
int rank_of_matrix_memory_given(int *A, int m, int *B, int *base_cols, int verbose_level)
void scalar_multiply_vector_in_place(int c, int *A, int m)
int Gauss_int(int *A, int f_special, int f_complete, int *base_cols, int f_P, int *P, int m, int n, int Pn, int verbose_level)
void support(int *A, int m, int *&support, int &size)
int matrix_determinant(int *A, int n, int verbose_level)
void complete_hyperbolic_pair(int n, int form_nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram, int *vec1, int *vec2, int verbose_level)
void identity_matrix(int *A, int n)
int base_cols_and_embedding(int m, int n, int *A, int *base_cols, int *embedding, int verbose_level)
void transpose_matrix(int *A, int *At, int ma, int na)
void mult_matrix_matrix(int *A, int *B, int *C, int m, int n, int o, int verbose_level)
int Gauss_easy(int *A, int m, int n)
void mult_vector_from_the_right(int *A, int *v, int *Av, int m, int n)
void invert_matrix_memory_given(int *A, int *A_inv, int n, int *tmp_A, int *tmp_basecols, int verbose_level)
int perp_standard_with_temporary_data(int n, int k, int *A, int *B, int *K, int *base_cols, int verbose_level)
int perp(int n, int k, int *A, int *Gram, int verbose_level)
int evaluate_quadratic_form(int n, int nb_terms, int *i, int *j, int *coeff, int *x)
void Gauss_step(int *v1, int *v2, int len, int idx, int verbose_level)
void vector_frobenius_power_in_place(int *A, int m, int f)
void semilinear_action_from_the_right(int *v, int *A, int *vA, int n)
void restrict_quadratic_form(int k, int n, int *basis, int *C, int *D, int verbose_level)
int Gauss_simple(int *A, int m, int n, int *base_cols, int verbose_level)
void matrix_get_kernel(int *M, int m, int n, int *base_cols, int nb_base_cols, int &kernel_m, int &kernel_n, int *kernel, int verbose_level)
void add_vector(int *A, int *B, int *C, int m)
void copy_matrix(int *A, int *B, int ma, int na)
int dot_product(int len, int *v, int *w)
int is_diagonal_matrix(int *A, int n)
void negate_vector_in_place(int *A, int m)
void zero_vector(int *A, int m)
int intersect_subspaces(int n, int k1, int *A, int k2, int *B, int &k3, int *intersection, int verbose_level)
void matrix_invert(int *A, int *Tmp, int *Tmp_basecols, int *Ainv, int n, int verbose_level)
basic number theoretic functions
long int mod(long int a, long int p)
int i_power_j(int i, int j)
data_structures::int_vec * Int_vec
#define Int_vec_zero(A, B)
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
#define Int_matrix_print(A, B, C)
#define Int_vec_copy(A, B, C)
#define Int_vec_print(A, B, C)
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects