19namespace layer1_foundations {
20namespace orthogonal_geometry {
34 int f_v = (verbose_level >= 1);
37 cout <<
"orthogonal_indexing::init" << endl;
41 cout <<
"orthogonal_indexing::init done" << endl;
46 int *v,
int stride,
int epsilon,
int k,
47 int c1,
int c2,
int c3,
long int a,
int verbose_level)
49 int f_v = (verbose_level >= 1);
52 cout <<
"orthogonal_indexing::Q_epsilon_unrank" << endl;
56 cout <<
"orthogonal_indexing::Q_epsilon_unrank before Q_unrank" << endl;
58 Q_unrank(v, stride, k, a, verbose_level);
60 cout <<
"orthogonal_indexing::Q_epsilon_unrank after Q_unrank" << endl;
63 else if (epsilon == 1) {
65 cout <<
"orthogonal_indexing::Q_epsilon_unrank before Qplus_unrank" << endl;
69 cout <<
"orthogonal_indexing::Q_epsilon_unrank after Qplus_unrank" << endl;
72 else if (epsilon == -1) {
74 cout <<
"orthogonal_indexing::Q_epsilon_unrank before Qminus_unrank" << endl;
78 cout <<
"finite_field::Q_epsilon_unrank after Qminus_unrank" << endl;
82 cout <<
"orthogonal_indexing epsilon is wrong" << endl;
86 cout <<
"orthogonal_indexing::Q_epsilon_unrank done" << endl;
91 int *v,
int stride,
int epsilon,
int k,
92 int c1,
int c2,
int c3,
int verbose_level)
94 int f_v = (verbose_level >= 1);
98 cout <<
"orthogonal_indexing::Q_epsilon_rank" << endl;
102 cout <<
"orthogonal_indexing::Q_epsilon_rank before Q_rank" << endl;
104 a =
Q_rank(v, stride, k, verbose_level);
106 cout <<
"orthogonal_indexing::Q_epsilon_rank after Q_rank" << endl;
109 else if (epsilon == 1) {
111 cout <<
"orthogonal_indexing::Q_epsilon_rank before Qplus_rank" << endl;
115 cout <<
"orthogonal_indexing::Q_epsilon_rank after Qplus_rank" << endl;
118 else if (epsilon == -1) {
120 cout <<
"orthogonal_indexing::Q_epsilon_rank before Qminus_rank" << endl;
122 a =
Qminus_rank(v, stride, k, c1, c2, c3, verbose_level);
124 cout <<
"orthogonal_indexing::Q_epsilon_rank after Qminus_rank" << endl;
128 cout <<
"orthogonal_indexing::Q_epsilon_unrank epsilon is wrong" << endl;
132 cout <<
"orthogonal_indexing::Q_epsilon_rank done" << endl;
163 Sbar_unrank(v + stride, stride, n, a, verbose_level);
172 for (i = 0; i < n; i++) {
173 v[(1 + 2 * i) * stride] =
174 F->
mult(v[(1 + 2 * i) * stride], minusone);
191 Sbar_rank(v + stride, stride, n, a, verbose_level);
200 for (i = 0; i < n; i++) {
201 v[(1 + 2 * i) * stride] =
202 F->
mult(v[(1 + 2 * i) * stride], minusone);
205 N1_rank(v + stride, stride, n, b);
224 int f_v = (verbose_level >= 1);
230 cout <<
"orthogonal_indexing::Qplus_rank" << endl;
233 Sbar_rank(v, stride, n, a, verbose_level);
238 int stride,
int k,
long int a,
239 int c1,
int c2,
int c3,
int verbose_level)
246 int n, z, minusz, u, vv, w, i;
247 long int x, b, c, x1, x2;
253 v[2 * n * stride] = 0;
254 v[(2 * n + 1) * stride] = 0;
272 cout <<
"orthogonal_indexing::Qminus_unrank "
273 "b >= q, the rank was too big" << endl;
277 v[2 * n * stride] = x1;
278 v[(2 * n + 1) * stride] = x2;
282 z =
F->
add3(u, vv, w);
284 cout <<
"Qminus_unrank z = 0" << endl;
285 cout <<
"b=" << b << endl;
286 cout <<
"c1=" << c1 << endl;
287 cout <<
"c2=" << c2 << endl;
288 cout <<
"c3=" << c3 << endl;
289 cout <<
"x1=" << x1 << endl;
290 cout <<
"x2=" << x2 << endl;
291 cout <<
"u=c1*x1*x1=" << u << endl;
292 cout <<
"vv=c2*x1*x2=" << vv << endl;
293 cout <<
"w=c3*x2*x2=" << w << endl;
299 for (i = 0; i < n; i++) {
300 v[2 * i * stride] =
F->
mult(v[2 * i * stride], minusz);
306 int stride,
int k,
int c1,
int c2,
int c3,
int verbose_level)
313 int n, minusz, minuszv;
314 long int a, b, c, x, x1, x2, u, vv, w, z, i;
323 cout <<
"Qminus_rank fatal: the vector "
324 "is not zero under the quadratic form" << endl;
325 cout <<
"value=" << aa << endl;
326 cout <<
"stride=" << stride << endl;
327 cout <<
"k=" << k << endl;
328 cout <<
"c1=" << c1 << endl;
329 cout <<
"c2=" << c2 << endl;
330 cout <<
"c3=" << c3 << endl;
337 x1 = v[2 * n * stride];
338 x2 = v[(2 * n + 1) * stride];
339 if (x1 == 0 && x2 == 0) {
340 Sbar_rank(v, stride, n, a, verbose_level);
345 if (x1 == 1 && x2 == 0) {
350 cout <<
"Qminus_rank x2 != 1" << endl;
362 z =
F->
add3(u, vv, w);
364 cout <<
"Qminus_rank z = 0" << endl;
365 cout <<
"b=" << b << endl;
372 for (i = 0; i < n; i++) {
373 v[2 * i * stride] =
F->
mult(v[2 * i * stride], minuszv);
394 long int l, i, j, x, y, u;
411 cout <<
"orthogonal_indexing::S_unrank "
412 "error in S_unrank n = 1 a = " << a << endl;
423 S_unrank(v + (n - 1) * 2 * stride, stride, 1, i);
436 N_unrank(v + (n - 1) * 2 * stride, stride, 1, i);
439 alpha =
F->
mult(v[2 * (n - 1) * stride],
440 v[(2 * (n - 1) + 1) * stride]);
442 for (u = 0; u < n - 1; u++) {
443 v[2 * u * stride] =
F->
mult(v[2 * u * stride], beta);
448 cout <<
"orthogonal_indexing::S_unrank "
449 "error in S_unrank n = " << n <<
", a = " << a << endl;
457 long int l, i, j, x, y, u;
458 int alpha, beta, gamma, delta, epsilon;
462 if (v[1 * stride] == 0) {
467 cout <<
"orthogonal_indexing::S_rank "
468 "error in S_rank v[0] not null" << endl;
478 alpha =
F->
mult(v[2 * (n - 1) * stride],
479 v[(2 * (n - 1) + 1) * stride]);
481 S_rank(v + (n - 1) * 2 * stride, stride, 1, i);
482 S_rank(v, stride, n - 1, j);
490 N_rank(v + (n - 1) * 2 * stride, stride, 1, i);
497 cout <<
"orthogonal_indexing::S_rank "
498 "error in S_rank gamma != beta" << endl;
502 for (u = 0; u < n - 1; u++) {
503 v[2 * u * stride] =
F->
mult(v[2 * u * stride], delta);
508 cout <<
"orthogonal_indexing::S_rank "
509 "error in S_rank epsilon != 1" << endl;
519 long int l, i, j, k, j1, x, y, z, yz, u;
520 int alpha, beta, gamma, delta, epsilon;
530 v[0 * stride] = 1 + j;
531 v[1 * stride] = 1 + i;
535 cout <<
"orthogonal_indexing::N_unrank "
536 "error in N_unrank n = 1 a = " << a << endl;
547 S_unrank(v + (n - 1) * 2 * stride, stride, 1, i);
558 N_unrank(v + (n - 1) * 2 * stride, stride, 1, i);
573 N_unrank(v + (n - 1) * 2 * stride, stride, 1, i);
577 beta =
F->
power(alpha, j + 1);
578 gamma =
F->
mult(v[(n - 1) * 2 * stride],
579 v[((n - 1) * 2 + 1) * stride]);
581 epsilon =
F->
mult(delta, beta);
582 for (u = 0; u < n - 1; u++) {
583 v[2 * u * stride] =
F->
mult(v[2 * u * stride], epsilon);
588 cout <<
"orthogonal_indexing::N_unrank "
589 "error in N_unrank n = " << n <<
", a = " << a << endl;
597 long int l, i, j, k, x, y, z, yz, u;
598 int alpha, beta, gamma, delta;
599 int epsilon, gamma2, epsilon_inv;
605 if (v[0 * stride] == 0 || v[1 * stride] == 0) {
606 cout <<
"orthogonal_indexing::N_rank "
607 "v[0 * stride] == 0 || "
608 "v[1 * stride] == 0" << endl;
611 j = v[0 * stride] - 1;
612 i = v[1 * stride] - 1;
616 gamma =
F->
mult(v[(n - 1) * 2 * stride],
617 v[((n - 1) * 2 + 1) * stride]);
622 S_rank(v + (n - 1) * 2 * stride, stride, 1, i);
623 N_rank(v, stride, n - 1, j);
634 N_rank(v + (n - 1) * 2, stride, 1, i);
635 S_rank(v, stride, n - 1, j);
646 N_rank(v + (n - 1) * 2 * stride, stride, 1, i);
649 for (j = 0; j <
F->
q - 2; j++) {
650 beta =
F->
power(alpha, j + 1);
651 epsilon =
F->
mult(delta, beta);
652 if (epsilon == gamma2) {
654 for (u = 0; u < n - 1; u++) {
655 v[2 * u * stride] =
F->
mult(
656 v[2 * u * stride], epsilon_inv);
659 a += i * yz + j * z + k;
663 cout <<
"orthogonal_indexing::N_rank "
664 "error, gamma2 not found" << endl;
671 long int l, i, j, k, j1, x, y, z, yz, u;
672 int alpha, beta, gamma;
682 v[0 * stride] = alpha;
683 v[1 * stride] = beta;
687 cout <<
"orthogonal_indexing::N1_unrank "
688 "error in N1_unrank n = 1 a = " << a << endl;
699 S_unrank(v + (n - 1) * 2 * stride, stride, 1, i);
712 N1_unrank(v + (n - 1) * 2 * stride, stride, 1, i);
739 N1_unrank(v + (n - 1) * 2 * stride, stride, 1, i);
745 v[2 * (n - 1) * stride] =
F->
mult(
746 v[2 * (n - 1) * stride], alpha);
754 gamma =
F->
add(beta, 1);
760 for (u = 0; u < n - 1; u++) {
761 v[2 * u * stride] =
F->
mult(v[2 * u * stride], gamma);
769 cout <<
"orthogonal_indexing::N1_unrank "
770 "error in N1_unrank n = " << n <<
", a = " << a << endl;
778 long int l, i, j, k, x, y, z, yz, u;
779 int alpha, alpha_inv, beta, gamma, gamma2, gamma_inv;
783 alpha = v[0 * stride];
784 beta = v[1 * stride];
785 if (alpha == 0 || beta == 0) {
786 cout <<
"orthogonal_indexing::N1_rank "
787 "alpha == 0 || beta == 0" << endl;
792 cout <<
"orthogonal_indexing::N1_rank "
793 "error in N1_rank gamma = " << gamma
794 <<
" != beta = " << beta << endl;
801 alpha =
F->
mult(v[2 * (n - 1) * stride],
802 v[(2 * (n - 1) + 1) * stride]);
807 S_rank(v + (n - 1) * 2 * stride, stride, 1, i);
819 N1_rank(v + (n - 1) * 2 * stride, stride, 1, i);
820 S_rank(v, stride, n - 1, j);
827 cout <<
"orthogonal_indexing::N1_rank "
828 "the case q=2 should not appear here" << endl;
839 alpha =
F->
mult(v[2 * (n - 1) * stride],
840 v[(2 * (n - 1) + 1) * stride]);
842 cout <<
"N1_rank alpha == 0" << endl;
846 cout <<
"N1_rank alpha == 1" << endl;
851 v[2 * (n - 1) * stride] =
F->
mult(
852 v[2 * (n - 1) * stride], alpha_inv);
854 N1_rank(v + (n - 1) * 2 * stride, stride, 1, i);
859 cout <<
"orthogonal_indexing::N1_rank "
860 "gamma2 == 0" << endl;
864 cout <<
"orthogonal_indexing::N1_rank "
865 "gamma2 == 1" << endl;
869 for (u = 0; u < n - 1; u++) {
870 v[2 * u * stride] =
F->
mult(v[2 * u * stride], gamma_inv);
874 a += i * yz + j * z + k;
881 int f_v = (verbose_level >= 1);
882 long int l, i, j, x, y, u;
887 cout <<
"orthogonal_indexing::Sbar_unrank" << endl;
901 cout <<
"orthogonal_indexing::Sbar_unrank "
902 "error in Sbar_unrank n = 1 a = " << a << endl;
911 v[2 * u * stride] = 0;
912 v[(2 * u + 1) * stride] = 0;
917 cout <<
"orthogonal_indexing::Sbar_unrank a = " << a << endl;
918 cout <<
"orthogonal_indexing::Sbar_unrank l = " << l << endl;
922 cout <<
"orthogonal_indexing::Sbar_unrank a = " << a << endl;
932 Sbar_unrank(v + (n - 1) * 2 * stride, stride, 1, i, verbose_level);
937 cout <<
"orthogonal_indexing::Sbar_unrank a = " << a << endl;
938 cout <<
"orthogonal_indexing::Sbar_unrank l = " << l << endl;
942 cout <<
"orthogonal_indexing::Sbar_unrank a = " << a << endl;
950 cout <<
"orthogonal_indexing::Sbar_unrank x = " << x << endl;
951 cout <<
"orthogonal_indexing::Sbar_unrank y = " << y << endl;
952 cout <<
"orthogonal_indexing::Sbar_unrank l = " << l << endl;
958 Nbar_unrank(v + (n - 1) * 2 * stride, stride, 1, i);
963 alpha =
F->
mult(v[2 * (n - 1) * stride],
964 v[(2 * (n - 1) + 1) * stride]);
966 for (u = 0; u < n - 1; u++) {
967 v[2 * u * stride] =
F->
mult(v[2 * u * stride], beta);
974 cout <<
"orthogonal_indexing::Sbar_unrank "
975 "error in Sbar_unrank n = " << n
976 <<
", a = " << a << endl;
984 int f_v = (verbose_level >= 1);
985 long int l, i, j, x, y, u;
986 int alpha, beta, beta2, beta_inv;
990 cout <<
"orthogonal_indexing::Sbar_rank" << endl;
994 cout <<
"orthogonal_indexing::Sbar_rank: ";
1002 if (v[0 * stride] == 1 && v[1 * stride] == 0) {
1006 if (v[0 * stride] == 0 && v[1 * stride] == 1) {
1011 cout <<
"orthogonal_indexing::Sbar_rank "
1012 "error in Sbar_rank n = 1 bad vector" << endl;
1022 if (v[2 * (n - 1) * stride] == 0 &&
1023 v[(2 * (n - 1) + 1) * stride] == 0) {
1025 Sbar_rank(v, stride, n - 1, a, verbose_level);
1030 cout <<
"orthogonal_indexing::Sbar_rank not a leading zero, l = " << l << endl;
1035 alpha =
F->
mult(v[2 * (n - 1) * stride],
1036 v[(2 * (n - 1) + 1) * stride]);
1041 cout <<
"orthogonal_indexing::Sbar_rank alpha = " << alpha << endl;
1042 cout <<
"orthogonal_indexing::Sbar_rank x = " << x << endl;
1043 cout <<
"orthogonal_indexing::Sbar_rank y = " << y << endl;
1051 Sbar_rank(v + (n - 1) * 2 * stride, stride, 1, i, verbose_level);
1052 S_rank(v, stride, n - 1, j);
1061 cout <<
"orthogonal_indexing::Sbar_rank l = " << l << endl;
1062 cout <<
"orthogonal_indexing::Sbar_rank a = " << a << endl;
1071 Nbar_rank(v + (n - 1) * 2 * stride, stride, 1, i);
1073 cout <<
"orthogonal_indexing::Sbar_rank x = " << x << endl;
1074 cout <<
"orthogonal_indexing::Sbar_rank y = " << y << endl;
1075 cout <<
"orthogonal_indexing::Sbar_rank i = " << i << endl;
1085 if (beta2 != beta) {
1086 cout <<
"orthogonal_indexing::Sbar_rank "
1087 "error in Sbar_rank beta2 != beta" << endl;
1093 for (u = 0; u < n - 1; u++) {
1094 v[2 * u * stride] =
F->
mult(
1095 v[2 * u * stride], beta_inv);
1100 cout <<
"orthogonal_indexing::Sbar_rank j = " << j << endl;
1104 cout <<
"orthogonal_indexing::Sbar_rank a = " << a << endl;
1117 v[0 * stride] = 1 + a;
1122 cout <<
"orthogonal_indexing::Nbar_unrank "
1123 "error in Nbar_unrank n = 1 a = " << a << endl;
1128 cout <<
"orthogonal_indexing::Nbar_unrank "
1129 "only defined for n = 1" << endl;
1137 if (v[1 * stride] != 1) {
1138 cout <<
"error in Nbar_rank n = 1 v[1 * stride] != 1" << endl;
1141 if (v[0 * stride] == 0) {
1142 cout <<
"error in Nbar_rank n = 1 v[0 * stride] == 0" << endl;
1145 a = v[0 * stride] - 1;
1149 cout <<
"orthogonal_indexing::Nbar_rank only defined for n = 1" << endl;
void PG_element_normalize_from_front(int *v, int stride, int len)
void PG_element_normalize(int *v, int stride, int len)
int product3(int a1, int a2, int a3)
int add3(int i1, int i2, int i3)
linear_algebra::linear_algebra * Linear_algebra
various functions related to geometries
int Witt_index(int epsilon, int k)
long int nb_pts_S(int n, int q)
long int nb_pts_Sbar(int n, int q)
long int nb_pts_N1(int n, int q)
long int nb_pts_N(int n, int q)
long int nb_pts_Nbar(int n, int q)
int evaluate_quadratic_form(int n, int nb_terms, int *i, int *j, int *coeff, int *x)
int evaluate_hyperbolic_quadratic_form(int *v, int stride, int n)
void S_unrank(int *v, int stride, int n, long int a)
long int Q_rank_directly(int *v, int stride, int k, int verbose_level)
void Q_epsilon_unrank(int *v, int stride, int epsilon, int k, int c1, int c2, int c3, long int a, int verbose_level)
void Sbar_rank(int *v, int stride, int n, long int &a, int verbose_level)
void Q_unrank(int *v, int stride, int k, long int a, int verbose_level)
void N1_unrank(int *v, int stride, int n, long int a)
long int Qplus_rank(int *v, int stride, int k, int verbose_level)
void init(field_theory::finite_field *F, 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)
void Nbar_rank(int *v, int stride, int n, long int &a)
void Qminus_unrank(int *v, int stride, int k, long int a, int c1, int c2, int c3, int verbose_level)
field_theory::finite_field * F
void S_rank(int *v, int stride, int n, long int &a)
void Qplus_unrank(int *v, int stride, int k, long int a, int verbose_level)
void N_unrank(int *v, int stride, int n, long int a)
void N_rank(int *v, int stride, int n, long int &a)
long int Qminus_rank(int *v, int stride, int k, int c1, int c2, int c3, int verbose_level)
long int Q_rank(int *v, int stride, int k, int verbose_level)
void N1_rank(int *v, int stride, int n, long int &a)
void Sbar_unrank(int *v, int stride, int n, long int a, int verbose_level)
void Q_unrank_directly(int *v, int stride, int k, long int a, int verbose_level)
void Nbar_unrank(int *v, int stride, int n, long int a)
#define Int_vec_print(A, B, C)
the orbiter library for the classification of combinatorial objects