16namespace layer1_foundations {
17namespace linear_algebra {
23void linear_algebra::Gram_matrix(
int epsilon,
int k,
24 int form_c1,
int form_c2,
int form_c3,
25 int *&Gram,
int verbose_level)
27 int f_v = (verbose_level >= 1);
29 int n, i, j, u, offset = 0;
33 cout <<
"linear_algebra::Gram_matrix" << endl;
39 Gram[0 * d + 0] =
F->
add(form_c1, form_c1);
42 else if (epsilon == 1) {
44 else if (epsilon == -1) {
45 Gram[(d - 2) * d + d - 2] =
F->
add(form_c1, form_c1);
46 Gram[(d - 2) * d + d - 1] = form_c2;
47 Gram[(d - 1) * d + d - 2] = form_c2;
48 Gram[(d - 1) * d + d - 1] =
F->
add(form_c3, form_c3);
50 for (i = 0; i < n; i++) {
53 Gram[u * d + u + 1] = 1;
55 Gram[(u + 1) * d + u] = 1;
59 cout <<
"linear_algebra::Gram_matrix done" << endl;
63int linear_algebra::evaluate_bilinear_form(
64 int *u,
int *v,
int d,
int *Gram)
66 int i, j, a, b, c, e, A;
69 for (i = 0; i < d; i++) {
71 for (j = 0; j < d; j++) {
82int linear_algebra::evaluate_quadratic_form(
int *v,
int stride,
83 int epsilon,
int k,
int form_c1,
int form_c2,
int form_c3)
85 int n, a, b, c = 0, d, x, x1, x2;
95 else if (epsilon == 1) {
98 else if (epsilon == -1) {
100 x1 = v[2 * n * stride];
101 x2 = v[(2 * n + 1) * stride];
105 c =
F->
add4(a, b, c, d);
111int linear_algebra::evaluate_hyperbolic_quadratic_form(
112 int *v,
int stride,
int n)
114 int alpha = 0, beta, u;
116 for (u = 0; u < n; u++) {
117 beta =
F->
mult(v[2 * u * stride], v[(2 * u + 1) * stride]);
118 alpha =
F->
add(alpha, beta);
123int linear_algebra::evaluate_hyperbolic_bilinear_form(
124 int *u,
int *v,
int n)
126 int alpha = 0, beta1, beta2, i;
128 for (i = 0; i < n; i++) {
129 beta1 =
F->
mult(u[2 * i], v[2 * i + 1]);
130 beta2 =
F->
mult(u[2 * i + 1], v[2 * i]);
131 alpha =
F->
add(alpha, beta1);
132 alpha =
F->
add(alpha, beta2);
139void linear_algebra::Siegel_map_between_singular_points(
int *T,
140 long int rk_from,
long int rk_to,
long int root,
141 int epsilon,
int algebraic_dimension,
142 int form_c1,
int form_c2,
int form_c3,
int *Gram_matrix,
146 int *B, *Bv, *w, *z, *x;
147 int i, j, a, b, av, bv, minus_one;
149 int f_v = (verbose_level >= 1);
150 int f_vv = (verbose_level >= 2);
153 cout <<
"linear_algebra::Siegel_map_between_singular_points "
154 "rk_from=" << rk_from
155 <<
" rk_to=" << rk_to
156 <<
" root=" << root << endl;
158 d = algebraic_dimension;
167 form_c1, form_c2, form_c3, root, 0 );
169 form_c1, form_c2, form_c3, rk_from, 0 );
171 form_c1, form_c2, form_c3, rk_to, 0 );
188 for (i = 0; i < d; i++) {
189 B[d + i] =
F->
mult(B[d + i], av);
190 w[i] =
F->
mult(w[i], bv);
193 cout <<
"after scaling:" << endl;
201 for (i = 2; i < d; i++) {
202 for (j = 0; j < d; j++) {
208 cout <<
"before perp, the matrix B is:" << endl;
213 cout <<
"after perp, the matrix B is:" << endl;
218 cout <<
"the matrix Bv = B^{-1} is:" << endl;
223 cout <<
"the coefficient vector z = w * Bv is:" << endl;
230 cout <<
"we zero out the first two coordinates:" << endl;
236 cout <<
"the vector x = z * B is:" << endl;
241 for (i = 0; i < d; i++) {
242 x[i] =
F->
mult(x[i], minus_one);
245 cout <<
"the vector -x is:" << endl;
250 form_c1, form_c2, form_c3, T, x, B,
253 cout <<
"linear_algebra::Siegel_map_between_singular_points "
254 "the Siegel transformation is:" << endl;
264void linear_algebra::Siegel_Transformation(
266 int form_c1,
int form_c2,
int form_c3,
267 int *M,
int *v,
int *u,
int verbose_level)
274 int f_v = (verbose_level >= 1);
276 int i, j, Qv, a, b, c, e;
284 cout <<
"linear_algebra::Siegel_Transformation "
292 form_c1, form_c2, form_c3, Gram, verbose_level);
294 epsilon, k, form_c1, form_c2, form_c3);
296 cout <<
"Qv=" << Qv << endl;
302 for (i = 0; i < d; i++) {
303 for (j = 0; j < d; j++) {
313 for (i = 0; i < d; i++) {
315 for (j = 0; j < d; j++) {
324 for (i = 0; i < d; i++) {
326 for (j = 0; j < d; j++) {
329 M[i * d + j] =
F->
add(M[i * d + j], e);
333 for (i = 0; i < d; i++) {
335 for (j = 0; j < d; j++) {
344 for (i = 0; i < d; i++) {
346 for (j = 0; j < d; j++) {
353 for (i = 0; i < d; i++) {
355 for (j = 0; j < d; j++) {
362 cout <<
"linear_algebra::Siegel_Transformation "
363 "Siegel matrix:" << endl;
379long int linear_algebra::orthogonal_find_root(
int rk2,
380 int epsilon,
int algebraic_dimension,
381 int form_c1,
int form_c2,
int form_c3,
int *Gram_matrix,
384 int f_v = (verbose_level >= 1);
389 int y2_minus_y3, minus_y1, y3_minus_y2, a, a2, u, v;
392 d = algebraic_dimension;
395 cout <<
"linear_algebra::orthogonal_find_root "
396 "rk2=" << rk2 << endl;
399 cout <<
"linear_algebra::orthogonal_find_root: "
400 "rk2 must not be 0" << endl;
412 for (i = 0; i < d; i++) {
419 form_c1, form_c2, form_c3, rk2, 0 );
425 for (i = 2; i < d; i++) {
439 cout <<
"linear_algebra::orthogonal_find_root "
440 "error: y is zero vector" << endl;
444 if (minus_y1 != y2_minus_y3) {
452 if (minus_y1 != y3_minus_y2) {
466 else if (y[3] == 0) {
471 cout <<
"linear_algebra::orthogonal_find_root "
472 "error neither y2 nor y3 is zero" << endl;
486 cout <<
"u=" << u << endl;
491 cout <<
"v=" << v << endl;
495 form_c1, form_c2, form_c3, 0 );
497 cout <<
"linear_algebra::orthogonal_find_root "
498 "root=" << root << endl;
508void linear_algebra::choose_anisotropic_form(
509 int &c1,
int &c2,
int &c3,
int verbose_level)
511 int f_v = (verbose_level >= 1);
516 cout <<
"linear_algebra::choose_anisotropic_form "
517 "over GF(" <<
F->
q <<
")" << endl;
539 cout <<
"linear_algebra::choose_anisotropic_form "
540 "choosing the following primitive polynomial:" << endl;
544 int *rep = (
int *) m;
545 int *coeff = rep + 1;
554 GFQ.init(
GFq.q *
GFq.q, 0);
555 cout <<
"linear_algebra::choose_anisotropic_form "
556 "choose_anisotropic_form created field GF("
557 << GFQ.q <<
")" << endl;
560 c2 = GFQ.negate(GFQ.T2(GFQ.p));
563 cout <<
"c1=" << c1 <<
" c2=" << c2 <<
" c3=" << c3 << endl;
566 c2 = GFQ.retract(
GFq, 2, c2, verbose_level);
567 c3 = GFQ.retract(
GFq, 2, c3, verbose_level);
569 cout <<
"after retract:" << endl;
570 cout <<
"c1=" << c1 <<
" c2=" << c2 <<
" c3=" << c3 << endl;
575 cout <<
"linear_algebra::choose_anisotropic_form "
576 "over GF(" <<
F->
q <<
"): choosing c1=" << c1 <<
", c2=" << c2
577 <<
", c3=" << c3 << endl;
582int linear_algebra::evaluate_conic_form(
int *six_coeffs,
int *v3)
589 val1 =
F->
product3(six_coeffs[0], v3[0], v3[0]);
590 val =
F->
add(val, val1);
591 val1 =
F->
product3(six_coeffs[1], v3[1], v3[1]);
592 val =
F->
add(val, val1);
593 val1 =
F->
product3(six_coeffs[2], v3[2], v3[2]);
594 val =
F->
add(val, val1);
595 val1 =
F->
product3(six_coeffs[3], v3[0], v3[1]);
596 val =
F->
add(val, val1);
597 val1 =
F->
product3(six_coeffs[4], v3[0], v3[2]);
598 val =
F->
add(val, val1);
599 val1 =
F->
product3(six_coeffs[5], v3[1], v3[2]);
600 val =
F->
add(val, val1);
604int linear_algebra::evaluate_quadric_form_in_PG_three(
605 int *ten_coeffs,
int *v4)
610 val1 =
F->
product3(ten_coeffs[0], v4[0], v4[0]);
611 val =
F->
add(val, val1);
612 val1 =
F->
product3(ten_coeffs[1], v4[1], v4[1]);
613 val =
F->
add(val, val1);
614 val1 =
F->
product3(ten_coeffs[2], v4[2], v4[2]);
615 val =
F->
add(val, val1);
616 val1 =
F->
product3(ten_coeffs[3], v4[3], v4[3]);
617 val =
F->
add(val, val1);
618 val1 =
F->
product3(ten_coeffs[4], v4[0], v4[1]);
619 val =
F->
add(val, val1);
620 val1 =
F->
product3(ten_coeffs[5], v4[0], v4[2]);
621 val =
F->
add(val, val1);
622 val1 =
F->
product3(ten_coeffs[6], v4[0], v4[3]);
623 val =
F->
add(val, val1);
624 val1 =
F->
product3(ten_coeffs[7], v4[1], v4[2]);
625 val =
F->
add(val, val1);
626 val1 =
F->
product3(ten_coeffs[8], v4[1], v4[3]);
627 val =
F->
add(val, val1);
628 val1 =
F->
product3(ten_coeffs[9], v4[2], v4[3]);
629 val =
F->
add(val, val1);
633int linear_algebra::Pluecker_12(
int *x4,
int *y4)
638int linear_algebra::Pluecker_21(
int *x4,
int *y4)
643int linear_algebra::Pluecker_13(
int *x4,
int *y4)
648int linear_algebra::Pluecker_31(
int *x4,
int *y4)
653int linear_algebra::Pluecker_14(
int *x4,
int *y4)
658int linear_algebra::Pluecker_41(
int *x4,
int *y4)
663int linear_algebra::Pluecker_23(
int *x4,
int *y4)
668int linear_algebra::Pluecker_32(
int *x4,
int *y4)
673int linear_algebra::Pluecker_24(
int *x4,
int *y4)
678int linear_algebra::Pluecker_42(
int *x4,
int *y4)
683int linear_algebra::Pluecker_34(
int *x4,
int *y4)
688int linear_algebra::Pluecker_43(
int *x4,
int *y4)
693int linear_algebra::Pluecker_ij(
int i,
int j,
int *x4,
int *y4)
699int linear_algebra::evaluate_symplectic_form(
int len,
int *x,
int *y)
704 cout <<
"linear_algebra::evaluate_symplectic_form "
705 "len must be even" << endl;
706 cout <<
"len=" << len << endl;
711 for (i = 0; i < n; i++) {
713 F->
mult(x[2 * i + 0], y[2 * i + 1]),
720int linear_algebra::evaluate_symmetric_form(
int len,
int *x,
int *y)
725 cout <<
"linear_algebra::evaluate_symmetric_form "
726 "len must be even" << endl;
727 cout <<
"len=" << len << endl;
732 for (i = 0; i < n; i++) {
734 F->
mult(x[2 * i + 0], y[2 * i + 1]),
735 F->
mult(x[2 * i + 1], y[2 * i + 0])
741int linear_algebra::evaluate_quadratic_form_x0x3mx1x2(
int *x)
749void linear_algebra::solve_y2py(
int a,
int *Y2,
int &nb_sol)
754 for (y = 0; y <
F->
q; y++) {
761 cout <<
"linear_algebra::solve_y2py nb_sol > 2" << endl;
766void linear_algebra::find_secant_points_wrt_x0x3mx1x2(
int *Basis_line,
int *Pts4,
int &nb_pts,
int verbose_level)
768 int f_v = (verbose_level >= 1);
770 int b0, b1, b2, b3, b4, b5, b6, b7;
771 int a, av, b, c, bv, acbv2, cav, t, r, i;
774 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2" << endl;
781 Pts4[nb_pts * 2 + 0] = 1;
782 Pts4[nb_pts * 2 + 1] = 0;
789 Pts4[nb_pts * 2 + 0] = 0;
790 Pts4[nb_pts * 2 + 1] = 1;
806 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 a=" << a <<
" b=" << b <<
" c=" << c << endl;
809 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 a == 0" << endl;
815 cav =
F->
mult(c, av);
817 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 cav=" << cav << endl;
821 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 r=" << r << endl;
823 Pts4[nb_pts * 2 + 0] = 1;
824 Pts4[nb_pts * 2 + 1] = r;
829 acbv2 =
F->
mult4(a, c, bv, bv);
831 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 acbv2=" << acbv2 << endl;
835 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 t=" << t << endl;
842 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 before solve_y2py" << endl;
846 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 after solve_y2py nb_sol= " << nb_sol << endl;
850 if (nb_sol + nb_pts > 2) {
851 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 nb_sol + nb_pts > 2" << endl;
854 for (i = 0; i < nb_sol; i++) {
855 r =
F->
mult3(b, Y2[i], av);
857 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 solution " << i <<
" r=" << r << endl;
859 Pts4[nb_pts * 2 + 0] = 1;
860 Pts4[nb_pts * 2 + 1] = r;
867 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 no solution" << endl;
874 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 odd characteristic not yet implemented" << endl;
879 cout <<
"linear_algebra::find_secant_points_wrt_x0x3mx1x2 done" << endl;
883int linear_algebra::is_totally_isotropic_wrt_symplectic_form(
884 int k,
int n,
int *Basis)
888 for (i = 0; i < k; i++) {
889 for (j = i + 1; j < k; j++) {
898int linear_algebra::evaluate_monomial(
int *monomial,
899 int *variables,
int nb_vars)
904 for (i = 0; i < nb_vars; i++) {
907 for (j = 0; j < b; j++) {
int add4(int i1, int i2, int i3, int i4)
orthogonal_geometry::orthogonal_indexing * Orthogonal_indexing
int mult3(int a1, int a2, int a3)
int product3(int a1, int a2, int a3)
int frobenius_power(int a, int frob_power)
int absolute_trace(int i)
int mult4(int a1, int a2, int a3, int a4)
various functions related to geometries
int Witt_index(int epsilon, int k)
provides access to pre-computed combinatorial data in encoded form
void get_primitive_polynomial(std::string &poly, int p, int e, int verbose_level)
field_theory::finite_field * F
void Siegel_Transformation(int epsilon, int k, int form_c1, int form_c2, int form_c3, int *M, int *v, int *u, int verbose_level)
int evaluate_symplectic_form(int len, int *x, int *y)
void invert_matrix(int *A, int *A_inv, int n, int verbose_level)
void mult_matrix_matrix(int *A, int *B, int *C, int m, int n, int o, int verbose_level)
void solve_y2py(int a, int *Y2, int &nb_sol)
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)
int Pluecker_ij(int i, int j, int *x4, int *y4)
int evaluate_bilinear_form(int n, int *v1, int *v2, int *Gram)
int evaluate_quadratic_form_x0x3mx1x2(int *x)
void Gram_matrix(int epsilon, int k, int form_c1, int form_c2, int form_c3, int *&Gram, int verbose_level)
int evaluate_hyperbolic_quadratic_form(int *v, int stride, int n)
void Q_epsilon_unrank(int *v, int stride, int epsilon, int k, int c1, int c2, int c3, long int a, int verbose_level)
long int Q_epsilon_rank(int *v, int stride, int epsilon, int k, int c1, int c2, int c3, int verbose_level)
domain of polynomials in one variable over a finite field
void create_object_by_rank_string(unipoly_object &p, std::string &rk, int verbose_level)
void print_object(unipoly_object p, std::ostream &ost)
#define Int_vec_print_integer_matrix(A, B, C, D)
#define Int_vec_zero(A, B)
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
#define Int_vec_print(A, B, C)
the orbiter library for the classification of combinatorial objects