Orbiter 2022
Combinatorial Objects
finite_field_projective.cpp
Go to the documentation of this file.
1// finite_field_projective.cpp
2//
3// Anton Betten
4//
5// started: April 2, 2003
6//
7// renamed from projective.cpp Nov 16, 2018
8
9
10
11#include "foundations.h"
12
13using namespace std;
14
15
16
17namespace orbiter {
18namespace layer1_foundations {
19namespace field_theory {
20
21
23 int *v, int f)
24{
25 int i;
26
27 for (i = 0; i < n; i++) {
28 v[i] = frobenius_power(v[i], f);
29 }
30}
31
32
33
35{
36 int *w1, *w2;
37 int i;
38 int ret;
39
40 w1 = NEW_int(len);
41 w2 = NEW_int(len);
42
43#if 0
44 cout << "finite_field::test_if_vectors_are_projectively_equal:" << endl;
45 Orbiter->Int_vec.print(cout, v1, 20);
46 cout << endl;
47 cout << "finite_field::test_if_vectors_are_projectively_equal:" << endl;
48 Orbiter->Int_vec.print(cout, v2, 20);
49 cout << endl;
50#endif
51
52 Int_vec_copy(v1, w1, len);
53 Int_vec_copy(v2, w2, len);
54 PG_element_normalize(w1, 1, len);
55 PG_element_normalize(w2, 1, len);
56
57#if 0
58 cout << "finite_field::test_if_vectors_are_projectively_equal:" << endl;
59 Orbiter->Int_vec.print(cout, w1, 20);
60 cout << endl;
61 cout << "finite_field::test_if_vectors_are_projectively_equal:" << endl;
62 Orbiter->Int_vec.print(cout, w2, 20);
63 cout << endl;
64#endif
65
66 for (i = 0; i < len; i++) {
67 if (w1[i] != w2[i]) {
68 ret = FALSE;
69 goto finish;
70 }
71 }
72 ret = TRUE;
73finish:
74 FREE_int(w1);
75 FREE_int(w2);
76 return ret;
77}
78
80 int *v, int stride, int len)
81// last non-zero element made one
82{
83 int i, j, a;
84
85 for (i = len - 1; i >= 0; i--) {
86 a = v[i * stride];
87 if (a) {
88 if (a == 1) {
89 return;
90 }
91 a = inverse(a);
92 v[i * stride] = 1;
93 for (j = i - 1; j >= 0; j--) {
94 v[j * stride] = mult(v[j * stride], a);
95 }
96 return;
97 }
98 }
99 cout << "finite_field::PG_element_normalize zero vector" << endl;
100 exit(1);
101}
102
104 int *v, int stride, int len)
105// first non zero element made one
106{
107 int i, j, a;
108
109 for (i = 0; i < len; i++) {
110 a = v[i * stride];
111 if (a) {
112 if (a == 1) {
113 return;
114 }
115 a = inverse(a);
116 v[i * stride] = 1;
117 for (j = i + 1; j < len; j++) {
118 v[j * stride] = mult(v[j * stride], a);
119 }
120 return;
121 }
122 }
123 cout << "finite_field::PG_element_normalize_from_front "
124 "zero vector" << endl;
125 exit(1);
126}
127
129 long int *set_in, long int *set_out, int sz,
130 int old_length, int new_length, int *v)
131{
132 int i;
133
134 for (i = 0; i < sz; i++) {
135 set_out[i] = PG_element_embed(set_in[i], old_length, new_length, v);
136 }
137}
138
140 long int rk, int old_length, int new_length, int *v)
141{
142 long int a;
143 PG_element_unrank_modified_lint(v, 1, old_length, rk);
144 Int_vec_zero(v + old_length, new_length - old_length);
145 PG_element_rank_modified_lint(v, 1, new_length, a);
146 return a;
147}
148
149
150void finite_field::PG_element_unrank_fining(int *v, int len, int a)
151{
152 int b, c;
153
154 if (len != 3) {
155 cout << "finite_field::PG_element_unrank_fining "
156 "len != 3" << endl;
157 exit(1);
158 }
159 if (a <= 0) {
160 cout << "finite_field::PG_element_unrank_fining "
161 "a <= 0" << endl;
162 exit(1);
163 }
164 if (a == 1) {
165 v[0] = 1;
166 v[1] = 0;
167 v[2] = 0;
168 return;
169 }
170 a--;
171 if (a <= q) {
172 if (a == 1) {
173 v[0] = 0;
174 v[1] = 1;
175 v[2] = 0;
176 return;
177 }
178 else {
179 v[0] = 1;
180 v[1] = a - 1;
181 v[2] = 0;
182 return;
183 }
184 }
185 a -= q;
186 if (a <= q * q) {
187 if (a == 1) {
188 v[0] = 0;
189 v[1] = 0;
190 v[2] = 1;
191 return;
192 }
193 a--;
194 a--;
195 b = a % (q + 1);
196 c = a / (q + 1);
197 v[2] = c + 1;
198 if (b == 0) {
199 v[0] = 1;
200 v[1] = 0;
201 }
202 else if (b == 1) {
203 v[0] = 0;
204 v[1] = 1;
205 }
206 else {
207 v[0] = 1;
208 v[1] = b - 1;
209 }
210 return;
211 }
212 else {
213 cout << "finite_field::PG_element_unrank_fining "
214 "a is illegal" << endl;
215 exit(1);
216 }
217}
218
220{
221 int a;
222
223 if (len != 3) {
224 cout << "finite_field::PG_element_rank_fining "
225 "len != 3" << endl;
226 exit(1);
227 }
228 //PG_element_normalize(v, 1, len);
229
231
232 if (v[2] == 0) {
233 if (v[0] == 1 && v[1] == 0) {
234 return 1;
235 }
236 else if (v[0] == 0 && v[1] == 1) {
237 return 2;
238 }
239 else {
240 return 2 + v[1];
241 }
242
243 }
244 else {
245 if (v[0] == 0 && v[1] == 0) {
246 return q + 2;
247 }
248 else {
249 a = (q + 1) * v[2] + 2;
250 if (v[0] == 1 && v[1] == 0) {
251 return a;
252 }
253 else if (v[0] == 0 && v[1] == 1) {
254 return a + 1;
255 }
256 else {
257 return a + 1 + v[1];
258 }
259 }
260 }
261}
262
264 int *v, int len, int a)
265{
266 int b, qm1o2, rk, i;
267
268 if (len != 3) {
269 cout << "finite_field::PG_element_unrank_gary_cook "
270 "len != 3" << endl;
271 exit(1);
272 }
273 if (q != 11) {
274 cout << "finite_field::PG_element_unrank_gary_cook "
275 "q != 11" << endl;
276 exit(1);
277 }
278 qm1o2 = (q - 1) >> 1;
279 if (a < 0) {
280 cout << "finite_field::PG_element_unrank_gary_cook "
281 "a < 0" << endl;
282 exit(1);
283 }
284 if (a == 0) {
285 v[0] = 0;
286 v[1] = 0;
287 v[2] = 1;
288 }
289 else {
290 a--;
291 if (a < q) {
292 v[0] = 0;
293 v[1] = 1;
294 v[2] = -qm1o2 + a;
295 }
296 else {
297 a -= q;
298 rk = a;
299 if (rk < q * q) {
300 // (1, a, b) = 11a + b + 72, where a,b in -5..5
301 b = rk % 11;
302 a = (rk - b) / 11;
303 v[0] = 1;
304 v[1] = -qm1o2 + a;
305 v[2] = -qm1o2 + b;
306 }
307 else {
308 cout << "finite_field::PG_element_unrank_gary_cook "
309 "a is illegal" << endl;
310 exit(1);
311 }
312 }
313 }
314 for (i = 0; i < 3; i++) {
315 if (v[i] < 0) {
316 v[i] += q;
317 }
318 }
319}
320
322 int *v, int stride, int len, int &a)
323{
324 int i, j, q_power_j, b, sqj;
325 int f_v = FALSE;
326
327 if (len <= 0) {
328 cout << "finite_field::PG_element_rank_modified "
329 "len <= 0" << endl;
330 exit(1);
331 }
333 if (f_v) {
334 cout << "the vector before normalization is ";
335 for (i = 0; i < len; i++) {
336 cout << v[i * stride] << " ";
337 }
338 cout << endl;
339 }
340 PG_element_normalize(v, stride, len);
341 if (f_v) {
342 cout << "the vector after normalization is ";
343 for (i = 0; i < len; i++) {
344 cout << v[i * stride] << " ";
345 }
346 cout << endl;
347 }
348 for (i = 0; i < len; i++) {
349 if (v[i * stride]) {
350 break;
351 }
352 }
353 if (i == len) {
354 cout << "finite_field::PG_element_rank_modified "
355 "zero vector" << endl;
356 exit(1);
357 }
358 for (j = i + 1; j < len; j++) {
359 if (v[j * stride]) {
360 break;
361 }
362 }
363 if (j == len) {
364 // we have the unit vector vector e_i
365 a = i;
366 return;
367 }
368
369 // test for the all one vector:
370 if (i == 0 && v[i * stride] == 1) {
371 for (j = i + 1; j < len; j++) {
372 if (v[j * stride] != 1) {
373 break;
374 }
375 }
376 if (j == len) {
377 a = len;
378 return;
379 }
380 }
381
382
383 for (i = len - 1; i >= 0; i--) {
384 if (v[i * stride]) {
385 break;
386 }
387 }
388 if (i < 0) {
389 cout << "finite_field::PG_element_rank_modified "
390 "zero vector" << endl;
391 exit(1);
392 }
393 if (v[i * stride] != 1) {
394 cout << "finite_field::PG_element_rank_modified "
395 "vector not normalized" << endl;
396 exit(1);
397 }
398 if (f_v) {
399 cout << "i=" << i << endl;
400 }
401
402 b = 0;
403 q_power_j = 1;
404 sqj = 0;
405 for (j = 0; j < i; j++) {
406 b += q_power_j - 1;
407 sqj += q_power_j;
408 q_power_j *= q;
409 }
410 if (f_v) {
411 cout << "b=" << b << endl;
412 cout << "sqj=" << sqj << endl;
413 }
414
415
416 a = 0;
417 for (j = i - 1; j >= 0; j--) {
418 a += v[j * stride];
419 if (j > 0) {
420 a *= q;
421 }
422 if (f_v) {
423 cout << "j=" << j << ", a=" << a << endl;
424 }
425 }
426
427 if (f_v) {
428 cout << "a=" << a << endl;
429 }
430
431 // take care of 1111 vector being left out
432 if (i == len - 1) {
433 //cout << "sqj=" << sqj << endl;
434 if (a >= sqj) {
435 a--;
436 }
437 }
438
439 a += b;
440 a += len;
441}
442
444 int *v, int stride, int len, int a)
445{
446 int n, l, ql, sql, k, j, r, a1 = a;
447
448 n = len;
449 if (n <= 0) {
450 cout << "finite_field::PG_element_unrank_modified "
451 "len <= 0" << endl;
452 exit(1);
453 }
455 if (a < n) {
456 // unit vector:
457 for (k = 0; k < n; k++) {
458 if (k == a) {
459 v[k * stride] = 1;
460 }
461 else {
462 v[k * stride] = 0;
463 }
464 }
465 return;
466 }
467 a -= n;
468 if (a == 0) {
469 // all one vector
470 for (k = 0; k < n; k++) {
471 v[k * stride] = 1;
472 }
473 return;
474 }
475 a--;
476
477 l = 1;
478 ql = q;
479 sql = 1;
480 // sql = q^0 + q^1 + \cdots + q^{l-1}
481 while (l < n) {
482 if (a >= ql - 1) {
483 a -= (ql - 1);
484 sql += ql;
485 ql *= q;
486 l++;
487 continue;
488 }
489 v[l * stride] = 1;
490 for (k = l + 1; k < n; k++) {
491 v[k * stride] = 0;
492 }
493 a++; // take into account the fact that we do not want 00001000
494 if (l == n - 1 && a >= sql) {
495 a++;
496 // take into account the fact that the
497 // vector 11111 has already been listed
498 }
499 j = 0;
500 while (a != 0) {
501 r = a % q;
502 v[j * stride] = r;
503 j++;
504 a -= r;
505 a /= q;
506 }
507 for ( ; j < l; j++) {
508 v[j * stride] = 0;
509 }
510 return;
511 }
512 cout << "finite_field::PG_element_unrank_modified "
513 "a too large" << endl;
514 cout << "len = " << len << endl;
515 cout << "a = " << a1 << endl;
516 exit(1);
517}
518
520 int *v, int stride, int len, long int &a)
521{
522 int i, j;
523 long int q_power_j, b, sqj;
524 int f_v = FALSE;
525
526 if (len <= 0) {
527 cout << "finite_field::PG_element_rank_modified_lint "
528 "len <= 0" << endl;
529 exit(1);
530 }
532 if (f_v) {
533 cout << "the vector before normalization is ";
534 for (i = 0; i < len; i++) {
535 cout << v[i * stride] << " ";
536 }
537 cout << endl;
538 }
539 PG_element_normalize(v, stride, len);
540 if (f_v) {
541 cout << "the vector after normalization is ";
542 for (i = 0; i < len; i++) {
543 cout << v[i * stride] << " ";
544 }
545 cout << endl;
546 }
547 for (i = 0; i < len; i++) {
548 if (v[i * stride]) {
549 break;
550 }
551 }
552 if (i == len) {
553 cout << "finite_field::PG_element_rank_modified_lint "
554 "zero vector" << endl;
555 exit(1);
556 }
557 for (j = i + 1; j < len; j++) {
558 if (v[j * stride]) {
559 break;
560 }
561 }
562 if (j == len) {
563 // we have the unit vector vector e_i
564 a = i;
565 return;
566 }
567
568 // test for the all one vector:
569 if (i == 0 && v[i * stride] == 1) {
570 for (j = i + 1; j < len; j++) {
571 if (v[j * stride] != 1) {
572 break;
573 }
574 }
575 if (j == len) {
576 a = len;
577 return;
578 }
579 }
580
581
582 for (i = len - 1; i >= 0; i--) {
583 if (v[i * stride]) {
584 break;
585 }
586 }
587 if (i < 0) {
588 cout << "finite_field::PG_element_rank_modified_lint "
589 "zero vector" << endl;
590 exit(1);
591 }
592 if (v[i * stride] != 1) {
593 cout << "finite_field::PG_element_rank_modified_lint "
594 "vector not normalized" << endl;
595 exit(1);
596 }
597 if (f_v) {
598 cout << "i=" << i << endl;
599 }
600
601 b = 0;
602 q_power_j = 1;
603 sqj = 0;
604 for (j = 0; j < i; j++) {
605 b += q_power_j - 1;
606 sqj += q_power_j;
607 q_power_j *= q;
608 }
609 if (f_v) {
610 cout << "b=" << b << endl;
611 cout << "sqj=" << sqj << endl;
612 }
613
614
615 a = 0;
616 for (j = i - 1; j >= 0; j--) {
617 a += v[j * stride];
618 if (j > 0) {
619 a *= q;
620 }
621 if (f_v) {
622 cout << "j=" << j << ", a=" << a << endl;
623 }
624 }
625
626 if (f_v) {
627 cout << "a=" << a << endl;
628 }
629
630 // take care of 1111 vector being left out
631 if (i == len - 1) {
632 //cout << "sqj=" << sqj << endl;
633 if (a >= sqj) {
634 a--;
635 }
636 }
637
638 a += b;
639 a += len;
640}
641
643 int *M, int k, int n, long int *rank_vec)
644{
645 int i;
646
647 for (i = 0; i < k; i++) {
648 PG_element_unrank_modified_lint(M + i * n, 1, n, rank_vec[i]);
649 }
650}
651
653 int *M, int k, int n, long int *rank_vec)
654{
655 int i;
656
657 for (i = 0; i < k; i++) {
658 PG_element_rank_modified_lint(M + i * n, 1, n, rank_vec[i]);
659 }
660}
661
663 int *v, int stride, int len, long int a)
664{
665 long int n, l, ql, sql, k, j, r, a1 = a;
666
667 n = len;
668 if (n <= 0) {
669 cout << "finite_field::PG_element_unrank_modified_lint "
670 "len <= 0" << endl;
671 exit(1);
672 }
674 if (a < n) {
675 // unit vector:
676 for (k = 0; k < n; k++) {
677 if (k == a) {
678 v[k * stride] = 1;
679 }
680 else {
681 v[k * stride] = 0;
682 }
683 }
684 return;
685 }
686 a -= n;
687 if (a == 0) {
688 // all one vector
689 for (k = 0; k < n; k++) {
690 v[k * stride] = 1;
691 }
692 return;
693 }
694 a--;
695
696 l = 1;
697 ql = q; // q to the power of l
698 sql = 1;
699 // sql = q^0 + q^1 + \cdots + q^{l-1}
700 while (l < n) {
701 if (a >= ql - 1) {
702 a -= (ql - 1);
703 sql += ql;
704 ql *= q;
705 l++;
706 continue;
707 }
708 v[l * stride] = 1;
709 for (k = l + 1; k < n; k++) {
710 v[k * stride] = 0;
711 }
712 a++; // take into account the fact that we do not want 00001000
713 if (l == n - 1 && a >= sql) {
714 a++;
715 // take into account the fact that the
716 // vector 11111 has already been listed
717 }
718 j = 0;
719 while (a != 0) {
720 r = a % q;
721 v[j * stride] = r;
722 j++;
723 a -= r;
724 a /= q;
725 }
726 for ( ; j < l; j++) {
727 v[j * stride] = 0;
728 }
729 return;
730 }
731 cout << "finite_field::PG_element_unrank_modified_lint "
732 "a too large" << endl;
733 cout << "len = " << len << endl;
734 cout << "l = " << l << endl;
735 cout << "a = " << a1 << endl;
736 cout << "q = " << q << endl;
737 cout << "ql = " << ql << endl;
738 cout << "sql = q^0 + q^1 + \\cdots + q^{l-1} = " << sql << endl;
739 exit(1);
740}
741
743 int *v, int stride, int len, int m, long int &a)
744{
745 long int s, qq, i;
746
747 qq = 1;
748 s = qq;
749 for (i = 0; i < m; i++) {
750 qq *= q;
751 s += qq;
752 }
753 s -= (m + 1);
754
755 PG_element_rank_modified_lint(v, stride, len, a);
756 if (a > len + s) {
757 a -= s;
758 }
759 a -= (m + 1);
760}
761
763 int *v, int stride, int len, int m, long int a)
764{
765 long int s, qq, i;
766
767 qq = 1;
768 s = qq;
769 for (i = 0; i < m; i++) {
770 qq *= q;
771 s += qq;
772 }
773 s -= (m + 1);
774
775 a += (m + 1);
776 if (a > len) {
777 a += s;
778 }
779
780 PG_element_unrank_modified_lint(v, stride, len, a);
781}
782
783void finite_field::projective_point_unrank(int n, int *v, int rk)
784{
785 PG_element_unrank_modified(v, 1 /* stride */,
786 n + 1 /* len */, rk);
787}
788
790{
791 long int rk;
792
793 PG_element_rank_modified_lint(v, 1 /* stride */, n + 1, rk);
794 return rk;
795}
796
797
798
799
801 int *genma, int k, int n, long int *&point_list, int &nb_points,
802 int verbose_level)
803{
804 int f_v = (verbose_level >= 1);
805 int f_vv = FALSE; //(verbose_level >= 2);
806 int *message;
807 int *word;
808 int i;
809 long int a;
811
812 if (f_v) {
813 cout << "finite_field::all_PG_elements_in_subspace" << endl;
814 }
815 message = NEW_int(k);
816 word = NEW_int(n);
817 nb_points = Combi.generalized_binomial(k, 1, q);
818 point_list = NEW_lint(nb_points);
819
820 for (i = 0; i < nb_points; i++) {
821 PG_element_unrank_modified(message, 1, k, i);
822 if (f_vv) {
823 cout << "message " << i << " / " << nb_points << " is ";
824 Int_vec_print(cout, message, k);
825 cout << endl;
826 }
827 Linear_algebra->mult_vector_from_the_left(message, genma, word, k, n);
828 if (f_vv) {
829 cout << "yields word ";
830 Int_vec_print(cout, word, n);
831 cout << endl;
832 }
833 PG_element_rank_modified_lint(word, 1, n, a);
834 if (f_vv) {
835 cout << "which has rank " << a << endl;
836 }
837 point_list[i] = a;
838 }
839
840 FREE_int(message);
841 FREE_int(word);
842 if (f_v) {
843 cout << "finite_field::all_PG_elements_in_subspace "
844 "done" << endl;
845 }
846}
847
849 int *genma, int k, int n, long int *point_list, int &nb_points,
850 int verbose_level)
851{
852 int f_v = (verbose_level >= 1);
853 int f_vv = FALSE; //(verbose_level >= 2);
854 int *message;
855 int *word;
856 int i, j;
858
859 if (f_v) {
860 cout << "finite_field::all_PG_elements_in_subspace_array_is_given" << endl;
861 }
862 message = NEW_int(k);
863 word = NEW_int(n);
864 nb_points = Combi.generalized_binomial(k, 1, q);
865 //point_list = NEW_int(nb_points);
866
867 for (i = 0; i < nb_points; i++) {
868 PG_element_unrank_modified(message, 1, k, i);
869 if (f_vv) {
870 cout << "message " << i << " / " << nb_points << " is ";
871 Int_vec_print(cout, message, k);
872 cout << endl;
873 }
874 Linear_algebra->mult_vector_from_the_left(message, genma, word, k, n);
875 if (f_vv) {
876 cout << "yields word ";
877 Int_vec_print(cout, word, n);
878 cout << endl;
879 }
880 PG_element_rank_modified(word, 1, n, j);
881 if (f_vv) {
882 cout << "which has rank " << j << endl;
883 }
884 point_list[i] = j;
885 }
886
887 FREE_int(message);
888 FREE_int(word);
889 if (f_v) {
890 cout << "finite_field::all_PG_elements_in_subspace_array_is_given "
891 "done" << endl;
892 }
893}
894
896{
897 int *v = NEW_int(n + 1);
899 int l = Gg.nb_PG_elements(n, q);
900 int i, j, a;
901
902 for (i = 0; i < l; i++) {
903 PG_element_unrank_modified(v, 1, n + 1, i);
904 cout << i << " : ";
905 for (j = 0; j < n + 1; j++) {
906 cout << v[j] << " ";
907 }
908 PG_element_rank_modified(v, 1, n + 1, a);
909 cout << " : " << a << endl;
910 }
911 FREE_int(v);
912}
913
915{
916 int *v = NEW_int(n + 1);
918 long int l = Gg.nb_PG_elements_not_in_subspace(n, m, q);
919 long int i, j, a;
920
921 for (i = 0; i < l; i++) {
923 cout << i << " : ";
924 for (j = 0; j < n + 1; j++) {
925 cout << v[j] << " ";
926 }
928 cout << " : " << a << endl;
929 }
930 FREE_int(v);
931}
932
934{
935 int *v = NEW_int(n);
937 int l = Gg.nb_AG_elements(n, q);
938 int i, j;
939
940 for (i = 0; i < l; i++) {
941 Gg.AG_element_unrank(q, v, 1, n + 1, i);
942 cout << i << " : ";
943 for (j = 0; j < n; j++) {
944 cout << v[j] << " ";
945 }
946 cout << endl;
947 }
948 FREE_int(v);
949}
950
951
953 long int *set_in, int set_size_in, long int *&set_out, int &set_size_out,
954 int verbose_level)
955{
956 int f_v = (verbose_level >= 1);
957
958 if (f_v) {
959 cout << "finite_field::do_cone_over" << endl;
960 }
961 //projective_space *P1;
962 //projective_space *P2;
963 int *v;
964 int d = n + 2;
965 int h, u, cnt;
966 long int a, b;
967
968#if 0
969 P1 = NEW_OBJECT(projective_space);
970 P2 = NEW_OBJECT(projective_space);
971
972 P1->init(n, this,
973 FALSE /* f_init_incidence_structure */,
974 verbose_level - 2 /*MINIMUM(verbose_level - 1, 3)*/);
975
976 P2->init(n + 1, this,
977 FALSE /* f_init_incidence_structure */,
978 verbose_level - 2 /*MINIMUM(verbose_level - 1, 3)*/);
979#endif
980
981 v = NEW_int(d);
982
983 set_size_out = 1 + q * set_size_in;
984 set_out = NEW_lint(set_size_out);
985 cnt = 0;
986
987 // create the vertex:
988 Int_vec_zero(v, d);
989 v[d - 1] = 1;
990 //b = P2->rank_point(v);
991 PG_element_rank_modified_lint(v, 1, n + 2, b);
992 set_out[cnt++] = b;
993
994
995 // for each point, create the generator
996 // which is the line connecting the point and the vertex
997 // since we have created the vertex already,
998 // we only need to create q points per line:
999
1000 for (h = 0; h < set_size_in; h++) {
1001 a = set_in[h];
1002 for (u = 0; u < q; u++) {
1003 //P1->unrank_point(v, a);
1004 PG_element_unrank_modified_lint(v, 1, n + 1, a);
1005
1006 v[d - 1] = u;
1007
1008 //b = P2->rank_point(v);
1009 PG_element_rank_modified_lint(v, 1, n + 2, b);
1010
1011 set_out[cnt++] = b;
1012 }
1013 }
1014
1015 if (cnt != set_size_out) {
1016 cout << "finite_field::do_cone_over cnt != set_size_out" << endl;
1017 exit(1);
1018 }
1019
1020 FREE_int(v);
1021 //FREE_OBJECT(P1);
1022 //FREE_OBJECT(P2);
1023 if (f_v) {
1024 cout << "finite_field::do_cone_over done" << endl;
1025 }
1026}
1027
1028
1030 long int *set_in, int set_size,
1031 long int *&the_set_out, int &set_size_out,
1032 int verbose_level)
1033// creates projective_space PG(2,q)
1034{
1035 int f_v = (verbose_level >= 1);
1036
1037 if (f_v) {
1038 cout << "finite_field::do_blocking_set_family_3" << endl;
1039 }
1041 int h;
1042
1043 if (n != 2) {
1044 cout << "finite_field::do_blocking_set_family_3 "
1045 "we need n = 2" << endl;
1046 exit(1);
1047 }
1048 if (ODD(q)) {
1049 cout << "finite_field::do_blocking_set_family_3 "
1050 "we need q even" << endl;
1051 exit(1);
1052 }
1053 if (set_size != q + 2) {
1054 cout << "finite_field::do_blocking_set_family_3 "
1055 "we need set_size == q + 2" << endl;
1056 exit(1);
1057 }
1059
1060 P->projective_space_init(n, this,
1061 FALSE /* f_init_incidence_structure */,
1062 0 /* verbose_level - 2 */);
1063
1064
1065 int *idx;
1066 int p_idx[4];
1067 int line[6];
1068 int diag_pts[3];
1069 int diag_line;
1070 int nb, pt, sz;
1071 int i, j;
1072 int basis[6];
1074
1076
1078
1079 S->init(P->N_lines, 0);
1080 S->k = 0;
1081
1082 idx = NEW_int(set_size);
1083
1084#if 1
1085 while (TRUE) {
1086 cout << "choosing random permutation" << endl;
1087 Combi.random_permutation(idx, set_size);
1088
1089 cout << idx[0] << ", ";
1090 cout << idx[1] << ", ";
1091 cout << idx[2] << ", ";
1092 cout << idx[3] << endl;
1093
1094 for (i = 0; i < 4; i++) {
1095 p_idx[i] = set_in[idx[i]];
1096 }
1097
1098 line[0] = P->line_through_two_points(p_idx[0], p_idx[1]);
1099 line[1] = P->line_through_two_points(p_idx[0], p_idx[2]);
1100 line[2] = P->line_through_two_points(p_idx[0], p_idx[3]);
1101 line[3] = P->line_through_two_points(p_idx[1], p_idx[2]);
1102 line[4] = P->line_through_two_points(p_idx[1], p_idx[3]);
1103 line[5] = P->line_through_two_points(p_idx[2], p_idx[3]);
1104 diag_pts[0] = P->intersection_of_two_lines(line[0], line[5]);
1105 diag_pts[1] = P->intersection_of_two_lines(line[1], line[4]);
1106 diag_pts[2] = P->intersection_of_two_lines(line[2], line[3]);
1107
1108 diag_line = P->line_through_two_points(diag_pts[0], diag_pts[1]);
1109 if (diag_line != P->line_through_two_points(diag_pts[0], diag_pts[2])) {
1110 cout << "diaginal points not collinear!" << endl;
1111 exit(1);
1112 }
1113 P->unrank_line(basis, diag_line);
1114 Int_matrix_print(basis, 2, 3);
1115 nb = 0;
1116 for (i = 0; i < set_size; i++) {
1117 pt = set_in[i];
1118 if (P->is_incident(pt, diag_line)) {
1119 nb++;
1120 }
1121 }
1122 cout << "nb=" << nb << endl;
1123 if (nb == 0) {
1124 cout << "the diagonal line is external!" << endl;
1125 break;
1126 }
1127 } // while
1128#endif
1129
1130#if 0
1131 int fundamental_quadrangle[4] = {0,1,2,3};
1132 int basis[6];
1133
1134 for (i = 0; i < 4; i++) {
1135 if (!int_vec_search_linear(set_in, set_size, fundamental_quadrangle[i], j)) {
1136 cout << "the point " << fundamental_quadrangle[i] << " is not contained in the hyperoval" << endl;
1137 exit(1);
1138 }
1139 idx[i] = j;
1140 }
1141 cout << "the fundamental quadrangle is contained, the positions are " << endl;
1142 cout << idx[0] << ", ";
1143 cout << idx[1] << ", ";
1144 cout << idx[2] << ", ";
1145 cout << idx[3] << endl;
1146
1147 for (i = 0; i < 4; i++) {
1148 p_idx[i] = set_in[idx[i]];
1149 }
1150
1151 line[0] = P->line_through_two_points(p_idx[0], p_idx[1]);
1152 line[1] = P->line_through_two_points(p_idx[0], p_idx[2]);
1153 line[2] = P->line_through_two_points(p_idx[0], p_idx[3]);
1154 line[3] = P->line_through_two_points(p_idx[1], p_idx[2]);
1155 line[4] = P->line_through_two_points(p_idx[1], p_idx[3]);
1156 line[5] = P->line_through_two_points(p_idx[2], p_idx[3]);
1157 diag_pts[0] = P->line_intersection(line[0], line[5]);
1158 diag_pts[1] = P->line_intersection(line[1], line[4]);
1159 diag_pts[2] = P->line_intersection(line[2], line[3]);
1160
1161 diag_line = P->line_through_two_points(diag_pts[0], diag_pts[1]);
1162 cout << "The diagonal line is " << diag_line << endl;
1163
1164 P->unrank_line(basis, diag_line);
1165 int_matrix_print(basis, 2, 3);
1166
1167 if (diag_line != P->line_through_two_points(diag_pts[0], diag_pts[2])) {
1168 cout << "diagonal points not collinear!" << endl;
1169 exit(1);
1170 }
1171 nb = 0;
1172 for (i = 0; i < set_size; i++) {
1173 pt = set_in[i];
1174 if (P->Incidence[pt * P->N_lines + diag_line]) {
1175 nb++;
1176 }
1177 }
1178 cout << "nb=" << nb << endl;
1179 if (nb == 0) {
1180 cout << "the diagonal line is external!" << endl;
1181 }
1182 else {
1183 cout << "error: the diagonal line is not external" << endl;
1184 exit(1);
1185 }
1186
1187#endif
1188
1189 S->add_element(diag_line);
1190 for (i = 4; i < set_size; i++) {
1191 pt = set_in[idx[i]];
1192 for (j = 0; j < P->r; j++) {
1193 h = P->Implementation->Lines_on_point[pt * P->r + j];
1194 if (!S->is_contained(h)) {
1195 S->add_element(h);
1196 }
1197 }
1198 }
1199
1200 cout << "we created a blocking set of lines of "
1201 "size " << S->k << ":" << endl;
1202 Lint_vec_print(cout, S->set, S->k);
1203 cout << endl;
1204
1205
1206 int *pt_type;
1207
1208 pt_type = NEW_int(P->N_points);
1209
1210 P->point_types_of_line_set(S->set, S->k, pt_type, 0);
1211
1213
1214 C.init(pt_type, P->N_points, FALSE, 0);
1215
1216
1217 cout << "the point types are:" << endl;
1218 C.print_naked(FALSE /*f_backwards*/);
1219 cout << endl;
1220
1221#if 0
1222 for (i = 0; i <= P->N_points; i++) {
1223 if (pt_type[i]) {
1224 cout << i << "^" << pt_type[i] << " ";
1225 }
1226 }
1227 cout << endl;
1228#endif
1229
1230 sz = ((q * q) >> 1) + ((3 * q) >> 1) - 4;
1231
1232 if (S->k != sz) {
1233 cout << "the size does not match the expected size" << endl;
1234 exit(1);
1235 }
1236
1237 cout << "the size is OK" << endl;
1238
1239 the_set_out = NEW_lint(sz);
1240 set_size_out = sz;
1241
1242 for (i = 0; i < sz; i++) {
1243 j = S->set[i];
1244 the_set_out[i] = P->Standard_polarity->Hyperplane_to_point[j];
1245 }
1246
1247
1248
1249 FREE_OBJECT(P);
1250}
1251
1253 finite_field *Fq,
1254 std::string &fname, int &nb_pts, long int *&Pts,
1255 int verbose_level)
1256// creates projective_space PG(n,Q)
1257// the big field FQ is given
1258{
1259 int f_v = (verbose_level >= 1);
1260
1261 if (f_v) {
1262 cout << "finite_field::create_Baer_substructure" << endl;
1263 }
1265 int q = Fq->q;
1266 int Q = q;
1267 int sz;
1268 int *v;
1269 int d = n + 1;
1270 int i, j, a, b, index, f_is_in_subfield;
1272
1273 //Q = q * q;
1275
1276 P2->projective_space_init(n, this,
1277 FALSE /* f_init_incidence_structure */,
1278 verbose_level);
1279
1280 if (q != NT.i_power_j(p, e >> 1)) {
1281 cout << "q != i_power_j(p, e >> 1)" << endl;
1282 exit(1);
1283 }
1284
1285 cout << "Q=" << Q << endl;
1286 cout << "q=" << q << endl;
1287
1288 index = (Q - 1) / (q - 1);
1289 cout << "index=" << index << endl;
1290
1291 v = NEW_int(d);
1292 Pts = NEW_lint(P2->N_points);
1293 sz = 0;
1294 for (i = 0; i < P2->N_points; i++) {
1295 PG_element_unrank_modified(v, 1, d, i);
1296 for (j = 0; j < d; j++) {
1297 a = v[j];
1298 b = log_alpha(a);
1299 f_is_in_subfield = FALSE;
1300 if (a == 0 || (b % index) == 0) {
1301 f_is_in_subfield = TRUE;
1302 }
1303 if (!f_is_in_subfield) {
1304 break;
1305 }
1306 }
1307 if (j == d) {
1308 Pts[nb_pts++] = i;
1309 }
1310 }
1311 cout << "the Baer substructure PG(" << n << "," << q
1312 << ") inside PG(" << n << "," << Q << ") has size "
1313 << sz << ":" << endl;
1314 for (i = 0; i < sz; i++) {
1315 cout << Pts[i] << " ";
1316 }
1317 cout << endl;
1318
1319
1320
1321 char str[1000];
1322 sprintf(str, "_%d_%d.txt", n, Q);
1323 //write_set_to_file(fname, S, sz, verbose_level);
1324
1325
1326 fname.assign("Baer_substructure_in_PG");
1327 fname.append(str);
1328
1329 FREE_int(v);
1330 //FREE_int(S);
1331 FREE_OBJECT(P2);
1332}
1333
1335 int BLT_k,
1336 std::string &label_txt,
1337 std::string &label_tex,
1338 int &nb_pts, long int *&Pts,
1339 int verbose_level)
1340{
1341 int f_v = (verbose_level >= 1);
1342
1343 if (f_v) {
1344 cout << "finite_field::create_BLT_from_database" << endl;
1345 }
1346 int i;
1347 long int j;
1348 int epsilon = 0;
1349 int n = 4;
1350 int c1 = 0, c2 = 0, c3 = 0;
1351 int d = 5;
1352 long int *BLT;
1353 int *v;
1355
1356 nb_pts = q + 1;
1357
1358 BLT = K.BLT_representative(q, BLT_k);
1359
1360 v = NEW_int(d);
1361 Pts = NEW_lint(nb_pts);
1362
1363 if (f_v) {
1364 cout << "i : orthogonal rank : point : projective rank" << endl;
1365 }
1366 for (i = 0; i < nb_pts; i++) {
1367 Orthogonal_indexing->Q_epsilon_unrank(v, 1, epsilon, n, c1, c2, c3, BLT[i], 0 /* verbose_level */);
1368 if (f_embedded) {
1370 }
1371 else {
1372 j = BLT[i];
1373 }
1374 // recreate v:
1375 Orthogonal_indexing->Q_epsilon_unrank(v, 1, epsilon, n, c1, c2, c3, BLT[i], 0 /* verbose_level */);
1376 Pts[i] = j;
1377 if (f_v) {
1378 cout << setw(4) << i << " : " << setw(4) << BLT[i] << " : ";
1379 Int_vec_print(cout, v, d);
1380 cout << " : " << setw(5) << j << endl;
1381 }
1382 }
1383
1384#if 0
1385 cout << "list of points:" << endl;
1386 cout << nb_pts << endl;
1387 for (i = 0; i < nb_pts; i++) {
1388 cout << Pts[i] << " ";
1389 }
1390 cout << endl;
1391#endif
1392
1393 char str[1000];
1394 char str2[1000];
1395 if (f_embedded) {
1396 sprintf(str, "%d_%d_embedded", q, BLT_k);
1397 sprintf(str2, "%d\\_%d\\_embedded", q, BLT_k);
1398 label_txt.assign("BLT_");
1399 label_txt.append(str);
1400 label_tex.assign("BLT\\_");
1401 label_tex.append(str2);
1402 }
1403 else {
1404 sprintf(str, "%d_%d", q, BLT_k);
1405 sprintf(str2, "%d\\_%d", q, BLT_k);
1406 label_txt.assign("BLT_");
1407 label_txt.append(str);
1408 label_tex.assign("BLT\\_");
1409 label_tex.append(str2);
1410 }
1411 //write_set_to_file(fname, L, N, verbose_level);
1412
1413
1414 FREE_int(v);
1415 //FREE_int(L);
1416 //delete F;
1417}
1418
1419
1420
1421void finite_field::create_orthogonal(int epsilon, int n,
1422 std::string &label_txt,
1423 std::string &label_tex,
1424 int &nb_pts, long int *&Pts,
1425 int verbose_level)
1426{
1427 int f_v = (verbose_level >= 1);
1428
1429 if (f_v) {
1430 cout << "finite_field::create_orthogonal" << endl;
1431 }
1432 int c1 = 1, c2 = 0, c3 = 0;
1433 int i, j;
1434 int d = n + 1;
1435 int *v;
1437
1438 nb_pts = Gg.nb_pts_Qepsilon(epsilon, n, q);
1439
1440 v = NEW_int(d);
1441 Pts = NEW_lint(nb_pts);
1442
1443 if (epsilon == -1) {
1444 Linear_algebra->choose_anisotropic_form(c1, c2, c3, verbose_level);
1445 if (f_v) {
1446 cout << "c1=" << c1 << " c2=" << c2 << " c3=" << c3 << endl;
1447 }
1448 }
1449 if (f_v) {
1450 cout << "orthogonal rank : point : projective rank" << endl;
1451 }
1452 for (i = 0; i < nb_pts; i++) {
1453 Orthogonal_indexing->Q_epsilon_unrank(v, 1, epsilon, n, c1, c2, c3, i, 0 /* verbose_level */);
1454 PG_element_rank_modified(v, 1, d, j);
1455 Pts[i] = j;
1456 if (f_v) {
1457 cout << setw(4) << i << " : ";
1458 Int_vec_print(cout, v, d);
1459 cout << " : " << setw(5) << j << endl;
1460 }
1461 }
1462
1463#if 0
1464 cout << "list of points:" << endl;
1465 cout << nb_pts << endl;
1466 for (i = 0; i < nb_pts; i++) {
1467 cout << Pts[i] << " ";
1468 }
1469 cout << endl;
1470#endif
1471
1472 char str[1000];
1473 char str2[1000];
1474
1476
1477 sprintf(str, "Q%s_%d_%d.txt", AG.plus_minus_letter(epsilon), n, q);
1478 sprintf(str2, "Q%s\\_%d\\_%d.txt", AG.plus_minus_letter(epsilon), n, q);
1479 label_txt.assign(str);
1480 label_tex.assign(str2);
1481 //write_set_to_file(fname, L, N, verbose_level);
1482
1483
1484 FREE_int(v);
1485 //FREE_int(L);
1486}
1487
1488
1490 std::string &label_txt,
1491 std::string &label_tex,
1492 int &nb_pts, long int *&Pts,
1493 int verbose_level)
1494// creates hermitian
1495{
1496 int f_v = (verbose_level >= 1);
1497
1498 if (f_v) {
1499 cout << "finite_field::create_hermitian" << endl;
1500 }
1501 int i, j;
1502 int d = n + 1;
1503 int *v;
1505
1507 H->init(this, d, verbose_level - 1);
1508
1509 nb_pts = H->cnt_Sbar[d];
1510
1511 v = NEW_int(d);
1512 Pts = NEW_lint(nb_pts);
1513
1514 if (f_v) {
1515 cout << "hermitian rank : point : projective rank" << endl;
1516 }
1517 for (i = 0; i < nb_pts; i++) {
1518 H->Sbar_unrank(v, d, i, 0 /*verbose_level*/);
1519 PG_element_rank_modified(v, 1, d, j);
1520 Pts[i] = j;
1521 if (f_v) {
1522 cout << setw(4) << i << " : ";
1523 Int_vec_print(cout, v, d);
1524 cout << " : " << setw(5) << j << endl;
1525 }
1526 }
1527
1528#if 0
1529 cout << "list of points:" << endl;
1530 cout << nb_pts << endl;
1531 for (i = 0; i < nb_pts; i++) {
1532 cout << Pts[i] << " ";
1533 }
1534 cout << endl;
1535#endif
1536
1537 char str[1000];
1538 char str2[1000];
1539 sprintf(str, "H_%d_%d.txt", n, q);
1540 sprintf(str2, "H\\_%d\\_%d.txt", n, q);
1541 label_txt.assign(str);
1542 label_tex.assign(str2);
1543 //write_set_to_file(fname, L, N, verbose_level);
1544
1545
1546 FREE_int(v);
1547 FREE_OBJECT(H);
1548 //FREE_int(L);
1549}
1550
1552 int f_construction_A, int f_hyperoval, int f_construction_B,
1553 std::string &fname, int &nb_pts, long int *&Pts,
1554 int verbose_level)
1555// this is FQ
1556{
1557 int f_v = (verbose_level >= 1);
1558
1559 if (f_v) {
1560 cout << "finite_field::create_ttp_code" << endl;
1561 }
1563 long int i, j, d;
1564 int *v;
1565 int *H_subfield;
1566 int m, n;
1567 int f_elements_exponential = TRUE;
1568 string symbol_for_print_subfield;
1570
1571 if (f_v) {
1572 cout << "finite_field::create_ttp_code" << endl;
1573 }
1574
1575 symbol_for_print_subfield.assign("\\alpha");
1576
1578 H_subfield, m, n,
1579 this, Fq,
1580 f_construction_A, f_hyperoval,
1581 f_construction_B,
1582 verbose_level - 2);
1583
1584 if (f_v) {
1585 cout << "H_subfield:" << endl;
1586 cout << "m=" << m << endl;
1587 cout << "n=" << n << endl;
1588 Int_vec_print_integer_matrix_width(cout, H_subfield, m, n, n, 2);
1589 //f.latex_matrix(cout, f_elements_exponential,
1590 //symbol_for_print_subfield, H_subfield, m, n);
1591 }
1592
1593 d = m;
1595
1596
1597 P->projective_space_init(d - 1, Fq,
1598 FALSE /* f_init_incidence_structure */,
1599 verbose_level /*MINIMUM(verbose_level - 1, 3)*/);
1600 nb_pts = n;
1601
1602 if (f_v) {
1603 cout << "H_subfield:" << endl;
1604 //print_integer_matrix_width(cout, H_subfield, m, n, n, 2);
1605 Fq->latex_matrix(cout, f_elements_exponential,
1606 symbol_for_print_subfield, H_subfield, m, n);
1607 }
1608
1609 v = NEW_int(d);
1610 Pts = NEW_lint(nb_pts);
1611
1612 if (f_v) {
1613 cout << "i : point : projective rank" << endl;
1614 }
1615 for (i = 0; i < nb_pts; i++) {
1616 for (j = 0; j < d; j++) {
1617 v[j] = H_subfield[j * n + i];
1618 }
1619 j = P->rank_point(v);
1620 Pts[i] = j;
1621 if (f_v) {
1622 cout << setw(4) << i << " : ";
1623 Int_vec_print(cout, v, d);
1624 cout << " : " << setw(5) << j << endl;
1625 }
1626 }
1627
1628#if 0
1629 cout << "list of points for the ttp code:" << endl;
1630 cout << N << endl;
1631 for (i = 0; i < N; i++) {
1632 cout << L[i] << " ";
1633 }
1634 cout << endl;
1635#endif
1636
1637 char str[1000];
1638 if (f_construction_A) {
1639 if (f_hyperoval) {
1640 snprintf(str, 1000, "ttp_code_Ah_%d.txt", Fq->q);
1641 }
1642 else {
1643 snprintf(str, 1000, "ttp_code_A_%d.txt", Fq->q);
1644 }
1645 }
1646 else if (f_construction_B) {
1647 snprintf(str, 1000, "ttp_code_B_%d.txt", Fq->q);
1648 }
1649 fname.assign(str);
1650 //write_set_to_file(fname, L, N, verbose_level);
1651
1652 FREE_OBJECT(P);
1653 FREE_int(v);
1654 FREE_int(H_subfield);
1655}
1656
1657
1658
1659
1660
1662 std::string &label_txt,
1663 std::string &label_tex,
1664 int &nb_pts, long int *&Pts,
1665 int verbose_level)
1666// creates PG(a,q), PG(b,q) and PG((a+1)*(b+1)-1,q)
1667{
1668 int f_v = (verbose_level >= 1);
1669
1670 if (f_v) {
1671 cout << "finite_field::create_segre_variety" << endl;
1672 }
1676 int i, j, d, N1, N2, rk;
1677 int *v1;
1678 int *v2;
1679 int *v3;
1680
1681 if (f_v) {
1682 cout << "finite_field::create_segre_variety" << endl;
1683 cout << "a=" << a << " (projective)" << endl;
1684 cout << "b=" << b << " (projective)" << endl;
1685 }
1686 d = (a + 1) * (b + 1);
1687 if (f_v) {
1688 cout << "d=" << d << " (vector space dimension)" << endl;
1689 }
1693 v1 = NEW_int(a + 1);
1694 v2 = NEW_int(b + 1);
1695 v3 = NEW_int(d);
1696
1697 P1->projective_space_init(a, this,
1698 FALSE /* f_init_incidence_structure */,
1699 verbose_level /*MINIMUM(verbose_level - 1, 3)*/);
1700 P2->projective_space_init(b, this,
1701 FALSE /* f_init_incidence_structure */,
1702 verbose_level /*MINIMUM(verbose_level - 1, 3)*/);
1703 P3->projective_space_init(d - 1, this,
1704 FALSE /* f_init_incidence_structure */,
1705 verbose_level /*MINIMUM(verbose_level - 1, 3)*/);
1706
1707
1708 N1 = P1->N_points;
1709 N2 = P2->N_points;
1710 Pts = NEW_lint(N1 * N2);
1711 nb_pts = 0;
1712 for (i = 0; i < N1; i++) {
1713 P1->unrank_point(v1, i);
1714 for (j = 0; j < N2; j++) {
1715 P2->unrank_point(v2, j);
1716 Linear_algebra->mult_matrix_matrix(v1, v2, v3, a + 1, 1, b + 1,
1717 0 /* verbose_level */);
1718 rk = P3->rank_point(v3);
1719 Pts[nb_pts++] = rk;
1720 if (f_v) {
1721 cout << setw(4) << nb_pts - 1 << " : " << endl;
1722 Int_matrix_print(v3, a + 1, b + 1);
1723 cout << " : " << setw(5) << rk << endl;
1724 }
1725 }
1726 }
1727
1728 char str[1000];
1729 char str2[1000];
1730 sprintf(str, "segre_variety_%d_%d_%d", a, b, q);
1731 sprintf(str2, "segre\\_variety\\_%d\\_%d\\_%d", a, b, q);
1732 label_txt.assign(str);
1733 label_tex.assign(str2);
1734
1735 FREE_OBJECT(P1);
1736 FREE_OBJECT(P2);
1737 FREE_OBJECT(P3);
1738 FREE_int(v1);
1739 FREE_int(v2);
1740 FREE_int(v3);
1741}
1742
1743
1744
1746 long int *the_set_in, int set_size_in,
1747 long int *&the_set_out, int &set_size_out,
1748 int verbose_level)
1749// creates PG(2,Q) and PG(4,q)
1750// this is FQ
1751{
1752 int f_v = (verbose_level >= 1);
1753 int f_vv = (verbose_level >= 2);
1755 int a, a0, a1;
1756 int b, b0, b1;
1757 int i, h, k, alpha; //, d;
1758 int *v, *w1, *w2, *w3, *v2;
1759 int *components;
1760 int *embedding;
1761 int *pair_embedding;
1762
1763 if (f_v) {
1764 cout << "finite_field::do_andre for a set of size " << set_size_in << endl;
1765 }
1768
1769
1770 P2->projective_space_init(2, this,
1771 FALSE /* f_init_incidence_structure */,
1772 verbose_level /*MINIMUM(verbose_level - 1, 3)*/);
1773
1774 P4->projective_space_init(4, Fq,
1775 FALSE /* f_init_incidence_structure */,
1776 verbose_level /*MINIMUM(verbose_level - 1, 3)*/);
1777
1778 //d = 5;
1779
1780
1781 if (f_v) {
1782 cout << "before subfield_embedding_2dimensional" << endl;
1783 }
1784
1786 components, embedding, pair_embedding, verbose_level);
1787
1788 // we think of FQ as two dimensional vector space
1789 // over Fq with basis (1,alpha)
1790 // for i,j \in Fq, with x = i + j * alpha \in FQ, we have
1791 // pair_embedding[i * q + j] = x;
1792 // also,
1793 // components[x * 2 + 0] = i;
1794 // components[x * 2 + 1] = j;
1795 // also, for i \in Fq, embedding[i] is the element
1796 // in FQ that corresponds to i
1797
1798 // components[Q * 2]
1799 // embedding[q]
1800 // pair_embedding[q * q]
1801
1802 if (f_v) {
1803 cout << "after subfield_embedding_2dimensional" << endl;
1804 }
1805 if (f_vv) {
1806 print_embedding(*Fq,
1807 components, embedding, pair_embedding);
1808 }
1809 alpha = p;
1810 if (f_vv) {
1811 cout << "alpha=" << alpha << endl;
1812 //FQ->print(TRUE /* f_add_mult_table */);
1813 }
1814
1815
1816 v = NEW_int(3);
1817 w1 = NEW_int(5);
1818 w2 = NEW_int(5);
1819 w3 = NEW_int(5);
1820 v2 = NEW_int(2);
1821
1822
1823 the_set_out = NEW_lint(P4->N_points);
1824 set_size_out = 0;
1825
1826 for (i = 0; i < set_size_in; i++) {
1827 if (f_vv) {
1828 cout << "input point " << i << " is "
1829 << the_set_in[i] << " : ";
1830 }
1831 P2->unrank_point(v, the_set_in[i]);
1832 PG_element_normalize(v, 1, 3);
1833 if (f_vv) {
1834 Int_vec_print(cout, v, 3);
1835 cout << " becomes ";
1836 }
1837
1838 if (v[2] == 0) {
1839
1840 // we are dealing with a point on the line at infinity.
1841 // Such a point corresponds to a line of the spread.
1842 // We create the line and then create all
1843 // q + 1 points on that line.
1844
1845 if (f_vv) {
1846 cout << endl;
1847 }
1848 // w1[4] is the GF(q)-vector corresponding
1849 // to the GF(q^2)-vector v[2]
1850 // w2[4] is the GF(q)-vector corresponding
1851 // to the GF(q^2)-vector v[2] * alpha
1852 // where v[2] runs through the points of PG(1,q^2).
1853 // That way, w1[4] and w2[4] are a GF(q)-basis for the
1854 // 2-dimensional subspace v[2] (when viewed over GF(q)),
1855 // which is an element of the regular spread.
1856
1857 for (h = 0; h < 2; h++) {
1858 a = v[h];
1859 a0 = components[a * 2 + 0];
1860 a1 = components[a * 2 + 1];
1861 b = mult(a, alpha);
1862 b0 = components[b * 2 + 0];
1863 b1 = components[b * 2 + 1];
1864 w1[2 * h + 0] = a0;
1865 w1[2 * h + 1] = a1;
1866 w2[2 * h + 0] = b0;
1867 w2[2 * h + 1] = b1;
1868 }
1869 if (FALSE) {
1870 cout << "w1=";
1871 Int_vec_print(cout, w1, 4);
1872 cout << "w2=";
1873 Int_vec_print(cout, w2, 4);
1874 cout << endl;
1875 }
1876
1877 // now we create all points on the line spanned
1878 // by w1[4] and w2[4]:
1879 // There are q + 1 of these points.
1880 // We make sure that the coordinate vectors have
1881 // a zero in the last spot.
1882
1883 for (h = 0; h < Fq->q + 1; h++) {
1884 Fq->PG_element_unrank_modified(v2, 1, 2, h);
1885 if (FALSE) {
1886 cout << "v2=";
1887 Int_vec_print(cout, v2, 2);
1888 cout << " : ";
1889 }
1890 for (k = 0; k < 4; k++) {
1891 w3[k] = Fq->add(Fq->mult(v2[0], w1[k]),
1892 Fq->mult(v2[1], w2[k]));
1893 }
1894 w3[4] = 0;
1895 if (f_vv) {
1896 cout << " ";
1897 Int_vec_print(cout, w3, 5);
1898 }
1899 a = P4->rank_point(w3);
1900 if (f_vv) {
1901 cout << " rank " << a << endl;
1902 }
1903 the_set_out[set_size_out++] = a;
1904 }
1905 }
1906 else {
1907
1908 // we are dealing with an affine point:
1909 // We make sure that the coordinate vector
1910 // has a one in the last spot.
1911
1912
1913 for (h = 0; h < 2; h++) {
1914 a = v[h];
1915 a0 = components[a * 2 + 0];
1916 a1 = components[a * 2 + 1];
1917 w1[2 * h + 0] = a0;
1918 w1[2 * h + 1] = a1;
1919 }
1920 w1[4] = 1;
1921 if (f_vv) {
1922 //cout << "w1=";
1923 Int_vec_print(cout, w1, 5);
1924 }
1925 a = P4->rank_point(w1);
1926 if (f_vv) {
1927 cout << " rank " << a << endl;
1928 }
1929 the_set_out[set_size_out++] = a;
1930 }
1931 }
1932
1933 if (f_v) {
1934 for (i = 0; i < set_size_out; i++) {
1935 a = the_set_out[i];
1936 P4->unrank_point(w1, a);
1937 cout << setw(3) << i << " : " << setw(5) << a << " : ";
1938 Int_vec_print(cout, w1, 5);
1939 cout << endl;
1940 }
1941 }
1942
1943 FREE_OBJECT(P2);
1944 FREE_OBJECT(P4);
1945 FREE_int(v);
1946 FREE_int(w1);
1947 FREE_int(w2);
1948 FREE_int(w3);
1949 FREE_int(v2);
1950 FREE_int(components);
1951 FREE_int(embedding);
1952 FREE_int(pair_embedding);
1953}
1954
1955
1957 int epsilon, int n,
1958 long int *set_in, long int *&set_out, int set_size,
1959 int verbose_level)
1960{
1961 int f_v = (verbose_level >= 1);
1962 //projective_space *P;
1963 int *v;
1964 int d = n + 1;
1965 long int h, a, b;
1966 int c1 = 0, c2 = 0, c3 = 0;
1967
1968 if (f_v) {
1969 cout << "finite_field::do_embed_orthogonal" << endl;
1970 }
1971#if 0
1972 P = NEW_OBJECT(projective_space);
1973
1974 P->init(n, this,
1975 FALSE /* f_init_incidence_structure */,
1976 verbose_level - 2 /*MINIMUM(verbose_level - 1, 3)*/);
1977#endif
1978
1979 if (epsilon == -1) {
1980 Linear_algebra->choose_anisotropic_form(c1, c2, c3, verbose_level);
1981 }
1982
1983 v = NEW_int(d);
1984 set_out = NEW_lint(set_size);
1985
1986 for (h = 0; h < set_size; h++) {
1987 a = set_in[h];
1988 Orthogonal_indexing->Q_epsilon_unrank(v, 1, epsilon, n, c1, c2, c3, a, 0 /* verbose_level */);
1989 //b = P->rank_point(v);
1990 PG_element_rank_modified_lint(v, 1, n + 1, b);
1991 set_out[h] = b;
1992 }
1993
1994 FREE_int(v);
1995 //FREE_OBJECT(P);
1996
1997}
1998
2000 long int *set_in, long int *&set_out, int set_size,
2001 int verbose_level)
2002{
2003 int f_v = (verbose_level >= 1);
2004 int *v;
2005 int d = n + 2;
2006 int h;
2007 long int a, b;
2008
2009 if (f_v) {
2010 cout << "finite_field::do_embed_points" << endl;
2011 }
2012
2013 v = NEW_int(d);
2014 set_out = NEW_lint(set_size);
2015
2016 for (h = 0; h < set_size; h++) {
2017 a = set_in[h];
2018
2019 PG_element_unrank_modified_lint(v, 1, n + 1, a);
2020
2021 v[d - 1] = 0;
2022
2023 PG_element_rank_modified_lint(v, 1, n + 2, b);
2024
2025 set_out[h] = b;
2026 }
2027
2028 FREE_int(v);
2029 if (f_v) {
2030 cout << "finite_field::do_embed_points done" << endl;
2031 }
2032
2033}
2034
2036{
2037 int *A;
2038 int i, j, x, y, v[3];
2039
2040
2041 A = NEW_int(q * q);
2042 for (x = 0; x < q; x++) {
2043 for (y = 0; y < q; y++) {
2044 A[(q - 1 - y) * q + x] = 0;
2045 }
2046 }
2047 for (i = 0; i < len; i++) {
2049 v, 1 /* stride */, 3 /* len */, S[i]);
2050 if (v[2] != 1) {
2051 //cout << "my_generator::print_set_in_affine_plane
2052 // not an affine point" << endl;
2053 cout << "(" << v[0] << "," << v[1]
2054 << "," << v[2] << ")" << endl;
2055 continue;
2056 }
2057 x = v[0];
2058 y = v[1];
2059 A[(q - 1 - y) * q + x] = 1;
2060 }
2061 for (i = 0; i < q; i++) {
2062 for (j = 0; j < q; j++) {
2063 cout << A[i * q + j];
2064 }
2065 cout << endl;
2066 }
2067 FREE_int(A);
2068}
2069
2070
2071
2072void finite_field::simeon(int n, int len, long int *S, int s, int verbose_level)
2073{
2074 int f_v = (verbose_level >= 1);
2075 int f_vv = FALSE; //(verbose_level >= 1);
2076 int k, nb_rows, nb_cols, nb_r1, nb_r2, row, col;
2077 int *Coord;
2078 int *M;
2079 int *A;
2080 int *C;
2081 int *T;
2082 int *Ac; // no not free
2083 int *U;
2084 int *U1;
2085 int nb_A, nb_U;
2086 int a, u, ac, i, d, idx, mtx_rank;
2089
2090 if (f_v) {
2091 cout << "finite_field::simeon s=" << s << endl;
2092 }
2093 k = n + 1;
2094 nb_cols = Combi.int_n_choose_k(len, k - 1);
2095 nb_r1 = Combi.int_n_choose_k(len, s);
2096 nb_r2 = Combi.int_n_choose_k(len - s, k - 2);
2097 nb_rows = nb_r1 * nb_r2;
2098 if (f_v) {
2099 cout << "nb_r1=" << nb_r1 << endl;
2100 cout << "nb_r2=" << nb_r2 << endl;
2101 cout << "nb_rows=" << nb_rows << endl;
2102 cout << "nb_cols=" << nb_cols << endl;
2103 }
2104
2105 Coord = NEW_int(len * k);
2106 M = NEW_int(nb_rows * nb_cols);
2107 A = NEW_int(len);
2108 U = NEW_int(k - 2);
2109 U1 = NEW_int(k - 2);
2110 C = NEW_int(k - 1);
2111 T = NEW_int(k * k);
2112
2113 Int_vec_zero(M, nb_rows * nb_cols);
2114
2115
2116 // unrank all points of the arc:
2117 for (i = 0; i < len; i++) {
2118 //point_unrank(Coord + i * k, S[i]);
2119 PG_element_unrank_modified(Coord + i * k, 1 /* stride */, n + 1 /* len */, S[i]);
2120 }
2121
2122
2123 nb_A = Combi.int_n_choose_k(len, k - 2);
2124 nb_U = Combi.int_n_choose_k(len - (k - 2), k - 1);
2125 if (nb_A * nb_U != nb_rows) {
2126 cout << "nb_A * nb_U != nb_rows" << endl;
2127 exit(1);
2128 }
2129 if (f_v) {
2130 cout << "nb_A=" << nb_A << endl;
2131 cout << "nb_U=" << nb_U << endl;
2132 }
2133
2134
2135 Ac = A + k - 2;
2136
2137 row = 0;
2138 for (a = 0; a < nb_A; a++) {
2139 if (f_vv) {
2140 cout << "a=" << a << " / " << nb_A << ":" << endl;
2141 }
2142 Combi.unrank_k_subset(a, A, len, k - 2);
2143 Combi.set_complement(A, k - 2, Ac, ac, len);
2144 if (ac != len - (k - 2)) {
2145 cout << "arc_generator::simeon ac != len - (k - 2)" << endl;
2146 exit(1);
2147 }
2148 if (f_vv) {
2149 cout << "Ac=";
2150 Int_vec_print(cout, Ac, ac);
2151 cout << endl;
2152 }
2153
2154
2155 for (u = 0; u < nb_U; u++, row++) {
2156
2157 Combi.unrank_k_subset(u, U, len - (k - 2), k - 1);
2158 for (i = 0; i < k - 1; i++) {
2159 U1[i] = Ac[U[i]];
2160 }
2161 if (f_vv) {
2162 cout << "U1=";
2163 Int_vec_print(cout, U1, k - 1);
2164 cout << endl;
2165 }
2166
2167 for (col = 0; col < nb_cols; col++) {
2168 if (f_vv) {
2169 cout << "row=" << row << " / " << nb_rows
2170 << " col=" << col << " / "
2171 << nb_cols << ":" << endl;
2172 }
2173 Combi.unrank_k_subset(col, C, len, k - 1);
2174 if (f_vv) {
2175 cout << "C: ";
2176 Int_vec_print(cout, C, k - 1);
2177 cout << endl;
2178 }
2179
2180
2181 // test if A is a subset of C:
2182 for (i = 0; i < k - 2; i++) {
2183 if (!Sorting.int_vec_search_linear(C, k - 1, A[i], idx)) {
2184 //cout << "did not find A[" << i << "] in C" << endl;
2185 break;
2186 }
2187 }
2188 if (i == k - 2) {
2190 Coord, C, U1, k, s /*sz_U */,
2191 T, 0 /*verbose_level*/);
2192 if (f_vv) {
2193 cout << "d=" << d << endl;
2194 }
2195
2196 M[row * nb_cols + col] = d;
2197 } // if
2198 } // next col
2199 } // next u
2200 } // next a
2201
2202 if (f_v) {
2203 cout << "simeon, the matrix M is:" << endl;
2204 //int_matrix_print(M, nb_rows, nb_cols);
2205 }
2206
2207 //print_integer_matrix_with_standard_labels(cout, M,
2208 //nb_rows, nb_cols, TRUE /* f_tex*/);
2209 //int_matrix_print_tex(cout, M, nb_rows, nb_cols);
2210
2211 if (f_v) {
2212 cout << "nb_rows=" << nb_rows << endl;
2213 cout << "nb_cols=" << nb_cols << endl;
2214 cout << "s=" << s << endl;
2215 }
2216
2217 mtx_rank = Linear_algebra->Gauss_easy(M, nb_rows, nb_cols);
2218 if (f_v) {
2219 cout << "mtx_rank=" << mtx_rank << endl;
2220 //cout << "simeon, the reduced matrix M is:" << endl;
2221 //int_matrix_print(M, mtx_rank, nb_cols);
2222 }
2223
2224
2225 FREE_int(Coord);
2226 FREE_int(M);
2227 FREE_int(A);
2228 FREE_int(C);
2229 //FREE_int(E);
2230#if 0
2231 FREE_int(A1);
2232 FREE_int(C1);
2233 FREE_int(E1);
2234 FREE_int(A2);
2235 FREE_int(C2);
2236#endif
2237 FREE_int(T);
2238 if (f_v) {
2239 cout << "finite_field::simeon s=" << s << " done" << endl;
2240 }
2241}
2242
2243
2245{
2246 K[0] = W[0]; // 12
2247 K[1] = W[5]; // 34
2248 K[2] = W[1]; // 13
2249 K[3] = negate(W[4]); // 24
2250 K[4] = W[2]; // 14
2251 K[5] = W[3]; // 23
2252}
2253
2255{
2256 W[0] = K[0];
2257 W[1] = K[2];
2258 W[2] = K[4];
2259 W[3] = K[5];
2260 W[4] = negate(K[3]);
2261 W[5] = K[1];
2262}
2263
2264
2265void finite_field::isomorphism_to_special_orthogonal(int *A4, int *A6, int verbose_level)
2266{
2267 int f_v = (verbose_level >= 1);
2268 int f_vv = (verbose_level >= 2);
2269
2270 if (f_v) {
2271 cout << "finite_field::isomorphism_to_special_orthogonal" << endl;
2272 }
2273 int i, j;
2274 int Basis1[] = {
2275 1,0,0,0,0,0,
2276 0,1,0,0,0,0,
2277 0,0,1,0,0,0,
2278 0,0,0,1,0,0,
2279 0,0,0,0,1,0,
2280 0,0,0,0,0,1,
2281 };
2282 int Basis2[36];
2283 int An2[37];
2284 int v[6];
2285 int w[6];
2286 int C[36];
2287 int D[36];
2288 int B[] = {
2289 1,0,0,0,0,0,
2290 0,0,0,2,0,0,
2291 1,3,0,0,0,0,
2292 0,0,0,1,3,0,
2293 1,0,2,0,0,0,
2294 0,0,0,2,0,4,
2295 };
2296 int Bv[36];
2298
2299 for (i = 0; i < 6; i++) {
2300 klein_to_wedge(Basis1 + i * 6, Basis2 + i * 6);
2301 }
2302
2303 Linear_algebra->matrix_inverse(B, Bv, 6, 0 /* verbose_level */);
2304
2305
2306
2307
2308 Linear_algebra->exterior_square(A4, An2, 4, 0 /*verbose_level*/);
2309
2310 if (f_vv) {
2311 cout << "finite_field::isomorphism_to_special_orthogonal "
2312 "exterior_square :" << endl;
2313 Int_matrix_print(An2, 6, 6);
2314 cout << endl;
2315 }
2316
2317
2318 for (j = 0; j < 6; j++) {
2319 Linear_algebra->mult_vector_from_the_left(Basis2 + j * 6, An2, v, 6, 6);
2320 // v[m], A[m][n], vA[n]
2321 wedge_to_klein(v, w);
2322 Int_vec_copy(w, C + j * 6, 6);
2323 }
2324
2325
2326 if (f_vv) {
2327 cout << "finite_field::isomorphism_to_special_orthogonal "
2328 "orthogonal matrix :" << endl;
2329 Int_matrix_print(C, 6, 6);
2330 cout << endl;
2331 }
2332
2333 Linear_algebra->mult_matrix_matrix(Bv, C, D, 6, 6, 6, 0 /*verbose_level */);
2334 Linear_algebra->mult_matrix_matrix(D, B, A6, 6, 6, 6, 0 /*verbose_level */);
2335
2337
2338 if (f_vv) {
2339 cout << "finite_field::isomorphism_to_special_orthogonal "
2340 "orthogonal matrix in the special form:" << endl;
2341 Int_matrix_print(A6, 6, 6);
2342 cout << endl;
2343 }
2344
2345 if (f_v) {
2346 cout << "finite_field::isomorphism_to_special_orthogonal done" << endl;
2347 }
2348
2349}
2350
2351
2353 int &a, int &b, int verbose_level)
2354{
2355 int X[6];
2356 int i, i0;
2357
2358 X[0] = x;
2359 X[1] = add(x, 1);
2360 X[2] = mult(x, inverse(y));
2361 X[3] = mult(add(x, y), inverse(add(y, 1)));
2362 X[4] = mult(1, inverse(y));
2363 X[5] = mult(add(x, y), inverse(x));
2364 i0 = 0;
2365 for (i = 1; i < 6; i++) {
2366 if (X[i] < X[i0]) {
2367 i0 = i;
2368 }
2369 }
2370 a = X[i0];
2371 if (i0 == 0) {
2372 b = y;
2373 }
2374 else if (i0 == 1) {
2375 b = add(y, 1);
2376 }
2377 else if (i0 == 2) {
2378 b = mult(1, inverse(y));
2379 }
2380 else if (i0 == 3) {
2381 b = mult(y, inverse(add(y, 1)));
2382 }
2383 else if (i0 == 4) {
2384 b = mult(x, inverse(y));
2385 }
2386 else if (i0 == 5) {
2387 b = mult(add(x, 1), inverse(x));
2388 }
2389}
2390
2392// used to create the Schlaefli graph
2393{
2394 int a, i;
2395
2396 a = 0;
2397 for (i = 0; i < 4; i++) {
2398 a = add(a, power(v[i], 3));
2399 }
2400 return a;
2401}
2402
2403
2404
2405}}}
2406
2407
global functions related to finite fields, irreducible polynomials and such
Definition: algebra.h:130
void twisted_tensor_product_codes(int *&H_subfield, int &m, int &n, field_theory::finite_field *F, field_theory::finite_field *f, int f_construction_A, int f_hyperoval, int f_construction_B, int verbose_level)
void set_complement(int *subset, int subset_size, int *complement, int &size_complement, int universal_set_size)
void print(std::ostream &ost, std::vector< int > &v)
Definition: int_vec.cpp:413
a collection of functions related to sorted vectors
int int_vec_search_linear(int *v, int len, int a, int &idx)
Definition: sorting.cpp:686
a statistical analysis of data consisting of single integers
void init(int *data, int data_length, int f_second, int verbose_level)
Definition: tally.cpp:72
void create_BLT_from_database(int f_embedded, int BLT_k, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void PG_element_rank_modified(int *v, int stride, int len, int &a)
void PG_elements_embed(long int *set_in, long int *set_out, int sz, int old_length, int new_length, int *v)
void all_PG_elements_in_subspace(int *genma, int k, int n, long int *&point_list, int &nb_points, int verbose_level)
void create_ttp_code(finite_field *Fq, int f_construction_A, int f_hyperoval, int f_construction_B, std::string &fname, int &nb_pts, long int *&Pts, int verbose_level)
void PG_elements_unrank_lint(int *M, int k, int n, long int *rank_vec)
void create_orthogonal(int epsilon, int n, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void create_hermitian(int n, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void PG_element_rank_modified_not_in_subspace(int *v, int stride, int len, int m, long int &a)
void do_embed_orthogonal(int epsilon, int n, long int *set_in, long int *&set_out, int set_size, int verbose_level)
void isomorphism_to_special_orthogonal(int *A4, int *A6, int verbose_level)
orthogonal_geometry::orthogonal_indexing * Orthogonal_indexing
void do_blocking_set_family_3(int n, long int *set_in, int set_size, long int *&the_set_out, int &set_size_out, int verbose_level)
void create_segre_variety(int a, int b, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void simeon(int n, int len, long int *S, int s, int verbose_level)
void PG_element_unrank_modified(int *v, int stride, int len, int a)
void all_PG_elements_in_subspace_array_is_given(int *genma, int k, int n, long int *point_list, int &nb_points, int verbose_level)
void minimal_orbit_rep_under_stabilizer_of_frame_characteristic_two(int x, int y, int &a, int &b, int verbose_level)
void do_embed_points(int n, long int *set_in, long int *&set_out, int set_size, int verbose_level)
void do_cone_over(int n, long int *set_in, int set_size_in, long int *&set_out, int &set_size_out, int verbose_level)
void do_andre(finite_field *Fq, long int *the_set_in, int set_size_in, long int *&the_set_out, int &set_size_out, int verbose_level)
void PG_element_unrank_modified_lint(int *v, int stride, int len, long int a)
void subfield_embedding_2dimensional(finite_field &subfield, int *&components, int *&embedding, int *&pair_embedding, int verbose_level)
void PG_element_unrank_modified_not_in_subspace(int *v, int stride, int len, int m, long int a)
void latex_matrix(std::ostream &f, int f_elements_exponential, std::string &symbol_for_print, int *M, int m, int n)
void print_embedding(finite_field &subfield, int *components, int *embedding, int *pair_embedding)
long int PG_element_embed(long int rk, int old_length, int new_length, int *v)
void PG_elements_rank_lint(int *M, int k, int n, long int *rank_vec)
void create_Baer_substructure(int n, finite_field *Fq, std::string &fname, int &nb_pts, long int *&Pts, int verbose_level)
void PG_element_rank_modified_lint(int *v, int stride, int len, long int &a)
various functions related to geometries
Definition: geometry.h:721
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
long int nb_PG_elements_not_in_subspace(int n, int m, int q)
long int nb_pts_Qepsilon(int epsilon, int k, int q)
void init(field_theory::finite_field *F, int nb_vars, int verbose_level)
Definition: hermitian.cpp:73
void Sbar_unrank(int *v, int len, int rk, int verbose_level)
Definition: hermitian.cpp:859
projective space PG(n,q) of dimension n over Fq
Definition: geometry.h:1916
void point_types_of_line_set(long int *set_of_lines, int set_size, int *type, int verbose_level)
void line_intersection(int line_rank, long int *set, int set_size, std::vector< int > &point_indices, int verbose_level)
projective_space_implementation * Implementation
Definition: geometry.h:1940
void projective_space_init(int n, field_theory::finite_field *F, int f_init_incidence_structure, int verbose_level)
long int line_through_two_points(long int p1, long int p2)
provides access to pre-computed combinatorial data in encoded form
void mult_vector_from_the_left(int *v, int *A, int *vA, int m, int n)
int BallChowdhury_matrix_entry(int *Coord, int *C, int *U, int k, int sz_U, int *T, int verbose_level)
void exterior_square(int *An, int *An2, 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 choose_anisotropic_form(int &c1, int &c2, int &c3, int verbose_level)
void matrix_inverse(int *A, int *Ainv, int n, 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)
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define FREE_OBJECT(p)
Definition: foundations.h:651
#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 Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define ODD(x)
Definition: foundations.h:222
#define Int_vec_copy(A, B, C)
Definition: foundations.h:693
#define NEW_lint(n)
Definition: foundations.h:628
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects