Orbiter 2022
Combinatorial Objects
unusual_model.cpp
Go to the documentation of this file.
1// unusual_model.cpp
2//
3// Anton Betten
4// started 2007
5// moved here from BLT_ANALYZE: 7/10/09
6//
7//
8//
9//
10
11#include "foundations.h"
12
13
14using namespace std;
15
16
17namespace orbiter {
18namespace layer1_foundations {
19namespace orthogonal_geometry {
20
21
22
24{
25 FQ = Fq = NULL;
26 q = Q = 0;
27 alpha = 0;
28 T_alpha = N_alpha = 0;
29 nb_terms = 0;
30 form_i = NULL;
31 form_j = NULL;
32 form_coeff = NULL;
33 Gram = NULL;
34 r_nb_terms = 0;
35 r_form_i = NULL;
36 r_form_j = NULL;
37 r_form_coeff = NULL;
38 r_Gram = NULL;
39 rr_nb_terms = 0;
40 rr_form_i = NULL;
41 rr_form_j = NULL;
42 rr_form_coeff = NULL;
43 rr_Gram = NULL;
44 //int hyperbolic_basis[4 * 4];
45 //int hyperbolic_basis_inverse[4 * 4];
46 //int basis[4 * 4];
47 //int basis_subspace[2 * 2];
48 M = NULL;
49 components = NULL;
50 embedding = NULL;
51 pair_embedding = NULL;
52}
53
55{
56 if (form_i) {
58 form_i = NULL;
59 }
60 if (form_j) {
62 form_j = NULL;
63 }
64 if (form_coeff) {
66 form_coeff = NULL;
67 }
68 if (Gram) {
70 Gram = NULL;
71 }
72 if (r_form_i) {
74 r_form_i = NULL;
75 }
76 if (r_form_j) {
78 r_form_j = NULL;
79 }
80 if (r_form_coeff) {
82 r_form_coeff = NULL;
83 }
84 if (r_Gram) {
86 r_Gram = NULL;
87 }
88 if (rr_form_i) {
90 rr_form_i = NULL;
91 }
92 if (rr_form_j) {
94 rr_form_j = NULL;
95 }
96 if (rr_form_coeff) {
98 rr_form_coeff = NULL;
99 }
100 if (rr_Gram) {
102 rr_Gram = NULL;
103 }
104 if (M) {
105 FREE_int(M);
106 M = NULL;
107 }
108 if (components) {
110 components = NULL;
111 }
112 if (embedding) {
114 embedding = NULL;
115 }
116 if (pair_embedding) {
118 pair_embedding = NULL;
119 }
120}
121
122#if 0
123void unusual_model::setup_sum_of_squares(int q,
124 std::string &poly_q, std::string &poly_Q,
125 int verbose_level)
126{
127 setup2(q, poly_q, poly_Q, TRUE, verbose_level);
128}
129#endif
130
133 int verbose_level)
134{
135 setup2(FQ, Fq, FALSE, verbose_level);
136}
137
140 int f_sum_of_squares, int verbose_level)
141{
142 int f_v = (verbose_level >= 1);
143 int f_vv = (verbose_level >= 2);
144 int f_vvv = (verbose_level >= 2);
145 int i, j, b, p, h;
148
149 if (f_v) {
150 cout << "unusual_model::setup2 f_sum_of_squares=" << f_sum_of_squares << endl;
151 }
154 q = Fq->q;
155 Q = q * q;
156 if (Q != FQ->q) {
157 cout << "unusual_model::setup2 the large field must be a "
158 "quadratic extension of the small field" << endl;
159 exit(1);
160 }
161 nb_terms = 0;
162
163 //const char *override_poly_Q = NULL;
164 //const char *override_poly_q = NULL;
165
166 NT.is_prime_power(q, p, h);
167
168
169
170#if 0
171 if (h > 1) {
172 override_poly_Q = override_polynomial_extension_field(q);
173 override_poly_q = override_polynomial_subfield(q);
174 FQ->init_override_polynomial(Q, override_poly_Q, verbose_level - 2);
175 cout << "field of order " << Q << " initialized" << endl;
176 Fq->init_override_polynomial(q, override_poly_q, verbose_level - 2);
177 }
178 else {
179 if (f_vv) {
180 cout << "initializing large field" << endl;
181 }
182 FQ->init(Q, verbose_level);
183 if (f_vv) {
184 cout << "initializing small field" << endl;
185 }
186 Fq->init(q, verbose_level);
187 if (Fq->e > 1) {
188 FQ->init(qq, 1);
189 Fq->init(q, 3);
190 cout << "need to choose the generator polynomial "
191 "for the field" << endl;
192 FQ->compute_subfields(verbose_level);
193 exit(1);
194 }
195 }
196#endif
197#if 0
198 if (f_vv) {
199 cout << "initializing large field" << endl;
200 }
201 FQ->init_override_polynomial(Q, poly_Q, verbose_level - 2);
202 if (f_vv) {
203 cout << "field of order " << Q << " initialized" << endl;
204 }
205 if (f_vv) {
206 cout << "initializing small field" << endl;
207 }
208 Fq->init_override_polynomial(q, poly_q, verbose_level - 2);
209 if (f_vv) {
210 cout << "field of order " << q << " initialized" << endl;
211 }
212#endif
213
214
215
216#if 0
217 if (q == 9) {
218 char *override_poly_Q = "110";
219 // X^{4} + X^{3} + 2
220 char *override_poly_q = "17";
221 // X^2 - X - 1 = X^2 +2X + 2 = 2 + 2*3 + 9 = 17
222 //finite_field::init_override_polynomial()
223 //GF(81) = GF(3^4), polynomial = X^{4} + X^{3} + 2 = 110
224 //subfields of F_{81}:
225 //subfield 3^2 : subgroup_index = 10
226 //0 : 0 : 1 : 1
227 //1 : 10 : 46 : X^{3} + 2X^{2} + 1
228 //2 : 20 : 47 : X^{3} + 2X^{2} + 2
229 FQ->init_override_polynomial(Q, override_poly_Q, verbose_level - 2);
230 cout << "field of order " << Q << " initialized" << endl;
231 Fq->init_override_polynomial(q, override_poly_q, verbose_level - 2);
232 }
233 else if (q == 25) {
234 char *override_poly_Q = "767";
235 // X^{4} + X^{3} + 3X + 2
236 char *override_poly_q = "47";
237 // X^2 - X - 3 = X^2 +4X + 2=25+20+2=47
238 //subfields of F_{625}:
239 //subfield 5^2 : subgroup_index = 26
240 //0 : 0 : 1 : 1
241 //1 : 26 : 110 : 4X^{2} + 2X
242 //2 : 52 : 113 : 4X^{2} + 2X + 3
243 FQ->init_override_polynomial(Q, override_poly_Q, verbose_level - 2);
244 cout << "field of order " << Q << " initialized" << endl;
245 Fq->init_override_polynomial(q, override_poly_q, verbose_level - 2);
246 }
247 else if (q == 27) {
248 char *override_poly_Q = "974";
249 // X^{6} + X^{5} + 2
250 char *override_poly_q = "34";
251 // X^3 - X + 1 = X^3 +2X + 1 = 27+6+1=34
252 //subfields of F_{729}:
253 //subfield 3^2 : subgroup_index = 91
254 //0 : 0 : 1 : 1
255 //1 : 91 : 599 : 2X^{5} + X^{4} + X^{3} + X + 2
256 //2 : 182 : 597 : 2X^{5} + X^{4} + X^{3} + X
257 //subfield 3^3 : subgroup_index = 28
258 //0 : 0 : 1 : 1
259 //1 : 28 : 158 : X^{4} + 2X^{3} + 2X^{2} + X + 2
260 //2 : 56 : 498 : 2X^{5} + X^{2} + X
261 //3 : 84 : 157 : X^{4} + 2X^{3} + 2X^{2} + X + 1
262 FQ->init_override_polynomial(Q, override_poly_Q, verbose_level - 2);
263 cout << "field of order " << Q << " initialized" << endl;
264 Fq->init_override_polynomial(q, override_poly_q, verbose_level - 2);
265 }
266 else if (q == 49) {
267 char *override_poly_Q = "2754"; // X^{4} + X^{3} + X + 3
268 char *override_poly_q = "94"; // X^2-X+3 = X^2+6X+3 = 49+6*7+3=94
269 //subfields of F_{2401}:
270 //subfield 7^2 : subgroup_index = 50
271 //0 : 0 : 1 : 1
272 //1 : 50 : 552 : X^{3} + 4X^{2} + X + 6
273 //2 : 100 : 549 : X^{3} + 4X^{2} + X + 3
274 FQ->init_override_polynomial(Q, override_poly_Q, verbose_level - 2);
275 cout << "field of order " << Q << " initialized" << endl;
276 Fq->init_override_polynomial(q, override_poly_q, verbose_level - 2);
277 }
278 else if (q == 81) {
279 char *override_poly_Q = "6590"; // X^{8} + X^{3} + 2
280 char *override_poly_q = "89"; // X^4-X-1=X^4+2X+2=81+2*3+2=89
281 //subfields of F_{6561}:
282 //subfield 3^4 : subgroup_index = 82
283 //0 : 0 : 1 : 1
284 //1 : 82 : 5413 : 2X^{7} + X^{6} + X^{5} + 2X^{3} + X^{2} + X + 1
285 //2 : 164 : 1027 : X^{6} + X^{5} + 2X^{3} + 1
286 //3 : 246 : 3976 : X^{7} + 2X^{6} + X^{5} + X^{4} + 2X + 1
287 //4 : 328 : 5414 : 2X^{7} + X^{6} + X^{5} + 2X^{3} + X^{2} + X + 2
288 FQ->init_override_polynomial(Q, override_poly_Q, verbose_level - 2);
289 cout << "field of order " << Q << " initialized" << endl;
290 Fq->init_override_polynomial(q, override_poly_q, verbose_level - 2);
291 }
292 else if (q == 121) {
293 char *override_poly_Q = "15985";
294 // X^{4} + X^{3} + X + 2
295 char *override_poly_q = "200";
296 // X^2-4X+2=X^2+7X+2=11^2+7*11+2=200
297 //subfields of F_{14641}:
298 //subfield 11^2 : subgroup_index = 122
299 //0 : 0 : 1 : 1
300 //1 : 122 : 4352 : 3X^{3} + 2X^{2} + 10X + 7
301 //2 : 244 : 2380 : X^{3} + 8X^{2} + 7X + 4
302 FQ->init_override_polynomial(Q, override_poly_Q, verbose_level - 2);
303 cout << "field of order " << Q << " initialized" << endl;
304 Fq->init_override_polynomial(q, override_poly_q, verbose_level - 2);
305 }
306 else {
307 }
308#endif
309
310
311
312
313 alpha = Fq->p;
314 if (f_vv) {
315 cout << "unusual_model::setup2 primitive element alpha=" << alpha << endl;
316 }
317
318 if (f_vv) {
319 cout << "unusual_model::setup calling "
320 "subfield_embedding_2dimensional" << endl;
321 }
323 components, embedding, pair_embedding, verbose_level - 4);
324 if (f_vvv) {
325 cout << "unusual_model::setup2 "
326 "subfield_embedding_2dimensional finished" << endl;
329 }
330
331 T_alpha = FQ->retract(*Fq, 2, FQ->T2(alpha), verbose_level - 2);
332 N_alpha = FQ->retract(*Fq, 2, FQ->N2(alpha), verbose_level - 2);
333 if (f_vv) {
334 cout << "unusual_model::setup2 T_alpha = " << T_alpha << endl;
335 cout << "unusual_model::setup2 N_alpha = " << N_alpha << endl;
336 }
337
338 form_i = NEW_int(4 * 4);
339 form_j = NEW_int(4 * 4);
340 form_coeff = NEW_int(4 * 4);
341 Gram = NEW_int(4 * 4);
342
343 Int_vec_zero(Gram, 4 * 4);
344
345 if (f_sum_of_squares) {
346 Gg.add_term(4, *FQ, nb_terms, form_i, form_j, form_coeff, Gram, 0, 0, 1);
347 Gg.add_term(4, *FQ, nb_terms, form_i, form_j, form_coeff, Gram, 1, 1, 1);
348 Gg.add_term(4, *FQ, nb_terms, form_i, form_j, form_coeff, Gram, 2, 2, 1);
349 Gg.add_term(4, *FQ, nb_terms, form_i, form_j, form_coeff, Gram, 3, 3, 1);
350 }
351 else {
352 Gg.add_term(4, *FQ, nb_terms, form_i, form_j, form_coeff, Gram, 0, 0, 1);
355 Gg.add_term(4, *FQ, nb_terms, form_i, form_j, form_coeff, Gram, 2, 2, 1);
358 }
359 if (f_vv) {
360 cout << "unusual_model::setup2 Gram matrix:" << endl;
361 Int_vec_print_integer_matrix_width(cout, Gram, 4, 4, 4, 2);
362 cout << "quadratic form:" << endl;
364 }
365
366 if (f_vv) {
367 cout << "unusual_model::setup2 finding hyperbolic pair" << endl;
368 }
371 basis, basis + 4, 0 /*verbose_level - 3*/);
372 Fq->Linear_algebra->perp(4, 2, basis, Gram, 0 /* verbose_level */);
373 if (f_vv) {
374 cout << "basis:" << endl;
375 Int_vec_print_integer_matrix_width(cout, basis, 4, 4, 4, 2);
376 }
377
378 for (i = 0; i < 2 * 4; i++) {
379 hyperbolic_basis[i] = basis[i];
380 }
381
382 if (f_vvv) {
383 for (i = 0; i < 4; i++) {
386 basis + i * 4);
387 cout << "i=" << i << " form value " << b << endl;
388 }
389 }
390
394 verbose_level - 2);
395
396 if (f_vv) {
397 cout << "unusual_model::setup2 restricted quadratic form:" << endl;
400 }
401 r_Gram = NEW_int(2 * 2);
402
405 if (f_vv) {
406 cout << "unusual_model::setup2 restricted Gram matrix:" << endl;
408 }
409
412 basis_subspace, basis_subspace + 2, verbose_level - 2);
413 if (f_vv) {
414 cout << "unusual_model::setup2 basis_subspace:" << endl;
416 }
418 basis + 8, hyperbolic_basis + 8, 2, 2, 4,
419 0 /* verbose_level */);
420
421 if (f_vv) {
422 cout << "unusual_model::setup2 hyperbolic basis:" << endl;
424 for (i = 0; i < 4; i++) {
427 hyperbolic_basis + i * 4);
428 cout << "i=" << i << " quadratic form value " << b << endl;
429 }
430 }
431
432 M = NEW_int(4 * 4);
433 for (i = 0; i < 4; i++) {
434 for (j = 0; j < 4; j++) {
435 M[i * 4 + j] = Fq->Linear_algebra->evaluate_bilinear_form(4,
436 hyperbolic_basis + i * 4,
437 hyperbolic_basis + j * 4, Gram);
438 }
439 }
440
441 if (f_vvv) {
442 cout << "unusual_model::setup2 bilinear form on the hyperbolic basis:" << endl;
443 Int_vec_print_integer_matrix_width(cout, M, 4, 4, 4, 2);
444 }
445
450 verbose_level - 2);
451 if (f_vv) {
452 cout << "unusual_model::setup2 restricted quadratic form:" << endl;
455 }
456
458 hyperbolic_basis_inverse, 4, verbose_level - 2);
459 if (f_vv) {
460 cout << "unusual_model::setup2 inverse hyperbolic basis:" << endl;
462 hyperbolic_basis_inverse, 4, 4, 4, 2);
463 }
464 if (f_v) {
465 cout << "unusual_model::setup2 done" << endl;
466 }
467
468}
469
471 int *unusual_coordinates, long int *ranks, int verbose_level)
472{
473 int f_v = (verbose_level >= 1);
474 int f_vv = (verbose_level >= 2);
475 int *usual;
476 int i;
477
478 if (f_v) {
479 cout << "unusual_model::convert_to_ranks" << endl;
480 }
481 if (f_v) {
482 cout << "unusual_model::convert_to_ranks unusual_coordinates:" << endl;
484 unusual_coordinates, n, 3, 3, 2);
485 }
486
487
488 usual = NEW_int(n * 5);
489 convert_to_usual(n, unusual_coordinates, usual, verbose_level - 1);
490
491
492 for (i = 0; i < n; i++) {
493 ranks[i] = Fq->Orthogonal_indexing->Q_rank(usual + 5 * i, 1, 4, 0 /* verbose_level */);
494 if (f_vv) {
495 cout << "ranks[" << i << "]=" << ranks[i] << endl;
496 }
497 }
498
499 if (f_v) {
500 cout << "unusual_model::convert_to_ranks ranks:" << endl;
501 Lint_vec_print(cout, ranks, n);
502 cout << endl;
503 }
504
505 FREE_int(usual);
506}
507
509 long int *ranks, int *unusual_coordinates, int verbose_level)
510{
511 int f_v = (verbose_level >= 1);
512 int *usual;
513 int i;
514
515 if (f_v) {
516 cout << "unusual_model::convert_from_ranks" << endl;
517 }
518 if (f_v) {
519 cout << "unusual_model::convert_from_ranks ranks:" << endl;
520 Lint_vec_print(cout, ranks, n);
521 cout << endl;
522 }
523
524 usual = NEW_int(n * 5);
525 for (i = 0; i < n; i++) {
526 Fq->Orthogonal_indexing->Q_unrank(usual + 5 * i, 1, 4, ranks[i], 0 /* verbose_level */);
527 }
528
529
530 convert_from_usual(n, usual,
531 unusual_coordinates, verbose_level - 1);
532
533 if (f_v) {
534 cout << "unusual_model::convert_from_ranks unusual_coordinates:" << endl;
536 unusual_coordinates, n, 3, 3, 2);
537 }
538
539
540 FREE_int(usual);
541}
542
544 int *unusual_coordinates, int verbose_level)
545{
546 int usual[5];
547 long int rank;
548
549 convert_to_usual(1, unusual_coordinates, usual, verbose_level - 1);
550 rank = Fq->Orthogonal_indexing->Q_rank(usual, 1, 4, 0 /* verbose_level */);
551 return rank;
552}
553
555 int *unusual_coordinates, int verbose_level)
556{
557 int usual[5];
558
559 Fq->Orthogonal_indexing->Q_unrank(usual, 1, 4, rank, 0 /* verbose_level */);
560 convert_from_usual(1, usual,
561 unusual_coordinates, verbose_level - 1);
562}
563
565 int *unusual_coordinates, int *usual_coordinates,
566 int verbose_level)
567{
568 int f_v = (verbose_level >= 1);
569 int i, j, a, b, c;
570 int *tmp;
571
572 tmp = NEW_int(n * 4);
573 if (f_v) {
574 cout << "convert_to_usual:" << endl;
576 unusual_coordinates, n, 3, 3, 2);
577 }
578 for (i = 0; i < n; i++) {
579 for (j = 0; j < 2; j++) {
580 c = unusual_coordinates[i * 3 + j];
581 a = components[c * 2 + 0];
582 b = components[c * 2 + 1];
583 //a = c % q;
584 //b = (c - a) / q;
585 tmp[i * 4 + j * 2 + 0] = a;
586 tmp[i * 4 + j * 2 + 1] = b;
587 }
588 }
589 if (f_v) {
590 cout << "tmp:" << endl;
591 Int_vec_print_integer_matrix_width(cout, tmp, n, 4, 4, 2);
592 }
593 for (i = 0; i < n; i++) {
596 usual_coordinates + i * 5 + 1, 1, 4, 4,
597 0 /* verbose_level */);
598 usual_coordinates[i * 5 + 0] = unusual_coordinates[i * 3 + 2];
599 }
600 if (f_v) {
601 cout << "usual_coordinates:" << endl;
602 Int_vec_print_integer_matrix_width(cout, usual_coordinates, n, 5, 5, 2);
603 }
604 FREE_int(tmp);
605}
606
608 int *usual_coordinates,
609 int *unusual_coordinates,
610 int verbose_level)
611{
612 int f_v = (verbose_level >= 1);
613 int i, j, a, b, c, aa, bb;
614 int *tmp;
615
616 tmp = NEW_int(n * 4);
617 if (f_v) {
618 cout << "convert_from_usual:" << endl;
620 usual_coordinates, n, 5, 5, 2);
621 }
622 if (q == 0) {
623 cout << "q=" << q << " is zero" << endl;
624 exit(1);
625 }
626 for (i = 0; i < n; i++) {
627 Fq->Linear_algebra->mult_matrix_matrix(usual_coordinates + i * 5 + 1,
628 hyperbolic_basis, tmp + i * 4, 1, 4, 4,
629 0 /* verbose_level */);
630 }
631 if (f_v) {
632 cout << "tmp:" << endl;
633 Int_vec_print_integer_matrix_width(cout, tmp, n, 4, 4, 2);
634 }
635
636 for (i = 0; i < n; i++) {
637 for (j = 0; j < 2; j++) {
638 a = tmp[i * 4 + j * 2 + 0];
639 b = tmp[i * 4 + j * 2 + 1];
640 //c = b * q + a;
641 c = pair_embedding[a * q + b];
642 aa = components[c * 2 + 0];
643 bb = components[c * 2 + 1];
644 if (aa != a) {
645 cout << "aa=" << aa << " not equal to a=" << a << endl;
646 cout << "a=" << a << " b=" << b << " c=" << c << endl;
647 cout << "a * q + b = " << a * q + b << endl;
648 cout << "q=" << q << endl;
649 cout << "aa=" << aa << endl;
650 cout << "bb=" << bb << endl;
651 exit(1);
652 }
653 if (bb != b) {
654 cout << "bb=" << bb << " not equal to b=" << b << endl;
655 cout << "a=" << a << " b=" << b << " c=" << c << endl;
656 cout << "a * q + b = " << a * q + b << endl;
657 cout << "aa=" << aa << endl;
658 cout << "bb=" << bb << endl;
659 exit(1);
660 }
661 unusual_coordinates[i * 3 + j] = c;
662 }
663 unusual_coordinates[i * 3 + 2] = usual_coordinates[i * 5 + 0];
664 }
665 if (f_v) {
666 cout << "unusual_coordinates:" << endl;
667 Int_vec_print_integer_matrix_width(cout, unusual_coordinates, n, 3, 3, 2);
668 }
669 FREE_int(tmp);
670}
671
673 long int *Fisher_BLT, int *ABC, int verbose_level)
674{
675 int f_v = (verbose_level >= 1);
676 //int f_vv = (verbose_level >= 2);
677 int i, j, beta, minus_one, k;
678 int *norm_one_table, nb_norm_one = 0;
679 //int *Table;
680
681 if (f_v) {
682 cout << "unusual_model::create_Fisher_BLT_set" << endl;
683 }
684 minus_one = FQ->negate(1);
685
686 // now we find an element beta in F_q^2 with N2(beta) = -1
687 for (beta = 1; beta < Q; beta++) {
688 if (FQ->N2(beta) == minus_one) {
689 break;
690 }
691 }
692 if (beta == Q) {
693 cout << "did not find beta" << endl;
694 }
695 if (f_v) {
696 cout << "beta=" << beta << endl;
697 }
698 norm_one_table = NEW_int(Q);
699 for (i = 0; i < Q; i++) {
700 if (FQ->N2(i) == 1) {
701 j = FQ->negate(i);
702 for (k = 0; k < nb_norm_one; k++) {
703 if (norm_one_table[k] == j)
704 break;
705 }
706 if (k == nb_norm_one) {
707 norm_one_table[nb_norm_one++] = i;
708 }
709 }
710 }
711 if (f_v) {
712 cout << nb_norm_one << " norm one elements reduced:" << endl;
713 Int_vec_print(cout, norm_one_table, nb_norm_one);
714 cout << endl;
715 }
716 if (nb_norm_one != (q + 1) / 2) {
717 cout << "nb_norm_one != (q + 1) / 2" << endl;
718 exit(1);
719 }
720 //Table = NEW_int((q + 1) * 3);
721
722 for (i = 0; i < nb_norm_one; i++) {
723 ABC[i * 3 + 0] = FQ->mult(beta,
724 FQ->mult(norm_one_table[i], norm_one_table[i]));
725 ABC[i * 3 + 1] = 0;
726 ABC[i * 3 + 2] = 1;
727 }
728 for (i = 0; i < nb_norm_one; i++) {
729 ABC[(nb_norm_one + i) * 3 + 0] = 0;
730 ABC[(nb_norm_one + i) * 3 + 1] =
731 FQ->mult(beta, FQ->mult(norm_one_table[i], norm_one_table[i]));
732 ABC[(nb_norm_one + i) * 3 + 2] = 1;
733 }
734 if (FALSE) {
735 cout << "Table:" << endl;
736 Int_vec_print_integer_matrix_width(cout, ABC, q + 1, 3, 3, 2);
737 }
738
739 convert_to_ranks(q + 1, ABC, Fisher_BLT, verbose_level);
740
741 if (f_v) {
742 cout << "Fisher BLT set:" << endl;
743 Lint_vec_print(cout, Fisher_BLT, q + 1);
744 cout << endl;
745 }
746 FREE_int(norm_one_table);
747 //FREE_int(Table);
748}
749
751 long int *BLT, int *ABC, int verbose_level)
752{
753 int f_v = (verbose_level >= 1);
754 //int f_vv = (verbose_level >= 2);
755 int i, minus_one;
756 int *norm_table, nb = 0;
757 //int *Table;
758
759 if (f_v) {
760 cout << "unusual_model::create_Linear_BLT_set" << endl;
761 }
762 minus_one = FQ->negate(1);
763
764 norm_table = NEW_int(Q);
765 for (i = 0; i < Q; i++) {
766 if (FQ->N2(i) == minus_one) {
767 norm_table[nb++] = i;
768 }
769 }
770 if (f_v) {
771 cout << nb << " norm -1 elements reduced:" << endl;
772 Int_vec_print(cout, norm_table, nb);
773 cout << endl;
774 }
775 if (nb != q + 1) {
776 cout << "nb != q + 1" << endl;
777 exit(1);
778 }
779 //Table = NEW_int((q + 1) * 3);
780
781 for (i = 0; i < nb; i++) {
782 ABC[i * 3 + 0] = norm_table[i];
783 ABC[i * 3 + 1] = 0;
784 ABC[i * 3 + 2] = 1;
785 }
786 if (FALSE) {
787 cout << "ABC:" << endl;
788 Int_vec_print_integer_matrix_width(cout, ABC, q + 1, 3, 3, 2);
789 }
790
791 convert_to_ranks(q + 1, ABC, BLT, verbose_level);
792
793 if (f_v) {
794 cout << "Linear BLT set:" << endl;
795 Lint_vec_print(cout, BLT, q + 1);
796 cout << endl;
797 }
798 FREE_int(norm_table);
799 //FREE_int(Table);
800}
801
803 long int *BLT, int *ABC, int verbose_level)
804{
805 int f_v = (verbose_level >= 1);
806 //int f_vv = (verbose_level >= 2);
807 int i, beta, gamma;
808 int *norm_one_table, nb_norm_one = 0;
809 //int *Table;
810 int /*minus_one,*/ four, five;
811 int minus_four_fifth, minus_one_fifth;
812
813 if (f_v) {
814 cout << "unusual_model::create_Mondello_BLT_set" << endl;
815 }
816 //minus_one = FQ->negate(1);
817 four = 4 % Fq->p;
818 five = 5 % Fq->p;
819 minus_four_fifth = FQ->negate(FQ->mult(four, FQ->inverse(five)));
820 minus_one_fifth = FQ->negate(FQ->inverse(five));
821
822 // now we find an element beta in F_q^2
823 // with N2(beta) = minus_four_fifth
824 for (beta = 1; beta < Q; beta++) {
825 if (FQ->N2(beta) == minus_four_fifth) {
826 break;
827 }
828 }
829 if (beta == Q) {
830 cout << "did not find beta" << endl;
831 }
832 if (f_v) {
833 cout << "beta=" << beta << endl;
834 }
835
836 // now we find an element gamma in
837 // F_q^2 with N2(beta) = minus_one_fifth
838 for (gamma = 1; gamma < Q; gamma++) {
839 if (FQ->N2(gamma) == minus_one_fifth) {
840 break;
841 }
842 }
843 if (gamma == Q) {
844 cout << "did not find gamma" << endl;
845 }
846 if (f_v) {
847 cout << "gamma=" << gamma << endl;
848 }
849
850 norm_one_table = NEW_int(Q);
851 for (i = 0; i < Q; i++) {
852 if (FQ->N2(i) == 1) {
853 norm_one_table[nb_norm_one++] = i;
854 }
855 }
856 if (f_v) {
857 cout << nb_norm_one << " norm one elements:" << endl;
858 Int_vec_print(cout, norm_one_table, nb_norm_one);
859 cout << endl;
860 }
861 if (nb_norm_one != q + 1) {
862 cout << "nb_norm_one != q + 1" << endl;
863 exit(1);
864 }
865 //Table = NEW_int((q + 1) * 3);
866 for (i = 0; i < q + 1; i++) {
867 ABC[i * 3 + 0] = FQ->mult(beta, FQ->power(norm_one_table[i], 2));
868 ABC[i * 3 + 1] = FQ->mult(gamma, FQ->power(norm_one_table[i], 3));
869 ABC[i * 3 + 2] = 1;
870 }
871 if (FALSE) {
872 cout << "ABC:" << endl;
873 Int_vec_print_integer_matrix_width(cout, ABC, q + 1, 3, 3, 2);
874 }
875
876 convert_to_ranks(q + 1, ABC, BLT, verbose_level);
877
878 if (f_v) {
879 cout << "Mondello BLT set:" << endl;
880 Lint_vec_print(cout, BLT, q + 1);
881 cout << endl;
882 }
883 FREE_int(norm_one_table);
884 //FREE_int(Table);
885}
886
888{
889 return FQ->retract(*Fq, 2, FQ->N2(a), 0 /* verbose_level */);
890
891}
892
894{
895 return FQ->retract(*Fq, 2, FQ->T2(a), 0 /* verbose_level */);
896
897}
898
900 int a, int b, int c, int verbose_level)
901{
902 int f_v = (verbose_level >= 1);
903 int w, x, y, z;
904
905 if (f_v) {
906 cout << "quadratic_form a=" << a << " b=" << b
907 << " c=" << c << endl;
908 }
909 x = N2(a);
910 y = N2(b);
911 z = Fq->power(c, 2);
912 if (f_v) {
913 cout << "quadratic_form N(a)=" << x
914 << " N(b)=" << y << " c^2=" << z << endl;
915 }
916 w = Fq->add3(x, y, z);
917 if (f_v) {
918 cout << "quadratic_form w=" << w << endl;
919 }
920 return w;
921}
922
924 int a1, int b1, int c1,
925 int a2, int b2, int c2,
926 int verbose_level)
927{
928 int f_v = (verbose_level >= 1);
929 int a3, b3, c3, q1, q2, q3, w;
930
931 if (f_v) {
932 cout << "bilinear_form (" << a1 << "," << b1
933 << "," << c1 << " and " << a2 << ","
934 << b2 << "," << c2 << ")";
935 }
936 a3 = FQ->add(a1, a2);
937 b3 = FQ->add(b1, b2);
938 c3 = Fq->add(c1, c2);
939 if (f_v) {
940 cout << "a3=" << a3 << " b3=" << b3 << " c3=" << c3 << endl;
941 }
942 q1 = quadratic_form(a1, b1, c1, 0);
943 q2 = quadratic_form(a2, b2, c2, 0);
944 q3 = quadratic_form(a3, b3, c3, 0);
945 if (f_v) {
946 cout << "q1=" << q1 << " q2=" << q2 << " q3=" << q3 << endl;
947 }
948 w = Fq->add3(q3, Fq->negate(q1), Fq->negate(q2));
949 if (f_v) {
950 cout << "evaluates to " << w << endl;
951 }
952 return w;
953}
954
956 long int *set, int len)
957{
958 int i, j;
959
960 for (j = 0; j < len; j++) {
961 i = set[j];
963 cout << endl;
964 }
965}
966
968{
969 int a, b, c, x, y, l1, l2, aq, bq, ll1, ll2, a1, a2, b1, b2, w;
970 int Q = q * q;
971
972 int usual[5];
973 int unusual[3];
974 int unusual_point_rank;
975
976 Fq->Orthogonal_indexing->Q_unrank(usual, 1, 4, pt, 0 /* verbose_level */);
977 convert_from_usual(1, usual, unusual, 0);
978
979 a = unusual[0];
980 b = unusual[1];
981 c = unusual[2];
982 w = quadratic_form(a, b, c, 0);
983 a1 = components[2 * a + 0];
984 a2 = components[2 * a + 1];
985 b1 = components[2 * b + 0];
986 b2 = components[2 * b + 1];
987 unusual_point_rank = a * Q + b * q + c;
988 l1 = FQ->log_alpha(a);
989 l2 = FQ->log_alpha(b);
990 aq = FQ->power(a, q);
991 bq = FQ->power(b, q);
992 ll1 = FQ->log_alpha(aq);
993 ll2 = FQ->log_alpha(bq);
994
995 cout << setw(3) << cnt << " : " << setw(6) << pt << " : ";
996 cout << setw(4) << l1 << ", " << setw(4) << l2 << " : ";
997 cout << setw(4) << ll1 << ", " << setw(4) << ll2
998 << " : Q(a,b,c)=" << w << " ";
999 cout << "(" << setw(3) << a << ", " << setw(3)
1000 << b << ", " << c << " : " << setw(3) << a1
1001 << ", " << setw(4) << a2 << ", " << setw(3)
1002 << b1 << ", " << setw(4) << b2 << ", 1) : ";
1003 Int_vec_print(cout, unusual, 3);
1004 cout << " : " << unusual_point_rank << " : ";
1005 Int_vec_print(cout, usual, 5);
1006 cout << " : ";
1007 x = N2(a);
1008 y = N2(b);
1009 cout << setw(4) << x << " " << setw(4) << y;
1010}
1011
1013 int gamma, int delta, int m, long int *Set,
1014 int f_second_half, int verbose_level)
1015{
1016 int offset, len;
1017
1018 len = (q + 1) / 2;
1019 offset = (2 * m + 2) % len;
1020
1022 O, q, gamma, delta, offset,
1023 m, Set, f_second_half, TRUE, verbose_level);
1024}
1025
1027 orthogonal &O, int q,
1028 int gamma, int delta, int offset, int m, long int *Set,
1029 int f_second_half, int verbose_level)
1030{
1032 O, q, gamma, delta, offset,
1033 m, Set, f_second_half, TRUE, verbose_level);
1034}
1035
1037 orthogonal &O, int q,
1038 int gamma, int delta, int offset, int m, long int *Set,
1039 int f_second_half, int f_test, int verbose_level)
1040{
1041 int f_v = (verbose_level >= 1);
1042 int f_vv = (verbose_level >= 2);
1043 int f_vvv = (verbose_level >= 3);
1044 int i, z2i, z2mi;
1045 int len = (q + 1) / 2;
1046 int Len = 0;
1047 int *Table;
1048 int zeta;
1049
1050 Table = NEW_int((q + 1) * 3);
1051
1052 zeta = FQ->alpha_power(q - 1);
1053 for (i = 0; i < len; i++) {
1054 z2i = FQ->power(zeta, 2 * i);
1055 z2mi = FQ->power(z2i, m);
1056 Table[i * 3 + 0] = FQ->mult(gamma, z2i);
1057 Table[i * 3 + 1] = FQ->mult(delta, z2mi);
1058 Table[i * 3 + 2] = 1;
1059 }
1060 Len += len;
1061 convert_to_ranks(Len, Table, Set, verbose_level - 2);
1062
1063 if (f_vvv) {
1064 cout << "created the following 1st half:" << endl;
1065 Lint_vec_print(cout, Set, Len);
1066 cout << endl;
1068 }
1069
1070 if (f_test) {
1071 for (i = 1; i < Len; i++) {
1072 if (!O.BLT_test_full(i, Set, 0/*verbose_level*/)) {
1073 cout << "BLT test fails in point " << i
1074 << " in 1st half" << endl;
1075 FREE_int(Table);
1076 return FALSE;
1077 }
1078 }
1079 if (f_vv) {
1080 cout << "passes BLT test for 1st half" << endl;
1081 }
1082 }
1083
1084 if (f_second_half) {
1085 int z2s;
1086
1087 for (i = 0; i < len; i++) {
1088 z2i = FQ->power(zeta, 2 * i);
1089 z2mi = FQ->power(z2i, m);
1090 z2s = FQ->power(zeta, 2 * offset);
1091 Table[(len + i) * 3 + 0] = FQ->mult(delta, z2i);
1092 Table[(len + i) * 3 + 1] = FQ->mult(FQ->mult(gamma, z2mi), z2s);
1093 Table[(len + i) * 3 + 2] = 1;
1094 }
1095 Len += len;
1096 convert_to_ranks(Len, Table, Set, verbose_level - 2);
1097 if (f_test) {
1098 for (i = 1; i < len; i++) {
1099 if (!O.BLT_test_full(i, Set + len,
1100 0/*verbose_level*/)) {
1101 cout << "BLT test fails in point " << i
1102 << " in 2nd half" << endl;
1103 FREE_int(Table);
1104 return FALSE;
1105 }
1106 }
1107 if (f_vv) {
1108 cout << "passes BLT test for second half" << endl;
1109 }
1110 }
1111 }
1112 if (FALSE) {
1113 cout << "Table:" << endl;
1114 Int_vec_print_integer_matrix_width(cout, Table, Len, 3, 3, 2);
1115 }
1116
1117 convert_to_ranks(Len, Table, Set, verbose_level - 2);
1118
1119 if (f_vvv) {
1120 cout << "created the following set:" << endl;
1121 Lint_vec_print(cout, Set, Len);
1122 cout << endl;
1124 }
1125#if 0
1126 //int_vec_sort(Len, Set);
1127 for (i = 0; i < Len - 1; i++) {
1128 if (Set[i] == Set[i + 1]) {
1129 cout << "the set contains repeats" << endl;
1130 FREE_int(Table);
1131 return FALSE;
1132 }
1133 }
1134#endif
1135
1136 if (f_test) {
1137 for (i = 1; i < Len; i++) {
1138 if (!O.BLT_test(i, Set, 0/*verbose_level*/)) {
1139 if (f_v) {
1140 cout << "BLT test fails in point " << i
1141 << " in the joining" << endl;
1142 }
1143 FREE_int(Table);
1144 return FALSE;
1145 }
1146 }
1147 if (f_v) {
1148 cout << "passes BLT test" << endl;
1149 }
1150 }
1151 if (Len < q + 1) {
1152 FREE_int(Table);
1153 return FALSE;
1154 }
1155 FREE_int(Table);
1156 return TRUE;
1157}
1158
1160 int gamma, int delta, int m, long int *Set,
1161 int f_test, int verbose_level)
1162{
1163 //int f_v = (verbose_level >= 1);
1164 int f_vv = (verbose_level >= 2);
1165 int f_vvv = (verbose_level >= 3);
1166 int i, z2i;
1167 int len = (q + 1) / 2;
1168 int *Table;
1169 int zeta;
1170
1171 Table = NEW_int((q + 1) / 2 * 3);
1172
1173 zeta = FQ->alpha_power(q - 1);
1174 for (i = 0; i < len; i++) {
1175 z2i = FQ->power(zeta, 2 * i);
1176 Table[i * 3 + 0] = FQ->mult(gamma, z2i);
1177 Table[i * 3 + 1] = FQ->mult(delta, FQ->power(z2i, m));
1178 Table[i * 3 + 2] = 1;
1179 }
1180 convert_to_ranks(len, Table, Set, verbose_level - 2);
1181
1182 if (f_vvv) {
1183 cout << "created the following psi-orbit:" << endl;
1184 Lint_vec_print(cout, Set, len);
1185 cout << endl;
1187 }
1188
1189 if (f_test) {
1190 for (i = 1; i < len; i++) {
1191 if (!O.BLT_test_full(i, Set, 0/*verbose_level*/)) {
1192 cout << "BLT test fails in point " << i
1193 << " in create_orbit_of_psi" << endl;
1194 FREE_int(Table);
1195 return FALSE;
1196 }
1197 }
1198 if (f_vv) {
1199 cout << "passes BLT test for 1st half" << endl;
1200 }
1201 }
1202
1203 FREE_int(Table);
1204 return TRUE;
1205}
1206
1208 orthogonal *O,
1209 int *M4, int *M5, int verbose_level)
1210{
1211 int f_v = (verbose_level >= 1);
1212 int f_vv = (verbose_level >= 2);
1213 int f_vvv = (verbose_level >= 3);
1214
1215 int *M4_tmp1, *M4_tmp2, *M5t, *M5_tmp1, *M5_tmp2;
1216 int i, j, a;
1217
1218 M4_tmp1 = NEW_int(4 * 4);
1219 M4_tmp2 = NEW_int(4 * 4);
1220 //M5 = NEW_int(5 * 5);
1221 M5t = NEW_int(5 * 5);
1222 M5_tmp1 = NEW_int(5 * 5);
1223 M5_tmp2 = NEW_int(5 * 5);
1224
1225 if (f_v) {
1226 cout << "unusual_model::transform_matrix_"
1227 "unusual_to_usual" << endl;
1228 }
1229 if (f_vv) {
1230 cout << "transformation matrix in unusual model" << endl;
1231 Int_vec_print_integer_matrix_width(cout, M4, 4, 4, 4, 3);
1232 }
1233
1235 M4, M4_tmp1, 4, 4, 4,
1236 0 /* verbose_level */);
1238 hyperbolic_basis_inverse, M4_tmp2, 4, 4, 4,
1239 0 /* verbose_level */);
1240 if (f_vvv) {
1241 cout << "transformation matrix in "
1242 "standard coordinates:" << endl;
1243 Int_vec_print_integer_matrix_width(cout, M4_tmp2, 4, 4, 4, 3);
1244 }
1245 for (i = 0; i < 25; i++) {
1246 M5[i] = 0;
1247 }
1248 for (i = 0; i < 4; i++) {
1249 for (j = 0; j < 4; j++) {
1250 a = M4_tmp2[i * 4 + j];
1251 M5[(i + 1) * 5 + j + 1] = a;
1252 }
1253 }
1254 M5[0 * 5 + 0] = 1;
1255 if (f_vvv) {
1256 cout << "embedded (M5):" << endl;
1257 Int_vec_print_integer_matrix_width(cout, M5, 5, 5, 5, 3);
1258 }
1259
1260 Fq->Linear_algebra->transpose_matrix(M5, M5t, 5, 5);
1261
1262 if (f_vvv) {
1263 cout << "transposed (M5t):" << endl;
1265 M5t, 5, 5, 5, 3);
1266 cout << "Gram matrix:" << endl;
1268 O->Gram_matrix, 5, 5, 5, 3);
1269 }
1270
1271
1272 Fq->Linear_algebra->mult_matrix_matrix(M5, O->Gram_matrix, M5_tmp1, 5, 5, 5,
1273 0 /* verbose_level */);
1274 Fq->Linear_algebra->mult_matrix_matrix(M5_tmp1, M5t, M5_tmp2, 5, 5, 5,
1275 0 /* verbose_level */);
1276
1277 if (f_vvv) {
1278 cout << "Gram matrix transformed:" << endl;
1279 Int_vec_print_integer_matrix_width(cout, M5_tmp2, 5, 5, 5, 3);
1280 }
1281
1282 for (i = 0; i < 25; i++) {
1283 if (M5_tmp2[i] != O->Gram_matrix[i]) {
1284 cout << "does not preserve the form" << endl;
1285 exit(1);
1286 }
1287 }
1288
1289#if 0
1290 A->make_element(Elt, M5, verbose_level);
1291
1292 if (f_vv) {
1293 A->print(cout, Elt);
1294 }
1295#endif
1296 FREE_int(M4_tmp1);
1297 FREE_int(M4_tmp2);
1298 //FREE_int(M5);
1299 FREE_int(M5t);
1300 FREE_int(M5_tmp1);
1301 FREE_int(M5_tmp2);
1302}
1303
1305 orthogonal *O,
1306 int *M5, int *M4, int verbose_level)
1307{
1308 int f_v = (verbose_level >= 1);
1309 int f_vv = (verbose_level >= 2);
1310 //int f_vvv = (verbose_level >= 3);
1311
1312 int *M4_tmp1, *M4_tmp2; //, *M5;
1313 int i, j, a;
1314
1315 M4_tmp1 = NEW_int(4 * 4);
1316 M4_tmp2 = NEW_int(4 * 4);
1317 //M5 = NEW_int(5 * 5);
1318
1319 if (f_v) {
1320 cout << "unusual_model::transform_matrix_"
1321 "usual_to_unusual" << endl;
1322 }
1323#if 0
1324 if (f_vv) {
1325 A->print(cout, Elt);
1326 }
1327 for (i = 0; i < 25; i++) {
1328 M5[i] = Elt[i];
1329 }
1330#endif
1331 if (M5[0] != 1) {
1332 a = Fq->inverse(M5[0]);
1333 for (i = 0; i < 25; i++) {
1334 M5[i] = Fq->mult(a, M5[i]);
1335 }
1336 }
1337 for (i = 0; i < 4; i++) {
1338 for (j = 0; j < 4; j++) {
1339 a = M5[(i + 1) * 5 + j + 1];
1340 M4_tmp2[i * 4 + j] = a;
1341 }
1342 }
1343
1345 M4_tmp2, M4_tmp1, 4, 4, 4,
1346 0 /* verbose_level */);
1348 hyperbolic_basis, M4, 4, 4, 4,
1349 0 /* verbose_level */);
1350
1351 if (f_vv) {
1352 cout << "transformation matrix in unusual model" << endl;
1353 Int_vec_print_integer_matrix_width(cout, M4, 4, 4, 4, 3);
1354 }
1355 FREE_int(M4_tmp1);
1356 FREE_int(M4_tmp2);
1357 //FREE_int(M5);
1358}
1359
1361 int &a, int &b, int &c, int &d,
1362 int &f_semi1, int &f_semi2, int &f_semi3, int &f_semi4)
1363{
1364 int i, j, x, y, image1, image2, u, v, f_semi;
1365
1366 for (i = 0; i < 2; i++) {
1367 for (j = 0; j < 2; j++) {
1368 x = M4[i * 8 + j * 2 + 0];
1369 y = M4[i * 8 + j * 2 + 1];
1370 if (x == 0 && y == 0) {
1371 image1 = 0;
1372 f_semi = FALSE;
1373 }
1374 else {
1375 image1 = pair_embedding[x * q + y];
1376 x = M4[i * 8 + 4 + j * 2 + 0];
1377 y = M4[i * 8 + 4 + j * 2 + 1];
1378 image2 = pair_embedding[x * q + y];
1379 u = FQ->inverse(image1);
1380 v = FQ->mult(image2, u);
1381 if (v == q) {
1382 f_semi = FALSE;
1383 }
1384 else {
1385 if (v != FQ->power(q, q)) {
1386 cout << "unusual_model::parse_"
1387 "4by4_matrix v != FQ->power(q, q)" << endl;
1388 exit(1);
1389 }
1390 f_semi = TRUE;
1391 }
1392 }
1393 if (i == 0 && j == 0) {
1394 a = image1;
1395 f_semi1 = f_semi;
1396 }
1397 else if (i == 0 && j == 1) {
1398 b = image1;
1399 f_semi2 = f_semi;
1400 }
1401 else if (i == 1 && j == 0) {
1402 c = image1;
1403 f_semi3 = f_semi;
1404 }
1405 else if (i == 1 && j == 1) {
1406 d = image1;
1407 f_semi4 = f_semi;
1408 }
1409 }
1410 }
1411}
1412
1414 int a, int b, int c, int d,
1415 int f_semi1, int f_semi2, int f_semi3, int f_semi4,
1416 int verbose_level)
1417{
1418 int i, j, f_phi, coeff = 0, image1, image2;
1419
1420 f_phi = FALSE;
1421 for (i = 0; i < 2; i++) {
1422 for (j = 0; j < 2; j++) {
1423 if (i == 0 && j == 0) {
1424 coeff = a;
1425 f_phi = f_semi1;
1426 }
1427 if (i == 0 && j == 1) {
1428 coeff = b;
1429 f_phi = f_semi2;
1430 }
1431 if (i == 1 && j == 0) {
1432 coeff = c;
1433 f_phi = f_semi3;
1434 }
1435 if (i == 1 && j == 1) {
1436 coeff = d;
1437 f_phi = f_semi4;
1438 }
1439 if (f_phi) {
1440 image1 = FQ->mult(1, coeff);
1441 image2 = FQ->mult(FQ->power(q, q), coeff);
1442 }
1443 else {
1444 image1 = FQ->mult(1, coeff);
1445 image2 = FQ->mult(q, coeff);
1446 }
1447 M4[i * 8 + j * 2 + 0] = components[image1 * 2 + 0];
1448 M4[i * 8 + j * 2 + 1] = components[image1 * 2 + 1];
1449 M4[i * 8 + 4 + j * 2 + 0] = components[image2 * 2 + 0];
1450 M4[i * 8 + 4 + j * 2 + 1] = components[image2 * 2 + 1];
1451 }
1452 }
1453}
1454
1455void unusual_model::print_2x2(int *v, int *f_semi)
1456{
1457 int i, j, a, l;
1458
1459 for (i = 0; i < 2; i++) {
1460 for (j = 0; j < 2; j++) {
1461 if (f_semi[i * 2 + j]) {
1462 cout << "phi.";
1463 }
1464 else {
1465 cout << " ";
1466 }
1467 a = v[2 * i + j];
1468 if (a) {
1469 l = FQ->log_alpha(a);
1470 if (l == q * q - 1) {
1471 cout << " " << setw(FQ->log10_of_q)
1472 << 1 << " ";
1473 }
1474 else {
1475 if ((l % (q - 1)) == 0) {
1476 cout << " zeta^" << setw(FQ->log10_of_q)
1477 << l / (q - 1) << " ";
1478
1479 }
1480 else {
1481 cout << "omega^" << setw(FQ->log10_of_q)
1482 << l << " ";
1483 }
1484 }
1485 }
1486 else {
1487 cout << " " << setw(FQ->log10_of_q) << 0 << " ";
1488 }
1489 }
1490 cout << endl;
1491 }
1492}
1493
1495{
1496 int M4[16], v[4], f_semi[4];
1497
1500 v[0], v[1], v[2], v[3],
1501 f_semi[0], f_semi[1], f_semi[2], f_semi[3]);
1502 print_2x2(v, f_semi);
1503}
1504
1505}}}
1506
1507
1508
void init(finite_field_description *Descr, int verbose_level)
orthogonal_geometry::orthogonal_indexing * Orthogonal_indexing
void init_override_polynomial(int q, std::string &poly, int f_without_tables, int verbose_level)
void subfield_embedding_2dimensional(finite_field &subfield, int *&components, int *&embedding, int *&pair_embedding, int verbose_level)
void print_embedding(finite_field &subfield, int *components, int *embedding, int *pair_embedding)
int retract(finite_field &subfield, int index, int a, int verbose_level)
various functions related to geometries
Definition: geometry.h:721
void add_term(int n, field_theory::finite_field &F, int &nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram, int i, int j, int coeff)
void print_quadratic_form_list_coded(int form_nb_terms, int *form_i, int *form_j, int *form_coeff)
void make_Gram_matrix_from_list_coded_quadratic_form(int n, field_theory::finite_field &F, int nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram)
void transpose_matrix(int *A, int *At, int ma, int na)
void mult_matrix_matrix(int *A, int *B, int *C, int m, int n, int o, int verbose_level)
void restrict_quadratic_form_list_coding(int k, int n, int *basis, int form_nb_terms, int *form_i, int *form_j, int *form_coeff, int &restricted_form_nb_terms, int *&restricted_form_i, int *&restricted_form_j, int *&restricted_form_coeff, int verbose_level)
int perp(int n, int k, int *A, int *Gram, int verbose_level)
int evaluate_quadratic_form(int n, int nb_terms, int *i, int *j, int *coeff, int *x)
int evaluate_bilinear_form(int n, int *v1, int *v2, int *Gram)
void matrix_inverse(int *A, int *Ainv, int n, int verbose_level)
void find_hyperbolic_pair(int n, int form_nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram, int *vec1, int *vec2, int verbose_level)
void Q_unrank(int *v, int stride, int k, long int a, int verbose_level)
long int Q_rank(int *v, int stride, int k, int verbose_level)
int BLT_test_full(int size, long int *set, int verbose_level)
int BLT_test(int size, long int *set, int verbose_level)
int build_candidate_set_with_offset(orthogonal &O, int q, int gamma, int delta, int offset, int m, long int *Set, int f_second_half, int verbose_level)
void transform_matrix_unusual_to_usual(orthogonal *O, int *M4, int *M5, int verbose_level)
int build_candidate_set(orthogonal &O, int q, int gamma, int delta, int m, long int *Set, int f_second_half, int verbose_level)
void create_Mondello_BLT_set(long int *BLT, int *ABC, int verbose_level)
void convert_to_ranks(int n, int *unusual_coordinates, long int *ranks, int verbose_level)
void setup2(field_theory::finite_field *FQ, field_theory::finite_field *Fq, int f_sum_of_squares, int verbose_level)
void convert_from_rank(long int rank, int *unusual_coordinates, int verbose_level)
int quadratic_form(int a, int b, int c, int verbose_level)
void create_Linear_BLT_set(long int *BLT, int *ABC, int verbose_level)
void transform_matrix_usual_to_unusual(orthogonal *O, int *M5, int *M4, int verbose_level)
void parse_4by4_matrix(int *M4, int &a, int &b, int &c, int &d, int &f_semi1, int &f_semi2, int &f_semi3, int &f_semi4)
void convert_from_usual(int n, int *usual_coordinates, int *unusual_coordinates, int verbose_level)
void setup(field_theory::finite_field *FQ, field_theory::finite_field *Fq, int verbose_level)
int build_candidate_set_with_or_without_test(orthogonal &O, int q, int gamma, int delta, int offset, int m, long int *Set, int f_second_half, int f_test, int verbose_level)
int create_orbit_of_psi(orthogonal &O, int q, int gamma, int delta, int m, long int *Set, int f_test, int verbose_level)
void create_4by4_matrix(int *M4, int a, int b, int c, int d, int f_semi1, int f_semi2, int f_semi3, int f_semi4, int verbose_level)
void create_Fisher_BLT_set(long int *Fisher_BLT, int *ABC, int verbose_level)
int bilinear_form(int a1, int b1, int c1, int a2, int b2, int c2, int verbose_level)
void convert_from_ranks(int n, long int *ranks, int *unusual_coordinates, int verbose_level)
long int convert_to_rank(int *unusual_coordinates, int verbose_level)
void convert_to_usual(int n, int *unusual_coordinates, int *usual_coordinates, int verbose_level)
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define NEW_int(n)
Definition: foundations.h:625
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
Definition: foundations.h:691
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects