24namespace layer2_discreta {
26#undef MATRIX_COPY_VERBOSE
31static int gfq_dep(
int n, discreta_matrix& A, discreta_matrix& P,
32 Vector& v,
int m, permutation& rho,
int verbose_level);
47 cout <<
"discreta_matrix::copy constructor for object: "
56 cout <<
"discreta_matrix::operator = (copy assignment)" << endl;
93#ifdef MATRIX_COPY_VERBOSE
94 cout <<
"in discreta_matrix::copyobject_to()\n";
98#ifdef MATRIX_CHANGE_KIND_VERBOSE
99 cout <<
"waring: discreta_matrix::copyobject_to x not a vector\n";
109 for (i = 0; i < m; i++) {
110 for (j = 0; j < n; j++) {
119 int i, j,
k, m, n, l1, l2, l3;
124#ifdef PRint_WITH_TYPE
125 ost <<
"(MATRIX of size " << m <<
" x " << n <<
", \n";
128 for (i = 0; i < m; i++) {
129 for (j = 0; j < n; j++) {
132 s <<
s_ij(i, j) << ends;
133 l1 = s.str().length();
134 l2 = col_width.
s_ii(j);
136 col_width.
m_ii(j, l3);
140 for (i = 0; i < m; i++) {
141 for (j = 0; j < n; j++) {
146 l = s.str().length();
147 for (
k = l;
k < col_width.
s_ii(j);
k++)
157 ost <<
"\\begin{array}{*{" << n <<
"}{c}}\n";
158 for (i = 0; i < m; i++) {
159 for (j = 0; j < n; j++) {
164 l = s.str().length();
165 for (
k = l;
k < col_width.
s_ii(j);
k++)
171 ost <<
" \\\\" << endl;
173 ost <<
"\\end{array}\n";
176 ost <<
"current_printing_mode() = "
179#ifdef PRint_WITH_TYPE
188 int i, j, m1, n1, m2, n2, r;
191 cout <<
"discreta_matrix::compare_with() a is not a matrix object" << endl;
207 for (i = 0; i < m1; i++) {
208 for (j = 0; j < n1; j++) {
229 for (i = 0; i < m; i++) {
230 for (j = 0; j < n; j++) {
245 for (i = 0; i <
MINIMUM(m, m1); i++) {
246 for (j = 0; j <
MINIMUM(n, n1); j++) {
273 cout <<
"discreta_matrix::s_ij(" << i <<
", " << j <<
")" << endl;
276 cout <<
"discreta_matrix::s_ij() matrix_pointer == NULL\n";
281 if ( i < 0 || i >= m ) {
282 cout <<
"discreta_matrix::s_ij() addressing error, i = " << i <<
", m = " << m << endl;
285 if ( j < 0 || j >= n ) {
286 cout <<
"discreta_matrix::s_ij() addressing error, j = " << j <<
", n = " << n << endl;
310 cout <<
"discreta_matrix::mult_to() object x is of bad type" << endl;
318 int i, j,
k, m, n, l;
321 cout <<
"discreta_matrix::matrix_mult_to() this is not a matrix" << endl;
325 cout <<
"discreta_matrix::matrix_mult_to() x is not a matrix" << endl;
331 cout <<
"discreta_matrix::matrix_mult_to() l != x.s_m(), cannot multiply" << endl;
337 for (i = 0; i < m; i++) {
338 for (j = 0; j < n; j++) {
340 for (
k = 0;
k < l;
k++) {
361 cout <<
"discreta_matrix::vector_mult_to() this is not a matrix\n";
365 cout <<
"discreta_matrix::vector_mult_to() x is not a vector\n";
371 cout <<
"discreta_matrix::vector_mult_to() l != x.s_l(), cannot multiply\n";
376 for (i = 0; i < m; i++) {
378 for (j = 0; j < l; j++) {
400 cout <<
"discreta_matrix::multiply_vector_from_left() l != m, cannot multiply\n";
405 for (j = 0; j < n; j++) {
407 for (i = 0; i < m; i++) {
427 cout <<
"discreta_matrix::invert_to() this not a matrix\n";
433 cout <<
"discreta_matrix::invert_to() m != n\n";
443 cout <<
"warning: matrix is not invertible\n";
455 cout <<
"discreta_matrix::add_to() this is not a matrix\n";
459 cout <<
"discreta_matrix::add_to() x is not a matrix\n";
468 cout <<
"discreta_matrix::add_to() m != px.s_m()\n";
472 cout <<
"discreta_matrix::add_to() n != px.s_n()\n";
476 for (i = 0; i < m; i++) {
477 for (j = 0; j < n; j++) {
478 py[i][j].
add(
s_ij(i, j), px[i][j]);
489 cout <<
"discreta_matrix::negate_to() this not a matrix\n";
497 for (i = 0; i < m; i++) {
498 for (j = 0; j < n; j++) {
499 py[i][j] =
s_ij(i, j);
514 cout <<
"discreta_matrix::one() m != n\n";
517 for (i = 0; i < m; i++) {
518 for (j = 0; j < n; j++) {
533 for (i = 0; i < m; i++) {
534 for (j = 0; j < n; j++) {
563 for (i = 0; i < m; i++)
565 for (j = 0; j < n; j++)
583 int f_v = (verbose_level >= 1);
584 int rank, i, j,
k, jj, m, n, Pn = 0;
592 cout <<
"discreta_matrix::Gauss m != P.s_m()" << endl;
599 for (j = 0; j < n; j++) {
602 for (
k = i;
k < m;
k++) {
606 for (jj = j; jj < n; jj++) {
610 for (jj = 0; jj < Pn; jj++) {
623 cout <<
"row " << i <<
" pivot in row " <<
k <<
" colum " << j << endl;
632 for (jj = j; jj < n; jj++) {
633 s_ij(i, jj) *= pivot_inv;
636 for (jj = 0; jj < Pn; jj++) {
637 P.
s_ij(i, jj) *= pivot_inv;
641 cout <<
"pivot=" << pivot <<
" pivot_inv=" << pivot_inv
642 <<
" made to one: " <<
s_ij(i, j) << endl;
647 for (
k = i + 1;
k < m;
k++) {
652 f.
mult(z, pivot_inv);
660 cout <<
"eliminating row " <<
k << endl;
662 for (jj = j + 1; jj < n; jj++) {
672 cout <<
s_ij(
k, jj) <<
" ";
676 for (jj = 0; jj < Pn; jj++) {
693 for (i =
rank - 1; i >= 0; i--) {
694 j = base_cols.
s_ii(i);
703 for (
k = i - 1;
k >= 0;
k--) {
708 for (jj = j + 1; jj < n; jj++) {
720 for (jj = 0; jj < Pn; jj++) {
748 int r, n,
k, i, j, ii, iii, a, b;
760 b = base_cols.
s_ii(j);
763 for (i = 0; i < n; i++) {
767 b = base_cols.
s_ii(j);
777 cout <<
"discreta_matrix::get_kernel() ii != k" << endl;
784 b = base_cols.
s_ii(j);
787 for (i = 0; i < n; i++) {
789 for (iii = 0; iii <
k; iii++) {
791 kernel[i][iii] =
s_ij(j, a);
795 b = base_cols.
s_ii(j);
800 for (iii = 0; iii <
k; iii++) {
822 for (i = 0; i < m; i++) {
823 for (j = 0; j < n; j++) {
841 cout <<
"discreta_matrix::Asup2Ainf() not rectangular\n";
845 for (i = 0; i < m; i++) {
846 orbit_size[i] =
s_ij(i, m - 1);
848 cout <<
"discreta_matrix::Asup2Ainf() orbit_size[i].is_zero()\n";
852 for (j = 0; j < m; j++) {
853 for (i = 0; i < m; i++) {
854 s_ij(i, j) *= orbit_size[j];
857 for (i = 0; i < m; i++) {
858 for (j = 0; j < m; j++) {
883 for (i = 0; i < m; i++) {
884 for (j = 0; j < n; j++) {
889 for (i = m - 1; i >= 0; i--) {
890 for (j = i + 1; j < n; j++) {
894 for (
k = 0;
k < i;
k++) {
913 int m, n, i, j,
k, len, cur;
919 for (i = 0; i < m; i++) {
920 for (j = i + 1; j < n; j++) {
929 for (i = 0; i < m; i++) {
932 for (j = i + 1; j < n; j++) {
948 int f_v = (verbose_level >= 1);
954 cout <<
"discreta_matrix::Frobenius() d=" << d <<
" p=" << p << endl;
960 cout <<
"discreta_matrix::Frobenius() x=" << a << endl;
964 cout <<
"discreta_matrix::Frobenius() a = x^p=" << a << endl;
967 for (j = 1; j < d; j++) {
972 cout <<
"discreta_matrix::Frobenius() x^{p^" << j <<
"}=" << b << endl;
975 for (i = 0; i <= d1; i++) {
983 int f_v = (verbose_level >= 1);
989 cout <<
"discreta_matrix matrix=\n" << *
this;
993 for (i = 0; i < l; i++) {
997 cout <<
"discreta_matrix Berlekamp matrix=\n" << *
this;
1003 int f_v = (verbose_level >= 1);
1007 cout <<
"discreta_matrix::companion_matrix() of the polynomial " << m << endl;
1012 for (i = 0; i < d - 1; i++) {
1015 for (i = 0; i < d; i++) {
1020 cout <<
"discreta_matrix::companion_matrix=\n" << *
this;
1031 for (i = 0; i < m; i++) {
1032 for (j = 0; j < n; j++) {
1055 for (i = 0; i < l; i++) {
1071 for (i = 0; i < m; i++) {
1072 for (j = 0; j < n; j++) {
1076 for (i = 0; i < l; i++) {
1084 int f_v = (verbose_level >= 1);
1085 int m, n, i, j, l, ii, jj, stable;
1089 cout <<
"discreta_matrix::smith_normal_form" << endl;
1100 for (i = 0; i < m; i++) {
1101 for (j = 0; j < m; j++) {
1111 for (i = 0; i < n; i++) {
1112 for (j = 0; j < n; j++) {
1123 cout <<
"this=" << endl << *
this << endl;
1124 cout <<
"P=" << endl << P << endl;
1125 cout <<
"Q=" << endl << Q << endl;
1128 for (i = 0; i < l; i++) {
1130 cout <<
"discreta_matrix::smith_normal_form "
1131 "pivot column is " << i <<
" / " << l << endl;
1137 cout <<
"before smith_eliminate_column " << i << endl;
1138 cout <<
"this=" << endl << *
this << endl;
1139 cout <<
"P=" << endl << P << endl;
1140 cout <<
"Q=" << endl << Q << endl;
1146 cout <<
"after smith_eliminate_column " << i << endl;
1147 cout <<
"this=" << endl << *
this << endl;
1148 cout <<
"P=" << endl << P << endl;
1149 cout <<
"Q=" << endl << Q << endl;
1153 cout <<
"before smith_eliminate_row " << i << endl;
1154 cout <<
"this=" << endl << *
this << endl;
1155 cout <<
"P=" << endl << P << endl;
1156 cout <<
"Q=" << endl << Q << endl;
1162 cout <<
"after smith_eliminate_row " << i << endl;
1163 cout <<
"this=" << endl << *
this << endl;
1164 cout <<
"P=" << endl << P << endl;
1165 cout <<
"Q=" << endl << Q << endl;
1168 for (jj = i + 1; jj < n; jj++) {
1170 cout <<
"jj=" << jj << endl;
1172 for (ii = i + 1; ii < m; ii++) {
1174 cout <<
"ii=" << ii << endl;
1182 cout <<
"adding column " << jj
1183 <<
" to column " << i << endl;
1200 cout <<
"smith normal form reached" << endl;
1201 cout <<
"this=" << endl << *
this << endl;
1202 cout <<
"P=" << endl << P << endl;
1203 cout <<
"Pv=" << endl << Pv << endl;
1204 cout <<
"Q=" << endl << Q << endl;
1205 cout <<
"Qv=" << endl << Qv << endl;
1212 int f_v = (verbose_level >= 1);
1214 int m, j, action =
FALSE;
1218 cout <<
"discreta_matrix::smith_eliminate_column column " << i << endl;
1219 cout <<
"this=" << endl << *
this << endl;
1222 for (j = i + 1; j < m; j++) {
1226 cout <<
"smith_eliminate_column() j=" << j
1227 <<
" x=" << x <<
" y=" << y << endl;
1228 cout <<
"this=" << endl << *
this << endl;
1234 cout <<
"before extended_gcd" << endl;
1235 cout <<
"x=" << x << endl;
1236 cout <<
"y=" << y << endl;
1241 cout <<
"i=" << i <<
" j=" << j <<
": ";
1242 cout << g <<
" = (" << u <<
") * (" << x <<
") + "
1243 "(" << v <<
") * (" << y <<
")" << endl;
1249 cout <<
"after switch:" << endl;
1250 cout <<
"this=" << endl << *
this << endl;
1251 cout <<
"i=" << i <<
" j=" << j <<
": ";
1252 cout << g <<
" = (" << u <<
") * (" << x <<
") + "
1253 "(" << v <<
") * (" << y <<
")" << endl;
1261 cout <<
"After multiply_2by2_from_left, "
1262 "this=" << endl << *
this << endl;
1266 cout <<
"After P.multiply_2by2_from_left, "
1267 "P=" << endl << P << endl;
1273 cout <<
"After Pv.multiply_2by2_from_right, "
1274 "Pv=" << endl << Pv << endl;
1284 int f_v = (verbose_level >= 1);
1285 int f_vv = (verbose_level >= 2);
1286 int n, j, action =
FALSE;
1290 cout <<
"discreta_matrix::smith_eliminate_row row " << i << endl;
1293 for (j = i + 1; j < n; j++) {
1297 cout <<
"smith_eliminate_row() "
1298 "j=" << j <<
" x=" << x <<
" y=" << y << endl;
1305 cout <<
"i=" << i <<
" j=" << j <<
": ";
1306 cout << g <<
" = (" << u <<
") * (" << x <<
") + "
1307 "(" << v <<
") * (" << y <<
")" << endl;
1313 cout <<
"after switch:" << endl;
1315 cout <<
"i=" << i <<
" j=" << j <<
": ";
1316 cout << g <<
" = (" << u <<
") * (" << x <<
") + "
1317 "(" << v <<
") * (" << y <<
")" << endl;
1340 int f_v = (verbose_level >= 1);
1345 cout <<
"from left: i=" << i <<
" j=" << j << endl;
1346 cout <<
"(" << aii <<
", " << aij <<
")" << endl;
1347 cout <<
"(" << aji <<
", " << ajj <<
")" << endl;
1350 for (
k = 0;
k < n;
k++) {
1367 int f_v = (verbose_level >= 1);
1372 cout <<
"from right: i=" << i <<
" j=" << j << endl;
1373 cout <<
"(" << aii <<
", " << aij <<
")" << endl;
1374 cout <<
"(" << aji <<
", " << ajj <<
")" << endl;
1377 for (
k = 0;
k < m;
k++) {
1398 for (i = 0; i < m; i++) {
1400 for (j = 0; j < n; j++) {
1413 cout <<
"discreta_matrix::from_vector_of_rows() m <= 0\n";
1419 for (i = 0; i < m; i++) {
1421 for (j = 0; j < n; j++) {
1435 for (j = 0; j < n; j++) {
1437 for (i = 0; i < m; i++) {
1450 cout <<
"discreta_matrix::from_vector_of_columns n <= 0" << endl;
1456 for (j = 0; j < n; j++) {
1458 for (i = 0; i < m; i++) {
1471 for (i = 0; i < m; i++) {
1472 for (j = 0; j < n; j++) {
1484 int f_v = (verbose_level >= 1);
1485 int f_vv = (verbose_level >= 2);
1486 int i, j, k, f_null, pp;
1490 cout <<
"gfq_dep" << endl;
1497 for (j = 0; j < n; j++)
1498 A[m][j] = v[rho[j]];
1500 for (k = 0; k < m; k++) {
1502 cout <<
"k=" << k << endl;
1511 cout <<
"A=\n" << A << endl;
1512 cout <<
"P=\n" << P << endl;
1522 while (A[m][j].is_zero() && j < n - 1)
1525 if (!f_null && j > m) {
1526 for (i = 0; i <= m; i++) {
1527 A[i][m].
swap(A[i][j]);
1544 int f_v = (verbose_level >= 1);
1545 int f_vv = (verbose_level >= 2);
1548 int n, m, f_null, j;
1563 cout <<
"discreta_matrix::KX_module_order_ideal() m=" << m << endl;
1564 cout <<
"v=\n" << v << endl;
1566 f_null = gfq_dep(n, A, P, v, m, rho, verbose_level - 2);
1568 cout <<
"A=\n" << A << endl;
1576 cout <<
"discreta_matrix::KX_module_order_ideal m=" << m << endl;
1577 cout <<
"v=\n" << v << endl;
1579 f_null = gfq_dep(n, A, P, v, m, rho, verbose_level - 2);
1581 cout <<
"A=\n" << A << endl;
1583 if (m == n && !f_null) {
1584 cout <<
"gfq_order_ideal m == n && !f_null" << endl;
1591 for (j = m - 1; j >= 0; j--) {
1596 cout <<
"discreta_matrix::KX_module_order_ideal "
1597 "order ideal of e_" << i <<
": " << mue << endl;
1602 cout <<
"mue(v)=" << v << endl;
1615 for (i = d - 1; i >= 0; i--) {
1632 int f_v = (verbose_level >= 1);
1633 unipoly u, v, g, gg, r, rr, rrr, r4, m1, m2;
1638 cout <<
"discreta_matrix::KX_module_join()" << endl;
1639 cout <<
"v1=" << v1 <<
" mue1=" << mue1 << endl;
1640 cout <<
"v2=" << v2 <<
" mue2=" << mue2 << endl;
1645 cout <<
"g=" << g << endl;
1656 cout <<
"vv1=" << vv1 <<
" r=" << r << endl;
1666 cout <<
"r=" << r << endl;
1667 cout <<
"rrr=" << rrr << endl;
1669 cout <<
"gcd(r,rrr)=" << gg <<
" (should be 1)" << endl;
1671 cout <<
"r*rrr=" << r4 <<
" (should be = lcd(mue1, mue2))" << endl;
1679 cout <<
"vv2=" << vv2 <<
" rrr=" << rrr << endl;
1685 cout <<
"discreta_matrix::KX_module_join()" << endl;
1686 cout <<
"v3=" << v3 << endl;
1687 cout <<
"mue3=" << mue3 << endl;
1690 cout <<
"mue3(v3)=" << vv1 <<
" (should be zero)" << endl;
1700 unipoly& mue,
int verbose_level)
1702 int f_v = (verbose_level > 1);
1703 int f_vv = (verbose_level > 2);
1709 cout <<
"discreta_matrix::KX_cyclic_module_generator" << endl;
1715 for (i = 1; i < f; i++) {
1726 cout <<
"discreta_matrix::KX_cyclic_module_generator error: "
1727 "mue1.degree < f" << endl;
1737 int f_v = (verbose_level >= 1);
1738 int f_vv = (verbose_level >= 2);
1745 cout <<
"discreta_matrix::KX_module_minpol" << endl;
1750 cout <<
"KX_module_minpol() d >= f\n";
1762 for (i = 0; i <= d; i++) {
1769 cout <<
"p^{sigma^" << l - 1 <<
"}=" << p <<
" = " << v << endl;
1777 for (i = 0; i < f; i++) {
1783 cout <<
"p^{sigma^" << l <<
"}=" << q <<
" = " << v << endl;
1786 cout <<
"KX_module_minpol() l >= f\n";
1791 cout <<
"the degree is " << l << endl;
1793 for (i = 0; i < l; i++) {
1802 for (i = l - 2; i >= 0; i--) {
1805 for (i = 1; i < l; i++) {
1807 for (j = i; j >= 0; j--) {
1813 cout <<
"y (coefficients must lie in the ground field):" << endl;
1814 for (i = 0; i <= l; i++) {
1815 cout << y[i] <<
" * X^" << i << endl;
1819 for (i = 0; i <= l; i++) {
1823 cout <<
"minpol=" << mue << endl;
1828 int k_min,
int k_max)
1832 m = n_max + 1 - n_min;
1833 n = k_max + 1 - k_min;
1835 for (i = 0; i < m; i++) {
1836 for (j = 0; j < n; j++) {
1843 int k_min,
int k_max,
int f_ordered)
1848 m = n_max + 1 - n_min;
1849 n = k_max + 1 - k_min;
1851 for (i = 0; i < m; i++) {
1852 for (j = 0; j < n; j++) {
1854 k_min + j, f_ordered,
s_ij(i, j), f_v);
1860 int k_min,
int k_max,
int f_signless)
1865 m = n_max + 1 - n_min;
1866 n = k_max + 1 - k_min;
1868 for (i = 0; i < m; i++) {
1869 for (j = 0; j < n; j++) {
1871 f_signless,
s_ij(i, j), f_v);
1877 int k_min,
int k_max,
int f_inverse)
1881 m = n_max + 1 - n_min;
1882 n = k_max + 1 - k_min;
1884 for (i = 0; i < m; i++) {
1885 for (j = 0; j < n; j++) {
1887 if (f_inverse &&
ODD(n_min + i + k_min + j))
1900 for (i = 0; i < m; i++)
1901 for (j = 0; j < n; j++)
1916 for (i = 0; i < m; i++) {
1917 for (j = 0; j < n; j++) {
1919 cout <<
"discreta_matrix::hip1(): not INTEGER\n";
1933 char f_hip = 0, f_hip1 = 0;
1939 f_hip = (char)
hip();
1941 f_hip1 = (char)
hip1();
1942 if (debug_depth > 0) {
1943 cout <<
"writing " << m <<
" x " << n <<
" ";
1956 for (i = 0; i < m; i++) {
1957 for (j = 0; j < n; j++) {
1964 for (i = 0; i < m; i++) {
1965 for (j = 0; j < n; j++) {
1972 for (i = 0; i < m; i++) {
1973 for (j = 0; j < n; j++) {
1983 char c, f_hip = 0, f_hip1 = 0;
1992 if (debug_depth > 0) {
1993 cout <<
"reading " << m <<
" x " << n <<
" ";
2004 for (i = 0; i < m; i++) {
2005 for (j = 0; j < n; j++) {
2013 for (i = 0; i < m; i++) {
2014 for (j = 0; j < n; j++) {
2022 for (i = 0; i < m; i++) {
2023 for (j = 0; j < n; j++) {
2024 if (debug_depth > 0) {
2025 cout <<
"(" << i <<
"," << j <<
") ";
2044 f_hip = (char)
hip();
2047 f_hip1 = (char)
hip1();
2055 for (i = 0; i < m; i++) {
2056 for (j = 0; j < n; j++) {
2072 for (i = 0; i < m; i++) {
2073 for (j = 0; j < n; j++) {
2078 theX = (
int *)
new int[nb_X];
2081 for (i = 0; i < m; i++) {
2082 for (j = 0; j < n; j++) {
2084 theX[nb_X++] = i * n + j;
2094 int m, n, i, ii, j, jj;
2112 for (i = 0; i < m; i++) {
2114 for (j = 0; j < n; j++) {
2125 int m, n, i, ii, j, jj;
2130 for (i = 0; i < m; i++) {
2132 for (j = 0; j < n; j++) {
2143 int m, n, i, ii, j, jj;
2148 for (i = 0; i < m; i++) {
2150 for (j = 0; j < n; j++) {
2163 Vector row_decomp, col_decomp;
2173 for (i = 0; i < ll; i++) {
2182 for (i++; i < ll; i++) {
2193 int m, n, M, N, i, j, i0, j0, v, h;
2201 for (i = 0; i < M; i++) {
2202 for (j = 0; j < N; j++) {
2211 for (i = 0; i < row_decomp.
s_l(); i++) {
2212 i0 += row_decomp.
s_ii(i);
2217 for (j = 0; j < col_decomp.
s_l(); j++) {
2218 j0 += col_decomp.
s_ii(j);
2224 for (i = 0; i <= 2 * m; i += 2) {
2225 for (j = 0; j <= 2 * n; j += 2) {
2241 for (i = 0; i <= 2 * m; i += 2) {
2244 for (j = 0; j < n; j++) {
2248 for (j = 0; j <= 2 * n; j += 2) {
2251 for (i = 0; i < m; i++) {
2255 for (i = 0; i < m; i++) {
2256 for (j = 0; j < n; j++) {
2257 T.
s_ij(2 * i + 1, 2 * j + 1) =
s_ij(i, j);
2264 int f_row_decomp,
Vector &row_decomp,
2265 int f_col_decomp,
Vector &col_decomp)
2268 int m, n, M, N, i, j, i0, j0, v, h;
2278 for (i = 0; i < M; i++) {
2279 for (j = 0; j < N; j++) {
2300 for (i = 0; i < rd.
s_l(); i++) {
2306 for (j = 0; j < cd.
s_l(); j++) {
2313 for (i = 0; i <= 2 * m; i += 2) {
2314 for (j = 0; j <= 2 * n; j += 2) {
2330 for (i = 0; i <= 2 * m; i += 2) {
2333 for (j = 0; j < n; j++) {
2337 for (j = 0; j <= 2 * n; j += 2) {
2340 for (i = 0; i < m; i++) {
2344 for (i = 0; i < m; i++) {
2345 for (j = 0; j < n; j++) {
2355 for (i = 0; i < M; i++) {
2359 for (i = 0; i < M; i++) {
2360 for (j = 0; j < N; j++) {
2364 for (i = 0; i < M; i++) {
2368 ost <<
"\\\\[-12pt]";
2376 int f_row_decomp,
Vector &row_decomp,
2377 int f_col_decomp,
Vector &col_decomp,
2378 int f_labelling_points,
Vector &point_labels,
2379 int f_labelling_blocks,
Vector &block_labels)
2389 f_row_decomp, row_decomp,
2390 f_col_decomp, col_decomp,
2391 f_labelling_points, point_labels,
2392 f_labelling_blocks, block_labels);
2396 int width,
int width_10,
2397 int f_outline_thin,
const char *unit_length,
2398 const char *thick_lines,
const char *thin_lines,
const char *geo_line_width,
2399 int f_row_decomp,
Vector &row_decomp,
2400 int f_col_decomp,
Vector &col_decomp,
2401 int f_labelling_points,
Vector &point_labels,
2402 int f_labelling_blocks,
Vector &block_labels)
2412 int width_8, width_5;
2413 const char *tdo_line_width = thick_lines ;
2414 const char *line_width = thin_lines ;
2433 width_8 = width - 2 * width_10;
2434 width_5 = width >> 1;
2435 f <<
"\\unitlength" << unit_length << endl;
2440 if (f_labelling_points)
2442 if (f_labelling_blocks)
2444 f <<
"\\begin{picture}(" << w1 <<
"," << h1 <<
")\n";
2447 f <<
"\\linethickness{" << tdo_line_width <<
"}\n";
2449 for (i = -1; i < cd.
s_l(); i++) {
2454 if (f_outline_thin) {
2455 if (i == -1 || i == cd.
s_l() - 1)
2458 f <<
"\\put(" <<
k * width <<
",0){\\line(0,1){" << h <<
"}}\n";
2461 cout <<
"incma_print_latex2(): k != b\n";
2465 for (i = -1; i < rd.
s_l(); i++) {
2470 if (f_outline_thin) {
2471 if (i == -1 || i == rd.
s_l() - 1)
2474 f <<
"\\put(0," << h -
k * width <<
"){\\line(1,0){" << w <<
"}}\n";
2477 cout <<
"incma_print_latex2(): k != v\n";
2480 if (f_labelling_points) {
2481 for (i = 0; i < v; i++) {
2482 f <<
"\\put(0," << h - i * width - width_5
2483 <<
"){\\makebox(0,0)[r]{"
2484 << point_labels.
s_i(i) <<
"$\\,$}}\n";
2487 if (f_labelling_blocks) {
2488 for (i = 0; i < b; i++) {
2489 f <<
"\\put(" << i * width + width_5 <<
","
2490 << h + width_5 <<
"){\\makebox(0,0)[b]{"
2491 << block_labels.
s_i(i) <<
"}}\n";
2495 f <<
"\\linethickness{" << line_width <<
"}\n";
2496 f <<
"\\multiput(0,0)(" << width <<
",0){" << b + 1
2497 <<
"}{\\line(0,1){" << h <<
"}}\n";
2498 f <<
"\\multiput(0,0)(0," << width <<
"){" << v + 1 <<
"}{\\line(1,0){"
2502 f <<
"\\linethickness{" << geo_line_width <<
"}\n";
2503 for (i = 0; i < v; i++) {
2505 y1 = h - (i + 1) * width;
2508 for (j = 0; j < b; j++) {
2509 if (
s_iji(i, j) == 0)
2513 x1 = (j + 1) * width;
2517 f <<
"\\put(" << X0 <<
"," << Y0 <<
"){\\line(1,0){" << width_8 <<
"}}\n";
2518 f <<
"\\put(" << X0 <<
"," << Y1 <<
"){\\line(1,0){" << width_8 <<
"}}\n";
2521 f <<
"\\put(" << X0 <<
"," << Y1 <<
"){\\line(0,1){" << width_8 <<
"}}\n";
2522 f <<
"\\put(" << X1 <<
"," << Y1 <<
"){\\line(0,1){" << width_8 <<
"}}\n";
2528 f <<
"\\end{picture}" << endl;
2534 char *alphabet = NULL;
2537 int i, j,
k, v, b, nb_inc, pr, x, y;
2546 for (i = 0; i < v; i++) {
2547 for (j = 0; j < b; j++) {
2548 if (
s_iji(i, j) != 0)
2554 alphabet = (
char *)
new char[al_len + 1];
2555 inc = (
char *)
new char[nb_inc + 1];
2556 key = (
char *)
new char[key_len + 1];
2559 while (
k < al_len) {
2560 for (i = 0; i < 10; i++) {
2561 alphabet[
k] =
'0' + i;
2566 for (i = 0; i < 26; i++) {
2567 alphabet[
k] =
'a' + i;
2572 for (i = 0; i < 26; i++) {
2573 alphabet[
k] =
'A' + i;
2579 alphabet[al_len] = 0;
2581 cout <<
"alphabet: " << alphabet << endl;
2585 for (i = 0; i < v; i++) {
2586 for (j = 0; j < b; j++) {
2587 if (
s_iji(i, j) == 0)
2596 cout <<
"incidences: " <<
inc << endl;
2600 for (
k = 0;
k < key_len;
k++) {
2601 pr = P.
s_ii(
k % 25);
2603 for (i = 0; i < nb_inc; i++) {
2610 key[
k] = alphabet[x];
2613 key[key_len - 1] = 0;
2616 cout <<
"discreta_matrix::calc_hash_key() (len=" << key_len <<
") hash=" << hash_key << endl;
2633 for (i = 0; i < m; i++)
2635 for (j = 0; j < n; j++)
2640 if (i != j && e.
s_i() != 0)
2644 if (i == j && e.
s_i() != c.
s_i())
2663 cout <<
"discreta_matrix::power_mod(): m !=n" << endl;
2670 for (i = 0; i < m; i++)
2672 for (j = 0; j < n; j++)
2698 cout <<
"discreta_matrix::proj_order_mod() m != n" << endl;
2704 cout <<
"is zero matrix!" << endl;
2714 cout <<
"ERROR: proj_order_mod() order too big" << endl;
2727 PG_rep(p, f_action_from_right, f_modified);
2739 cout <<
"discreta_matrix::PG_rep() no finite field domain" << endl;
2746 for (i = 0; i < l; i++) {
2751 if (f_action_from_right)
2766 AG_rep(p, f_action_from_right);
2778 cout <<
"discreta_matrix::AG_rep() no finite field domain" << endl;
2785 for (i = 0; i < l; i++) {
2787 if (f_action_from_right)
2801 for (i = 0; i <= n; i++) {
2802 for (j = 0; j <= n; j++) {
2807 cout <<
"discreta_matrix::MacWilliamsTransform(" << n <<
", " << q <<
")" << endl;
2828 for (i = 0; i < l; i++) {
2850 for (j = 0; j < n; j++) {
2852 for (i = 0; i <
k; i++) {
2857 cout <<
"discreta_matrix::Simplex_code_generator_matrix(" <<
k <<
", " << q <<
")" << endl;
2876 for (i = 0; i < l; i++) {
2878 for (j = 0; j < l; j++) {
2886 cout <<
"discreta_matrix::PG_design_point_vs_hyperplane(" <<
k <<
", " << q <<
")" << endl;
2894 int ii, i, j, nb_pts, nb_lines, r;
2903 cout <<
"nb_pts=" << nb_pts <<
" nb_lines=" << nb_lines << endl;
2906 cout <<
"points:" << endl;
2908 for (i = 0; i < nb_pts; i++) {
2910 cout << i <<
" : " << v << endl;
2912 cout <<
"lines:" << endl;
2914 for (j = 0; j < nb_lines; j++) {
2918 cout << j <<
" : \n" << z << endl;
2921 m_mn_n(nb_pts, nb_lines);
2926 for (i = 0; i < nb_pts; i++) {
2928 for (j = 0; j < nb_lines; j++) {
2930 for (ii = 0; ii <
k + 1; ii++) {
2931 z[ii][0] = v[ii][0];
2932 z[ii][1] = w[ii][0];
2933 z[ii][2] = w[ii][1];
2938 if (r != 2 && r != 3) {
2939 cout <<
"error rank != 2 and rank != 3" << endl;
2940 cout <<
"rank=" << r << endl;
2947 cout <<
"PG_k_q_design(" <<
k <<
", " << q <<
")" << endl;
2954 int f_v = (verbose_level >= 1);
2955 int n, h, i, j, ii, jj;
2960 cout <<
"discreta_matrix::determinant" << endl;
2963 cout <<
"discreta_matrix::determinant the matrix is not square" << endl;
2974 M1.
m_mn(n - 1, n - 1);
2975 for (h = 0; h < n; h++) {
2977 cout <<
"discreta_matrix::determinant h=" << h <<
" d=" << d << endl;
2979 for (i = 0, ii = 0; i < n; i++) {
2983 for (j = 0, jj = 0; j < n; j++) {
2993 cout <<
"discreta_matrix::determinant M1=" << endl << M1 << endl;
2997 cout <<
"discreta_matrix::determinant a=" << a << endl;
3019 int f_special =
TRUE;
3020 int f_complete =
FALSE;
3027 cout <<
"in det():" << endl << *
this << endl;
3029 rk =
Gauss(f_special, f_complete, base_cols, f_P, P, f_vv);
3031 cout <<
"Gauss:" << endl << *
this << endl;
3035 cout <<
"singular" << endl;
3039 for (i = 1; i < rk; i++) {
3043 cout <<
"det = " << d << endl;
3050 cout <<
"determinant_map() x must be a MATRIX" << endl;
3056 M.
det(d, f_v, f_vv);
3062 int q, m, n, l, s, i, a1, a2, a3, nb, ql, pivot_row, pivot_row2 = 0;
3068 cout <<
"discreta_matrix::PG_line_rank() no finite field domain" << endl;
3075 cout <<
"discreta_matrix::PG_line_rank() matrix not allocated()" << endl;
3079 cout <<
"discreta_matrix::PG_line_rank() matrix not allocated()" << endl;
3085 for (i = m - 1; i >= 0; i--) {
3089 for ( ; i >= 0; i--) {
3097 cout <<
"after permuting:\n" << *
this << endl;
3098 cout <<
"PG_line_rank() pivot_row=" << pivot_row << endl;
3102 cout <<
"matrix::PG_line_rank() pivot element is not one" << endl;
3108 x =
s_ij(pivot_row, 0);
3109 for (i = pivot_row; i >= 0; i--) {
3120 cout <<
"PG_line_rank() after gauss right to left and normalize:\n" << *
this << endl;
3122 for (i = pivot_row - 1; i >= 0; i--) {
3129 cout <<
"discreta_matrix::PG_line_rank() zero column" << endl;
3135 cout <<
"matrix::PG_line_rank() pivot element 2 is not one" << endl;
3141 x =
s_ij(pivot_row2, 1);
3142 for (i = pivot_row2; i >= 0; i--) {
3152 cout <<
"PG_line_rank() after gauss left to right:\n" << *
this << endl;
3157 cout <<
"!s_ij(l, 1).is_zero()" << endl;
3164 cout <<
"l=" << l <<
" ql=" << ql <<
" nb=" << nb <<
" s=" << s << endl;
3168 cout <<
"a3=" << a3 << endl;
3173 cout <<
"a2=" << a2 << endl;
3177 cout <<
"a1=" << a1 << endl;
3184 a = (a1 * nb + a3) * ql + a2;
3186 cout <<
"a=" << a << endl;
3188 for (l--; l >= 0; l--) {
3199 int q, m, n, l, s,
k, a1, a2, a3, nb, ql;
3204 cout <<
"discreta_matrix::PG_line_unrank no finite field domain" << endl;
3211 cout <<
"discreta_matrix::PG_line_unrank matrix not allocated" << endl;
3215 cout <<
"discreta_matrix::PG_line_unrank matrix not allocated" << endl;
3249 for (
k = l + 1;
k < m;
k++) {
3261 cout <<
"discreta_matrix::PG_line_unrank a too large" << endl;
3266 int di,
int dj,
int length)
3272 for (i = length - 1; i >= 0; i--) {
3276 a =
s_ij(i0 + i * di, j0 + i * dj);
3278 for (j = i; j >= 0; j--) {
3279 s_ij(i0 + j * di, j0 + j * dj) *= a;
3284 cout <<
"discreta_matrix::PG_point_normalize zero vector" << endl;
3289 int di,
int dj,
int length,
int a)
3292 int q, n, l, qhl,
k, j, r, a1 = a;
3295 cout <<
"discreta_matrix::PG_point_unrank no finite field domain" << endl;
3301 cout <<
"discreta_matrix::PG_point_unrank n <= 0" << endl;
3315 s_ij(i0 + l * di, j0 + l * dj).
one();
3316 for (
k = l + 1;
k < n;
k++) {
3322 m_iji(i0 + j * di, j0 + j * dj, r);
3328 m_iji(i0 + j * di, j0 + j * dj, 0);
3331 cout <<
"discreta_matrix::PG_point_unrank() a too large" << endl;
3332 cout <<
"length = " << length << endl;
3333 cout <<
"a = " << a1 << endl;
3338 int di,
int dj,
int length,
int &a)
3341 int i, j, q, q_power_j, b;
3344 cout <<
"discreta_matrix::PG_point_rank no finite field domain" << endl;
3350 cout <<
"discreta_matrix::PG_point_rank length <= 0" << endl;
3353 for (i = length - 1; i >= 0; i--) {
3358 cout <<
"discreta_matrix::PG_point_rank zero vector" << endl;
3361 if (!
s_ij(i0 + i * di, j0 + i * dj).
is_one()) {
3362 cout <<
"discreta_matrix::PG_point_rank vector not normalized" << endl;
3368 for (j = 0; j < i; j++) {
3375 for (j = i - 1; j >= 0; j--) {
3376 a +=
s_iji(i0 + j * di, j0 + j * dj);
3392 for (j = 0; j < n; j++) {
3393 for (i = m - 1; i >= 0; i--) {
3399 for (ii = i; ii >= 0; ii--) {
3406 cout <<
"discreta_matrix::PG_element_normalize zero column" << endl;
3413 int di,
int dj,
int length,
int &a)
3419 cout <<
"discreta_matrix::AG_point_rank no finite field domain" << endl;
3424 cout <<
"discreta_matrix::AG_point_rank length <= 0" << endl;
3428 for (i = length - 1; i >= 0; i--) {
3429 a +=
s_iji(i0 + i * di, j0 + i * dj);
3436 int di,
int dj,
int length,
int a)
3442 cout <<
"discreta_matrix::AG_point_unrank no finite field domain" << endl;
3447 cout <<
"discreta_matrix::AG_point_unrank length <= 0" << endl;
3450 for (i = 0; i < length; i++) {
3452 m_iji(i0 + i * di, j0 + i * dj, b);
3459 int l, ql, nb, s, a = 0, m;
3464 for (l = 0; l < m; l++) {
3475 int i, j = 0, m, n, nb_X = 0;
3478 for (i = 0; i < m; i++) {
3479 for (j = 0; j < n; j++) {
3485 f << i <<
" " << j <<
" " << nb_X << endl;
3487 f <<
"-1 1" << endl;
3495 for (i = 0; i < m; i++) {
3496 for (j = 0; j < n; j++) {
3498 f << i * n + j <<
" ";
various functions related to geometries
long int nb_PG_elements(int n, int q)
long int nb_AG_elements(int n, int q)
basic number theoretic functions
int i_power_j(int i, int j)
DISCRETA vector class for vectors of DISCRETA objects.
void PG_element_unrank_modified(int a)
void mult_scalar(discreta_base &a)
void scalar_product(Vector &w, discreta_base &a)
void PG_element_unrank(int a)
int compare_with(discreta_base &a)
Vector & append_integer(int a)
void AG_element_rank(int &a)
discreta_base & s_i(int i)
void PG_element_rank_modified(int &a)
void AG_element_unrank(int a)
void PG_element_rank(int &a)
DISCRETA base class. All DISCRETA classes are derived from this class.
void integral_division_exact(discreta_base &x, discreta_base &q)
void add_apply(discreta_base &x)
virtual int compare_with_euclidean(discreta_base &a)
int is_divisor(discreta_base &y)
discreta_matrix & as_matrix()
void add(discreta_base &x, discreta_base &y)
void mult(discreta_base &x, discreta_base &y)
virtual int compare_with(discreta_base &a)
discreta_base & power_int_mod(int l, discreta_base &p)
hollerith & as_hollerith()
void read_memory(memory &m, int debug_depth)
void swap(discreta_base &a)
discreta_base & divide_by_exact(discreta_base &x)
void copyobject(discreta_base &x)
void mult_mod(discreta_base &x, discreta_base &y, discreta_base &p)
discreta_base & power_int(int l)
virtual int invert_to(discreta_base &x)
hollerith & change_to_hollerith()
void write_memory(memory &m, int debug_depth)
void mult_apply(discreta_base &x)
void extended_gcd(discreta_base &n, discreta_base &u, discreta_base &v, discreta_base &g, int verbose_level)
discreta_matrix & transpose()
void PG_line_rank(int &a, int f_v)
void to_vector_of_rows(Vector &v)
void vector_mult_to(Vector &x, discreta_base &y)
void save_as_inc_file(char *fname)
void binomial(int n_min, int n_max, int k_min, int k_max)
void from_vector_of_columns(Vector &v)
void evaluate_at(discreta_base &x)
int smith_eliminate_column(discreta_matrix &P, discreta_matrix &Pv, int i, int verbose_level)
void weight_enumerator_brute_force(domain *dom, Vector &v)
void incma_print_ascii(std::ostream &ost, int f_tex, int f_row_decomp, Vector &row_decomp, int f_col_decomp, Vector &col_decomp)
void print_decomposed(std::ostream &ost, Vector &row_decomp, Vector &col_decomp)
void KX_module_join(Vector &v1, unipoly &mue1, Vector &v2, unipoly &mue2, Vector &v3, unipoly &mue3, int verbose_level)
void PG_point_unrank(int i0, int j0, int di, int dj, int length, int a)
void from_vector_of_rows(Vector &v)
void negate_to(discreta_base &x)
void KX_module_order_ideal(int i, unipoly &mue, int verbose_level)
void read_mem(memory &M, int debug_depth)
void det(discreta_base &d, int f_v, int f_vv)
void multiply_2by2_from_right(int i, int j, discreta_base &aii, discreta_base &aij, discreta_base &aji, discreta_base &ajj, int verbose_level)
void calc_hash_key(int key_len, hollerith &hash_key, int f_v)
void companion_matrix(unipoly &m, int verbose_level)
int proj_order_mod(integer &P)
void PG_point_normalize(int i0, int j0, int di, int dj, int length)
int smith_eliminate_row(discreta_matrix &Q, discreta_matrix &Qv, int i, int verbose_level)
void stirling_first(int n_min, int n_max, int k_min, int k_max, int f_signless)
discreta_matrix & m_mn(int m, int n)
void apply_row_col_perm(permutation &p)
void KX_module_apply(unipoly &p, Vector &v)
void power_mod(int r, integer &P, discreta_matrix &C)
void smith_normal_form(discreta_matrix &P, discreta_matrix &Pv, discreta_matrix &Q, discreta_matrix &Qv, int verbose_level)
int & s_iji(int i, int j)
void PG_line_unrank(int a)
discreta_matrix & m_mn_n(int m, int n)
void Berlekamp(unipoly &m, int p, int verbose_level)
void mult_to(discreta_base &x, discreta_base &y)
void multiply_2by2_from_left(int i, int j, discreta_base &aii, discreta_base &aij, discreta_base &aji, discreta_base &ajj, int verbose_level)
discreta_matrix & operator=(const discreta_base &x)
int Acover2nl(Vector &nl)
void PG_element_normalize()
discreta_base & s_ij(int i, int j)
int compare_with(discreta_base &a)
void elements_to_unipoly()
void AG_point_rank(int i0, int j0, int di, int dj, int length, int &a)
void incma_print_latex(std::ostream &f, int f_row_decomp, Vector &row_decomp, int f_col_decomp, Vector &col_decomp, int f_labelling_points, Vector &point_labels, int f_labelling_blocks, Vector &block_labels)
void PG_k_q_design(domain *dom, int k, int f_v, int f_vv)
void apply_perms(int f_row_perm, permutation &row_perm, int f_col_perm, permutation &col_perm)
void AG_point_unrank(int i0, int j0, int di, int dj, int length, int a)
void add_to(discreta_base &x, discreta_base &y)
void incma_print_ascii_permuted_and_decomposed(std::ostream &ost, int f_tex, Vector &decomp, permutation &p)
void Simplex_code_generator_matrix(domain *dom, int k, int f_v)
void to_vector_of_columns(Vector &v)
void matrix_mult_to(discreta_matrix &x, discreta_base &y)
void m_iji(int i, int j, int a)
void calc_theX(int &nb_X, int *&theX)
void apply_col_row_perm(permutation &p)
int get_kernel(Vector &base_cols, discreta_matrix &kernel)
int Gauss(int f_special, int f_complete, Vector &base_cols, int f_P, discreta_matrix &P, int verbose_level)
void MacWilliamsTransform(int n, int q, int f_v)
void write_mem(memory &m, int debug_depth)
void stirling_second(int n_min, int n_max, int k_min, int k_max, int f_ordered)
discreta_matrix & realloc(int m, int n)
void AG_rep(domain *dom, permutation &p, int f_action_from_right)
void X_times_id_minus_self()
std::ostream & print(std::ostream &)
void copyobject_to(discreta_base &x)
void KX_cyclic_module_generator(Vector &v, unipoly &mue, int verbose_level)
void KX_module_minpol(unipoly &p, unipoly &m, unipoly &mue, int verbose_level)
void save_as_inc(std::ofstream &f)
void PG_design_point_vs_hyperplane(domain *dom, int k, int f_v)
void multiply_vector_from_left(Vector &x, Vector &y)
void determinant(discreta_base &d, int verbose_level)
int invert_to(discreta_base &x)
void PG_rep(domain *dom, permutation &p, int f_action_from_right, int f_modified)
void incma_print_latex2(std::ostream &f, int width, int width_10, int f_outline_thin, const char *unit_length, const char *thick_lines, const char *thin_lines, const char *geo_line_width, int f_row_decomp, Vector &row_decomp, int f_col_decomp, Vector &col_decomp, int f_labelling_points, Vector &point_labels, int f_labelling_blocks, Vector &block_labels)
void det_modify_input_matrix(discreta_base &d, int f_v, int f_vv)
void Frobenius(unipoly &m, int p, int verbose_level)
void PG_point_rank(int i0, int j0, int di, int dj, int length, int &a)
DISCRETA class for influencing arithmetic operations.
void append(const char *p)
discreta_base & operator[](int j)
DISCRETA class to serialize data structures.
DISCRETA permutation class.
DISCRETA class for polynomials in one variable.
void largest_divisor_prime_to(unipoly &q, unipoly &r)
void evaluate_at(discreta_base &x, discreta_base &y)
DISCRETA class related to class domain.
enum printing_mode_enum current_printing_mode()
void determinant_map(discreta_base &x, discreta_base &d)
void stirling_first(int n, int k, int f_signless, discreta_base &res, int verbose_level)
void free_m_times_n_objects(discreta_base *p)
void Binomial(int n, int k, discreta_base &n_choose_k)
int is_finite_field_domain(domain *&d)
void stirling_second(int n, int k, int f_ordered, discreta_base &res, int verbose_level)
int nb_PG_lines(int n, int q)
void the_first_n_primes(Vector &P, int n)
void Krawtchouk(int n, int q, int i, int j, discreta_base &a)
discreta_base * calloc_m_times_n_objects(int m, int n, kind k)
int finite_field_domain_order_int(domain *d)
the orbiter library for the classification of combinatorial objects
discreta_base * matrix_pointer