Orbiter 2022
Combinatorial Objects
orthogonal_hyperbolic.cpp
Go to the documentation of this file.
1/*
2 * orthogonal_hyperbolic.cpp
3 *
4 * Created on: Oct 31, 2019
5 * Author: betten
6 */
7
8
9
10#include "foundations.h"
11
12using namespace std;
13
14
15namespace orbiter {
16namespace layer1_foundations {
17namespace orthogonal_geometry {
18
19
20
21// #############################################################################
22// orthogonal_hyperbolic.cpp
23// #############################################################################
24
25//##############################################################################
26// ranking / unranking points according to the partition:
27//##############################################################################
28
30 long int type, long int index, int verbose_level)
31{
32 int f_v = (verbose_level >= 1);
33 int rk;
34
35 if (f_v) {
36 cout << "orthogonal::hyperbolic_type_and_index_to_point_rk "
37 "type" << type << "index=" << index << endl;
38 }
39 rk = 0;
40 if (type == 4) {
41 if (index >= p4) {
42 cout << "error in orthogonal::hyperbolic_type_and_index_to_point_rk, "
43 "index >= p4" << endl;
44 exit(1);
45 }
46 rk += index;
47 goto done;
48 }
49 rk += p4;
50 if (type == 6) {
51 if (index >= p6) {
52 cout << "error in orthogonal::hyperbolic_type_and_index_to_point_rk, "
53 "index >= p6" << endl;
54 exit(1);
55 }
56 rk += index;
57 goto done;
58 }
59 rk += p6;
60 if (type == 3) {
61 if (index >= p3) {
62 cout << "error in orthogonal::hyperbolic_type_and_index_to_point_rk, "
63 "index >= p3" << endl;
64 exit(1);
65 }
66 rk += index;
67 goto done;
68 }
69 rk += p3;
70 if (type == 5) {
71 if (index >= p5) {
72 cout << "error in orthogonal::hyperbolic_type_and_index_to_point_rk, "
73 "index >= p5" << endl;
74 exit(1);
75 }
76 rk += index;
77 goto done;
78 }
79 rk += p5;
80 if (type == 2) {
81 if (index >= p2) {
82 cout << "error in orthogonal::hyperbolic_type_and_index_to_point_rk, "
83 "index >= p2" << endl;
84 exit(1);
85 }
86 rk += index;
87 goto done;
88 }
89 rk += p2;
90 if (type == 1) {
91 if (index >= p1) {
92 cout << "error in orthogonal::hyperbolic_type_and_index_to_point_rk, "
93 "index >= p1" << endl;
94 exit(1);
95 }
96 rk += index;
97 goto done;
98 }
99 cout << "error in orthogonal::hyperbolic_type_and_index_to_point_rk, "
100 "unknown type" << endl;
101 exit(1);
102done:
103 if (f_v) {
104 cout << "orthogonal::hyperbolic_type_and_index_to_point_rk "
105 "type" << type << "index=" << index << " rk=" << rk << endl;
106 }
107 return rk;
108}
109
111 long int rk, long int &type, long int &index)
112{
113 if (rk < p4) {
114 type = 4;
115 index = rk;
116 return;
117 }
118 rk -= p4;
119 if (rk == 0) {
120 type = 6;
121 index = 0;
122 return;
123 }
124 rk--;
125 if (rk < p3) {
126 type = 3;
127 index = rk;
128 return;
129 }
130 rk -= p3;
131 if (rk == 0) {
132 type = 5;
133 index = 0;
134 return;
135 }
136 rk--;
137 if (rk < p2) {
138 type = 2;
139 index = rk;
140 return;
141 }
142 rk -= p2;
143 if (rk < p1) {
144 type = 1;
145 index = rk;
146 return;
147 }
148 cout << "error in orthogonal::hyperbolic_point_rk_to_type_and_index" << endl;
149 exit(1);
150
151}
152
153//##############################################################################
154// ranking / unranking neighbors of the favorite point:
155//##############################################################################
156
157
158//##############################################################################
159// ranking / unranking lines:
160//##############################################################################
161
163 long int &p1, long int &p2, long int rk, int verbose_level)
164{
165 if (m == 0) {
166 cout << "orthogonal::hyperbolic_unrank_line "
167 "Witt index zero, there is no line to unrank" << endl;
168 exit(1);
169 }
170 if (rk < l1) {
171 unrank_line_L1(p1, p2, rk, verbose_level);
172 return;
173 }
174 rk -= l1;
175 if (rk < l2) {
176 unrank_line_L2(p1, p2, rk, verbose_level);
177 return;
178 }
179 rk -= l2;
180 if (rk < l3) {
181 unrank_line_L3(p1, p2, rk, verbose_level);
182 return;
183 }
184 rk -= l3;
185 if (rk < l4) {
186 unrank_line_L4(p1, p2, rk, verbose_level);
187 return;
188 }
189 rk -= l4;
190 if (rk < l5) {
191 unrank_line_L5(p1, p2, rk, verbose_level);
192 return;
193 }
194 rk -= l5;
195 if (rk < l6) {
196 unrank_line_L6(p1, p2, rk, verbose_level);
197 return;
198 }
199 rk -= l6;
200 if (rk < l7) {
201 unrank_line_L7(p1, p2, rk, verbose_level);
202 return;
203 }
204 rk -= l7;
205 cout << "error in orthogonal::hyperbolic_unrank_line, "
206 "rk too big" << endl;
207 exit(1);
208}
209
211 long int p1, long int p2, int verbose_level)
212{
213 int f_v = (verbose_level >= 1);
214 long int pt1_type, pt2_type;
215 long int pt1_index, pt2_index;
216 long int line_type;
217 long int rk = 0;
218 long int cp1, cp2;
219
220 if (f_v) {
221 cout << "orthogonal::hyperbolic_rank_line" << endl;
222 }
223 if (m == 0) {
224 cout << "orthogonal::hyperbolic_rank_line Witt index zero, "
225 "there is no line to rank" << endl;
226 exit(1);
227 }
228 if (f_v) {
229 cout << "orthogonal::hyperbolic_rank_line "
230 "p1=" << p1 << " p2=" << p2 << endl;
231 }
232 point_rk_to_type_and_index(p1, pt1_type, pt1_index, verbose_level);
233 point_rk_to_type_and_index(p2, pt2_type, pt2_index, verbose_level);
234 if (f_v) {
235 cout << "orthogonal::hyperbolic_rank_line pt1_type=" << pt1_type
236 << " pt2_type=" << pt2_type << endl;
237 }
238 line_type = line_type_given_point_types(p1, p2,
239 pt1_type, pt2_type);
240 if (f_v) {
241 cout << "orthogonal::hyperbolic_rank_line "
242 "line_type=" << line_type << endl;
243 }
244 if (f_v) {
245 cout << "orthogonal::hyperbolic_rank_line "
246 "before canonical_points_of_line" << endl;
247 }
248 canonical_points_of_line(line_type, p1, p2,
249 cp1, cp2, verbose_level);
250 if (f_v) {
251 cout << "orthogonal::hyperbolic_rank_line canonical points "
252 "cp1=" << cp1 << " cp2=" << cp2 << endl;
253 }
254 if (line_type == 1) {
255 rk += rank_line_L1(cp1, cp2, verbose_level);
256 goto done;
257 }
258 rk += l1;
259 if (f_v) {
260 cout << "orthogonal::hyperbolic_rank_line "
261 "after adding l1=" << l1 << ", rk=" << rk << endl;
262 }
263 if (line_type == 2) {
264 rk += rank_line_L2(cp1, cp2, verbose_level);
265 goto done;
266 }
267 rk += l2;
268 if (f_v) {
269 cout << "orthogonal::hyperbolic_rank_line "
270 "after adding l2=" << l2 << ", rk=" << rk << endl;
271 }
272 if (line_type == 3) {
273 rk += rank_line_L3(cp1, cp2, verbose_level);
274 goto done;
275 }
276 rk += l3;
277 if (f_v) {
278 cout << "orthogonal::hyperbolic_rank_line "
279 "after adding l3=" << l3 << ", rk=" << rk << endl;
280 }
281 if (line_type == 4) {
282 rk += rank_line_L4(cp1, cp2, verbose_level);
283 goto done;
284 }
285 rk += l4;
286 if (f_v) {
287 cout << "orthogonal::hyperbolic_rank_line after "
288 "adding l4=" << l4 << ", rk=" << rk << endl;
289 }
290 if (line_type == 5) {
291 rk += rank_line_L5(cp1, cp2, verbose_level);
292 goto done;
293 }
294 rk += l5;
295 if (f_v) {
296 cout << "orthogonal::hyperbolic_rank_line "
297 "after adding l5=" << l5 << ", rk=" << rk << endl;
298 }
299 if (line_type == 6) {
300 rk += rank_line_L6(cp1, cp2, verbose_level);
301 goto done;
302 }
303 rk += l6;
304 if (f_v) {
305 cout << "orthogonal::hyperbolic_rank_line "
306 "after adding l6=" << l6 << ", rk=" << rk << endl;
307 }
308 if (line_type == 7) {
309 rk += rank_line_L7(cp1, cp2, verbose_level);
310 goto done;
311 }
312 rk += l7;
313 cout << "error in orthogonal::hyperbolic_rank_line "
314 "illegal line_type" << endl;
315 exit(1);
316done:
317 if (f_v) {
318 cout << "orthogonal::hyperbolic_rank_line done" << endl;
319 }
320 return rk;
321}
322
324 long int &p1, long int &p2, long int index, int verbose_level)
325{
326 int f_v = (verbose_level >= 1);
327 int f_vv = (verbose_level >= 2);
328 int f_vvv = (verbose_level >= 3);
329 long int P4_index, P4_sub_index, P4_line_index;
330 long int P4_field_element, root, i;
331
332 if (f_v) {
333 cout << "orthogonal::unrank_line_L1" << endl;
334 }
335 if (index >= l1) {
336 cout << "error in orthogonal::unrank_line_L1 "
337 "index too large" << endl;
338 }
339 P4_index = index / a41;
340 P4_sub_index = index % a41;
341 P4_line_index = P4_sub_index / (q - 1);
342 P4_field_element = P4_sub_index % (q - 1);
343 P4_field_element++;
344 if (f_v) {
345 cout << "orthogonal::unrank_line_L1 index=" << index << endl;
346 }
347 if (index >= l1) {
348 cout << "error in orthogonal::unrank_line_L1 index too large" << endl;
349 exit(1);
350 }
351 if (f_vv) {
352 cout << "orthogonal::unrank_line_L1 P4_index=" << P4_index
353 << " P4_sub_index=" << P4_sub_index << endl;
354 cout << "P4_line_index=" << P4_line_index
355 << " P4_field_element=" << P4_field_element << endl;
356 }
357 p1 = type_and_index_to_point_rk(4, P4_index, verbose_level);
358 if (f_vv) {
359 cout << "p1=" << p1 << endl;
360 }
361 v1[0] = 0;
362 v1[1] = 0;
363 unrank_N1(v1 + 2, 1, m - 2, P4_line_index);
364 if (f_vvv) {
365 cout << "orthogonal::unrank_line_L1 after unrank_N1" << endl;
366 Int_vec_print(cout, v1, n - 2);
367 cout << endl;
368 }
369 for (i = 1; i < m - 1; i++) {
370 v1[2 * i] = F->mult(P4_field_element, v1[2 * i]);
371 }
372 if (f_vvv) {
373 cout << "orthogonal::unrank_line_L1 after scaling" << endl;
374 Int_vec_print(cout, v1, n - 2);
375 cout << endl;
376 }
377
378 if (P4_index) {
379 if (m > 2) {
380 root = find_root_hyperbolic(P4_index, m - 1,
381 verbose_level - 1);
382
384 0, P4_index, root, m - 1,
385 verbose_level - 1);
386 }
387 else {
388 T1[0] = T1[3] = 0;
389 T1[1] = T1[2] = 1;
390 }
391 F->Linear_algebra->mult_matrix_matrix(v1, T1, v2, 1, n - 2, n - 2,
392 0 /* verbose_level */);
393 }
394 else {
395 for (i = 0; i < n - 2; i++) {
396 v2[i] = v1[i];
397 }
398 }
399 v2[n - 2] = F->negate(P4_field_element);
400 v2[n - 1] = 1;
401 if (f_vv) {
402 cout << "orthogonal::unrank_line_L1 before rank_Sbar" << endl;
403 Int_vec_print(cout, v2, n);
404 cout << endl;
405 }
406 p2 = rank_Sbar(v2, 1, m);
407 if (f_vv) {
408 cout << "p2=" << p2 << endl;
409 }
410 if (f_v) {
411 cout << "orthogonal::unrank_line_L1 index=" << index
412 << " p1=" << p1 << " p2=" << p2 << endl;
413 }
414 if (f_v) {
415 cout << "orthogonal::unrank_line_L1 done" << endl;
416 }
417}
418
419long int orthogonal::rank_line_L1(long int p1, long int p2, int verbose_level)
420{
421 int f_v = (verbose_level >= 1);
422 //int f_vv = (verbose_level >= 2);
423 int f_vvv = (verbose_level >= 3);
424 long int P4_index, P4_sub_index, P4_line_index;
425 long int P4_field_element, root, i;
426 long int P4_field_element_inverse;
427 long int index, a, b;
428
429 if (f_v) {
430 cout << "orthogonal::rank_line_L1" << endl;
431 }
432 if (f_v) {
433 cout << "orthogonal::rank_line_L1 p1=" << p1 << " p2=" << p2 << endl;
434 }
435 P4_index = p1;
436 unrank_Sbar(v2, 1, m, p2);
437 if (f_vvv) {
438 cout << "p2 = " << p2 << " v2=" << endl;
439 Int_vec_print(cout, v2, n);
440 cout << endl;
441 }
442 if (v2[n - 1] != 1) {
443 cout << "orthogonal::rank_line_L1 v2[n - 1] != 1" << endl;
444 exit(1);
445 }
446 if (P4_index) {
447 if (m > 2) {
449 P4_index, m - 1, verbose_level - 1);
450
452 0, P4_index, root, m - 1, verbose_level - 1);
453 }
454 else {
455 T1[0] = T1[3] = 0;
456 T1[1] = T1[2] = 1;
457 }
458 F->Linear_algebra->invert_matrix(T1, T2, n - 2, 0 /* verbose_level */);
459 F->Linear_algebra->mult_matrix_matrix(v2, T2, v1, 1, n - 2, n - 2,
460 0 /* verbose_level */);
461 }
462 else {
463 for (i = 0; i < n - 2; i++) {
464 v1[i] = v2[i];
465 }
466 }
467 if (f_vvv) {
468 cout << "orthogonal::rank_line_L1 mapped back to v1=" << endl;
469 Int_vec_print(cout, v1, n);
470 cout << endl;
471 }
472 unrank_Sbar(v3, 1, m, 0);
473 a = v1[0];
474 if (a) {
475 b = F->mult(a, F->negate(F->inverse(v3[0])));
476 for (i = 0; i < n; i++) {
477 v1[i] = F->add(F->mult(b, v3[i]), v1[i]);
478 }
479 }
480 if (f_vvv) {
481 cout << "orthogonal::rank_line_L1 after Gauss reduction v1=" << endl;
482 Int_vec_print(cout, v1, n);
483 cout << endl;
484 }
485 P4_field_element = F->negate(v2[n - 2]);
486 if (P4_field_element == 0) {
487 cout << "orthogonal::rank_line_L1: "
488 "P4_field_element == 0" << endl;
489 exit(1);
490 }
491 P4_field_element_inverse = F->inverse(P4_field_element);
492 for (i = 1; i < m - 1; i++) {
493 v1[2 * i] = F->mult(P4_field_element_inverse, v1[2 * i]);
494 }
495 if (f_vvv) {
496 cout << "orthogonal::rank_line_L1 after scaling" << endl;
497 Int_vec_print(cout, v1, n - 2);
498 cout << endl;
499 }
500 if (v1[0] != 0 || v1[1] != 0) {
501 cout << "orthogonal::rank_line_L1: "
502 "v1[0] != 0 || v1[1] != 0" << endl;
503 exit(1);
504 }
505 P4_line_index = rank_N1(v1 + 2, 1, m - 2);
506 if (f_vvv) {
507 cout << "orthogonal::rank_line_L1 after rank_N1, "
508 "P4_line_index=" << P4_line_index << endl;
509 }
510 P4_field_element--;
511 P4_sub_index = P4_line_index * (q - 1) + P4_field_element;
512 index = P4_index * a41 + P4_sub_index;
513 if (f_v) {
514 cout << "orthogonal::rank_line_L1 p1=" << p1
515 << " p2=" << p2 << " index=" << index << endl;
516 }
517 if (index >= l1) {
518 cout << "orthogonal::rank_line_L1 error in rank_line_L1 index too large" << endl;
519 cout << "index=" << index << endl;
520 cout << "l1=" << l1 << endl;
521 cout << "P4_index=" << P4_index << endl;
522 cout << "a41=" << a41 << endl;
523 cout << "P4_sub_index=" << P4_sub_index << endl;
524 cout << "P4_line_index=" << P4_line_index << endl;
525 cout << "P4_field_element=" << P4_field_element << endl;
526 exit(1);
527 }
528 return index;
529}
530
532 long int &p1, long int &p2, long int index, int verbose_level)
533{
534 int f_v = (verbose_level >= 1);
535 int f_vv = (verbose_level >= 2);
536 int f_vvv = (verbose_level >= 3);
537 long int P3_index, P3_sub_index, P3_point;
538 long int root, a, b, c, d, e, i;
539 long int P3_field_element;
540
541 P3_index = index / a32;
542 P3_sub_index = index % a32;
543 if (f_v) {
544 cout << "orthogonal::unrank_line_L2 index=" << index << endl;
545 }
546 if (index >= l2) {
547 cout << "error in orthogonal::unrank_line_L2 index too large" << endl;
548 }
549 P3_point = P3_index / (q - 1);
550 P3_field_element = P3_index % (q - 1);
551 if (f_vv) {
552 cout << "orthogonal::unrank_line_L2 P3_index=" << P3_index
553 << " P3_sub_index=" << P3_sub_index << endl;
554 cout << "unrank_line_L2 P3_point=" << P3_point
555 << " P3_field_element=" << P3_field_element << endl;
556 }
557 unrank_Sbar(v3, 1, m - 1, P3_point);
558 v3[n - 2] = 1 + P3_field_element;
559 v3[n - 1] = 0;
560 if (f_vv) {
561 cout << "orthogonal::unrank_line_L2 before rank_Sbar v3=" << endl;
562 Int_vec_print(cout, v3, n);
563 cout << endl;
564 }
565 p1 = rank_Sbar(v3, 1, m);
566 if (f_vv) {
567 cout << "orthogonal::unrank_line_L2 p1=" << p1 << endl;
568 }
569 if (P3_sub_index == 0) {
570 if (f_vv) {
571 cout << "orthogonal::unrank_line_L2 case 1" << endl;
572 }
573 v1[0] = 0;
574 v1[1] = F->negate(1);
575 for (i = 2; i < n - 2; i++) {
576 v1[i] = 0;
577 }
578 }
579 else {
580 P3_sub_index--;
581 if (P3_sub_index < (q - 1) * T1_mm2) {
582 v1[0] = 0;
583 v1[1] = F->negate(1);
584 a = P3_sub_index / (q - 1);
585 b = P3_sub_index % (q - 1);
586 if (f_vv) {
587 cout << "orthogonal::unrank_line_L2 case 2, "
588 "a=" << a << " b=" << b << endl;
589 }
590 unrank_Sbar(v1 + 2, 1, m - 2, a);
591 for (i = 2; i < n - 2; i++)
592 v1[i] = F->mult(v1[i], (1 + b));
593 }
594 else {
595 P3_sub_index -= (q - 1) * T1_mm2;
596 a = P3_sub_index / (q - 1);
597 b = P3_sub_index % (q - 1);
598 v1[0] = 1 + b;
599 v1[1] = F->negate(1);
600 c = F->mult(v1[0], v1[1]);
601 d = F->negate(c);
602 if (f_vv) {
603 cout << "orthogonal::unrank_line_L2 case 3, "
604 "a=" << a << " b=" << b << endl;
605 }
606 unrank_N1(v1 + 2, 1, m - 2, a);
607 for (i = 1; i < m - 1; i++) {
608 v1[2 * i] = F->mult(d, v1[2 * i]);
609 }
610 }
611 }
612 if (f_vvv) {
613 cout << "orthogonal::unrank_line_L2 partner of 10...10 created:" << endl;
614 Int_vec_print(cout, v1, n - 2);
615 cout << endl;
616 }
617 if (P3_point) {
618 if (m > 2) {
619 root = find_root_hyperbolic(P3_point, m - 1,
620 verbose_level - 1);
621
623 0, P3_point, root, m - 1,
624 verbose_level - 1);
625 }
626 else {
627 T1[0] = T1[3] = 0;
628 T1[1] = T1[2] = 1;
629 }
630 if (f_vvv) {
631 cout << "orthogonal::unrank_line_L2 the Siegel map is" << endl;
632 Int_vec_print_integer_matrix(cout, T1, n - 2, n - 2);
633 }
634 F->Linear_algebra->mult_matrix_matrix(v1, T1, v2, 1, n - 2, n - 2,
635 0 /* verbose_level */);
636 }
637 else {
638 for (i = 0; i < n - 2; i++) {
639 v2[i] = v1[i];
640 }
641 }
642 if (f_vvv) {
643 cout << "orthogonal::unrank_line_L2 maps to v2=" << endl;
644 Int_vec_print(cout, v2, n - 2);
645 cout << endl;
646 }
648 if (f_vvv) {
649 cout << "c=" << c << endl;
650 }
651 v2[n - 2] = 0;
652 v2[n - 1] = F->mult(F->negate(c),F->inverse(v3[n - 2]));
653 if (f_vv) {
654 cout << "orthogonal::unrank_line_L2 before rank_Sbar v2=" << endl;
655 Int_vec_print(cout, v2, n);
656 cout << endl;
657 }
659 if (e) {
660 cout << "orthogonal::unrank_line_L2 error, not orthogonal" << endl;
661 exit(1);
662 }
663 p2 = rank_Sbar(v2, 1, m);
664 if (f_vv) {
665 cout << "p2=" << p2 << endl;
666 }
667 if (f_v) {
668 cout << "orthogonal::unrank_line_L2 index=" << index
669 << " p1=" << p1 << " p2=" << p2 << endl;
670 }
671}
672
673long int orthogonal::rank_line_L2(long int p1, long int p2, int verbose_level)
674{
675 int f_v = (verbose_level >= 1);
676 //int f_vv = (verbose_level >= 2);
677 int f_vvv = (verbose_level >= 3);
678 long int P3_index, P3_sub_index, P3_point;
679 long int root, a, b, c, d, i, alpha;
680 long int P3_field_element;
681 long int index;
682
683 if (f_v) {
684 cout << "orthogonal::rank_line_L2 p1=" << p1 << " p2=" << p2 << endl;
685 }
686 unrank_Sbar(v2, 1, m, p2);
687 unrank_Sbar(v3, 1, m, p1);
688 if (f_vvv) {
689 cout << "p1 = " << p1 << " : v3=:" << endl;
690 Int_vec_print(cout, v3, n);
691 cout << endl;
692 }
693 if (v3[n - 1]) {
694 cout << "orthogonal::rank_line_L2 v3[n - 1]" << endl;
695 exit(1);
696 }
697 for (i = n - 3; i >= 0; i--) {
698 if (v3[i]) {
699 break;
700 }
701 }
702 if (i < 0) {
703 cout << "orthogonal::rank_line_L2 i < 0" << endl;
704 exit(1);
705 }
706 a = v3[i];
707 if (a != 1) {
708 b = F->inverse(a);
709 for (i = 0; i < n; i++) {
710 v3[i] = F->mult(v3[i], b);
711 }
712 }
713 if (f_vvv) {
714 cout << "orthogonal::rank_line_L2 after scaling, v3=:" << endl;
715 Int_vec_print(cout, v3, n);
716 cout << endl;
717 }
718 P3_field_element = v3[n - 2] - 1;
719 P3_point = rank_Sbar(v3, 1, m - 1);
720 P3_index = P3_point * (q - 1) + P3_field_element;
721 if (f_vvv) {
722 cout << "orthogonal::rank_line_L2 P3_point=" << P3_point
723 << " P3_field_element=" << P3_field_element << endl;
724 cout << "orthogonal::rank_line_L2 P3_index=" << P3_index << endl;
725 }
726 if (f_vvv) {
727 cout << "orthogonal::rank_line_L2 p2 = " << p2 << " : v2=:" << endl;
728 Int_vec_print(cout, v2, n);
729 cout << endl;
730 }
732
733
734 if (P3_point) {
735 if (m > 2) {
736 root = find_root_hyperbolic(P3_point, m - 1,
737 verbose_level - 1);
738
740 0, P3_point, root, m - 1,
741 verbose_level - 1);
742 }
743 else {
744 T1[0] = T1[3] = 0;
745 T1[1] = T1[2] = 1;
746 }
747 F->Linear_algebra->invert_matrix(T1, T2, n - 2, 0 /* verbose_level */);
748 F->Linear_algebra->mult_matrix_matrix(v2, T2, v1, 1, n - 2, n - 2,
749 0 /* verbose_level */);
750 }
751 else {
752 for (i = 0; i < n - 2; i++)
753 v1[i] = v2[i];
754 }
755 if (f_vvv) {
756 cout << "orthogonal::rank_line_L2 maps back to v1=:" << endl;
757 Int_vec_print(cout, v1, n - 2);
758 cout << endl;
759 }
760 for (i = 2; i < n - 2; i++)
761 if (v1[i])
762 break;
763 if (i == n - 2) {
764 // case 1
765 if (f_vvv) {
766 cout << "orthogonal::rank_line_L2 case 1" << endl;
767 }
768 if (v1[0]) {
769 cout << "orthogonal::rank_line_L2, case 1 v1[0]" << endl;
770 exit(1);
771 }
772 c = v1[1];
773 if (c == 0) {
774 cout << "orthogonal::rank_line_L2, case 1 v1[1] == 0" << endl;
775 exit(1);
776 }
777 if (c != F->negate(1)) {
778 d = F->mult(F->inverse(c), F->negate(1));
779 for (i = 0; i < n; i++) {
780 v1[i] = F->mult(v1[i], d);
781 }
782 }
783 if (f_vvv) {
784 cout << "orthogonal::rank_line_L2 after scaling v1=:" << endl;
785 Int_vec_print(cout, v1, n);
786 cout << endl;
787 }
788 P3_sub_index = 0;
789 }
790 else {
792 if (alpha == 0) {
793 // case 2
794 if (f_vvv) {
795 cout << "orthogonal::rank_line_L2 case 2" << endl;
796 }
797 if (v1[0]) {
798 cout << "orthogonal::rank_line_L2, case 1 "
799 "v1[0]" << endl;
800 exit(1);
801 }
802 c = v1[1];
803 if (c == 0) {
804 cout << "orthogonal::rank_line_L2, case 1 "
805 "v1[1] == 0" << endl;
806 exit(1);
807 }
808 if (c != F->negate(1)) {
809 d = F->mult(F->inverse(c), F->negate(1));
810 for (i = 0; i < n; i++) {
811 v1[i] = F->mult(v1[i], d);
812 }
813 }
814 if (f_vvv) {
815 cout << "orthogonal::rank_line_L2 after scaling v1=:" << endl;
816 Int_vec_print(cout, v1, n);
817 cout << endl;
818 }
819
820 for (i = n - 3; i >= 2; i--) {
821 if (v1[i])
822 break;
823 }
824 if (i == 1) {
825 cout << "orthogonal::rank_line_L2 case 2, "
826 "i == 1" << endl;
827 exit(1);
828 }
829 b = v1[i];
830 c = F->inverse(b);
831 for (i = 2; i < n - 2; i++)
832 v1[i] = F->mult(v1[i], c);
833 b--;
834 if (f_vvv) {
835 cout << "orthogonal::rank_line_L2 before rank_Sbar:" << endl;
836 Int_vec_print(cout, v1, n);
837 cout << endl;
838 }
839 a = rank_Sbar(v1 + 2, 1, m - 2);
840 if (f_vvv) {
841 cout << "a=" << a << " b=" << b << endl;
842 }
843
844 P3_sub_index = 1 + a * (q - 1) + b;
845 }
846 else {
847 if (f_vvv) {
848 cout << "orthogonal::rank_line_L2 case 3" << endl;
849 }
850 P3_sub_index = 1 + (q - 1) * T1_mm2;
851 c = v1[1];
852 if (c == 0) {
853 cout << "orthogonal::rank_line_L2, case 3 "
854 "v1[1] == 0" << endl;
855 exit(1);
856 }
857 if (c != F->negate(1)) {
858 d = F->mult(F->inverse(c), F->negate(1));
859 for (i = 0; i < n; i++) {
860 v1[i] = F->mult(v1[i], d);
861 }
862 }
863 if (f_vvv) {
864 cout << "orthogonal::rank_line_L2 after scaling v1=:" << endl;
865 Int_vec_print(cout, v1, n);
866 cout << endl;
867 }
868 if (v1[0] == 0) {
869 cout << "orthogonal::rank_line_L2, case 3 "
870 "v1[0] == 0" << endl;
871 exit(1);
872 }
873 b = v1[0] - 1;
874 d = F->inverse(v1[0]);
875 for (i = 1; i < m - 1; i++) {
876 v1[2 * i] = F->mult(d, v1[2 * i]);
877 }
878 a = rank_N1(v1 + 2, 1, m - 2);
879 if (f_vvv) {
880 cout << "a=" << a << " b=" << b << endl;
881 }
882 P3_sub_index += a * (q - 1) + b;
883 }
884 }
885 if (f_v) {
886 cout << "orthogonal::rank_line_L2 p1=" << p1 << " p2=" << p2
887 << " P3_sub_index=" << P3_sub_index << endl;
888 }
889
890 index = P3_index * a32 + P3_sub_index;
891
892 if (f_v) {
893 cout << "orthogonal::rank_line_L2 p1=" << p1 << " p2=" << p2
894 << " index=" << index << endl;
895 }
896 if (index >= l2) {
897 cout << "error in orthogonal::rank_line_L2 index too large" << endl;
898 }
899 return index;
900}
901
903 long int &p1, long int &p2, long int index, int verbose_level)
904{
905 int f_v = (verbose_level >= 1);
906 int f_vv = (verbose_level >= 2);
907 int f_vvv = (verbose_level >= 3);
908 long int P4_index, P4_sub_index, P4_line_index;
909 long int P4_field_element, root, i, e;
910
911 P4_index = index / a43;
912 P4_sub_index = index % a43;
913 P4_line_index = P4_sub_index / (q - 1);
914 P4_field_element = P4_sub_index % (q - 1);
915 P4_field_element++;
916 if (f_v) {
917 cout << "orthogonal::unrank_line_L3 index=" << index << endl;
918 }
919 if (index >= l3) {
920 cout << "error in orthogonal::unrank_line_L3 index too large" << endl;
921 }
922 if (f_vv) {
923 cout << "orthogonal::unrank_line_L3 P4_index=" << P4_index
924 << " P4_sub_index=" << P4_sub_index << endl;
925 cout << "P4_line_index=" << P4_line_index
926 << " P4_field_element=" << P4_field_element << endl;
927 }
928 p1 = P4_index;
929 unrank_Sbar(v3, 1, m, P4_index);
930 if (f_vv) {
931 cout << "p1=" << p1 << " v3=" << endl;
932 Int_vec_print(cout, v3, n);
933 cout << endl;
934 }
935 v1[0] = 0;
936 v1[1] = 0;
937 unrank_Sbar(v1 + 2, 1, m - 2, P4_line_index);
938 if (f_vvv) {
939 cout << "orthogonal::unrank_line_L3 after unrank_Sbar" << endl;
940 Int_vec_print(cout, v1, n - 2);
941 cout << endl;
942 }
943
944 if (P4_index) {
945 if (m > 2) {
947 P4_index, m - 1, verbose_level - 1);
948
950 0, P4_index, root, m - 1,
951 verbose_level - 1);
952 }
953 else {
954 T1[0] = T1[3] = 0;
955 T1[1] = T1[2] = 1;
956 }
957 F->Linear_algebra->mult_matrix_matrix(v1, T1, v2, 1, n - 2, n - 2,
958 0 /* verbose_level */);
959 }
960 else {
961 for (i = 0; i < n - 2; i++)
962 v2[i] = v1[i];
963 }
964 v2[n - 2] = 0;
965 v2[n - 1] = P4_field_element;
966 if (f_vv) {
967 cout << "orthogonal::unrank_line_L3 before rank_Sbar" << endl;
968 Int_vec_print(cout, v2, n);
969 cout << endl;
970 }
972 if (e) {
973 cout << "orthogonal::unrank_line_L3 error, not orthogonal" << endl;
974 exit(1);
975 }
976 p2 = rank_Sbar(v2, 1, m);
977 if (f_vv) {
978 cout << "orthogonal::unrank_line_L3 p2=" << p2 << endl;
979 }
980 if (f_v) {
981 cout << "orthogonal::unrank_line_L3 index=" << index
982 << " p1=" << p1 << " p2=" << p2 << endl;
983 }
984}
985
986long int orthogonal::rank_line_L3(long int p1, long int p2, int verbose_level)
987{
988 int f_v = (verbose_level >= 1);
989 //int f_vv = (verbose_level >= 2);
990 int f_vvv = (verbose_level >= 3);
991 long int P4_index, P4_sub_index, P4_line_index;
992 long int P4_field_element, root, i;
993 long int index;
994 long int a, b;
995
996 if (f_v) {
997 cout << "orthogonal::rank_line_L3 p1=" << p1 << " p2=" << p2 << endl;
998 }
999 unrank_Sbar(v3, 1, m, p1);
1000 unrank_Sbar(v2, 1, m, p2);
1001 if (f_vvv) {
1002 cout << "orthogonal::rank_line_L3 p1=" << p1 << " v3=" << endl;
1003 Int_vec_print(cout, v3, n);
1004 cout << endl;
1005 }
1006 if (f_vvv) {
1007 cout << "orthogonal::rank_line_L3 p2=" << p2 << " v2=" << endl;
1008 Int_vec_print(cout, v2, n);
1009 cout << endl;
1010 }
1011 P4_index = p1;
1012 if (f_vvv) {
1013 cout << "orthogonal::rank_line_L3 P4_index=" << P4_index << endl;
1014 }
1015 if (P4_index) {
1016 if (m > 2) {
1017 root = find_root_hyperbolic(
1018 P4_index, m - 1, verbose_level - 1);
1019
1021 0, P4_index, root, m - 1,
1022 verbose_level - 1);
1023 }
1024 else {
1025 T1[0] = T1[3] = 0;
1026 T1[1] = T1[2] = 1;
1027 }
1028 F->Linear_algebra->invert_matrix(T1, T2, n - 2, 0 /* verbose_level */);
1029 F->Linear_algebra->mult_matrix_matrix(v2, T2, v1, 1, n - 2, n - 2,
1030 0 /* verbose_level */);
1031 v1[n - 2] = v2[n - 2];
1032 v1[n - 1] = v2[n - 1];
1033 }
1034 else {
1035 for (i = 0; i < n; i++)
1036 v1[i] = v2[i];
1037 }
1038 if (f_vvv) {
1039 cout << "orthogonal::rank_line_L3 maps back to" << endl;
1040 Int_vec_print(cout, v1, n);
1041 cout << endl;
1042 }
1043 v1[0] = 0;
1044 if (f_vvv) {
1045 cout << "orthogonal::rank_line_L3 after setting v1[0] = 0, v1=" << endl;
1046 Int_vec_print(cout, v1, n);
1047 cout << endl;
1048 }
1049 if (v1[0] || v1[1]) {
1050 cout << "orthogonal::rank_line_L3 rank_line_L3 v1[0] || v1[1]" << endl;
1051 exit(1);
1052 }
1053 P4_line_index = rank_Sbar(v1 + 2, 1, m - 2);
1054 if (f_vvv) {
1055 cout << "orthogonal::rank_line_L3 P4_line_index=" << P4_line_index << endl;
1056 }
1057 for (i = n - 3; i >= 0; i--) {
1058 if (v1[i]) {
1059 break;
1060 }
1061 }
1062 if (i < 0) {
1063 cout << "orthogonal::rank_line_L3 i < 0" << endl;
1064 exit(1);
1065 }
1066 a = v1[i];
1067 if (a != 1) {
1068 b = F->inverse(a);
1069 for (i = 0; i < n; i++) {
1070 v1[i] = F->mult(v1[i], b);
1071 }
1072 }
1073 if (f_vvv) {
1074 cout << "orthogonal::rank_line_L3 after scaling, v1=:" << endl;
1075 Int_vec_print(cout, v1, n);
1076 cout << endl;
1077 }
1078 if (v1[n - 2]) {
1079 cout << "orthogonal::rank_line_L3 v1[n - 2]" << endl;
1080 exit(1);
1081 }
1082 if (v1[n - 1] == 0) {
1083 cout << "orthogonal::rank_line_L3 v1[n - 1] == 0" << endl;
1084 exit(1);
1085 }
1086 P4_field_element = v1[n - 1] - 1;
1087 if (f_vvv) {
1088 cout << "orthogonal::rank_line_L3 P4_field_element=" << P4_field_element << endl;
1089 }
1090 P4_sub_index = P4_line_index * (q - 1) + P4_field_element;
1091 if (f_vvv) {
1092 cout << "orthogonal::rank_line_L3 P4_sub_index=" << P4_sub_index << endl;
1093 }
1094 index = (long int) P4_index * a43 + P4_sub_index;
1095
1096 if (f_v) {
1097 cout << "orthogonal::rank_line_L3 p1=" << p1 << " p2=" << p2
1098 << " index=" << index << endl;
1099 }
1100 if (index >= l3) {
1101 cout << "error in orthogonal::rank_line_L3 index too large" << endl;
1102 }
1103 return index;
1104}
1105
1107 long int &p1, long int &p2, long int index, int verbose_level)
1108{
1109 int f_v = (verbose_level >= 1);
1110 int f_vv = (verbose_level >= 2);
1111 int f_vvv = (verbose_level >= 3);
1112 long int P4_index, P4_sub_index, P4_line_index;
1113 long int P4_field_element, root, i, e;
1114
1115 P4_index = index / a44;
1116 P4_sub_index = index % a44;
1117 P4_line_index = P4_sub_index / (q - 1);
1118 P4_field_element = P4_sub_index % (q - 1);
1119 P4_field_element++;
1120 if (f_v) {
1121 cout << "unrank_line_L4 index=" << index << endl;
1122 }
1123 if (index >= l4) {
1124 cout << "error in unrank_line_L4 index too large" << endl;
1125 }
1126 if (f_vv) {
1127 cout << "unrank_line_L4 P4_index=" << P4_index
1128 << " P4_sub_index=" << P4_sub_index << endl;
1129 cout << "P4_line_index=" << P4_line_index
1130 << " P4_field_element=" << P4_field_element << endl;
1131 }
1132 p1 = P4_index;
1133 unrank_Sbar(v3, 1, m, P4_index);
1134 if (f_vv) {
1135 cout << "p1=" << p1 << endl;
1136 }
1137 v1[0] = 0;
1138 v1[1] = 0;
1139 unrank_Sbar(v1 + 2, 1, m - 2, P4_line_index);
1140 if (f_vvv) {
1141 cout << "after unrank_Sbar" << endl;
1142 Int_vec_print(cout, v1, n - 2);
1143 cout << endl;
1144 }
1145
1146 if (P4_index) {
1147 if (m > 2) {
1148 root = find_root_hyperbolic(
1149 P4_index, m - 1, verbose_level - 1);
1150
1152 0, P4_index, root, m - 1,
1153 verbose_level - 1);
1154 }
1155 else {
1156 T1[0] = T1[3] = 0;
1157 T1[1] = T1[2] = 1;
1158 }
1159 F->Linear_algebra->mult_matrix_matrix(v1, T1, v2, 1, n - 2, n - 2,
1160 0 /* verbose_level */);
1161 }
1162 else {
1163 for (i = 0; i < n - 2; i++)
1164 v2[i] = v1[i];
1165 }
1166 v2[n - 2] = P4_field_element;
1167 v2[n - 1] = 0;
1168 if (f_vv) {
1169 cout << "before rank_Sbar" << endl;
1170 Int_vec_print(cout, v2, n);
1171 cout << endl;
1172 }
1174 if (e) {
1175 cout << "error, not orthogonal" << endl;
1176 exit(1);
1177 }
1178 p2 = rank_Sbar(v2, 1, m);
1179 if (f_vv) {
1180 cout << "p2=" << p2 << endl;
1181 }
1182 if (f_v) {
1183 cout << "unrank_line_L4 index=" << index
1184 << " p1=" << p1 << " p2=" << p2 << endl;
1185 }
1186}
1187
1188long int orthogonal::rank_line_L4(long int p1, long int p2, int verbose_level)
1189{
1190 int f_v = (verbose_level >= 1);
1191 //int f_vv = (verbose_level >= 2);
1192 int f_vvv = (verbose_level >= 3);
1193 long int P3_index, P3_sub_index, P3_line_index;
1194 long int P3_field_element, root, i;
1195 long int index;
1196 long int a, b;
1197
1198 if (f_v) {
1199 cout << "rank_line_L4 p1=" << p1 << " p2=" << p2 << endl;
1200 }
1201 unrank_Sbar(v3, 1, m, p1);
1202 unrank_Sbar(v2, 1, m, p2);
1203 if (f_vvv) {
1204 cout << "p1=" << p1 << " v3=" << endl;
1205 Int_vec_print(cout, v3, n);
1206 cout << endl;
1207 }
1208 if (f_vvv) {
1209 cout << "p2=" << p2 << " v2=" << endl;
1210 Int_vec_print(cout, v2, n);
1211 cout << endl;
1212 }
1213 P3_index = p1;
1214 if (f_vvv) {
1215 cout << "P3_index=" << P3_index << endl;
1216 }
1217 if (P3_index) {
1218 if (m > 2) {
1219 root = find_root_hyperbolic(P3_index, m - 1, verbose_level - 1);
1221 0, P3_index, root, m - 1, verbose_level - 1);
1222 }
1223 else {
1224 T1[0] = T1[3] = 0;
1225 T1[1] = T1[2] = 1;
1226 }
1227 F->Linear_algebra->invert_matrix(T1, T2, n - 2, 0 /* verbose_level */);
1228 F->Linear_algebra->mult_matrix_matrix(v2, T2, v1, 1, n - 2, n - 2,
1229 0 /* verbose_level */);
1230 v1[n - 2] = v2[n - 2];
1231 v1[n - 1] = v2[n - 1];
1232 }
1233 else {
1234 for (i = 0; i < n; i++)
1235 v1[i] = v2[i];
1236 }
1237 if (f_vvv) {
1238 cout << "maps back to" << endl;
1239 Int_vec_print(cout, v1, n);
1240 cout << endl;
1241 }
1242 v1[0] = 0;
1243 if (f_vvv) {
1244 cout << "after setting v1[0] = 0, v1=" << endl;
1245 Int_vec_print(cout, v1, n);
1246 cout << endl;
1247 }
1248 if (v1[0] || v1[1]) {
1249 cout << "rank_line_L4 v1[0] || v1[1]" << endl;
1250 exit(1);
1251 }
1252 P3_line_index = rank_Sbar(v1 + 2, 1, m - 2);
1253 if (f_vvv) {
1254 cout << "P3_line_index=" << P3_line_index << endl;
1255 }
1256 for (i = n - 3; i >= 0; i--) {
1257 if (v1[i]) {
1258 break;
1259 }
1260 }
1261 if (i < 0) {
1262 cout << "orthogonal::rank_line_L4 i < 0" << endl;
1263 exit(1);
1264 }
1265 a = v1[i];
1266 if (a != 1) {
1267 b = F->inverse(a);
1268 for (i = 0; i < n; i++) {
1269 v1[i] = F->mult(v1[i], b);
1270 }
1271 }
1272 if (f_vvv) {
1273 cout << "after scaling, v1=:" << endl;
1274 Int_vec_print(cout, v1, n);
1275 cout << endl;
1276 }
1277 if (v1[n - 2] == 0) {
1278 cout << "orthogonal::rank_line_L4 v1[n - 2] == 0" << endl;
1279 exit(1);
1280 }
1281 if (v1[n - 1]) {
1282 cout << "orthogonal::rank_line_L4 v1[n - 1]" << endl;
1283 exit(1);
1284 }
1285 P3_field_element = v1[n - 2] - 1;
1286 if (f_vvv) {
1287 cout << "P3_field_element=" << P3_field_element << endl;
1288 }
1289 P3_sub_index = P3_line_index * (q - 1) + P3_field_element;
1290 if (f_vvv) {
1291 cout << "P3_sub_index=" << P3_sub_index << endl;
1292 }
1293 index = P3_index * a44 + P3_sub_index;
1294
1295 if (f_v) {
1296 cout << "rank_line_L4 p1=" << p1 << " p2=" << p2
1297 << " index=" << index << endl;
1298 }
1299 if (index >= l4) {
1300 cout << "error in rank_line_L4 index too large" << endl;
1301 }
1302 return index;
1303}
1304
1306 long int &p1, long int &p2, long int index, 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 if (f_v) {
1313 cout << "unrank_line_L5 index=" << index << endl;
1314 }
1315 if (index >= l5) {
1316 cout << "error in unrank_line_L5 index "
1317 "too large, l5=" << l5 << endl;
1318 }
1319 subspace->unrank_line(p1, p2, index, verbose_level);
1320 if (f_v) {
1321 cout << "unrank_line_L5 index=" << index
1322 << " p1=" << p1 << " p2=" << p2 << endl;
1323 }
1324}
1325
1326long int orthogonal::rank_line_L5(long int p1, long int p2, int verbose_level)
1327{
1328 int f_v = (verbose_level >= 1);
1329 long int index;
1330
1331 if (f_v) {
1332 cout << "rank_line_L5 p1=" << p1 << " p2=" << p2 << endl;
1333 }
1334 index = subspace->rank_line(p1, p2, verbose_level);
1335 if (f_v) {
1336 cout << "rank_line_L5 p1=" << p1 << " p2=" << p2
1337 << " index=" << index << endl;
1338 }
1339 if (index >= l5) {
1340 cout << "error in rank_line_L5 index too large" << endl;
1341 }
1342 return index;
1343}
1344
1346 long int &p1, long int &p2, long int index, int verbose_level)
1347{
1348 int f_v = (verbose_level >= 1);
1349 //int f_vv = (verbose_level >= 2);
1350 //int f_vvv = (verbose_level >= 3);
1351
1352 if (f_v) {
1353 cout << "unrank_line_L6 index=" << index << endl;
1354 }
1355 if (index >= l6) {
1356 cout << "error in unrank_line_L6 index too large" << endl;
1357 }
1358 p1 = index;
1359 p2 = type_and_index_to_point_rk(5, 0, verbose_level);
1360 if (f_v) {
1361 cout << "unrank_line_L6 index=" << index
1362 << " p1=" << p1 << " p2=" << p2 << endl;
1363 }
1364}
1365
1366long int orthogonal::rank_line_L6(long int p1, long int p2, int verbose_level)
1367{
1368 int f_v = (verbose_level >= 1);
1369 long int index;
1370
1371 if (f_v) {
1372 cout << "rank_line_L6 p1=" << p1 << " p2=" << p2 << endl;
1373 }
1374 index = p1;
1375 if (f_v) {
1376 cout << "rank_line_L6 p1=" << p1 << " p2=" << p2
1377 << " index=" << index << endl;
1378 }
1379 if (index >= l6) {
1380 cout << "error in rank_line_L6 index too large" << endl;
1381 }
1382 return index;
1383}
1384
1386 long int &p1, long int &p2, long int index, int verbose_level)
1387{
1388 int f_v = (verbose_level >= 1);
1389 //int f_vv = (verbose_level >= 2);
1390 //int f_vvv = (verbose_level >= 3);
1391
1392 if (f_v) {
1393 cout << "unrank_line_L7 index=" << index << endl;
1394 }
1395 if (index >= l7) {
1396 cout << "error in unrank_line_L7 index too large" << endl;
1397 }
1398 p1 = index;
1399 p2 = type_and_index_to_point_rk(6, 0, verbose_level);
1400 if (f_v) {
1401 cout << "unrank_line_L7 index=" << index
1402 << " p1=" << p1 << " p2=" << p2 << endl;
1403 }
1404}
1405
1406long int orthogonal::rank_line_L7(long int p1, long int p2, int verbose_level)
1407{
1408 int f_v = (verbose_level >= 1);
1409 long int index;
1410
1411 if (f_v) {
1412 cout << "rank_line_L7 p1=" << p1 << " p2=" << p2 << endl;
1413 }
1414 index = p1;
1415 if (f_v) {
1416 cout << "rank_line_L7 p1=" << p1 << " p2=" << p2
1417 << " index=" << index << endl;
1418 }
1419 if (index >= l7) {
1420 cout << "error in rank_line_L7 index too large" << endl;
1421 }
1422 return index;
1423}
1424
1425
1427 int line_type,
1428 long int pt1, long int pt2,
1429 long int &cpt1, long int &cpt2, int verbose_level)
1430{
1431 int f_v = (verbose_level >= 1);
1432
1433 if (line_type == 1) {
1434 canonical_points_L1(pt1, pt2, cpt1, cpt2);
1435 }
1436 else if (line_type == 2) {
1437 canonical_points_L2(pt1, pt2, cpt1, cpt2);
1438 }
1439 else if (line_type == 3) {
1440 canonical_points_L3(pt1, pt2, cpt1, cpt2);
1441 }
1442 else if (line_type == 4) {
1443 canonical_points_L4(pt1, pt2, cpt1, cpt2);
1444 }
1445 else if (line_type == 5) {
1446 canonical_points_L5(pt1, pt2, cpt1, cpt2);
1447 }
1448 else if (line_type == 6) {
1449 canonical_points_L6(pt1, pt2, cpt1, cpt2);
1450 }
1451 else if (line_type == 7) {
1452 canonical_points_L7(pt1, pt2, cpt1, cpt2);
1453 }
1454 if (f_v) {
1455 cout << "hyperbolic_canonical_points_of_line "
1456 "of type " << line_type << endl;
1457 cout << "pt1=" << pt1 << " pt2=" << pt2 << endl;
1458 cout << "cpt1=" << cpt1 << " cpt2=" << cpt2 << endl;
1459 }
1460}
1461
1463 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
1464{
1465 int a, b, c, d, lambda1, lambda2, i;
1466
1467 unrank_Sbar(v1, 1, m, pt1);
1468 unrank_Sbar(v2, 1, m, pt2);
1469 a = v1[n - 2];
1470 b = v1[n - 1];
1471 c = v2[n - 2];
1472 d = v2[n - 1];
1473 if (a == 0 && b == 0) {
1474 cpt1 = pt1;
1475 cpt2 = pt2;
1476 return;
1477 }
1478 if (c == 0 && d == 0) {
1479 cpt1 = pt2;
1480 cpt2 = pt1;
1481 return;
1482 }
1483 lambda1 = F->mult(c, F->negate(F->inverse(a)));
1484 lambda2 = F->mult(d, F->negate(F->inverse(b)));
1485 if (lambda1 != lambda2) {
1486 cout << "orthogonal::canonical_points_L1: "
1487 "lambda1 != lambda2" << endl;
1488 exit(1);
1489 }
1490 for (i = 0; i < n; i++) {
1491 v3[i] = F->add(F->mult(lambda1, v1[i]), v2[i]);
1492 }
1493 if (v3[n - 2] || v3[n - 1]) {
1494 cout << "orthogonal::canonical_points_L1: "
1495 "v3[n - 2] || v3[n - 1]" << endl;
1496 exit(1);
1497 }
1498 cpt1 = rank_Sbar(v3, 1, m);
1499 cpt2 = pt1;
1500}
1501
1503 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
1504{
1505 int a, b, c, d, lambda, i;
1506 long int p1, p2;
1507
1508 unrank_Sbar(v1, 1, m, pt1);
1509 unrank_Sbar(v2, 1, m, pt2);
1510 a = v1[n - 2];
1511 b = v1[n - 1];
1512 c = v2[n - 2];
1513 d = v2[n - 1];
1514 if (b == 0) {
1515 p1 = pt1;
1516 p2 = pt2;
1517 }
1518 else if (d == 0) {
1519 p1 = pt2;
1520 p2 = pt1;
1521 }
1522 else {
1523 lambda = F->mult(d, F->negate(F->inverse(b)));
1524 for (i = 0; i < n; i++) {
1525 v3[i] = F->add(F->mult(lambda, v1[i]), v2[i]);
1526 }
1527 if (v3[n - 1]) {
1528 cout << "orthogonal::canonical_points_L2: "
1529 "v3[n - 1]" << endl;
1530 exit(1);
1531 }
1532 p1 = rank_Sbar(v3, 1, m);
1533 p2 = pt1;
1534 }
1535 unrank_Sbar(v1, 1, m, p1);
1536 unrank_Sbar(v2, 1, m, p2);
1537 a = v1[n - 2];
1538 b = v1[n - 1];
1539 c = v2[n - 2];
1540 d = v2[n - 1];
1541 if (b) {
1542 cout << "orthogonal::canonical_points_L2: b" << endl;
1543 exit(1);
1544 }
1545 lambda = F->mult(c, F->negate(F->inverse(a)));
1546 for (i = 0; i < n; i++) {
1547 v3[i] = F->add(F->mult(lambda, v1[i]), v2[i]);
1548 }
1549 if (v3[n - 2]) {
1550 cout << "orthogonal::canonical_points_L2: "
1551 "v3[n - 2]" << endl;
1552 exit(1);
1553 }
1554 cpt1 = p1;
1555 cpt2 = rank_Sbar(v3, 1, m);
1556}
1557
1559 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
1560{
1561 int a, b, c, d, lambda, i;
1562
1563 unrank_Sbar(v1, 1, m, pt1);
1564 unrank_Sbar(v2, 1, m, pt2);
1565 a = v1[n - 2]; // always zero
1566 b = v1[n - 1];
1567 c = v2[n - 2]; // always zero
1568 d = v2[n - 1];
1569 if (a) {
1570 cout << "orthogonal::canonical_points_L3 a" << endl;
1571 exit(1);
1572 }
1573 if (c) {
1574 cout << "orthogonal::canonical_points_L3 c" << endl;
1575 exit(1);
1576 }
1577 if (b == 0) {
1578 cpt1 = pt1;
1579 cpt2 = pt2;
1580 return;
1581 }
1582 if (d == 0) {
1583 cpt1 = pt2;
1584 cpt2 = pt1;
1585 return;
1586 }
1587 // now b and d are nonzero
1588
1589 lambda = F->mult(d, F->negate(F->inverse(b)));
1590 for (i = 0; i < n; i++) {
1591 v3[i] = F->add(F->mult(lambda, v1[i]), v2[i]);
1592 }
1593 if (v3[n - 2] || v3[n - 1]) {
1594 cout << "orthogonal::canonical_points_L3: "
1595 "v3[n - 2] || v3[n - 1]" << endl;
1596 exit(1);
1597 }
1598 cpt1 = rank_Sbar(v3, 1, m);
1599 cpt2 = pt1;
1600}
1601
1603 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
1604{
1605 int a, b, c, d, lambda, i;
1606
1607 unrank_Sbar(v1, 1, m, pt1);
1608 unrank_Sbar(v2, 1, m, pt2);
1609 a = v1[n - 2];
1610 b = v1[n - 1]; // always zero
1611 c = v2[n - 2];
1612 d = v2[n - 1]; // always zero
1613 if (b) {
1614 cout << "orthogonal::canonical_points_L4 b" << endl;
1615 exit(1);
1616 }
1617 if (d) {
1618 cout << "orthogonal::canonical_points_L3 d" << endl;
1619 exit(1);
1620 }
1621 if (a == 0) {
1622 cpt1 = pt1;
1623 cpt2 = pt2;
1624 return;
1625 }
1626 if (c == 0) {
1627 cpt1 = pt2;
1628 cpt2 = pt1;
1629 return;
1630 }
1631 // now a and c are nonzero
1632
1633 lambda = F->mult(c, F->negate(F->inverse(a)));
1634 for (i = 0; i < n; i++) {
1635 v3[i] = F->add(F->mult(lambda, v1[i]), v2[i]);
1636 }
1637 if (v3[n - 2] || v3[n - 1]) {
1638 cout << "orthogonal::canonical_points_L4: "
1639 "v3[n - 2] || v3[n - 1]" << endl;
1640 exit(1);
1641 }
1642 cpt1 = rank_Sbar(v3, 1, m);
1643 cpt2 = pt1;
1644}
1645
1647 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
1648{
1649 cpt1 = pt1;
1650 cpt2 = pt2;
1651}
1652
1654 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
1655{
1656 canonical_points_L3(pt1, pt2, cpt1, cpt2);
1657}
1658
1660 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
1661{
1662 canonical_points_L4(pt1, pt2, cpt1, cpt2);
1663}
1664
1666 long int pt1, long int pt2, int pt1_type, int pt2_type)
1667{
1668 if (pt1_type == 1) {
1669 if (pt2_type == 1) {
1670 return hyperbolic_decide_P1(pt1, pt2);
1671 }
1672 else if (pt2_type == 2) {
1673 return 2;
1674 }
1675 else if (pt2_type == 3) {
1676 return 2;
1677 }
1678 else if (pt2_type == 4) {
1679 return 1;
1680 }
1681 }
1682 else if (pt1_type == 2) {
1683 if (pt2_type == 1) {
1684 return 2;
1685 }
1686 else if (pt2_type == 2) {
1687 return hyperbolic_decide_P2(pt1, pt2);
1688 }
1689 else if (pt2_type == 3) {
1690 return 2;
1691 }
1692 else if (pt2_type == 4) {
1693 return hyperbolic_decide_P2(pt1, pt2);
1694 }
1695 else if (pt2_type == 5) {
1696 return 6;
1697 }
1698 }
1699 else if (pt1_type == 3) {
1700 if (pt2_type == 1)
1701 return 2;
1702 else if (pt2_type == 2) {
1703 return 2;
1704 }
1705 else if (pt2_type == 3) {
1706 return hyperbolic_decide_P3(pt1, pt2);
1707 }
1708 else if (pt2_type == 4) {
1709 return hyperbolic_decide_P3(pt1, pt2);
1710 }
1711 else if (pt2_type == 6) {
1712 return 7;
1713 }
1714 }
1715 else if (pt1_type == 4) {
1716 if (pt2_type == 1)
1717 return 1;
1718 else if (pt2_type == 2) {
1719 return hyperbolic_decide_P2(pt1, pt2);
1720 }
1721 else if (pt2_type == 3) {
1722 return hyperbolic_decide_P3(pt1, pt2);
1723 }
1724 else if (pt2_type == 4) {
1725 return 5;
1726 }
1727 else if (pt2_type == 5) {
1728 return 6;
1729 }
1730 else if (pt2_type == 6) {
1731 return 7;
1732 }
1733 }
1734 else if (pt1_type == 5) {
1735 if (pt2_type == 2) {
1736 return 6;
1737 }
1738 else if (pt2_type == 4) {
1739 return 6;
1740 }
1741 }
1742 else if (pt1_type == 6) {
1743 if (pt2_type == 3) {
1744 return 7;
1745 }
1746 else if (pt2_type == 4) {
1747 return 7;
1748 }
1749 }
1750 cout << "orthogonal::hyperbolic_line_type_given_point_types "
1751 "illegal combination" << endl;
1752 cout << "pt1_type = " << pt1_type << endl;
1753 cout << "pt2_type = " << pt2_type << endl;
1754 exit(1);
1755}
1756
1757int orthogonal::hyperbolic_decide_P1(long int pt1, long int pt2)
1758{
1759 unrank_Sbar(v1, 1, m, pt1);
1760 unrank_Sbar(v2, 1, m, pt2);
1761 if (is_ending_dependent(v1, v2)) {
1762 return 1;
1763 }
1764 else {
1765 return 2;
1766 }
1767}
1768
1769int orthogonal::hyperbolic_decide_P2(long int pt1, long int pt2)
1770{
1771 if (triple_is_collinear(pt1, pt2, pt_Q)) {
1772 return 6;
1773 }
1774 else {
1775 return 3;
1776 }
1777}
1778
1779int orthogonal::hyperbolic_decide_P3(long int pt1, long int pt2)
1780{
1781 if (triple_is_collinear(pt1, pt2, pt_P)) {
1782 return 7;
1783 }
1784 else {
1785 return 4;
1786 }
1787}
1788
1790 long int rk2, int m, int verbose_level)
1791// m = Witt index
1792{
1793 int f_v = (verbose_level >= 1);
1794 int root, u, v;
1795
1796 if (f_v) {
1797 cout << "orthogonal::find_root_hyperbolic "
1798 "rk2=" << rk2 << " m=" << m << endl;
1799 }
1800 if (rk2 == 0) {
1801 cout << "orthogonal::find_root_hyperbolic: "
1802 "rk2 must not be 0" << endl;
1803 exit(1);
1804 }
1805 if (m == 1) {
1806 cout << "orthogonal::find_root_hyperbolic: "
1807 "m must not be 1" << endl;
1808 exit(1);
1809 }
1812 verbose_level);
1813 if (f_v) {
1814 cout << "orthogonal::find_root_hyperbolic root=" << endl;
1815 Int_vec_print(cout, find_root_z, 2 * m);
1816 cout << endl;
1817 }
1818
1821 if (u == 0) {
1822 cout << "orthogonal::find_root_hyperbolic u=" << u << endl;
1823 exit(1);
1824 }
1827 if (v == 0) {
1828 cout << "orthogonal::find_root_hyperbolic v=" << v << endl;
1829 exit(1);
1830 }
1831 root = rank_Sbar(find_root_z, 1, m);
1832 if (f_v) {
1833 cout << "orthogonal::find_root_hyperbolic root=" << root << endl;
1834 }
1835 return root;
1836}
1837
1839 long int rk2, int m, int *x, int *y, int *z,
1840 int verbose_level)
1841// m = Witt index
1842{
1843 int f_v = (verbose_level >= 1);
1844 int f_vv = (verbose_level >= 2);
1845 int d = 2 * m;
1846 int i;
1847 int y2_minus_y3, minus_y1, y3_minus_y2, a, a2;
1848
1849 if (f_v) {
1850 cout << "orthogonal::find_root_hyperbolic_xyz "
1851 "rk2=" << rk2 << " m=" << m << endl;
1852 }
1853 for (i = 0; i < d; i++) {
1854 x[i] = 0;
1855 z[i] = 0;
1856 }
1857 x[0] = 1;
1858
1859 unrank_Sbar(y, 1, m, rk2);
1860 if (f_vv) {
1861 cout << "orthogonal::find_root_hyperbolic_xyz y=" << endl;
1862 Int_vec_print(cout, y, 2 * m);
1863 cout << endl;
1864 }
1865 if (y[0]) {
1866 if (f_vv) {
1867 cout << "detected y[0] is nonzero" << endl;
1868 }
1869 z[1] = 1;
1870 if (f_v) {
1871 cout << "orthogonal::find_root_hyperbolic_xyz z=" << endl;
1872 Int_vec_print(cout, z, 2 * m);
1873 cout << endl;
1874 }
1875 return;
1876 }
1877 if (f_vv) {
1878 cout << "detected y[0] is zero" << endl;
1879 }
1880 if (y[1] == 0) {
1881 if (f_vv) {
1882 cout << "detected y[1] is zero" << endl;
1883 }
1884 for (i = 2; i < d; i++) {
1885 if (y[i]) {
1886 if (f_vv) {
1887 cout << "detected y[" << i << "] is nonzero" << endl;
1888 }
1889 if (EVEN(i)) {
1890 z[1] = 1;
1891 z[i + 1] = 1;
1892 if (f_v) {
1893 cout << "orthogonal::find_root_hyperbolic_xyz z=" << endl;
1894 Int_vec_print(cout, z, 2 * m);
1895 cout << endl;
1896 }
1897 return;
1898 }
1899 else {
1900 z[1] = 1;
1901 z[i - 1] = 1;
1902 if (f_v) {
1903 cout << "orthogonal::find_root_hyperbolic_xyz z=" << endl;
1904 Int_vec_print(cout, z, 2 * m);
1905 cout << endl;
1906 }
1907 return;
1908 }
1909 }
1910 }
1911 cout << "orthogonal::find_root_hyperbolic_xyz error: y is zero vector" << endl;
1912 }
1913 if (f_vv) {
1914 cout << "detected y[1] is nonzero" << endl;
1915 }
1916
1917 // now: y[0] = 0, y[1] <> 0
1918
1919 // try to choose z[0] = z[1] = 1:
1920 y2_minus_y3 = F->add(y[2], F->negate(y[3]));
1921 minus_y1 = F->negate(y[1]);
1922 if (minus_y1 != y2_minus_y3) {
1923 if (f_vv) {
1924 cout << "detected -y[1] != y[2] - y[3]" << endl;
1925 }
1926 z[0] = 1;
1927 z[1] = 1;
1928 z[2] = F->negate(1);
1929 z[3] = 1;
1930 // z = (1,1,-1,1) is singular
1931 // <x,z> = 1
1932 // <y,z> = y[1] - y[3] + y[2] = 0
1933 // iff -y[1] = y[2] - y[3]
1934 // which is not the case
1935 if (f_v) {
1936 cout << "orthogonal::find_root_hyperbolic_xyz z=" << endl;
1937 Int_vec_print(cout, z, 2 * m);
1938 cout << endl;
1939 }
1940 return;
1941 }
1942 if (f_vv) {
1943 cout << "detected -y[1] = y[2] - y[3]" << endl;
1944 }
1945 y3_minus_y2 = F->add(y[3], F->negate(y[2]));
1946 if (minus_y1 != y3_minus_y2) {
1947 if (f_vv) {
1948 cout << "detected -y[1] != y[3] - y[2]" << endl;
1949 }
1950 z[0] = 1;
1951 z[1] = 1;
1952 z[2] = 1;
1953 z[3] = F->negate(1);
1954 // z = (1,1,1,-1) is singular
1955 // <x,z> = 1
1956 // <y,z> = y[1] + y[3] - y[2] = 0
1957 // iff -y[1] = y[3] - y[2]
1958 // which is not the case
1959 if (f_v) {
1960 cout << "orthogonal::find_root_hyperbolic_xyz z=" << endl;
1961 Int_vec_print(cout, z, 2 * m);
1962 cout << endl;
1963 }
1964 return;
1965 }
1966 if (f_vv) {
1967 cout << "detected -y[1] = y[2] - y[3] = y[3] - y[2]" << endl;
1968 }
1969
1970 // now -y[1] = y[2] - y[3] = y[3] - y[2],
1971 // i.e., we are in characteristic 2
1972 // i.e., y[1] = y[2] + y[3]
1973
1974 if (F->q == 2) {
1975 if (f_vv) {
1976 cout << "detected field of order 2" << endl;
1977 }
1978 // that is, y[1] = 1 and y[3] = 1 + y[2]
1979 if (y[2] == 0) {
1980 if (f_vv) {
1981 cout << "detected y[2] == 0" << endl;
1982 }
1983 // that is, y[3] = 1
1984 z[1] = 1;
1985 z[2] = 1;
1986 // z=(0,1,1,0) is singular
1987 // <x,z> = 1
1988 // <y,z> = y[0] + y[3] = 0 + 1 = 1
1989 if (f_v) {
1990 cout << "orthogonal::find_root_hyperbolic_xyz z=" << endl;
1991 Int_vec_print(cout, z, 2 * m);
1992 cout << endl;
1993 }
1994 return;
1995 }
1996 else if (y[3] == 0) {
1997 if (f_vv) {
1998 cout << "detected y[3] == 0" << endl;
1999 }
2000 // that is, y[2] = 1
2001 z[1] = 1;
2002 z[3] = 1;
2003 // z=(0,1,0,1) is singular
2004 // <x,z> = 1
2005 // <y,z> = y[0] + y[2] = 0 + 1 = 1
2006 if (f_v) {
2007 cout << "orthogonal::find_root_hyperbolic_xyz z=" << endl;
2008 Int_vec_print(cout, z, 2 * m);
2009 cout << endl;
2010 }
2011 return;
2012 }
2013 cout << "orthogonal::find_root_hyperbolic_xyz error "
2014 "neither y2 nor y3 is zero" << endl;
2015 exit(1);
2016 }
2017 if (f_vv) {
2018 cout << "detected field has at least 4 elements" << endl;
2019 }
2020 // now the field has at least 4 elements
2021 a = 3;
2022 a2 = F->mult(a, a);
2023 z[0] = a2;
2024 z[1] = 1;
2025 z[2] = a;
2026 z[3] = a;
2027 // z=(alpha^2,1,alpha,alpha) is singular
2028 // <x,z> = alpha^2
2029 // <y,z> = y[0] + alpha^2 y[1] + alpha (y[2] + y[3])
2030 // = alpha^2 y[1] + alpha (y[2] + y[3])
2031 // = alpha^2 y[1] + alpha y[1]
2032 // = (alpha^2 + alpha) y[1]
2033 // = alpha (alpha + 1) y[1]
2034 // which is nonzero
2035 if (f_v) {
2036 cout << "orthogonal::find_root_hyperbolic_xyz z=" << endl;
2037 Int_vec_print(cout, z, 2 * m);
2038 cout << endl;
2039 }
2040 if (f_v) {
2041 cout << "orthogonal::find_root_hyperbolic_xyz done" << endl;
2042 }
2043}
2044
2046 int *v, int stride, int m)
2047{
2048 int alpha = 0, beta, i;
2049
2050 for (i = 0; i < m; i++) {
2051 beta = F->mult(v[2 * i * stride], v[(2 * i + 1) * stride]);
2052 alpha = F->add(alpha, beta);
2053 }
2054 return alpha;
2055}
2056
2058 int *u, int *v, int stride, int m)
2059{
2060 int alpha = 0, beta1, beta2, i;
2061
2062 for (i = 0; i < m; i++) {
2063 beta1 = F->mult(u[2 * i * stride], v[(2 * i + 1) * stride]);
2064 beta2 = F->mult(u[(2 * i + 1) * stride], v[2 * i * stride]);
2065 alpha = F->add(alpha, beta1);
2066 alpha = F->add(alpha, beta2);
2067 }
2068 return alpha;
2069}
2070
2071
2072
2073}}}
2074
2075
void invert_matrix(int *A, int *A_inv, int n, int verbose_level)
void mult_matrix_matrix(int *A, int *B, int *C, int m, int n, int o, int verbose_level)
long int rank_line_L7(long int p1, long int p2, int verbose_level)
long int hyperbolic_rank_line(long int p1, long int p2, int verbose_level)
void canonical_points_L7(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void canonical_points_L3(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
int evaluate_hyperbolic_bilinear_form(int *u, int *v, int stride, int m)
void canonical_points_L4(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
long int rank_line_L5(long int p1, long int p2, int verbose_level)
void canonical_points_L1(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void canonical_points_L2(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void hyperbolic_canonical_points_of_line(int line_type, long int pt1, long int pt2, long int &cpt1, long int &cpt2, int verbose_level)
int hyperbolic_line_type_given_point_types(long int pt1, long int pt2, int pt1_type, int pt2_type)
long int rank_line_L6(long int p1, long int p2, int verbose_level)
int find_root_hyperbolic(long int rk2, int m, int verbose_level)
void Siegel_map_between_singular_points_hyperbolic(int *T, long int rk_from, long int rk_to, long int root, int m, int verbose_level)
void hyperbolic_point_rk_to_type_and_index(long int rk, long int &type, long int &index)
void unrank_line_L7(long int &p1, long int &p2, long int index, int verbose_level)
long int hyperbolic_type_and_index_to_point_rk(long int type, long int index, int verbose_level)
long int rank_line(long int p1, long int p2, int verbose_level)
long int rank_line_L4(long int p1, long int p2, int verbose_level)
void canonical_points_L5(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void unrank_line(long int &p1, long int &p2, long int index, int verbose_level)
void point_rk_to_type_and_index(long int rk, long int &type, long int &index, int verbose_level)
long int type_and_index_to_point_rk(long int type, long int index, int verbose_level)
long int rank_line_L3(long int p1, long int p2, int verbose_level)
int line_type_given_point_types(long int pt1, long int pt2, long int pt1_type, long int pt2_type)
void hyperbolic_unrank_line(long int &p1, long int &p2, long int rk, int verbose_level)
void unrank_line_L3(long int &p1, long int &p2, long int index, int verbose_level)
int triple_is_collinear(long int pt1, long int pt2, long int pt3)
void unrank_line_L2(long int &p1, long int &p2, long int index, int verbose_level)
void find_root_hyperbolic_xyz(long int rk2, int m, int *x, int *y, int *z, int verbose_level)
long int rank_line_L2(long int p1, long int p2, int verbose_level)
void unrank_line_L5(long int &p1, long int &p2, long int index, int verbose_level)
void unrank_line_L4(long int &p1, long int &p2, long int index, int verbose_level)
void canonical_points_of_line(int line_type, long int pt1, long int pt2, long int &cpt1, long int &cpt2, int verbose_level)
long int rank_line_L1(long int p1, long int p2, int verbose_level)
void unrank_line_L1(long int &p1, long int &p2, long int index, int verbose_level)
void unrank_line_L6(long int &p1, long int &p2, long int index, int verbose_level)
void canonical_points_L6(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
#define Int_vec_print_integer_matrix(A, B, C, D)
Definition: foundations.h:690
#define EVEN(x)
Definition: foundations.h:221
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects