18namespace layer1_foundations {
25 int q, h, p, e, i, g, phi_g, l, cmp;
34 Rdq =
new int[Q_max * H_max];
35 G =
new int[Q_max * H_max];
37 for (q = 2; q <= Q_max; q++) {
41 cout <<
"studying prime power " << q << endl;
42 for (h = 2; h <= H_max; h++) {
48 cout <<
"g= " << g << endl;
49 cout <<
"\\Phi(g)= " << phi_g << endl;
50 cout <<
"The formula gives " << r2 << endl;
51 cout <<
"#subprimitive " << r3 << endl;
52 l = (phi_g * (q - 1)) / g;
53 cout <<
"l=" << l << endl;
54 A.
create(l, __FILE__, __LINE__);
56 cout <<
"#subprimitive from R_c(d,q)=" << B << endl;
59 cout <<
"cmp=" << cmp << endl;
66 cout <<
"r1 != r2 * h" << endl;
77 cout << setw(10) << Q[i];
78 for (h = 2; h <= H_max; h++) {
79 cout <<
" & " << setw(10) << Rdq[i * H_max + h - 2]
80 <<
"_{" << setw(3) << G[i * H_max + h - 2] <<
"}";
82 cout <<
"\\\\" << endl;
91 int f_v = (verbose_level >= 1);
92 int theta_mod_qm1, p, e, i, rem;
99 cout <<
"algebra_global::formula_subprimitive d=" << d <<
" q=" << q << endl;
101 Theta.
create(q, __FILE__, __LINE__);
102 M1.
create(-1, __FILE__, __LINE__);
103 Qm1.
create(q-1, __FILE__, __LINE__);
107 cout <<
"q^d-1 = " << A << endl;
111 cout <<
"theta = " << Theta << endl;
114 g = NT.
gcd_lint(q - 1, theta_mod_qm1);
116 cout <<
"g = " << g << endl;
120 cout <<
"theta = " << Theta << endl;
124 R.
create(1, __FILE__, __LINE__);
129 cout <<
"p=" << p <<
" e=" << e << endl;
132 A.
create(p, __FILE__, __LINE__);
135 cout <<
"p^e=" << A << endl;
137 B.
create(p, __FILE__, __LINE__);
140 cout <<
"p^{e-1}=" << A << endl;
145 cout <<
"p^e-p^{e-1}=" << C << endl;
150 cout <<
"R=" << R << endl;
154 cout <<
"\\Phi(theta)=" << R << endl;
159 cout <<
"(q-1)\\Phi(theta)=" << R << endl;
163 cout <<
"R not divisible by d" << endl;
167 cout <<
"R/d=" << A << endl;
171 cout <<
"algebra_global::formula_subprimitive done" << endl;
177 int f_v = (verbose_level >= 1);
178 int theta_mod_qm1, g, p, e, i, rem;
185 cout <<
"algebra_global::formula d=" << d <<
" q=" << q << endl;
187 Theta.
create(q, __FILE__, __LINE__);
188 M1.
create(-1, __FILE__, __LINE__);
189 Qm1.
create(q - 1, __FILE__, __LINE__);
193 cout <<
"q^d-1 = " << A << endl;
197 cout <<
"theta = " << Theta << endl;
200 q - 1, C, theta_mod_qm1);
201 g = NT.
gcd_lint(q - 1, theta_mod_qm1);
203 cout <<
"g = " << g << endl;
207 cout <<
"theta = " << Theta << endl;
211 R.
create(1, __FILE__, __LINE__);
216 cout <<
"p=" << p <<
" e=" << e << endl;
218 if (((q - 1) % p) == 0) {
219 A.
create(p, __FILE__, __LINE__);
226 A.
create(p, __FILE__, __LINE__);
228 cout <<
"p^e=" << A << endl;
229 B.
create(p, __FILE__, __LINE__);
231 cout <<
"p^{e-1}=" << A << endl;
234 cout <<
"p^e-p^{e-1}=" << C << endl;
237 cout <<
"R=" << R << endl;
241 cout <<
"R=" << R << endl;
245 cout <<
"R not divisible by d" << endl;
249 cout <<
"R/d=" << A << endl;
256 int Q, f, i, j, k, s, c, l, r = 0;
260 f = (Q - 1) / (q - 1);
261 cout <<
"q=" << q <<
" h=" << h << endl;
263 int *S, *C, *SM, *CM;
270 for (k = 0; k < Q; k++) {
273 for (k = 0; k < q - 1; k++) {
277 for (k = 0; k < f; k++) {
278 for (j = 0; j < q - 1; j++) {
280 S[k * (q - 1) + j] = s;
282 cout <<
"s=" << s <<
" >= Q=" << Q << endl;
288 cout <<
"c=" << c <<
" >= q-1=" << q-1 << endl;
292 C[k * (q - 1) + j] = c;
295 C[k * (q - 1) + j] = -1;
300 cout <<
"subexponents mod " << q - 1 <<
" :" << endl;
301 print_integer_matrix_width(cout, S, f, q - 1, q - 1, 2);
302 cout <<
"subexponents mod " << f <<
" :" << endl;
303 print_integer_matrix_width(cout, S, q - 1, f, f, 2);
304 cout <<
"integral elements:" << endl;
305 print_integer_matrix_width(cout, C, f, q - 1, q - 1, 2);
306 cout <<
"integral elements mod " << f <<
" :" << endl;
307 print_integer_matrix_width(cout, C, q - 1, f, f, 2);
309 cout <<
"multiplicities SM:" << endl;
310 for (i = 0; i < Q; i++) {
312 cout << i <<
" : " << SM[i] << endl;
316 cout << f <<
"^" << SM[f] << endl;
317 cout <<
"multiplicities CM:" << endl;
320 cout <<
"period " << l << endl;
321 for (i = 0; i < q - 1; i++) {
342 for (p = 1; p < l; p++) {
344 for (i = 0; i < l; i++) {
369 for (s = 1;
TRUE; s++) {
392 cout <<
"algebra_global::plus_minus_string epsilon=" << epsilon << endl;
407 cout <<
"algebra_global::plus_minus_letter epsilon=" << epsilon << endl;
422 cout <<
"algebra_global::display_all_PHG_elements not a chain ring" << endl;
427 for (i = 0; i < l; i++) {
430 for (j = 0; j < n + 1; j++) {
434 cout <<
" : " << a << endl;
446 int verbose_level = 0;
448 GFp.finite_field_init(p,
FALSE , verbose_level);
459 for (i = 0; i < 4; i++) {
461 cout <<
"elt_" << i <<
" = ";
464 for (i = 0; i < 4; i++) {
465 for (j = 0; j < 4; j++) {
470 Fq.
mult(elts[i], elts[j], c, verbose_level);
473 FX.
mult(elts[i], elts[j], a, verbose_level);
484 int verbose_level = 0;
492 for (i = 1; i < q; i++) {
504 for (i = 0; i < n; i++) {
505 for (j = 0; j < n; j++) {
525 int x[] = {15, 14, 12, 8};
527 int verbose_level = 0;
530 cout <<
"a=" << a << endl;
531 b.
create(2, __FILE__, __LINE__);
540 cout <<
"a=" << a << endl;
545 cout <<
"b=" << b << endl;
554 int verbose_level = 0;
558 cout << a <<
" = " << b <<
" * 127 + " << r << endl;
561 cout << b <<
" = " << d <<
" * " << c <<
" + " << e << endl;
570 for (i = 0; i < 10; i++) {
571 for (j = 0; j < 10; j++) {
582 int n = 6, q = 2, k, x, d = 3;
586 for (k = 0; k <= n; k++) {
587 for (x = 0; x <= n; x++) {
588 if (x > 0 && x < d) {
591 if (q == 2 &&
EVEN(d) &&
ODD(x)) {
606 int verbose_level = 2;
608 a.
create(9548, __FILE__, __LINE__);
609 b.
create(254774, __FILE__, __LINE__);
627 int verbose_level = 2;
631 a.
create(7411, __FILE__, __LINE__);
632 b.
create(9283, __FILE__, __LINE__);
633 D.
jacobi(a, b, verbose_level);
645 a.
create(15, __FILE__, __LINE__);
646 for (i = 0; i < 15; i++) {
649 for (i = 0; i < 10000; i++) {
655 for (i = 0; i < 15; i++) {
656 cout << i <<
" : " << mult[i] << endl;
663 int verbose_level = 2;
666 int nb_solovay_strassen_tests = 100;
667 int f_miller_rabin_test =
TRUE;
669 one.
create(1, __FILE__, __LINE__);
670 a.
create(197659, __FILE__, __LINE__);
672 f_miller_rabin_test, verbose_level);
680 multiplicities = NULL;
696 int j, c, h, f_added;
698 int *tmp_multiplicities;
702 for (j = 0; j < nb_agos; j++) {
712 tmp_multiplicities = multiplicities;
714 multiplicities =
NEW_int(nb_agos + 1);
715 for (h = 0; h < j; h++) {
717 multiplicities[h] = tmp_multiplicities[h];
720 multiplicities[j] = 1;
721 for (h = j; h < nb_agos; h++) {
723 multiplicities[h + 1] = tmp_multiplicities[h];
738 tmp_multiplicities = multiplicities;
740 multiplicities =
NEW_int(nb_agos + 1);
741 for (h = 0; h < nb_agos; h++) {
743 multiplicities[h] = tmp_multiplicities[h];
746 multiplicities[nb_agos] = 1;
761 for (j = 0; j < nb_agos; j++) {
763 if (multiplicities[j] == 1) {
765 else if (multiplicities[j] >= 10) {
766 ost <<
"^{" << multiplicities[j] <<
"}";
769 ost <<
"^" << multiplicities[j];
771 if (j < nb_agos - 1) {
781 int f_v = (verbose_level >= 1);
782 int i, j, h, a, b, ap, bp, g;
787 cout <<
"algebra_global::do_equivalence_class_of_fractions" << endl;
798 for (i = 0; i < N; i++) {
800 for (j = 0; j < N; j++) {
805 for (h = 0; h < length; h++) {
806 if (Pairs[h * 2 + 0] == ap && Pairs[h * 2 + 1] == bp) {
807 Table[i * N + j] = h;
812 Pairs[h * 2 + 0] = ap;
813 Pairs[h * 2 + 1] = bp;
814 Table[i * N + j] = h;
823 sprintf(str,
"table_fractions_N%d.csv", N);
826 cout <<
"Written file " << fname <<
" of size " << Fio.
file_size(fname) << endl;
832 cout <<
"algebra_global::do_equivalence_class_of_fractions done" << endl;
842 int f_v = (verbose_level >= 1);
845 cout <<
"algebra_global::order_of_q_mod_n" << endl;
851 snprintf(str, 1000,
"order_of_q_mod_n_q%d_%d_%d.csv", q, n_min, n_max);
860 cout <<
"algebra_global::order_of_q_mod_n writing csv file" << endl;
869 ost <<
"ROW,N,ORD,PHI,COF" << endl;
870 for (n = n_min; n <= n_max; n++) {
879 ost << row <<
"," << n;
880 cout <<
"computing n=" << n <<
" q=" << q << endl;
892 ost <<
"END" << endl;
895 cout <<
"algebra_global::order_of_q_mod_n writing csv file" << endl;
902 cout <<
"algebra_global::order_of_q_mod_n written file " << fname <<
" of size "
910 cout <<
"algebra_global::order_of_q_mod_n done" << endl;
917 int f_v = (verbose_level >= 1);
920 cout <<
"algebra_global::power_function_mod_n" << endl;
926 snprintf(str, 1000,
"power_function_k%d_n%d.csv", k, n);
935 cout <<
"algebra_global::power_function_mod_n computing powers" << endl;
945 ost <<
"ROW,A,APOWK" << endl;
946 for (a = 0; a < n; a++) {
956 ost <<
"END" << endl;
959 cout <<
"algebra_global::power_function_mod_n writing csv file" << endl;
966 cout <<
"algebra_global::power_function_mod_n written file " << fname <<
" of size "
974 cout <<
"algebra_global::power_mod_interval_n done" << endl;
980 int f_v = (verbose_level >= 1);
990 cout <<
"algebra_global::do_trace" << endl;
998 for (s = 0; s < F->
q; s++) {
1001 int s2, s4, s8, s2p1, s2p1t7, s2p1t6, s2p1t4, f;
1004 s2p1 = F->
add(s2, 1);
1005 s2p1t7 = F->
power(s2p1, 7);
1006 s2p1t6 = F->
power(s2p1, 6);
1007 s2p1t4 = F->
power(s2p1, 4);
1009 s4 = F->
power(s, 4);
1010 s8 = F->
power(s, 8);
1012 f = F->
add4(F->
mult(s, s2p1t7), F->
mult(s2, s2p1t6), F->
mult(s4, s2p1t4), s8);
1030 cout <<
"Trace 0:" << endl;
1034 cout <<
"Trace 1:" << endl;
1042 snprintf(str, 1000,
"F_q%d_trace.csv", F->
q);
1043 fname_csv.assign(str);
1045 cout <<
"written file " << fname_csv <<
" of size "
1049 snprintf(str, 1000,
"F_q%d_trace_0.csv", F->
q);
1050 fname_csv.assign(str);
1052 fname_csv,
"Trace_0");
1053 cout <<
"written file " << fname_csv <<
" of size "
1056 snprintf(str, 1000,
"F_q%d_trace_1.csv", F->
q);
1057 fname_csv.assign(str);
1059 fname_csv,
"Trace_1");
1060 cout <<
"written file " << fname_csv <<
" of size "
1068 cout <<
"algebra_global::do_trace done" << endl;
1074 int f_v = (verbose_level >= 1);
1082 cout <<
"algebra_global::do_norm" << endl;
1088 for (s = 0; s < F->
q; s++) {
1098 cout <<
"Norm 0:" << endl;
1102 cout <<
"Norm 1:" << endl;
1111 snprintf(str, 1000,
"F_q%d_norm_0.csv", F->
q);
1112 fname_csv.assign(str);
1114 fname_csv,
"Norm_0");
1115 cout <<
"written file " << fname_csv <<
" of size " << Fio.
file_size(fname_csv) << endl;
1117 snprintf(str, 1000,
"F_q%d_norm_1.csv", F->
q);
1118 fname_csv.assign(str);
1120 fname_csv,
"Norm_1");
1121 cout <<
"written file " << fname_csv <<
" of size " << Fio.
file_size(fname_csv) << endl;
1125 cout <<
"algebra_global::do_norm done" << endl;
1131 int f_v = (verbose_level >= 1);
1134 cout <<
"algebra_global::do_cheat_sheet_GF q=" << F->
q << endl;
1141 snprintf(fname, 1000,
"%s.tex", F->
label.c_str());
1142 snprintf(title, 1000,
"Cheat Sheet $%s$", F->
label_tex.c_str());
1158 ofstream ost(fname);
1193 cout <<
"written file " << fname <<
" of size " << Fio.
file_size(fname) << endl;
1197 cout <<
"algebra_global::do_cheat_sheet_GF q=" << F->
q <<
" done" << endl;
1208 int f_v = (verbose_level >= 1);
1214 cout <<
"algebra_global::gl_random_matrix" << endl;
1222 cout <<
"Random invertible matrix:" << endl;
1235 cout <<
"The characteristic polynomial is ";
1240 cout <<
"After substitution, the matrix is " << endl;
1255 std::string &fname_csv_in,
int n,
int verbose_level)
1257 int f_v = (verbose_level >= 1);
1260 cout <<
"algebra_global::apply_Walsh_Hadamard_transform" << endl;
1268 BF->
init(n, verbose_level);
1275 string fname_csv_out;
1278 fname_csv_out.assign(fname_csv_in);
1280 fname_csv_out.append(
"_transformed.csv");
1285 cout <<
"algebra_global::apply_Walsh_Hadamard_transform len != BF->Q" << endl;
1298 cout <<
"is bent" << endl;
1301 cout <<
"is not bent" << endl;
1306 cout <<
"is near bent" << endl;
1309 cout <<
"is not near bent" << endl;
1314 cout <<
"written file " << fname_csv_out <<
" of size "
1315 << Fio.
file_size(fname_csv_out) << endl;
1321 cout <<
"algebra_global::apply_Walsh_Hadamard_transform done" << endl;
1326 std::string &fname_csv_in,
int n,
int verbose_level)
1328 int f_v = (verbose_level >= 1);
1331 cout <<
"algebra_global::algebraic_normal_form" << endl;
1340 cout <<
"algebra_global::algebraic_normal_form before BF->init" << endl;
1342 BF->
init(n, verbose_level);
1344 cout <<
"algebra_global::algebraic_normal_form after BF->init" << endl;
1352 string fname_csv_out;
1355 fname_csv_out.assign(fname_csv_in);
1357 fname_csv_out.append(
"_alg_normal_form.csv");
1362 cout <<
"algebra_global::algebraic_normal_form len != BF->Q" << endl;
1374 cout <<
"algebra_global::algebraic_normal_form before BF->compute_polynomial_representation" << endl;
1378 cout <<
"algebra_global::algebraic_normal_form after BF->compute_polynomial_representation" << endl;
1381 cout <<
"algebraic normal form:" << endl;
1385 cout <<
"algebraic normal form in tex:" << endl;
1389 cout <<
"algebraic normal form in numerical form:" << endl;
1396 cout <<
"written file " << fname_csv_out <<
" of size "
1397 << Fio.
file_size(fname_csv_out) << endl;
1403 cout <<
"algebra_global::algebraic_normal_form done" << endl;
1408 std::string &fname_csv_in,
int verbose_level)
1410 int f_v = (verbose_level >= 1);
1413 cout <<
"algebra_global::apply_trace_function" << endl;
1421 string fname_csv_out;
1424 fname_csv_out.assign(fname_csv_in);
1426 fname_csv_out.append(
"_trace.csv");
1430 for (i = 0; i < len; i++) {
1438 cout <<
"algebra_global::apply_trace_function done" << endl;
1443 std::string &fname_csv_in,
long int d,
int verbose_level)
1445 int f_v = (verbose_level >= 1);
1448 cout <<
"algebra_global::apply_power_function" << endl;
1456 string fname_csv_out;
1459 fname_csv_out.assign(fname_csv_in);
1464 sprintf(str,
"_power_%ld.csv", d);
1465 fname_csv_out.append(str);
1469 for (i = 0; i < len; i++) {
1470 M[i] = F->
power(M[i], d);
1473 cout <<
"written file " << fname_csv_out <<
" of size "
1474 << Fio.
file_size(fname_csv_out) << endl;
1479 cout <<
"algebra_global::apply_power_function done" << endl;
1484 std::string &fname_csv_out,
int verbose_level)
1486 int f_v = (verbose_level >= 1);
1489 cout <<
"algebra_global::identity_function" << endl;
1498 for (i = 0; i < F->
q; i++) {
1502 cout <<
"written file " << fname_csv_out <<
" of size "
1503 << Fio.
file_size(fname_csv_out) << endl;
1508 cout <<
"algebra_global::identity_function done" << endl;
1515 int f_v = (verbose_level >= 1);
1524 cout <<
"algebra_global::Walsh_matrix" << endl;
1531 for (i = 0; i < Q; i++) {
1533 for (j = 0; j < Q; j++) {
1550 snprintf(str, 1000,
"Walsh_pm_%d.csv", n);
1551 fname_csv.assign(str);
1553 cout <<
"written file " << fname_csv <<
" of size "
1557 snprintf(str, 1000,
"Walsh_01_%d.csv", n);
1558 fname_csv.assign(str);
1560 cout <<
"written file " << fname_csv <<
" of size "
1568 cout <<
"algebra_global::Walsh_matrix done" << endl;
1574 int f_v = (verbose_level >= 1);
1580 cout <<
"algebra_global::Vandermonde_matrix" << endl;
1585 for (i = 0; i < q; i++) {
1588 for (j = 1; j < q; j++) {
1595 cout <<
"algebra_global::Vandermonde_matrix before invert_matrix" << endl;
1599 cout <<
"algebra_global::Vandermonde_matrix after invert_matrix" << endl;
1606 snprintf(str, 1000,
"Vandermonde_%d.csv", q);
1607 fname_csv.assign(str);
1609 cout <<
"written file " << fname_csv <<
" of size "
1613 snprintf(str, 1000,
"Vandermonde_inv_%d.csv", q);
1614 fname_csv.assign(str);
1616 cout <<
"written file " << fname_csv <<
" of size "
1621 cout <<
"algebra_global::Vandermonde_matrix done" << endl;
1627 int f_v = (verbose_level >= 1);
1630 int delta_min, nb_times;
1633 cout <<
"algebra_global::search_APN" << endl;
1636 delta_min = INT_MAX;
1640 std::vector<std::vector<int> > Solutions;
1645 delta_min, nb_times, Solutions,
1647 cout <<
"nb_times = " << nb_times << endl;
1654 sprintf(str,
"APN_functions_q%d.csv", F->
q);
1658 cout <<
"Written file " << fname <<
" of size " << Fio.
file_size(fname) << endl;
1662 cout <<
"algebra_global::search_APN done" << endl;
1667 int *f,
int depth,
int &delta_min,
int &nb_times,
1668 std::vector<std::vector<int> > &Solutions,
int verbose_level)
1670 if (depth == F->
q) {
1674 if (delta < delta_min) {
1683 for (i = 0; i < F->
q; i++) {
1686 Solutions.push_back(S);
1689 cout <<
" delta = " << delta <<
" nb_times=" << nb_times << endl;
1691 else if (delta == delta_min) {
1695 if (nb_times > 100) {
1696 if ((nb_times % 1000) == 0) {
1710 for (i = 0; i < F->
q; i++) {
1713 Solutions.push_back(S);
1717 cout <<
" delta = " << delta <<
" nb_times=" << nb_times << endl;
1725 for (a = 0; a < F->
q; a++) {
1728 f, depth + 1, delta_min, nb_times, Solutions, verbose_level);
1735 int f_v = (verbose_level >= 1);
1737 int a, av, x, b, fx, fxpa, mfx, dy, delta;
1741 cout <<
"algebra_global::non_linearity" << endl;
1746 for (x = 0; x < q; x++) {
1749 for (a = 1; a < q; a++) {
1750 fxpa = f[F->
add(x, a)];
1752 dy = F->
add(fxpa, mfx);
1753 b = F->
mult(dy, av);
1754 nb_times_ab[a * q + b]++;
1758 for (a = 1; a < q; a++) {
1759 for (b = 0; b < q; b++) {
1760 delta =
MAXIMUM(delta, nb_times_ab[a * q + b]);
1768 int *At,
int *As,
int &f_switch,
int *B,
1771 int f_v = (verbose_level >= 1);
1772 int f_vv = (verbose_level >= 2);
1773 int a, b, c, d, e, f, g, h;
1775 int P[4], Q[4], R[4], S[4];
1783 cout <<
"algebra_global::O4_isomorphism_4to2" << endl;
1802 0, 0, verbose_level);
1804 cout <<
"grid point (0,0) = ";
1809 1, 0, verbose_level);
1811 cout <<
"grid point (1,0) = ";
1818 Rx, Ry, verbose_level);
1820 Sx, Sy, verbose_level);
1822 cout <<
"Rx=" << Rx <<
" Ry=" << Ry
1823 <<
" Sx=" << Sx <<
" Sy=" << Sy << endl;
1832 cout <<
"f_switch=" << f_switch << endl;
1835 if (b22 == 0 && b24 == 0 && b32 == 0 && b34 == 0) {
1844 c = F->
mult(fv, b33);
1861 b = F->
mult(fv, b12);
1862 c = F->
mult(fv, b33);
1867 b = F->
mult(ev, b42);
1875 if (b22 == 0 && b24 == 0 && b42 == 0 && b44 == 0) {
1890 d = F->
mult(ev, b33);
1901 b = F->
mult(fv, b12);
1909 d = F->
mult(ev, b33);
1914 cout <<
"a=" << a <<
" b=" << b <<
" c=" << c <<
" d=" << d << endl;
1915 cout <<
"e=" << e <<
" f=" << f <<
" g=" << g <<
" h=" << h << endl;
1926 cout <<
"At:" << endl;
1928 cout <<
"As:" << endl;
1935 int *At,
int *As,
int f_switch,
int *B)
1937 int a, b, c, d, e, f, g, h;
1948 B[0 * 4 + 0] = F->
mult(h, d);
1949 B[0 * 4 + 1] = F->
mult(f, b);
1951 B[0 * 4 + 3] = F->
mult(h, b);
1952 B[1 * 4 + 0] = F->
mult(g, c);
1953 B[1 * 4 + 1] = F->
mult(e, a);
1955 B[1 * 4 + 3] = F->
mult(g, a);
1958 B[2 * 4 + 2] = F->
mult(f, c);
1960 B[3 * 4 + 0] = F->
mult(g, d);
1961 B[3 * 4 + 1] = F->
mult(e, b);
1963 B[3 * 4 + 3] = F->
mult(g, b);
1966 B[0 * 4 + 0] = F->
mult(h, d);
1967 B[0 * 4 + 1] = F->
mult(f, b);
1969 B[0 * 4 + 3] = F->
mult(h, b);
1970 B[1 * 4 + 0] = F->
mult(g, c);
1971 B[1 * 4 + 1] = F->
mult(e, a);
1973 B[1 * 4 + 3] = F->
mult(g, a);
1976 B[2 * 4 + 2] = F->
mult(e, d);
1978 B[3 * 4 + 0] = F->
mult(h, c);
1979 B[3 * 4 + 1] = F->
mult(f, a);
1981 B[3 * 4 + 3] = F->
mult(h, a);
1986 int x1,
int x2,
int x3,
int x4,
int &grid_x,
int &grid_y,
1989 int f_v = (verbose_level >= 1);
1990 int a, b, c, d, av, e;
2011 cout <<
"algebra_global::O4_grid_coordinates_rank "
2024 cout <<
"a is zero, b and c are not" << endl;
2045 int &x1,
int &x2,
int &x3,
int &x4,
2046 int grid_x,
int grid_y,
2049 int f_v = (verbose_level >= 1);
2063 a = F->
mult(v[0], w[0]);
2064 b = F->
mult(v[0], w[1]);
2065 c = F->
mult(v[1], w[0]);
2066 d = F->
mult(v[1], w[1]);
2074 int pt_x1,
int pt_x2,
int pt_x3,
int pt_x4,
2078 int f_v = (verbose_level >= 1);
2081 int size, x, y, z, xx, yy, zz, h, k;
2084 int f_special =
FALSE;
2085 int f_complete =
FALSE;
2093 cout <<
"algebra_global::O4_find_tangent_plane pt_x1=" << pt_x1
2094 <<
" pt_x2=" << pt_x2
2095 <<
" pt_x3=" << pt_x3
2096 <<
" pt_x4=" << pt_x4 << endl;
2102 A[2] = negate(pt_x3);
2110 int nb_complement = 0;
2112 secants1 =
NEW_int(size * size);
2113 secants2 =
NEW_int(size * size);
2114 complement =
NEW_int(size * size);
2115 for (x = 0; x < size; x++) {
2116 for (y = 0; y < size; y++) {
2129 for (k = 0; k < size; k++) {
2131 y1 = F->
add(F->
mult(pt_x1, vec2[0]), F->
mult(x1, vec2[1]));
2132 y2 = F->
add(F->
mult(pt_x2, vec2[0]), F->
mult(x2, vec2[1]));
2133 y3 = F->
add(F->
mult(pt_x3, vec2[0]), F->
mult(x3, vec2[1]));
2134 y4 = F->
add(F->
mult(pt_x4, vec2[0]), F->
mult(x4, vec2[1]));
2140 zz = xx * size + yy;
2160 f_special, f_complete, base_cols,
2161 f_P, NULL, 3, 4, 4, 0);
2163 secants1[nb_secants] = z;
2164 secants2[nb_secants] = zz;
2172 for (xx = 0; xx < size; xx++) {
2173 for (yy = 0; yy < size; yy++) {
2174 zz = xx * size + yy;
2195 rk = F.Gauss_int(C, f_special, f_complete, base_cols,
2196 f_P, NULL, 3, 4, 4, 0);
2198 secants1[nb_secants] = z;
2199 secants2[nb_secants] = zz;
2210 cout <<
"nb_secants=" << nb_secants << endl;
2217 for (zz = 0; zz < size * size; zz++) {
2218 if (secants1[h] > zz) {
2219 complement[nb_complement++] = zz;
2226 cout <<
"complement = tangents:" << endl;
2232 T =
NEW_int(4 * nb_complement);
2234 for (h = 0; h < nb_complement; h++) {
2239 cout << setw(3) << h <<
" : " << setw(4) << z
2240 <<
" : " << x <<
"," << y <<
" : ";
2243 x, y, verbose_level);
2245 cout <<
"y1=" << y1 <<
" y2=" << y2
2246 <<
" y3=" << y3 <<
" y4=" << y4 << endl;
2256 f_P, NULL, nb_complement, 4, 4, 0);
2258 cout <<
"the rank of the tangent space is " << rk << endl;
2259 cout <<
"basis:" << endl;
2264 cout <<
"rk = " << rk <<
" not equal to 3" << endl;
2268 for (i = 0; i < 12; i++) {
2269 tangent_plane[i] = T[i];
2277 for (h = 0; h < nb_secants; h++) {
2284 cout <<
"(" << x <<
"," << y <<
"),(" << xx
2285 <<
"," << yy <<
")" << endl;
2287 x, y, verbose_level);
2288 cout <<
"x1=" << x1 <<
" x2=" << x2
2289 <<
" x3=" << x3 <<
" x4=" << x4 << endl;
2291 cout <<
"y1=" << y1 <<
" y2=" << y2
2292 <<
" y3=" << y3 <<
" y4=" << y4 << endl;
void O4_isomorphism_4to2(field_theory::finite_field *F, int *At, int *As, int &f_switch, int *B, int verbose_level)
void search_APN_recursion(field_theory::finite_field *F, int *f, int depth, int &delta_min, int &nb_times, std::vector< std::vector< int > > &Solutions, int verbose_level)
void O4_grid_coordinates_rank(field_theory::finite_field *F, int x1, int x2, int x3, int x4, int &grid_x, int &grid_y, int verbose_level)
void do_equivalence_class_of_fractions(int N, int verbose_level)
void O4_isomorphism_2to4(field_theory::finite_field *F, int *At, int *As, int f_switch, int *B)
void apply_power_function(field_theory::finite_field *F, std::string &fname_csv_in, long int d, int verbose_level)
void Walsh_matrix(field_theory::finite_field *F, int n, int *&W, int verbose_level)
void longinteger_collect_print(std::ostream &ost, int &nb_agos, ring_theory::longinteger_object *&agos, int *&multiplicities)
void display_all_PHG_elements(int n, int q)
void O4_grid_coordinates_unrank(field_theory::finite_field *F, int &x1, int &x2, int &x3, int &x4, int grid_x, int grid_y, int verbose_level)
int is_diagonal_matrix(int *A, int n)
void do_norm(field_theory::finite_field *F, int verbose_level)
void algebraic_normal_form(field_theory::finite_field *F, std::string &fname_csv_in, int n, int verbose_level)
void longinteger_collect_setup(int &nb_agos, ring_theory::longinteger_object *&agos, int *&multiplicities)
void search_APN(field_theory::finite_field *F, int verbose_level)
const char * plus_minus_string(int epsilon)
int period_of_sequence(int *v, int l)
void formula_subprimitive(int d, int q, ring_theory::longinteger_object &Rdq, int &g, int verbose_level)
void longinteger_collect_add(int &nb_agos, ring_theory::longinteger_object *&agos, int *&multiplicities, ring_theory::longinteger_object &ago)
void O4_find_tangent_plane(field_theory::finite_field *F, int pt_x1, int pt_x2, int pt_x3, int pt_x4, int *tangent_plane, int verbose_level)
void power_function_mod_n(int k, int n, int verbose_level)
void do_cheat_sheet_GF(field_theory::finite_field *F, int verbose_level)
void apply_trace_function(field_theory::finite_field *F, std::string &fname_csv_in, int verbose_level)
const char * plus_minus_letter(int epsilon)
void gl_random_matrix(field_theory::finite_field *F, int k, int verbose_level)
void subexponent(int q, int Q, int h, int f, int j, int k, int &s, int &c)
void apply_Walsh_Hadamard_transform(field_theory::finite_field *F, std::string &fname_csv_in, int n, int verbose_level)
int subprimitive(int q, int h)
void longinteger_collect_free(int &nb_agos, ring_theory::longinteger_object *&agos, int *&multiplicities)
void Vandermonde_matrix(field_theory::finite_field *F, int *&W, int *&W_inv, int verbose_level)
void formula(int d, int q, ring_theory::longinteger_object &Rdq, int verbose_level)
void do_trace(field_theory::finite_field *F, int verbose_level)
int non_linearity(field_theory::finite_field *F, int *f, int verbose_level)
void order_of_q_mod_n(int q, int n_min, int n_max, int verbose_level)
void count_subprimitive(int Q_max, int H_max)
void identity_function(field_theory::finite_field *F, std::string &fname_csv_out, int verbose_level)
void raise(int *in, int *out)
void init(int n, int verbose_level)
void apply_Walsh_transform(int *in, int *out)
ring_theory::homogeneous_polynomial_domain * Poly
void compute_polynomial_representation(int *func, int *coeff, int verbose_level)
a collection of combinatorial functions
void binomial(ring_theory::longinteger_object &a, int n, int k, int verbose_level)
void krawtchouk(ring_theory::longinteger_object &a, int n, int q, int k, int x)
a collection of functions related to cryptography
void find_probable_prime_above(ring_theory::longinteger_object &a, int nb_solovay_strassen_tests, int f_miller_rabin_test, int verbose_level)
void matrix_print(int *p, int m, int n)
void cheat_sheet_main_table(std::ostream &f, int verbose_level)
int add4(int i1, int i2, int i3, int i4)
void PG_element_rank_modified(int *v, int stride, int len, int &a)
void cheat_sheet_power_table(std::ostream &f, int f_with_polynomials, int verbose_level)
void cheat_sheet_addition_table(std::ostream &f, int verbose_level)
void PG_element_normalize_from_front(int *v, int stride, int len)
void multiplication_table_save_csv(int verbose_level)
void addition_table_reordered_save_csv(int verbose_level)
void cheat_sheet(std::ostream &f, int verbose_level)
void PG_element_unrank_modified(int *v, int stride, int len, int a)
void addition_table_save_csv(int verbose_level)
void finite_field_init(int q, int f_without_tables, int verbose_level)
int absolute_trace(int i)
linear_algebra::linear_algebra * Linear_algebra
void cheat_sheet_multiplication_table(std::ostream &f, int verbose_level)
void multiplication_table_reordered_save_csv(int verbose_level)
various functions related to geometries
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
void mult_vector_from_the_left(int *v, int *A, int *vA, int m, int n)
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 random_invertible_matrix(int *M, int k, int verbose_level)
void invert_matrix(int *A, int *A_inv, int n, int verbose_level)
int dot_product(int len, int *v, int *w)
basic number theoretic functions
long int gcd_lint(long int m, long int n)
long int power_mod(long int a, long int n, long int p)
void print_factorization(int nb_primes, int *primes, int *exponents)
int i_power_j(int i, int j)
int is_prime_power(int q)
int eulers_totient_function(int n, int verbose_level)
long int euler_function(long int n)
long int order_mod_p(long int a, long int p)
a collection of functions related to file io
void int_matrix_write_csv(std::string &fname, int *M, int m, int n)
void int_vec_write_csv(int *v, int len, std::string &fname, const char *label)
void int_matrix_read_csv(std::string &fname, int *&M, int &m, int &n, int verbose_level)
void vector_matrix_write_csv(std::string &fname, std::vector< std::vector< int > > &V)
long int file_size(std::string &fname)
interface to create latex output files
void head(std::ostream &ost, int f_book, int f_title, const char *title, const char *author, int f_toc, int f_landscape, int f_12pt, int f_enlarged_page, int f_pagenumbers, const char *extras_for_preamble)
void foot(std::ostream &ost)
data_structures::int_vec * Int_vec
int PHG_element_rank(int *v, int stride, int len)
void init(int q, int verbose_level)
void PHG_element_unrank(int *v, int stride, int len, int rk)
int nb_PHG_elements(int n)
void print_equation_numerical(std::ostream &ost, int *coeffs)
void print_equation(std::ostream &ost, int *coeffs)
void print_equation_tex(std::ostream &ost, int *coeffs)
domain to compute with objects of type longinteger
void extended_gcd(longinteger_object &a, longinteger_object &b, longinteger_object &g, longinteger_object &u, longinteger_object &v, int verbose_level)
int jacobi(longinteger_object &a, longinteger_object &m, int verbose_level)
void base_b_representation(longinteger_object &a, int b, int *&rep, int &len)
void multiply_up(longinteger_object &a, int *x, int len, int verbose_level)
void add(longinteger_object &a, longinteger_object &b, longinteger_object &c)
void integral_division_by_int(longinteger_object &a, int b, longinteger_object &q, int &r)
void mult(longinteger_object &a, longinteger_object &b, longinteger_object &c)
void random_number_less_than_n(longinteger_object &n, longinteger_object &r)
void integral_division(longinteger_object &a, longinteger_object &b, longinteger_object &q, longinteger_object &r, int verbose_level)
void factor(longinteger_object &a, int &nb_primes, int *&primes, int *&exponents, int verbose_level)
void power_int(longinteger_object &a, int n)
int compare_unsigned(longinteger_object &a, longinteger_object &b)
a class to represent arbitrary precision integers
void create_from_base_b_representation(int b, int *rep, int len)
void create_from_base_10_string(const char *str, int verbose_level)
void assign_to(longinteger_object &b)
std::ostream & print(std::ostream &ost)
void create(long int i, const char *file, int line)
void swap_with(longinteger_object &b)
domain of polynomials in one variable over a finite field
void delete_object(unipoly_object &p)
void substitute_matrix_in_polynomial(unipoly_object &p, int *Mtx_in, int *Mtx_out, int k, int verbose_level)
void mult(unipoly_object a, unipoly_object b, unipoly_object &c, int verbose_level)
void create_object_by_rank(unipoly_object &p, long int rk, const char *file, int line, int verbose_level)
void characteristic_polynomial(int *Mtx, int k, unipoly_object &char_poly, int verbose_level)
void minimum_polynomial(unipoly_object &a, int alpha, int p, int verbose_level)
void print_object(unipoly_object p, std::ostream &ost)
#define Int_vec_zero(A, B)
#define Int_vec_print_fully(A, B, C)
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
#define NEW_OBJECTS(type, n)
#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