Orbiter 2022
Combinatorial Objects
orthogonal_parabolic.cpp
Go to the documentation of this file.
1/*
2 * orthogonal_parabolic.cpp
3 *
4 * Created on: Oct 31, 2019
5 * Author: betten
6 */
7
8#include "foundations.h"
9
10using namespace std;
11
12
13namespace orbiter {
14namespace layer1_foundations {
15namespace orthogonal_geometry {
16
17
18
19
20
21// #############################################################################
22// orthogonal_parabolic.cpp
23// #############################################################################
24
25//##############################################################################
26// ranking / unranking points according to the partition:
27//##############################################################################
28
30 int type, int index, int verbose_level)
31{
32 int f_v = (verbose_level >= 1);
33 int f_vv = (verbose_level >= 2);
34 int rk;
35
36 if (f_v) {
37 cout << "parabolic_type_and_index_to_point_rk "
38 "type=" << type << " index=" << index
39 << " epsilon=" << epsilon << " n=" << n << endl;
40 }
41 if (type == 3) {
42 int field, sub_index, len;
43
44 len = alpha;
45 field = index / len;
46 sub_index = index % len;
47 field++;
48 if (f_vv) {
49 cout << "field=" << field
50 << " sub_index=" << sub_index << endl;
51 }
52 subspace->unrank_point(v_tmp2, 1, sub_index, verbose_level - 1);
53 v_tmp2[n - 2] = 0;
54 v_tmp2[n - 1] = field;
55 rk = rank_point(v_tmp2, 1, verbose_level - 1);
56 if (f_v) {
57 cout << "parabolic_type_and_index_to_point_rk "
58 "type=" << type << " index=" << index
59 << " rk=" << rk << endl;
60 }
61 return rk;
62 }
63 else if (type == 4) {
64 int field, sub_index, len;
65
66 len = alpha;
67 field = index / len;
68 sub_index = index % len;
69 field++;
70 if (f_vv) {
71 cout << "field=" << field << " sub_index=" << sub_index << endl;
72 }
73 subspace->unrank_point(v_tmp2, 1, sub_index, verbose_level - 1);
74 v_tmp2[n - 2] = field;
75 v_tmp2[n - 1] = 0;
76 rk = rank_point(v_tmp2, 1, verbose_level - 1);
77 if (f_v) {
78 cout << "parabolic_type_and_index_to_point_rk "
79 "type=" << type << " index=" << index
80 << " rk=" << rk << endl;
81 }
82 return rk;
83 }
84 else if (type == 5) {
85 if (f_v) {
86 cout << "parabolic_type_and_index_to_point_rk "
87 "type=" << type << " index=" << index << endl;
88 cout << "parabolic_type_and_index_to_point_rk "
89 "before subspace->unrank_point" << endl;
90 }
91 if (subspace == NULL) {
92 cout << "parabolic_type_and_index_to_point_rk "
93 "subspace == NULL" << endl;
94 exit(1);
95 }
96 subspace->unrank_point(v_tmp2, 1, index, verbose_level /*- 1*/);
97 if (f_v) {
98 cout << "parabolic_type_and_index_to_point_rk "
99 "after subspace->unrank_point" << endl;
100 }
101 v_tmp2[n - 2] = 0;
102 v_tmp2[n - 1] = 0;
103 rk = rank_point(v_tmp2, 1, verbose_level - 1);
104 if (f_v) {
105 cout << "parabolic_type_and_index_to_point_rk "
106 "type=" << type << " index=" << index
107 << " rk=" << rk << endl;
108 }
109 return rk;
110 }
111 else if (type == 6) {
112 if (index < 1) {
113 rk = pt_Q;
114 if (f_v) {
115 cout << "parabolic_type_and_index_to_point_rk "
116 "type=" << type << " index=" << index
117 << " rk=" << rk << endl;
118 }
119 return rk;
120 }
121 else {
122 cout << "error in parabolic_P3to7_type_and_index_to_point_rk, "
123 "illegal index" << endl;
124 exit(1);
125 }
126 }
127 else if (type == 7) {
128 if (index < 1) {
129 rk = pt_P;
130 if (f_v) {
131 cout << "parabolic_type_and_index_to_point_rk "
132 "type=" << type << " index=" << index
133 << " rk=" << rk << endl;
134 }
135 return rk;
136 }
137 else {
138 cout << "error in parabolic_P3to7_type_and_index_to_point_rk, "
139 "illegal index" << endl;
140 exit(1);
141 }
142 }
143 else {
144 if (f_even) {
146 type, index, verbose_level);
147 }
148 else {
150 type, index, verbose_level);
151 }
152 }
153}
154
156 int type, int index, int verbose_level)
157{
158 int f_v = (verbose_level >= 1);
159 //int f_vv = (verbose_level >= 2);
160 int rk;
161
162 if (f_v) {
163 cout << "parabolic_even_type_and_index_to_point_rk "
164 "type=" << type << " index=" << index << endl;
165 }
166 if (type == 1) {
168 rk = rank_point(v_tmp2, 1, verbose_level - 1);
169 if (f_v) {
170 cout << "parabolic_even_type_and_index_to_point_rk "
171 "type=" << type << " index=" << index
172 << " rk=" << rk << endl;
173 }
174 return rk;
175 }
176 else if (type == 2) {
178 rk = rank_point(v_tmp2, 1, verbose_level - 1);
179 if (f_v) {
180 cout << "parabolic_even_type_and_index_to_point_rk "
181 "type=" << type << " index=" << index
182 << " rk=" << rk << endl;
183 }
184 return rk;
185 }
186 cout << "error in parabolic_even_type_and_index_to_point_rk "
187 "illegal type " << type << endl;
188 exit(1);
189}
190
192{
193 int a, b;
194
195 if (index >= p1) {
196 cout << "error in parabolic_even_type1_index_to_point, "
197 "index >= p1" << endl;
198 exit(1);
199 }
200 zero_vector(v + 1, 1, 2 * (m - 1));
201 a = 1 + index;
202 b = F->inverse(a);
203 v[0] = 1;
204 v[1 + 2 * (m - 1) + 0] = a;
205 v[1 + 2 * (m - 1) + 1] = b;
206}
207
209 int index, int *v)
210{
211 int a, b, c, d, l, ll, lll, field1, field2;
212 int sub_index, sub_sub_index;
213
214 l = (q - 1) * N1_mm1;
215 if (index < l) {
216 field1 = index / N1_mm1;
217 sub_index = index % N1_mm1;
218 v[0] = 0;
219 unrank_N1(v + 1, 1, m - 1, sub_index);
220 a = 1 + field1;
221 b = 1;
222 c = a;
223 v[1 + 2 * (m - 1) + 0] = a;
224 v[1 + 2 * (m - 1) + 1] = b;
225 change_form_value(v + 1, 1, m - 1, c);
226 //int_vec_print(cout, v, n);
227 return;
228 }
229 index -= l;
230 ll = S_mm1 - 1;
231 l = (q - 1) * ll;
232 if (index < l) {
233 field1 = index / ll;
234 sub_index = index % ll;
235 lll = Sbar_mm1;
236 field2 = sub_index / lll;
237 sub_sub_index = sub_index % lll;
238 v[0] = 1;
239 unrank_Sbar(v + 1, 1, m - 1, sub_sub_index);
240 scalar_multiply_vector(v + 1, 1, n - 3, 1 + field2);
241 a = 1 + field1;
242 b = F->inverse(a);
243 v[1 + 2 * (m - 1) + 0] = a;
244 v[1 + 2 * (m - 1) + 1] = b;
245 return;
246 }
247 index -= l;
248 l = (q - 2) * (q - 1) * N1_mm1;
249 if (index < l) {
250 ll = (q - 1) * N1_mm1;
251 field1 = index / ll;
252 sub_index = index % ll;
253 field2 = sub_index / N1_mm1;
254 sub_sub_index = sub_index % N1_mm1;
255 //cout << "field1=" << field1 << " field2=" << field2
256 //<< " sub_sub_index=" << sub_sub_index << endl;
257 v[0] = 1;
258 unrank_N1(v + 1, 1, m - 1, sub_sub_index);
259 a = 2 + field1;
260 b = 1 + field2;
261 c = F->mult(a, F->inverse(b));
262 v[1 + 2 * (m - 1) + 0] = b;
263 v[1 + 2 * (m - 1) + 1] = c;
264 d = F->add(1, a);
265 change_form_value(v + 1, 1, m - 1, d);
266 return;
267 }
268 else {
269 cout << "error in parabolic_even_type2_index_to_point "
270 "illegal index" << endl;
271 exit(1);
272 }
273}
274
276 long int type, long int index, int verbose_level)
277{
278 int f_v = (verbose_level >= 1);
279 //int f_vv = (verbose_level >= 2);
280 long int rk;
281
282 if (f_v) {
283 cout << "parabolic_odd_type_and_index_to_point_rk "
284 "type=" << type << " index=" << index << endl;
285 }
286 if (type == 1) {
287 parabolic_odd_type1_index_to_point(index, v_tmp2, verbose_level);
288 if (f_v) {
289 cout << "parabolic_odd_type_and_index_to_point_rk created ";
290 Int_vec_print(cout, v_tmp2, n);
291 cout << endl;
292 }
293 rk = rank_point(v_tmp2, 1, verbose_level - 1);
294 if (f_v) {
295 cout << "parabolic_odd_type_and_index_to_point_rk "
296 "type=" << type << " index=" << index
297 << " rk=" << rk << endl;
298 }
299 return rk;
300 }
301 else if (type == 2) {
302 parabolic_odd_type2_index_to_point(index, v_tmp2, verbose_level);
303 rk = rank_point(v_tmp2, 1, verbose_level - 1);
304 if (f_v) {
305 cout << "parabolic_odd_type_and_index_to_point_rk "
306 "type=" << type << " index=" << index
307 << " rk=" << rk << endl;
308 }
309 return rk;
310 }
311 cout << "error in parabolic_odd_type_and_index_to_point_rk "
312 "illegal type " << type << endl;
313 exit(1);
314}
315
317 long int index, int *v, int verbose_level)
318{
319 long int a, b, c, l, ll, ms_idx, field1, field2, sub_index, sub_sub_index;
320 int f_v = (verbose_level >= 1);
321
322 if (f_v) {
323 cout << "parabolic_odd_type1_index_to_point "
324 "m = " << m << " index = " << index << endl;
325 }
326 if (index >= p1) {
327 cout << "error in parabolic_odd_type1_index_to_point, "
328 "index >= p1" << endl;
329 exit(1);
330 }
331 l = (q - 1) / 2 * N1_mm1;
332 if (index < l) {
333 ms_idx = index / N1_mm1;
334 sub_index = index % N1_mm1;
335 field1 = minus_squares[ms_idx];
336 if (f_v) {
337 cout << "case a) ms_idx = " << ms_idx
338 << " sub_index=" << sub_index
339 << " field1 = " << field1 << endl;
340 }
341 v[0] = 0;
342 v[1 + 2 * (m - 1) + 0] = field1;
343 v[1 + 2 * (m - 1) + 1] = 1;
344 unrank_N1(v + 1, 1, m - 1, sub_index);
345 c = F->negate(field1);
346 change_form_value(v + 1, 1, m - 1, c);
347 return;
348 }
349 index -= l;
350 l = (q - 1) * S_mm1;
351 if (index < l) {
352 field1 = index / S_mm1;
353 sub_index = index % S_mm1;
354 if (f_v) {
355 cout << "case b) sub_index=" << sub_index
356 << " field1 = " << field1 << endl;
357 }
358 if (sub_index == 0) {
359 a = 1 + field1;
360 b = F->mult(F->inverse(a), F->negate(1));
361 v[0] = 1;
362 v[1 + 2 * (m - 1) + 0] = a;
363 v[1 + 2 * (m - 1) + 1] = b;
364 zero_vector(v + 1, 1, n - 3);
365 return;
366 }
367 else {
368 sub_index--;
369 field2 = sub_index / Sbar_mm1;
370 sub_sub_index = sub_index % Sbar_mm1;
371 //cout << "field1=" << field1 << " field2=" << field2
372 //<< " sub_sub_index=" << sub_sub_index << endl;
373 a = 1 + field1;
374 b = F->mult(F->inverse(a), F->negate(1));
375 v[0] = 1;
376 v[1 + 2 * (m - 1) + 0] = a;
377 v[1 + 2 * (m - 1) + 1] = b;
378 unrank_Sbar(v + 1, 1, m - 1, sub_sub_index);
379 scalar_multiply_vector(v + 1, 1, n - 3, 1 + field2);
380 return;
381 }
382 }
383 index -= l;
384 l = ((q - 1) / 2 - 1) * (q - 1) * N1_mm1;
385 ll = (q - 1) * N1_mm1;
386 //cout << "index = " << index << " l=" << l << endl;
387 if (index < l) {
388 ms_idx = index / ll;
389 sub_index = index % ll;
390 field2 = sub_index / N1_mm1;
391 sub_sub_index = sub_index % N1_mm1;
392 field1 = minus_squares_without[ms_idx];
393 if (f_v) {
394 cout << "case c) ms_idx = " << ms_idx
395 << " sub_index=" << sub_index
396 << " field2 = " << field2
397 << " sub_sub_index=" << sub_sub_index
398 << " field1 = " << field1
399 << endl;
400 }
401 a = 1 + field2;
402 b = F->mult(F->inverse(a), field1);
403 v[0] = 1;
404 v[1 + 2 * (m - 1) + 0] = a;
405 v[1 + 2 * (m - 1) + 1] = b;
406 unrank_N1(v + 1, 1, m - 1, sub_sub_index);
407 c = F->negate(F->add(1, field1));
408 change_form_value(v + 1, 1, m - 1, c);
409 return;
410 }
411 else {
412 cout << "error in parabolic_odd_type1_index_to_point "
413 "illegal index" << endl;
414 exit(1);
415 }
416}
417
419 long int index, int *v, int verbose_level)
420{
421 long int a, b, c, l, ll, ms_idx, field1, field2, sub_index, sub_sub_index;
422 int f_v = (verbose_level >= 1);
423
424 if (f_v) {
425 cout << "parabolic_odd_type2_index_to_point "
426 "index = " << index << endl;
427 }
428 if (index >= p1) {
429 cout << "error in parabolic_odd_type2_index_to_point, "
430 "index >= p1" << endl;
431 exit(1);
432 }
433 l = (q - 1) / 2 * N1_mm1;
434 if (index < l) {
435 ms_idx = index / N1_mm1;
436 sub_index = index % N1_mm1;
437 field1 = minus_nonsquares[ms_idx];
438 if (f_v) {
439 cout << "case 1 ms_idx=" << ms_idx
440 << " field1=" << field1
441 << " sub_index=" << sub_index << endl;
442 }
443 v[0] = 0;
444 v[1 + 2 * (m - 1) + 0] = field1;
445 v[1 + 2 * (m - 1) + 1] = 1;
446 unrank_N1(v + 1, 1, m - 1, sub_index);
447 c = F->negate(field1);
448 change_form_value(v + 1, 1, m - 1, c);
449 return;
450 }
451 index -= l;
452 l = (q - 1) / 2 * (q - 1) * N1_mm1;
453 ll = (q - 1) * N1_mm1;
454 if (index < l) {
455 ms_idx = index / ll;
456 sub_index = index % ll;
457 field2 = sub_index / N1_mm1;
458 sub_sub_index = sub_index % N1_mm1;
459 field1 = minus_nonsquares[ms_idx];
460 if (f_v) {
461 cout << "case 2 ms_idx=" << ms_idx
462 << " field1=" << field1 << " field2=" << field2
463 << " sub_sub_index=" << sub_sub_index << endl;
464 }
465 //cout << "ms_idx=" << ms_idx << " field2=" << field2
466 //<< " sub_sub_index=" << sub_sub_index << endl;
467 a = 1 + field2;
468 b = F->mult(F->inverse(a), field1);
469 v[0] = 1;
470 v[1 + 2 * (m - 1) + 0] = a;
471 v[1 + 2 * (m - 1) + 1] = b;
472 unrank_N1(v + 1, 1, m - 1, sub_sub_index);
473 c = F->negate(F->add(1, field1));
474 change_form_value(v + 1, 1, m - 1, c);
475 return;
476 }
477 cout << "error in parabolic_odd_type2_index_to_point "
478 "illegal index" << endl;
479 exit(1);
480}
481
483 long int rk, long int &type, long int &index, int verbose_level)
484{
485 int f_v = (verbose_level >= 1);
486 int f_vv = (verbose_level >= 2);
487
488 if (f_v) {
489 cout << "parabolic_point_rk_to_type_and_index "
490 "rk = " << rk << endl;
491 }
492 if (rk == pt_Q) {
493 type = 6;
494 index = 0;
495 if (f_v) {
496 cout << "parabolic_point_rk_to_type_and_index "
497 "rk = " << rk << " type = " << type
498 << " index = " << index << endl;
499 }
500 return;
501 }
502 if (rk == pt_P) {
503 type = 7;
504 index = 0;
505 if (f_v) {
506 cout << "parabolic_point_rk_to_type_and_index "
507 "rk = " << rk << " type = " << type
508 << " index = " << index << endl;
509 }
510 return;
511 }
512 unrank_point(v_tmp2, 1, rk, verbose_level - 1);
513 if (f_v) {
514 cout << "parabolic_point_rk_to_type_and_index created vector ";
515 Int_vec_print(cout, v_tmp2, n);
516 cout << endl;
517 }
518 if (v_tmp2[n - 2] == 0 && v_tmp2[n - 1]) {
519 long int field, sub_index, len;
520 type = 3;
521 len = alpha;
523 field = v_tmp2[n - 1];
524 sub_index = subspace->rank_point(v_tmp2, 1, verbose_level - 1);
525 if (f_vv) {
526 cout << "field=" << field << " sub_index=" << sub_index << endl;
527 }
528 index = (field - 1) * len + sub_index;
529 if (f_v) {
530 cout << "parabolic_point_rk_to_type_and_index rk = " << rk
531 << " type = " << type
532 << " index = " << index << endl;
533 }
534 return;
535 }
536 else if (v_tmp2[n - 2] && v_tmp2[n - 1] == 0) {
537 long int field, sub_index, len;
538 type = 4;
539 len = alpha;
541 field = v_tmp2[n - 2];
542 sub_index = subspace->rank_point(v_tmp2, 1, verbose_level - 1);
543 if (f_vv) {
544 cout << "field=" << field << " sub_index=" << sub_index << endl;
545 }
546 index = (field - 1) * len + sub_index;
547 if (f_v) {
548 cout << "parabolic_point_rk_to_type_and_index "
549 "rk = " << rk << " type = " << type
550 << " index = " << index << endl;
551 }
552 return;
553 }
554 else if (v_tmp2[n - 2] == 0 && v_tmp2[n - 1] == 0) {
555 type = 5;
556 index = subspace->rank_point(v_tmp2, 1, verbose_level - 1);
557 if (f_v) {
558 cout << "parabolic_point_rk_to_type_and_index "
559 "rk = " << rk << " type = " << type
560 << " index = " << index << endl;
561 }
562 return;
563 }
564 if (f_even) {
566 type, index, verbose_level);
567 }
568 else {
570 type, index, verbose_level);
571 }
572}
573
575 long int rk, long int &type, long int &index, int verbose_level)
576{
577 unrank_point(v_tmp2, 1, rk, verbose_level - 1);
579 type, index, verbose_level);
580}
581
583 int *v, long int &type, long int &index, int verbose_level)
584{
585 int f_v = (verbose_level >= 1);
586 int f_start_with_one, value_middle, value_end, f_middle_is_zero;
587 long int a, b, /*c,*/ l, ll, lll, field1, field2, sub_index, sub_sub_index;
588
589 if (f_v) {
590 cout << "parabolic_even_point_to_type_and_index:";
591 Int_vec_print(cout, v, n);
592 cout << endl;
593 }
594 if (v[0] != 0 && v[0] != 1) {
595 cout << "parabolic_even_point_to_type_and_index: "
596 "error in unrank_point" << endl;
597 exit(1);
598 }
600 f_start_with_one, value_middle, value_end, verbose_level);
601 if (value_middle == 0) {
602 f_middle_is_zero = is_zero_vector(v + 1, 1, n - 3);
603 }
604 else
605 f_middle_is_zero = FALSE;
606 if (f_v) {
607 cout << "parabolic_even_point_to_type_and_index: "
608 "f_start_with_one=" << f_start_with_one
609 << " value_middle=" << value_middle
610 << " f_middle_is_zero=" << f_middle_is_zero
611 << " value_end=" << value_end << endl;
612 }
613 if (f_start_with_one &&
614 value_middle == 0 &&
615 f_middle_is_zero &&
616 value_end == 1) {
617 type = 1;
618 a = v[1 + 2 * (m - 1) + 0];
619 b = v[1 + 2 * (m - 1) + 1];
620 index = a - 1;
621 if (f_v) {
622 cout << "parabolic_even_point_to_type_and_index "
623 "type = " << type << " index = " << index << endl;
624 }
625 return;
626 }
627 else if (value_end) {
628 type = 2;
629 index = 0;
630 if (!f_start_with_one) {
631 change_form_value(v + 1, 1, m - 1, F->inverse(value_middle));
632 sub_index = rank_N1(v + 1, 1, m - 1);
633 a = v[1 + 2 * (m - 1) + 0];
634 b = v[1 + 2 * (m - 1) + 1];
635 field1 = a - 1;
636 index += field1 * N1_mm1 + sub_index;
637 if (f_v) {
638 cout << "parabolic_even_point_to_type_and_index "
639 "type = " << type << " index = " << index << endl;
640 }
641 return;
642 }
643 index += (q - 1) * N1_mm1;
644 ll = S_mm1 - 1;
645 l = (q - 1) * ll;
646 if (value_middle == 0) {
647 a = v[1 + 2 * (m - 1) + 0];
648 b = v[1 + 2 * (m - 1) + 1];
649 field2 = last_non_zero_entry(v + 1, 1, n - 3);
650 scalar_multiply_vector(v + 1, 1, n - 3, F->inverse(field2));
651 sub_sub_index = rank_Sbar(v + 1, 1, m - 1);
652 field2--;
653 lll = Sbar_mm1;
654 sub_index = field2 * lll + sub_sub_index;
655 field1 = a - 1;
656 index += field1 * ll + sub_index;
657 if (f_v) {
658 cout << "parabolic_even_point_to_type_and_index "
659 "type = " << type << " index = " << index << endl;
660 }
661 return;
662 }
663 index += l;
664 l = (q - 2) * (q - 1) * N1_mm1;
665 change_form_value(v + 1, 1, m - 1, F->inverse(value_middle));
666 sub_sub_index = rank_N1(v + 1, 1, m - 1);
667 a = F->add(1, value_middle);
668 b = v[1 + 2 * (m - 1) + 0];
669 //c = v[1 + 2 * (m - 1) + 1];
670 if (a == 0 || a == 1) {
671 cout << "error in parabolic_even_point_to_type_and_index "
672 "a == 0 || a == 1" << endl;
673 exit(1);
674 }
675 if (b == 0) {
676 cout << "error in parabolic_even_point_to_type_and_index "
677 "b == 0" << endl;
678 exit(1);
679 }
680 field2 = b - 1;
681 field1 = a - 2;
682 //cout << "field1=" << field1 << " field2=" << field2
683 //<< " sub_sub_index=" << sub_sub_index << endl;
684 sub_index = field2 * N1_mm1 + sub_sub_index;
685 ll = (q - 1) * N1_mm1;
686 index += field1 * ll + sub_index;
687 if (f_v) {
688 cout << "parabolic_even_point_to_type_and_index "
689 "type = " << type << " index = " << index << endl;
690 }
691 return;
692 }
693 else {
694 cout << "error in parabolic_even_point_to_type_and_index, "
695 "unknown type, type = " << type << endl;
696 exit(1);
697 }
698}
699
701 long int rk, long int &type, long int &index, int verbose_level)
702{
703 unrank_point(v_tmp2, 1, rk, verbose_level - 1);
705 type, index, verbose_level);
706}
707
709 int *v, long int &type, long int &index, int verbose_level)
710{
711 int f_v = (verbose_level >= 1);
712 int f_start_with_one, value_middle, value_end;
713 int f_middle_is_zero, f_end_value_is_minus_square;
714 int a, c, l, ll, ms_idx, field1, field2, sub_index, sub_sub_index;
715
716 if (f_v) {
717 cout << "parabolic_odd_point_to_type_and_index:";
718 Int_vec_print(cout, v, n);
719 cout << endl;
720 }
721 if (v[0] != 0 && v[0] != 1) {
722 cout << "parabolic_odd_point_to_type_and_index: "
723 "error in unrank_point" << endl;
724 exit(1);
725 }
727 f_start_with_one, value_middle, value_end, verbose_level);
728 if (f_v) {
729 cout << "f_start_with_one=" << f_start_with_one
730 << " value_middle=" << value_middle
731 << " value_end=" << value_end << endl;
732 }
733 if (value_middle == 0) {
734 f_middle_is_zero = is_zero_vector(v + 1, 1, n - 3);
735 }
736 else {
737 f_middle_is_zero = FALSE;
738 }
739 if (f_v) {
740 cout << "f_middle_is_zero=" << f_middle_is_zero << endl;
741 }
742 f_end_value_is_minus_square = f_is_minus_square[value_end];
743 if (f_v) {
744 cout << "f_end_value_is_minus_square="
745 << f_end_value_is_minus_square << endl;
746 }
747
748 if (f_end_value_is_minus_square) {
749 type = 1;
750 index = 0;
751 l = (q - 1) / 2 * N1_mm1;
752 if (!f_start_with_one) {
753 ms_idx = index_minus_square[value_end];
754 if (ms_idx == -1) {
755 cout << "parabolic_odd_point_to_type_and_index: "
756 "ms_idx == -1" << endl;
757 }
758 c = F->negate(value_end);
759 change_form_value(v + 1, 1, m - 1, F->inverse(c));
760 sub_index = rank_N1(v + 1, 1, m - 1);
761 index += ms_idx * N1_mm1 + sub_index;
762 if (f_v) {
763 cout << "parabolic_odd_point_to_type_and_index "
764 "type = " << type << " index = " << index << endl;
765 }
766 return;
767 }
768 index += l;
769 l = (q - 1) * S_mm1;
770 if (value_middle == 0) {
771 if (f_middle_is_zero) {
772 a = v[1 + 2 * (m - 1) + 0];
773 field1 = a - 1;
774 sub_index = 0;
775 index += field1 * S_mm1 + sub_index;
776 if (f_v) {
777 cout << "parabolic_odd_point_to_type_and_index "
778 "type = " << type << " index = " << index << endl;
779 }
780 return;
781 }
782 else {
783 a = v[1 + 2 * (m - 1) + 0];
784 //b = v[1 + 2 * (m - 1) + 1];
785 field1 = a - 1;
786 field2 = last_non_zero_entry(v + 1, 1, n - 3);
787 scalar_multiply_vector(v + 1, 1, n - 3, F->inverse(field2));
788 sub_sub_index = rank_Sbar(v + 1, 1, m - 1);
789 field2--;
790 //cout << "field1=" << field1 << " field2=" << field2
791 //<< " sub_sub_index=" << sub_sub_index << endl;
792 sub_index = field2 * Sbar_mm1 + sub_sub_index + 1;
793 index += field1 * S_mm1 + sub_index;
794 if (f_v) {
795 cout << "parabolic_odd_point_to_type_and_index "
796 "type = " << type << " index = " << index << endl;
797 }
798 return;
799 }
800 }
801 index += l;
802 l = ((q - 1) / 2 - 1) * (q - 1) * N1_mm1;
803 ll = (q - 1) * N1_mm1;
804 ms_idx = index_minus_square_without[value_end];
805 if (ms_idx == -1) {
806 cout << "parabolic_odd_point_to_type_and_index: "
807 "ms_idx == -1" << endl;
808 }
809 field1 = minus_squares_without[ms_idx];
810 c = F->negate(F->add(1, field1));
811 change_form_value(v + 1, 1, m - 1, F->inverse(c));
812 sub_sub_index = rank_N1(v + 1, 1, m - 1);
813 a = v[1 + 2 * (m - 1) + 0];
814 field2 = a - 1;
815 sub_index = field2 * N1_mm1 + sub_sub_index;
816 index += ms_idx * ll + sub_index;
817 if (f_v) {
818 cout << "parabolic_odd_point_to_type_and_index "
819 "type = " << type << " index = " << index << endl;
820 }
821 return;
822 }
823 else if (value_end) {
824 type = 2;
825 l = (q - 1) / 2 * N1_mm1;
826 index = 0;
827 if (!f_start_with_one) {
828 ms_idx = index_minus_nonsquare[value_end];
829 if (ms_idx == -1) {
830 cout << "parabolic_odd_point_to_type_and_index: "
831 "ms_idx == -1" << endl;
832 }
833 c = F->negate(value_end);
834 change_form_value(v + 1, 1, m - 1, F->inverse(c));
835 sub_index = rank_N1(v + 1, 1, m - 1);
836 index += ms_idx * N1_mm1 + sub_index;
837 if (f_v) {
838 cout << "parabolic_odd_point_to_type_and_index "
839 "type = " << type << " index = " << index << endl;
840 }
841 return;
842 }
843 index += l;
844 l = (q - 1) / 2 * (q - 1) * N1_mm1;
845 ll = (q - 1) * N1_mm1;
846 ms_idx = index_minus_nonsquare[value_end];
847 if (ms_idx == -1) {
848 cout << "parabolic_odd_point_to_type_and_index: "
849 "ms_idx == -1" << endl;
850 }
851 //field1 = minus_nonsquares[ms_idx];
852 //c = F->negate(F->add(1, field1));
853 change_form_value(v + 1, 1, m - 1, F->inverse(value_middle));
854 sub_sub_index = rank_N1(v + 1, 1, m - 1);
855 a = v[1 + 2 * (m - 1) + 0];
856 field2 = a - 1;
857 //cout << "ms_idx=" << ms_idx << " field2=" << field2
858 //<< " sub_sub_index=" << sub_sub_index << endl;
859 sub_index = field2 * N1_mm1 + sub_sub_index;
860 index += ms_idx * ll + sub_index;
861 if (f_v) {
862 cout << "parabolic_odd_point_to_type_and_index "
863 "type = " << type << " index = " << index << endl;
864 }
865 return;
866 }
867 cout << "error in parabolic_odd_point_to_type_and_index, "
868 "unknown type, type = " << type << endl;
869 exit(1);
870}
871
872//##############################################################################
873// ranking / unranking neighbors of the favorite point:
874//##############################################################################
875
877 long int index, int *v, int verbose_level)
878{
879 int i;
880 int f_v = (verbose_level >= 1);
881
882 if (f_v) {
883 cout << "parabolic_neighbor51_odd_unrank "
884 "index=" << index << endl;
885 }
887 index, subspace->v_tmp2, verbose_level);
888 v[0] = subspace->v_tmp2[0];
889 v[1] = 0;
890 v[2] = 0;
891 for (i = 1; i < subspace->n; i++) {
892 v[2 + i] = subspace->v_tmp2[i];
893 }
894 if (f_v) {
895 cout << "parabolic_neighbor51_odd_unrank ";
896 Int_vec_print(cout, v, n);
897 cout << endl;
898 }
899}
900
902 int *v, int verbose_level)
903{
904 int i;
905 long int type, index;
906 int f_v = (verbose_level >= 1);
907
908 if (f_v) {
909 cout << "parabolic_neighbor51_odd_rank ";
910 Int_vec_print(cout, v, n);
911 cout << endl;
912 }
913 if (v[2]) {
914 cout << "parabolic_neighbor51_odd_rank v[2]" << endl;
915 exit(1);
916 }
917 subspace->v_tmp2[0] = v[0];
918 for (i = 1; i < subspace->n; i++) {
919 subspace->v_tmp2[i] = v[2 + i];
920 }
922 if (f_v) {
923 cout << "normalized and in subspace: ";
925 cout << endl;
926 }
928 subspace->v_tmp2, type, index, verbose_level);
929 if (type != 1) {
930 cout << "parabolic_neighbor51_odd_rank type != 1" << endl;
931 exit(1);
932 }
933 return index;
934}
935
936
938 long int index, int *v, int verbose_level)
939{
940 int i;
941 int f_v = (verbose_level >= 1);
942
943 if (f_v) {
944 cout << "parabolic_neighbor52_odd_unrank index=" << index << endl;
945 }
947 index, subspace->v_tmp2, verbose_level);
948 v[0] = subspace->v_tmp2[0];
949 v[1] = 0;
950 v[2] = 0;
951 for (i = 1; i < subspace->n; i++) {
952 v[2 + i] = subspace->v_tmp2[i];
953 }
954 if (f_v) {
955 cout << "parabolic_neighbor52_odd_unrank ";
956 Int_vec_print(cout, v, n);
957 cout << endl;
958 }
959}
960
961long int orthogonal::parabolic_neighbor52_odd_rank(int *v, int verbose_level)
962{
963 long int i, type, index;
964 int f_v = (verbose_level >= 1);
965
966 if (f_v) {
967 cout << "parabolic_neighbor52_odd_rank ";
968 Int_vec_print(cout, v, n);
969 cout << endl;
970 }
971 if (v[2]) {
972 cout << "parabolic_neighbor52_odd_rank v[2]" << endl;
973 exit(1);
974 }
975 subspace->v_tmp2[0] = v[0];
976 for (i = 1; i < subspace->n; i++) {
977 subspace->v_tmp2[i] = v[2 + i];
978 }
981 subspace->v_tmp2, type, index, verbose_level);
982 if (type != 2) {
983 cout << "parabolic_neighbor52_odd_rank type != 2" << endl;
984 exit(1);
985 }
986 return index;
987}
988
990 long int index, int *v, int verbose_level)
991{
992 int i;
993 int f_v = (verbose_level >= 1);
994
995 if (f_v) {
996 cout << "parabolic_neighbor52_even_unrank index=" << index << endl;
997 }
999 v[0] = subspace->v_tmp2[0];
1000 v[1] = 0;
1001 v[2] = 0;
1002 for (i = 1; i < subspace->n; i++) {
1003 v[2 + i] = subspace->v_tmp2[i];
1004 }
1005 if (f_v) {
1006 cout << "parabolic_neighbor52_even_unrank ";
1007 Int_vec_print(cout, v, n);
1008 cout << endl;
1009 }
1010}
1011
1012long int orthogonal::parabolic_neighbor52_even_rank(int *v, int verbose_level)
1013{
1014 long int i, type, index;
1015 int f_v = (verbose_level >= 1);
1016
1017 if (f_v) {
1018 cout << "parabolic_neighbor52_even_rank ";
1019 Int_vec_print(cout, v, n);
1020 cout << endl;
1021 }
1022 if (v[2]) {
1023 cout << "parabolic_neighbor52_even_rank v[2]" << endl;
1024 exit(1);
1025 }
1026 subspace->v_tmp2[0] = v[0];
1027 for (i = 1; i < subspace->n; i++) {
1028 subspace->v_tmp2[i] = v[2 + i];
1029 }
1032 subspace->v_tmp2, type, index, verbose_level);
1033 if (type != 2) {
1034 cout << "parabolic_neighbor52_even_rank type != 1" << endl;
1035 exit(1);
1036 }
1037 return index;
1038}
1039
1041 long int index, int *v, int verbose_level)
1042{
1043 long int len, sub_len, a, av, b, sub_index;
1044 long int sub_sub_index, multiplier;
1045 int f_v = (verbose_level >= 1);
1046
1047 if (f_v) {
1048 cout << "parabolic_neighbor34_unrank "
1049 "index=" << index << endl;
1050 }
1051 len = S_mm2;
1052 if (index < len) {
1053 // case 1:
1054 if (f_v) {
1055 cout << "case 1 index=" << index << endl;
1056 }
1057 v[0] = 0;
1058 v[n - 2] = 1;
1059 v[n - 1] = 0;
1060 v[1] = 0;
1061 v[2] = F->negate(1);
1062 unrank_S(v + 3, 1, m - 2, index);
1063 goto finish;
1064 }
1065 index -= len;
1066 len = (q - 1) * N1_mm2;
1067 if (index < len) {
1068 // case 2:
1069 a = index / N1_mm2;
1070 sub_index = index % N1_mm2;
1071 a++;
1072 if (f_v) {
1073 cout << "case 2 a=" << a
1074 << " sub_index=" << sub_index << endl;
1075 }
1076 v[0] = 0;
1077 v[n - 2] = 1;
1078 v[n - 1] = 0;
1079 v[1] = a;
1080 v[2] = F->negate(1);
1081 unrank_N1(v + 3, 1, m - 2, sub_index);
1082 change_form_value(v + 3, 1, m - 2, a);
1083 goto finish;
1084 }
1085 index -= len;
1086 len = (q - 1) * N1_mm2;
1087 if (index < len) {
1088 // case 3:
1089 a = index / N1_mm2;
1090 sub_index = index % N1_mm2;
1091 a++;
1092 if (f_v) {
1093 cout << "case 3 a=" << a
1094 << " sub_index=" << sub_index << endl;
1095 }
1096 v[0] = 1;
1097 v[1] = 0;
1098 v[2] = F->negate(a);
1099 v[n - 2] = a;
1100 v[n - 1] = 0;
1101 unrank_N1(v + 3, 1, m - 2, sub_index);
1102 change_form_value(v + 3, 1, m - 2, F->negate(1));
1103 goto finish;
1104 }
1105 index -= len;
1106 len = (q - 1) * S_mm2;
1107 if (index < len) {
1108 // case 4:
1109 a = index / S_mm2;
1110 sub_index = index % S_mm2;
1111 a++;
1112 if (f_v) {
1113 cout << "case 4 a=" << a
1114 << " sub_index=" << sub_index << endl;
1115 }
1116 v[0] = 1;
1117 v[1] = F->inverse(a);
1118 v[2] = F->negate(a);
1119 v[n - 2] = a;
1120 v[n - 1] = 0;
1121 unrank_S(v + 3, 1, m - 2, sub_index);
1122 goto finish;
1123 }
1124 index -= len;
1125 len = (q - 1) * (q - 2) * N1_mm2;
1126 if (index < len) {
1127 // case 5:
1128 sub_len = (q - 2) * N1_mm2;
1129 a = index / sub_len;
1130 sub_index = index % sub_len;
1131 b = sub_index / N1_mm2;
1132 sub_sub_index = sub_index % N1_mm2;
1133 a++;
1134 av = F->inverse(a);
1135 b++;
1136 if (b >= av) {
1137 b++;
1138 }
1139 if (f_v) {
1140 cout << "case 5 a=" << a << " b=" << b
1141 << " sub_sub_index=" << sub_sub_index << endl;
1142 }
1143 v[0] = 1;
1144 v[1] = b;
1145 v[2] = F->negate(a);
1146 v[n - 2] = a;
1147 v[n - 1] = 0;
1148 unrank_N1(v + 3, 1, m - 2, sub_sub_index);
1149 multiplier = F->add(F->negate(1), F->mult(a, b));
1150 if (f_v) {
1151 cout << "case 5 multiplyer=" << multiplier << endl;
1152 }
1153 change_form_value(v + 3, 1, m - 2, multiplier);
1154 goto finish;
1155 }
1156 cout << "parabolic_neighbor34_unrank index illegal" << endl;
1157 exit(1);
1158
1159finish:
1160 if (f_v) {
1161 cout << "parabolic_neighbor34_unrank ";
1162 Int_vec_print(cout, v, n);
1163 cout << endl;
1164 }
1165}
1166
1167long int orthogonal::parabolic_neighbor34_rank(int *v, int verbose_level)
1168{
1169 int len1, len2, len3, len4, /*len5,*/ av;
1170 int index, sub_len, a, b, sub_index, sub_sub_index, multiplyer;
1171 int f_v = (verbose_level >= 1);
1172
1173 if (f_v) {
1174 cout << "parabolic_neighbor34_rank " << endl;
1175 Int_vec_print(cout, v, n);
1176 cout << endl;
1177 }
1178 normalize_point(v, 1);
1179 if (v[n - 1]) {
1180 cout << "parabolic_neighbor34_rank v[n - 1]" << endl;
1181 exit(1);
1182 }
1183 if (v[n - 2] == 0) {
1184 cout << "parabolic_neighbor34_rank v[n - 2] == 0" << endl;
1185 exit(1);
1186 }
1187
1188 len1 = S_mm2;
1189 len2 = (q - 1) * N1_mm2;
1190 len3 = (q - 1) * N1_mm2;
1191 len4 = (q - 1) * S_mm2;
1192 //len5 = (q - 1) * (q - 2) * N1_mm2;
1193
1194 if (v[0] == 0) {
1195 if (v[2] != F->negate(1)) {
1196 cout << "parabolic_neighbor34_rank "
1197 "v[2] != F->negate(1)" << endl;
1198 exit(1);
1199 }
1200 a = v[1];
1201 if (a == 0) {
1202 // case 1:
1203 index = rank_S(v + 3, 1, m - 2);
1204 if (f_v) {
1205 cout << "case 1 index=" << index << endl;
1206 }
1207 goto finish;
1208 }
1209 else {
1210 // case 2:
1211 change_form_value(v + 3, 1, m - 2, F->inverse(a));
1212 sub_index = rank_N1(v + 3, 1, m - 2);
1213 if (f_v) {
1214 cout << "case 2 a=" << a
1215 << " sub_index=" << sub_index << endl;
1216 }
1217 index = (a - 1) * N1_mm2 + sub_index;
1218 index += len1;
1219 goto finish;
1220 }
1221 }
1222 else {
1223 if (v[0] != 1) {
1224 cout << "parabolic_neighbor34_rank v[1] != 1" << endl;
1225 exit(1);
1226 }
1227 a = v[n - 2];
1228 if (v[2] != F->negate(a)) {
1229 cout << "parabolic_neighbor34_rank "
1230 "v[2] != F->negate(a)" << endl;
1231 exit(1);
1232 }
1233 if (v[1] == 0) {
1234 // case 3:
1235 change_form_value(v + 3, 1, m - 2, F->negate(1));
1236 sub_index = rank_N1(v + 3, 1, m - 2);
1237 if (f_v) {
1238 cout << "case 3 a=" << a
1239 << " sub_index=" << sub_index << endl;
1240 }
1241 index = (a - 1) * N1_mm2 + sub_index;
1242 index += len1;
1243 index += len2;
1244 goto finish;
1245 }
1246 else {
1247 av = F->inverse(a);
1248 if (v[1] == av) {
1249 // case 4:
1250 sub_index = rank_S(v + 3, 1, m - 2);
1251 if (f_v) {
1252 cout << "case 4 a=" << a
1253 << " sub_index=" << sub_index << endl;
1254 }
1255 index = (a - 1) * S_mm2 + sub_index;
1256 index += len1;
1257 index += len2;
1258 index += len3;
1259 goto finish;
1260 }
1261 else {
1262 // case 5:
1263 sub_len = (q - 2) * N1_mm2;
1264 b = v[1];
1265 if (b == av) {
1266 cout << "parabolic_neighbor34_rank b = av" << endl;
1267 exit(1);
1268 }
1269 multiplyer = F->add(F->negate(1), F->mult(a, b));
1270 if (f_v) {
1271 cout << "case 5 multiplyer=" << multiplyer << endl;
1272 }
1273 change_form_value(v + 3, 1, m - 2, F->inverse(multiplyer));
1274 sub_sub_index = rank_N1(v + 3, 1, m - 2);
1275 if (f_v) {
1276 cout << "case 5 a=" << a << " b=" << b
1277 << " sub_sub_index=" << sub_sub_index << endl;
1278 }
1279 if (b >= av)
1280 b--;
1281 b--;
1282 sub_index = b * N1_mm2 + sub_sub_index;
1283 index = (a - 1) * sub_len + sub_index;
1284 index += len1;
1285 index += len2;
1286 index += len3;
1287 index += len4;
1288 goto finish;
1289 }
1290 }
1291 }
1292 cout << "parabolic_neighbor34_rank illegal point" << endl;
1293 exit(1);
1294
1295finish:
1296 if (f_v) {
1297 cout << "parabolic_neighbor34_rank index = " << index << endl;
1298 }
1299 return index;
1300}
1301
1302
1304 long int index, int *v, int verbose_level)
1305{
1306 long int a, sub_index;
1307 int f_v = (verbose_level >= 1);
1308 int len1, len2;
1309
1310 if (f_v) {
1311 cout << "parabolic_neighbor53_unrank index=" << index << endl;
1312 }
1313 len1 = (q - 1) * Sbar_mm2;
1314 len2 = (q - 1) * N1_mm2;
1315 if (index < len1) {
1316 // case 1:
1317 a = index / Sbar_mm2;
1318 sub_index = index % Sbar_mm2;
1319 a++;
1320 if (f_v) {
1321 cout << "case 1 index=" << index << " a=" << a
1322 << " sub_index=" << sub_index << endl;
1323 }
1324
1325 v[0] = 0;
1326 v[1] = 0;
1327 v[2] = 0;
1328 v[n - 2] = 0;
1329 v[n - 1] = a;
1330 unrank_Sbar(v + 3, 1, m - 2, sub_index);
1331 goto finish;
1332 }
1333 index -= len1;
1334 if (index < len2) {
1335 // case 2:
1336 a = index / N1_mm2;
1337 sub_index = index % N1_mm2;
1338 a++;
1339 if (f_v) {
1340 cout << "case 2 index=" << index << " a=" << a
1341 << " sub_index=" << sub_index << endl;
1342 }
1343 v[0] = 1;
1344 v[1] = 0;
1345 v[2] = 0;
1346 v[n - 2] = 0;
1347 v[n - 1] = a;
1348 unrank_N1(v + 3, 1, m - 2, sub_index);
1349 change_form_value(v + 3, 1, m - 2, F->negate(1));
1350 goto finish;
1351 }
1352 cout << "parabolic_neighbor53_unrank index illegal" << endl;
1353 exit(1);
1354
1355finish:
1356 if (f_v) {
1357 cout << "parabolic_neighbor53_unrank ";
1358 Int_vec_print(cout, v, n);
1359 cout << endl;
1360 }
1361}
1362
1363long int orthogonal::parabolic_neighbor53_rank(int *v, int verbose_level)
1364{
1365 int len1; //, len2;
1366 int index, a, sub_index;
1367 int f_v = (verbose_level >= 1);
1368
1369 if (f_v) {
1370 cout << "parabolic_neighbor53_rank " << endl;
1371 Int_vec_print(cout, v, n);
1372 cout << endl;
1373 }
1375 if (v[n - 2]) {
1376 cout << "parabolic_neighbor53_rank v[n - 2]" << endl;
1377 exit(1);
1378 }
1379 if (v[n - 1] == 0) {
1380 cout << "parabolic_neighbor53_rank v[n - 1] == 0" << endl;
1381 exit(1);
1382 }
1383 a = v[n - 1];
1384
1385 len1 = (q - 1) * Sbar_mm2;
1386 //len2 = (q - 1) * N1_mm2;
1387
1388 if (v[0] == 0) {
1389 // case 1
1390 sub_index = rank_Sbar(v + 3, 1, m - 2);
1391 index = (a - 1) * Sbar_mm2 + sub_index;
1392 goto finish;
1393 }
1394 else {
1395 // case 2
1396 change_form_value(v + 3, 1, m - 2, F->negate(1));
1397 sub_index = rank_N1(v + 3, 1, m - 2);
1398 index = len1 + (a - 1) * N1_mm2 + sub_index;
1399 goto finish;
1400 }
1401
1402 cout << "parabolic_neighbor53_rank illegal point" << endl;
1403 exit(1);
1404
1405finish:
1406 if (f_v) {
1407 cout << "parabolic_neighbor53_rank index = " << index << endl;
1408 }
1409 return index;
1410}
1411
1413 long int index, int *v, int verbose_level)
1414{
1415 long int a, sub_index;
1416 int f_v = (verbose_level >= 1);
1417 long int len1, len2;
1418
1419 if (f_v) {
1420 cout << "parabolic_neighbor54_unrank index=" << index << endl;
1421 }
1422 len1 = (q - 1) * Sbar_mm2;
1423 len2 = (q - 1) * N1_mm2;
1424 if (index < len1) {
1425 // case 1:
1426 a = index / Sbar_mm2;
1427 sub_index = index % Sbar_mm2;
1428 a++;
1429 if (f_v) {
1430 cout << "case 1 index=" << index
1431 << " a=" << a
1432 << " sub_index=" << sub_index << endl;
1433 }
1434
1435 v[0] = 0;
1436 v[1] = 0;
1437 v[2] = 0;
1438 v[n - 2] = a;
1439 v[n - 1] = 0;
1440 unrank_Sbar(v + 3, 1, m - 2, sub_index);
1441 goto finish;
1442 }
1443 index -= len1;
1444 if (index < len2) {
1445 // case 2:
1446 a = index / N1_mm2;
1447 sub_index = index % N1_mm2;
1448 a++;
1449 if (f_v) {
1450 cout << "case 2 index=" << index
1451 << " a=" << a
1452 << " sub_index=" << sub_index << endl;
1453 }
1454 v[0] = 1;
1455 v[1] = 0;
1456 v[2] = 0;
1457 v[n - 2] = a;
1458 v[n - 1] = 0;
1459 unrank_N1(v + 3, 1, m - 2, sub_index);
1460 change_form_value(v + 3, 1, m - 2, F->negate(1));
1461 goto finish;
1462 }
1463 cout << "parabolic_neighbor54_unrank index illegal" << endl;
1464 exit(1);
1465
1466finish:
1467 if (f_v) {
1468 cout << "parabolic_neighbor54_unrank ";
1469 Int_vec_print(cout, v, n);
1470 cout << endl;
1471 }
1472}
1473
1474long int orthogonal::parabolic_neighbor54_rank(int *v, int verbose_level)
1475{
1476 long int len1; //, len2;
1477 long int index, a, sub_index;
1478 int f_v = (verbose_level >= 1);
1479
1480 if (f_v) {
1481 cout << "parabolic_neighbor54_rank " << endl;
1482 Int_vec_print(cout, v, n);
1483 cout << endl;
1484 }
1486 if (f_v) {
1487 cout << "normalized wrt subspace " << endl;
1488 Int_vec_print(cout, v, n);
1489 cout << endl;
1490 }
1491 if (v[n - 1]) {
1492 cout << "parabolic_neighbor54_rank v[n - 2]" << endl;
1493 exit(1);
1494 }
1495 if (v[n - 2] == 0) {
1496 cout << "parabolic_neighbor54_rank v[n - 1] == 0" << endl;
1497 exit(1);
1498 }
1499 a = v[n - 2];
1500
1501 len1 = (q - 1) * Sbar_mm2;
1502 //len2 = (q - 1) * N1_mm2;
1503
1504 if (v[0] == 0) {
1505 // case 1
1506 sub_index = rank_Sbar(v + 3, 1, m - 2);
1507 index = (a - 1) * Sbar_mm2 + sub_index;
1508 goto finish;
1509 }
1510 else {
1511 // case 2
1512 change_form_value(v + 3, 1, m - 2, F->negate(1));
1513 sub_index = rank_N1(v + 3, 1, m - 2);
1514 index = len1 + (a - 1) * N1_mm2 + sub_index;
1515 goto finish;
1516 }
1517
1518 cout << "parabolic_neighbor54_rank illegal point" << endl;
1519 exit(1);
1520
1521finish:
1522 if (f_v) {
1523 cout << "parabolic_neighbor54_rank index = " << index << endl;
1524 }
1525 return index;
1526}
1527
1528
1529//##############################################################################
1530// ranking / unranking lines:
1531//##############################################################################
1532
1534 long int &p1, long int &p2, long int rk, int verbose_level)
1535{
1536 int f_v = (verbose_level >= 1);
1537
1538 if (f_v) {
1539 cout << "parabolic_unrank_line rk=" << rk << endl;
1540 }
1541 if (m == 0) {
1542 cout << "orthogonal::parabolic_unrank_line "
1543 "Witt index zero, there is no line to unrank" << endl;
1544 exit(1);
1545 }
1546 if (rk < l1) {
1547 if (f_even)
1548 parabolic_unrank_line_L1_even(p1, p2, rk, verbose_level);
1549 else
1550 parabolic_unrank_line_L1_odd(p1, p2, rk, verbose_level);
1551 return;
1552 }
1553 rk -= l1;
1554 if (f_v) {
1555 cout << "reducing rk to " << rk << " l2=" << l2 << endl;
1556 }
1557 if (rk < l2) {
1558 if (f_even)
1559 parabolic_unrank_line_L2_even(p1, p2, rk, verbose_level);
1560 else
1561 parabolic_unrank_line_L2_odd(p1, p2, rk, verbose_level);
1562 return;
1563 }
1564 rk -= l2;
1565 if (f_v) {
1566 cout << "reducing rk to " << rk << " l3=" << l3 << endl;
1567 }
1568 if (rk < l3) {
1569 parabolic_unrank_line_L3(p1, p2, rk, verbose_level);
1570 return;
1571 }
1572 rk -= l3;
1573 if (rk < l4) {
1574 parabolic_unrank_line_L4(p1, p2, rk, verbose_level);
1575 return;
1576 }
1577 rk -= l4;
1578 if (rk < l5) {
1579 parabolic_unrank_line_L5(p1, p2, rk, verbose_level);
1580 return;
1581 }
1582 rk -= l5;
1583 if (rk < l6) {
1584 parabolic_unrank_line_L6(p1, p2, rk, verbose_level);
1585 return;
1586 }
1587 rk -= l6;
1588 if (rk < l7) {
1589 parabolic_unrank_line_L7(p1, p2, rk, verbose_level);
1590 return;
1591 }
1592 rk -= l7;
1593 if (rk < l8) {
1594 parabolic_unrank_line_L8(p1, p2, rk, verbose_level);
1595 return;
1596 }
1597 rk -= l8;
1598 cout << "error in orthogonal::parabolic_unrank_line, "
1599 "rk too big" << endl;
1600 exit(1);
1601}
1602
1603long int orthogonal::parabolic_rank_line(long int p1, long int p2, int verbose_level)
1604{
1605 int f_v = (verbose_level >= 1);
1606 long int p1_type, p2_type, p1_index, p2_index, type;
1607 long int cp1, cp2;
1608
1609 if (f_v) {
1610 cout << "parabolic_rank_line "
1611 "p1=" << p1 << " p2=" << p2 << endl;
1612 }
1614 p1_type, p1_index, verbose_level);
1615 if (f_v) {
1616 cout << "parabolic_rank_line "
1617 "p1_type=" << p1_type
1618 << " p1_index=" << p1_index << endl;
1619 }
1621 p2_type, p2_index, verbose_level);
1622 if (f_v) {
1623 cout << "parabolic_rank_line "
1624 "p2_type=" << p2_type
1625 << " p2_index=" << p2_index << endl;
1626 }
1628 p1, p2, p1_type, p2_type, verbose_level);
1629 if (f_v) {
1630 cout << "parabolic_rank_line "
1631 "line type = " << type << endl;
1632 }
1634 p1, p2, cp1, cp2, verbose_level);
1635 if (f_v) {
1636 cout << "parabolic_rank_line "
1637 "cp1=" << cp1 << " cp2=" << cp2 << endl;
1638 }
1639
1640 if (type == 1) {
1641 if (f_even)
1642 return parabolic_rank_line_L1_even(cp1, cp2, verbose_level);
1643 else
1644 return parabolic_rank_line_L1_odd(cp1, cp2, verbose_level);
1645 }
1646 else if (type == 2) {
1647 if (f_even)
1648 return l1 +
1649 parabolic_rank_line_L2_even(cp1, cp2, verbose_level);
1650 else
1651 return l1 +
1652 parabolic_rank_line_L2_odd(cp1, cp2, verbose_level);
1653 }
1654 else if (type == 3) {
1655 return l1 + l2 +
1656 parabolic_rank_line_L3(cp1, cp2, verbose_level);
1657 }
1658 else if (type == 4) {
1659 return l1 + l2 + l3 +
1660 parabolic_rank_line_L4(cp1, cp2, verbose_level);
1661 }
1662 else if (type == 5) {
1663 return l1 + l2 + l3 + l4 +
1664 parabolic_rank_line_L5(cp1, cp2, verbose_level);
1665 }
1666 else if (type == 6) {
1667 return l1 + l2 + l3 + l4 + l5 +
1668 parabolic_rank_line_L6(cp1, cp2, verbose_level);
1669 }
1670 else if (type == 7) {
1671 return l1 + l2 + l3 + l4 + l5 + l6 +
1672 parabolic_rank_line_L7(cp1, cp2, verbose_level);
1673 }
1674 else if (type == 8) {
1675 return l1 + l2 + l3 + l4 + l5 + l6 + l7 +
1676 parabolic_rank_line_L8(cp1, cp2, verbose_level);
1677 }
1678 else {
1679 cout << "parabolic_rank_line type nyi" << endl;
1680 exit(1);
1681 }
1682}
1683
1685 long int &p1, long int &p2, long int index, int verbose_level)
1686{
1687 int f_v = (verbose_level >= 1);
1688 int f_vv = (verbose_level >= 2);
1689 //int f_vvv = (verbose_level >= 3);
1690 long int idx, sub_idx;
1691
1692 if (index >= l1) {
1693 cout << "error in parabolic_unrank_line_L1_even "
1694 "index too large" << endl;
1695 }
1696 idx = index / (q - 1);
1697 sub_idx = index % (q - 1);
1698 if (f_v) {
1699 cout << "parabolic_unrank_line_L1_even "
1700 "index=" << index << " idx=" << idx
1701 << " sub_idx=" << sub_idx << endl;
1702 }
1703 p1 = type_and_index_to_point_rk(5, idx, verbose_level);
1704 if (f_vv) {
1705 cout << "p1=" << p1 << endl;
1706 }
1707 p2 = type_and_index_to_point_rk(1, sub_idx, verbose_level);
1708 if (f_vv) {
1709 cout << "p2=" << p2 << endl;
1710 }
1711 if (f_v) {
1712 cout << "parabolic_unrank_line_L1_even "
1713 "index=" << index << " p1=" << p1
1714 << " p2=" << p2 << endl;
1715 }
1716}
1717
1719 long int p1, long int p2, int verbose_level)
1720{
1721 int f_v = (verbose_level >= 1);
1722 //int f_vv = (verbose_level >= 2);
1723 //int f_vvv = (verbose_level >= 3);
1724 long int index, type, idx, sub_idx;
1725
1726 if (f_v) {
1727 cout << "parabolic_unrank_line_L1_even "
1728 << " p1=" << p1 << " p2=" << p2 << endl;
1729 }
1730 point_rk_to_type_and_index(p1, type, idx, verbose_level);
1731 if (type != 5) {
1732 cout << "parabolic_rank_line_L1_even p1 must be in P5" << endl;
1733 exit(1);
1734 }
1735 point_rk_to_type_and_index(p2, type, sub_idx, verbose_level);
1736 if (type != 1) {
1737 cout << "parabolic_rank_line_L1_even p2 must be in P1" << endl;
1738 exit(1);
1739 }
1740 index = idx * (q - 1) + sub_idx;
1741 return index;
1742}
1743
1745 long int &p1, long int &p2, long int index, int verbose_level)
1746{
1747 int f_v = (verbose_level >= 1);
1748 //int f_vv = (verbose_level >= 2);
1749 //int f_vvv = (verbose_level >= 3);
1750 long int idx, index2, rk1;
1751
1752 if (f_v) {
1753 cout << "parabolic_unrank_line_L1_odd "
1754 "index=" << index << " l1=" << l1
1755 << " a51=" << a51 << endl;
1756 }
1757 if (index >= l1) {
1758 cout << "error in parabolic_unrank_line_L1_odd "
1759 "index too large" << endl;
1760 exit(1);
1761 }
1762 idx = index / a51;
1763 index2 = index % a51;
1764
1765 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
1766 if (f_v) {
1767 cout << "rk1=" << rk1 << endl;
1768 }
1769 p1 = type_and_index_to_point_rk(5, idx, verbose_level);
1770 if (f_v) {
1771 cout << "p1=" << p1 << endl;
1772 }
1773
1774 parabolic_neighbor51_odd_unrank(index2, v3, verbose_level);
1775
1776 Siegel_move_forward_by_index(rk1, p1, v3, v4, verbose_level);
1777 p2 = rank_point(v4, 1, verbose_level - 1);
1778
1779 if (f_v) {
1780 cout << "parabolic_unrank_line_L1_odd "
1781 "index=" << index << " p1=" << p1
1782 << " p2=" << p2 << endl;
1783 }
1784}
1785
1787 long int p1, long int p2, int verbose_level)
1788{
1789 int f_v = (verbose_level >= 1);
1790 //int f_vv = (verbose_level >= 2);
1791 //int f_vvv = (verbose_level >= 3);
1792 long int index, type, idx, index2, rk1;
1793
1794 if (f_v) {
1795 cout << "parabolic_rank_line_L1_odd "
1796 "p1=" << p1 << " p2=" << p2 << endl;
1797 }
1798
1799 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
1800
1801 point_rk_to_type_and_index(p1, type, idx, verbose_level);
1802 if (f_v) {
1803 cout << "parabolic_rank_line_L1_odd "
1804 "type=" << type << " idx=" << idx << endl;
1805 }
1806 if (type != 5) {
1807 cout << "parabolic_rank_line_L1_odd "
1808 "point 1 must be of type 5" << endl;
1809 exit(1);
1810 }
1811 unrank_point(v4, 1, p2, verbose_level - 1);
1812 Siegel_move_backward_by_index(rk1, p1, v4, v3, verbose_level);
1813
1814 index2 = parabolic_neighbor51_odd_rank(v3, verbose_level);
1815
1816 if (f_v) {
1817 cout << "parabolic_rank_line_L1_odd "
1818 "idx=" << idx << " index2=" << index2 << endl;
1819 }
1820
1821 index = idx * a51 + index2;
1822
1823 if (f_v) {
1824 cout << "parabolic_unrank_line_L1_odd index=" << index << endl;
1825 }
1826 return index;
1827}
1828
1830 long int &p1, long int &p2, long int index, int verbose_level)
1831{
1832 int f_v = (verbose_level >= 1);
1833 int f_vv = (verbose_level >= 2);
1834 //int f_vvv = (verbose_level >= 3);
1835 long int idx, index2, rk1;
1836
1837 if (f_v) {
1838 cout << "parabolic_unrank_line_L2_even index=" << index << endl;
1839 }
1840 if (index >= l2) {
1841 cout << "error in parabolic_unrank_line_L2_even "
1842 "index too large" << endl;
1843 exit(1);
1844 }
1845 idx = index / a52a;
1846 index2 = index % a52a;
1847
1848 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
1849 p1 = type_and_index_to_point_rk(5, idx, verbose_level);
1851
1852 Siegel_move_forward_by_index(rk1, p1, v3, v4, verbose_level);
1853 p2 = rank_point(v4, 1, verbose_level - 1);
1854
1855
1856 if (f_vv) {
1857 cout << "p2=" << p2 << endl;
1858 }
1859 if (f_v) {
1860 cout << "parabolic_unrank_line_L2_even "
1861 "index=" << index << " p1=" << p1
1862 << " p2=" << p2 << endl;
1863 }
1864}
1865
1867 long int &p1, long int &p2, long int index, int verbose_level)
1868{
1869 int f_v = (verbose_level >= 1);
1870 int f_vv = (verbose_level >= 2);
1871 //int f_vvv = (verbose_level >= 3);
1872 long int idx, index2, rk1;
1873
1874 if (f_v) {
1875 cout << "parabolic_unrank_line_L2_odd "
1876 "index=" << index << endl;
1877 }
1878 if (index >= l2) {
1879 cout << "error in parabolic_unrank_line_L2_odd "
1880 "index too large" << endl;
1881 exit(1);
1882 }
1883 idx = index / a52a;
1884 index2 = index % a52a;
1885 if (f_v) {
1886 cout << "parabolic_unrank_line_L2_odd "
1887 "idx=" << idx << " index2=" << index2 << endl;
1888 }
1889
1890 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
1891 p1 = type_and_index_to_point_rk(5, idx, verbose_level);
1893
1894 Siegel_move_forward_by_index(rk1, p1, v3, v4, verbose_level);
1895 if (f_v) {
1896 cout << "after Siegel_move_forward_by_index";
1897 Int_vec_print(cout, v4, n);
1898 cout << endl;
1899 }
1900 p2 = rank_point(v4, 1, verbose_level - 1);
1901
1902
1903 if (f_vv) {
1904 cout << "p2=" << p2 << endl;
1905 }
1906 if (f_v) {
1907 cout << "parabolic_unrank_line_L2_odd "
1908 "index=" << index << " p1=" << p1
1909 << " p2=" << p2 << endl;
1910 }
1911}
1912
1914 long int p1, long int p2, int verbose_level)
1915{
1916 int f_v = (verbose_level >= 1);
1917 //int f_vv = (verbose_level >= 2);
1918 //int f_vvv = (verbose_level >= 3);
1919 long int index, type, idx, index2, rk1;
1920
1921 if (f_v) {
1922 cout << "parabolic_rank_line_L2_even "
1923 "p1=" << p1 << " p2=" << p2 << endl;
1924 }
1925 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
1926
1927 point_rk_to_type_and_index(p1, type, idx, verbose_level);
1928 if (f_v) {
1929 cout << "parabolic_rank_line_L2_even "
1930 "type=" << type << " idx=" << idx << endl;
1931 }
1932 if (type != 5) {
1933 cout << "parabolic_rank_line_L2_even "
1934 "point 1 must be of type 5" << endl;
1935 exit(1);
1936 }
1937 unrank_point(v4, 1, p2, verbose_level - 1);
1938 Siegel_move_backward_by_index(rk1, p1, v4, v3, verbose_level);
1939
1940 if (f_v) {
1941 cout << "after Siegel_move_backward_by_index";
1942 Int_vec_print(cout, v3, n);
1943 cout << endl;
1944 }
1945 index2 = parabolic_neighbor52_even_rank(v3, verbose_level);
1946
1947 if (f_v) {
1948 cout << "parabolic_rank_line_L2_even idx=" << idx
1949 << " index2=" << index2 << endl;
1950 }
1951
1952 index = idx * a52a + index2;
1953
1954 if (f_v) {
1955 cout << "parabolic_rank_line_L2_even index=" << index << endl;
1956 }
1957 return index;
1958}
1959
1961 long int p1, long int p2, int verbose_level)
1962{
1963 int f_v = (verbose_level >= 1);
1964 //int f_vv = (verbose_level >= 2);
1965 //int f_vvv = (verbose_level >= 3);
1966 long int index, type, idx, index2, rk1;
1967
1968 if (f_v) {
1969 cout << "parabolic_rank_line_L2_odd "
1970 "p1=" << p1 << " p2=" << p2 << endl;
1971 }
1972 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
1973
1974 point_rk_to_type_and_index(p1, type, idx, verbose_level);
1975 if (f_v) {
1976 cout << "parabolic_rank_line_L2_odd type=" << type
1977 << " idx=" << idx << endl;
1978 }
1979 if (type != 5) {
1980 cout << "parabolic_rank_line_L2_odd "
1981 "point 1 must be of type 5" << endl;
1982 exit(1);
1983 }
1984 unrank_point(v4, 1, p2, verbose_level - 1);
1985 Siegel_move_backward_by_index(rk1, p1, v4, v3, verbose_level);
1986
1987 if (f_v) {
1988 cout << "after Siegel_move_backward_by_index";
1989 Int_vec_print(cout, v3, n);
1990 cout << endl;
1991 }
1992 index2 = parabolic_neighbor52_odd_rank(v3, verbose_level);
1993
1994 if (f_v) {
1995 cout << "parabolic_rank_line_L2_odd idx=" << idx
1996 << " index2=" << index2 << endl;
1997 }
1998
1999 index = idx * a52a + index2;
2000
2001 if (f_v) {
2002 cout << "parabolic_unrank_line_L2_odd index=" << index << endl;
2003 }
2004 return index;
2005}
2006
2008 long int &p1, long int &p2, long int index, int verbose_level)
2009{
2010 int f_v = (verbose_level >= 1);
2011 //int f_vv = (verbose_level >= 2);
2012 //int f_vvv = (verbose_level >= 3);
2013 long int idx, index2, idx2, field, rk1, rk2, a, b, c, multiplier, i;
2014
2015 if (f_v) {
2016 cout << "parabolic_unrank_line_L3 index=" << index << endl;
2017 }
2018 if (index >= l3) {
2019 cout << "error in parabolic_unrank_line_L3 "
2020 "index too large" << endl;
2021 exit(1);
2022 }
2023 idx = index / a32b;
2024 index2 = index % a32b;
2025 idx2 = idx / (q - 1);
2026 field = idx % (q - 1);
2027 field++;
2028 if (f_v) {
2029 cout << "parabolic_unrank_line_L3 idx=" << idx
2030 << " index2=" << index2 << " idx2=" << idx2
2031 << " field=" << field << endl;
2032 }
2033
2034 rk1 = type_and_index_to_point_rk(3, 0, verbose_level);
2035 rk2 = type_and_index_to_point_rk(5, idx2, verbose_level);
2036 if (f_v) {
2037 cout << "parabolic_unrank_line_L3 rk1=" << rk1
2038 << " rk2=" << rk2 << " idx2=" << idx2
2039 << " field=" << field << endl;
2040 }
2041 unrank_point(v1, 1, rk1, verbose_level - 1);
2042 unrank_point(v2, 1, rk2, verbose_level - 1);
2043 v2[n - 1] = 1;
2044
2045
2046 if (f_v) {
2047 Int_vec_print(cout, v1, n); cout << endl;
2048 Int_vec_print(cout, v2, n); cout << endl;
2049 }
2050
2051 parabolic_neighbor34_unrank(index2, v3, verbose_level);
2052
2053 Siegel_move_forward(v1, v2, v3, v4, verbose_level);
2054 if (f_v) {
2055 cout << "after Siegel_move_forward" << endl;
2056 Int_vec_print(cout, v3, n); cout << endl;
2057 Int_vec_print(cout, v4, n); cout << endl;
2058 }
2061 if (f_v) {
2062 cout << "a=" << a << " b=" << b << endl;
2063 }
2064 if (a != b) {
2065 if (a == 0) {
2066 cout << "a != b but a = 0" << endl;
2067 exit(1);
2068 }
2069 if (b == 0) {
2070 cout << "a != b but b = 0" << endl;
2071 exit(1);
2072 }
2073 multiplier = F->mult(a, F->inverse(b));
2074 if (f_v) {
2075 cout << "multiplier=" << multiplier << endl;
2076 }
2077 for (i = 0; i < n - 2; i++) {
2078 v4[i] = F->mult(v4[i], multiplier);
2079 }
2080 if (f_v) {
2081 cout << "after scaling" << endl;
2082 Int_vec_print(cout, v4, n); cout << endl;
2083 }
2085 if (f_v) {
2086 cout << "c=" << c << endl;
2087 }
2088 if (c != a) {
2089 cout << "c != a" << endl;
2090 exit(1);
2091 }
2092 }
2093 if (f_v) {
2094 cout << "now changing the last components:" << endl;
2095 }
2096
2097 v2[n - 2] = 0;
2098 v2[n - 1] = field;
2099 normalize_point(v2, 1);
2100 p1 = rank_point(v2, 1, verbose_level - 1);
2101 v4[n - 2] = F->mult(v4[n - 2], F->inverse(field));
2102 p2 = rank_point(v4, 1, verbose_level - 1);
2103
2104
2105
2106 if (f_v) {
2107 cout << "parabolic_unrank_line_L3 index=" << index
2108 << " p1=" << p1 << " p2=" << p2 << endl;
2109 }
2110}
2111
2112long int orthogonal::parabolic_rank_line_L3(long int p1, long int p2, int verbose_level)
2113{
2114 int f_v = (verbose_level >= 1);
2115 //int f_vv = (verbose_level >= 2);
2116 //int f_vvv = (verbose_level >= 3);
2117 long int index, idx, index2, idx2, field;
2118 long int rk1, rk2, type, a, b, c, i, multiplier;
2119
2120 if (f_v) {
2121 cout << "parabolic_rank_line_L3 "
2122 "p1=" << p1 << " p2=" << p2 << endl;
2123 }
2124
2125
2126 rk1 = type_and_index_to_point_rk(3, 0, verbose_level);
2127
2128 unrank_point(v1, 1, rk1, verbose_level - 1);
2129 unrank_point(v2, 1, p1, verbose_level - 1);
2130 if (f_v) {
2131 Int_vec_print(cout, v1, n); cout << endl;
2132 Int_vec_print(cout, v2, n); cout << endl;
2133 }
2134
2136 if (f_v) {
2137 cout << "after parabolic_normalize_point_wrt_subspace ";
2138 Int_vec_print(cout, v2, n);
2139 cout << endl;
2140 }
2141 field = v2[n - 1];
2142 if (f_v) {
2143 cout << "field=" << field << endl;
2144 }
2145 v2[n - 1] = 0;
2146 rk2 = rank_point(v2, 1, verbose_level - 1);
2148 type, idx2, verbose_level);
2149 if (f_v) {
2150 cout << "parabolic_unrank_line_L3 "
2151 "rk1=" << rk1 << " rk2=" << rk2
2152 << " idx2=" << idx2 << " field=" << field << endl;
2153 }
2154 if (type != 5) {
2155 cout << "parabolic_rank_line_L3 type != 5" << endl;
2156 exit(1);
2157 }
2158 v2[n - 1] = 1;
2159
2160
2161 unrank_point(v4, 1, p2, verbose_level - 1);
2162 v4[n - 2] = F->mult(v4[n - 2], field);
2163
2164 idx = idx2 * (q - 1) + (field - 1);
2165
2166 Siegel_move_backward(v1, v2, v4, v3, verbose_level);
2167 if (f_v) {
2168 cout << "after Siegel_move_backward" << endl;
2169 Int_vec_print(cout, v3, n); cout << endl;
2170 Int_vec_print(cout, v4, n); cout << endl;
2171 }
2174 if (f_v) {
2175 cout << "a=" << a << " b=" << b << endl;
2176 }
2177 if (a != b) {
2178 if (a == 0) {
2179 cout << "a != b but a = 0" << endl;
2180 exit(1);
2181 }
2182 if (b == 0) {
2183 cout << "a != b but b = 0" << endl;
2184 exit(1);
2185 }
2186 multiplier = F->mult(b, F->inverse(a));
2187 if (f_v) {
2188 cout << "multiplier=" << multiplier << endl;
2189 }
2190 for (i = 0; i < n - 2; i++) {
2191 v3[i] = F->mult(v3[i], multiplier);
2192 }
2193 if (f_v) {
2194 cout << "after scaling" << endl;
2195 Int_vec_print(cout, v3, n); cout << endl;
2196 }
2198 if (f_v) {
2199 cout << "c=" << c << endl;
2200 }
2201 if (c != b) {
2202 cout << "c != a" << endl;
2203 exit(1);
2204 }
2205 }
2206 if (f_v) {
2207 cout << "after scaling" << endl;
2208 Int_vec_print(cout, v3, n); cout << endl;
2209 Int_vec_print(cout, v4, n); cout << endl;
2210 }
2211
2212 index2 = parabolic_neighbor34_rank(v3, verbose_level);
2213
2214 if (f_v) {
2215 cout << "parabolic_rank_line_L3 idx=" << idx
2216 << " index2=" << index2 << " idx2=" << idx2
2217 << " field=" << field << endl;
2218 }
2219
2220 index = idx * a32b + index2;
2221
2222 if (f_v) {
2223 cout << "parabolic_unrank_line_L3 index=" << index << endl;
2224 }
2225
2226 return index;
2227}
2228
2230 long int &p1, long int &p2, long int index, int verbose_level)
2231// from P5 to P3
2232{
2233 int f_v = (verbose_level >= 1);
2234 //int f_vv = (verbose_level >= 2);
2235 //int f_vvv = (verbose_level >= 3);
2236 long int idx, neighbor_idx, rk1;
2237
2238 if (f_v) {
2239 cout << "parabolic_unrank_line_L4 index=" << index << endl;
2240 }
2241 if (index >= l4) {
2242 cout << "error in parabolic_unrank_line_L4 index too large" << endl;
2243 exit(1);
2244 }
2245 idx = index / a53;
2246 neighbor_idx = index % a53;
2247 if (f_v) {
2248 cout << "parabolic_unrank_line_L4 idx=" << idx
2249 << " neighbor_idx=" << neighbor_idx << endl;
2250 }
2251
2252 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
2253 p1 = type_and_index_to_point_rk(5, idx, verbose_level);
2254 parabolic_neighbor53_unrank(neighbor_idx, v3, verbose_level);
2255
2256 Siegel_move_forward_by_index(rk1, p1, v3, v4, verbose_level);
2257 p2 = rank_point(v4, 1, verbose_level - 1);
2258
2259 if (f_v) {
2260 unrank_point(v5, 1, p1, verbose_level - 1);
2261 cout << "p1=" << p1 << " ";
2262 Int_vec_print(cout, v5, n);
2263 cout << endl;
2264 cout << "p2=" << p2 << " ";
2265 Int_vec_print(cout, v4, n);
2266 cout << endl;
2267 }
2268 if (f_v) {
2269 cout << "parabolic_unrank_line_L4 index=" << index
2270 << " p1=" << p1 << " p2=" << p2 << endl;
2271 }
2272}
2273
2274long int orthogonal::parabolic_rank_line_L4(long int p1, long int p2, int verbose_level)
2275{
2276 int f_v = (verbose_level >= 1);
2277 //int f_vv = (verbose_level >= 2);
2278 //int f_vvv = (verbose_level >= 3);
2279 long int index, idx, neighbor_idx, rk1, type;
2280
2281 if (f_v) {
2282 cout << "parabolic_rank_line_L4 "
2283 "p1=" << p1 << " p2=" << p2 << endl;
2284 }
2285 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
2286
2287 point_rk_to_type_and_index(p1, type, idx, verbose_level);
2288 if (type != 5) {
2289 cout << "parabolic_rank_line_L4 type != 5" << endl;
2290 exit(1);
2291 }
2292
2293 unrank_point(v4, 1, p2, verbose_level - 1);
2294 Siegel_move_backward_by_index(rk1, p1, v4, v3, verbose_level);
2295
2296 if (f_v) {
2297 cout << "after Siegel_move_backward_by_index";
2298 Int_vec_print(cout, v3, n);
2299 cout << endl;
2300 }
2301 neighbor_idx = parabolic_neighbor53_rank(v3, verbose_level);
2302
2303 if (f_v) {
2304 cout << "parabolic_rank_line_L4 idx=" << idx
2305 << " neighbor_idx=" << neighbor_idx << endl;
2306 }
2307
2308 index = idx * a53 + neighbor_idx;
2309
2310 if (f_v) {
2311 cout << "parabolic_rank_line_L4 index=" << index << endl;
2312 }
2313 return index;
2314}
2315
2317 long int &p1, long int &p2, long int index, int verbose_level)
2318// from P5 to P4
2319{
2320 int f_v = (verbose_level >= 1);
2321 //int f_vv = (verbose_level >= 2);
2322 //int f_vvv = (verbose_level >= 3);
2323 long int idx, neighbor_idx, rk1;
2324
2325 if (f_v) {
2326 cout << "parabolic_unrank_line_L5 index=" << index << endl;
2327 }
2328 if (index >= l5) {
2329 cout << "error in parabolic_unrank_line_L5 index too large" << endl;
2330 exit(1);
2331 }
2332 idx = index / a54;
2333 neighbor_idx = index % a54;
2334 if (f_v) {
2335 cout << "parabolic_unrank_line_L5 idx=" << idx
2336 << " neighbor_idx=" << neighbor_idx << endl;
2337 }
2338
2339 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
2340 p1 = type_and_index_to_point_rk(5, idx, verbose_level);
2341 parabolic_neighbor54_unrank(neighbor_idx, v3, verbose_level);
2342
2343 Siegel_move_forward_by_index(rk1, p1, v3, v4, verbose_level);
2344 p2 = rank_point(v4, 1, verbose_level - 1);
2345
2346 if (f_v) {
2347 unrank_point(v5, 1, p1, verbose_level - 1);
2348 cout << "p1=" << p1 << " ";
2349 Int_vec_print(cout, v5, n);
2350 cout << endl;
2351 cout << "p2=" << p2 << " ";
2352 Int_vec_print(cout, v4, n);
2353 cout << endl;
2354 }
2355 if (f_v) {
2356 cout << "parabolic_unrank_line_L5 index=" << index
2357 << " p1=" << p1 << " p2=" << p2 << endl;
2358 }
2359}
2360
2361long int orthogonal::parabolic_rank_line_L5(long int p1, long int p2, int verbose_level)
2362{
2363 int f_v = (verbose_level >= 1);
2364 //int f_vv = (verbose_level >= 2);
2365 //int f_vvv = (verbose_level >= 3);
2366 long int index, idx, neighbor_idx, rk1, type;
2367
2368 if (f_v) {
2369 cout << "parabolic_rank_line_L5 p1=" << p1 << " p2=" << p2 << endl;
2370 }
2371 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
2372
2373 point_rk_to_type_and_index(p1, type, idx, verbose_level);
2374 if (type != 5) {
2375 cout << "parabolic_rank_line_L5 type != 5" << endl;
2376 exit(1);
2377 }
2378
2379 unrank_point(v4, 1, p2, verbose_level - 1);
2380 Siegel_move_backward_by_index(rk1, p1, v4, v3, verbose_level);
2381
2382 if (f_v) {
2383 cout << "after Siegel_move_backward_by_index";
2384 Int_vec_print(cout, v3, n);
2385 cout << endl;
2386 }
2387 neighbor_idx = parabolic_neighbor54_rank(v3, verbose_level);
2388
2389 if (f_v) {
2390 cout << "parabolic_rank_line_L5 idx=" << idx
2391 << " neighbor_idx=" << neighbor_idx << endl;
2392 }
2393
2394 index = idx * a54 + neighbor_idx;
2395
2396 if (f_v) {
2397 cout << "parabolic_rank_line_L5 index=" << index << endl;
2398 }
2399 return index;
2400}
2401
2403 long int &p1, long int &p2, long int index, int verbose_level)
2404// within P5
2405{
2406 int f_v = (verbose_level >= 1);
2407 //int f_vv = (verbose_level >= 2);
2408 //int f_vvv = (verbose_level >= 3);
2409 long int pt1, pt2;
2410
2411 if (f_v) {
2412 cout << "parabolic_unrank_line_L6 index=" << index << endl;
2413 }
2414 if (index >= l6) {
2415 cout << "error in parabolic_unrank_line_L6 "
2416 "index too large" << endl;
2417 exit(1);
2418 }
2419 subspace->parabolic_unrank_line(pt1, pt2, index, verbose_level);
2420 subspace->unrank_point(v1, 1, pt1, verbose_level - 1);
2421 subspace->unrank_point(v2, 1, pt2, verbose_level - 1);
2422 v1[n - 2] = 0;
2423 v1[n - 1] = 0;
2424 v2[n - 2] = 0;
2425 v2[n - 1] = 0;
2426 p1 = rank_point(v1, 1, verbose_level - 1);
2427 p2 = rank_point(v2, 1, verbose_level - 1);
2428
2429 if (f_v) {
2430 cout << "parabolic_unrank_line_L6 "
2431 "index=" << index
2432 << " p1=" << p1 << " p2=" << p2 << endl;
2433 }
2434}
2435
2437 long int p1, long int p2, int verbose_level)
2438{
2439 int f_v = (verbose_level >= 1);
2440 //int f_vv = (verbose_level >= 2);
2441 //int f_vvv = (verbose_level >= 3);
2442 long int pt1, pt2;
2443 long int index;
2444
2445 if (f_v) {
2446 cout << "parabolic_rank_line_L6 p1=" << p1 << " p2=" << p2 << endl;
2447 }
2448 unrank_point(v1, 1, p1, verbose_level - 1);
2449 unrank_point(v2, 1, p2, verbose_level - 1);
2450 if (v1[n - 2] || v1[n - 1] || v2[n - 2] || v2[n - 1]) {
2451 cout << "parabolic_rank_line_L6 points not in subspace" << endl;
2452 exit(1);
2453 }
2454 pt1 = subspace->rank_point(v1, 1, verbose_level - 1);
2455 pt2 = subspace->rank_point(v2, 1, verbose_level - 1);
2456 index = subspace->parabolic_rank_line(pt1, pt2, verbose_level);
2457
2458 if (f_v) {
2459 cout << "parabolic_rank_line_L6 index=" << index << endl;
2460 }
2461 return index;
2462}
2463
2465 long int &p1, long int &p2, long int index, int verbose_level)
2466// from P6 = {Q} to P5 via P3
2467{
2468 int f_v = (verbose_level >= 1);
2469 //int f_vv = (verbose_level >= 2);
2470 //int f_vvv = (verbose_level >= 3);
2471
2472 if (f_v) {
2473 cout << "parabolic_unrank_line_L7 index=" << index << endl;
2474 }
2475 if (index >= l7) {
2476 cout << "error in parabolic_unrank_line_L7 "
2477 "index too large" << endl;
2478 exit(1);
2479 }
2480 p1 = pt_Q;
2481 p2 = type_and_index_to_point_rk(5, index, verbose_level);
2482
2483 if (f_v) {
2484 cout << "parabolic_unrank_line_L7 "
2485 "index=" << index << " p1=" << p1 << " p2=" << p2 << endl;
2486 }
2487}
2488
2489long int orthogonal::parabolic_rank_line_L7(long int p1, long int p2, int verbose_level)
2490{
2491 int f_v = (verbose_level >= 1);
2492 //int f_vv = (verbose_level >= 2);
2493 //int f_vvv = (verbose_level >= 3);
2494 long int type, index;
2495
2496 if (f_v) {
2497 cout << "parabolic_rank_line_L7 p1=" << p1 << " p2=" << p2 << endl;
2498 }
2499 if (p1 != pt_Q) {
2500 cout << "parabolic_rank_line_L7 p1 != pt_Q" << endl;
2501 exit(1);
2502 }
2503 point_rk_to_type_and_index(p2, type, index, verbose_level);
2504 if (type != 5) {
2505 cout << "parabolic_rank_line_L7 type != 5" << endl;
2506 exit(1);
2507 }
2508
2509 if (f_v) {
2510 cout << "parabolic_rank_line_L7 index=" << index << endl;
2511 }
2512 return index;
2513}
2514
2516 long int &p1, long int &p2, long int index, int verbose_level)
2517// from P7 = {P} to P5 via P4
2518{
2519 int f_v = (verbose_level >= 1);
2520 //int f_vv = (verbose_level >= 2);
2521 //int f_vvv = (verbose_level >= 3);
2522
2523 if (f_v) {
2524 cout << "parabolic_unrank_line_L8 index=" << index << endl;
2525 }
2526 if (index >= l8) {
2527 cout << "error in parabolic_unrank_line_L8 "
2528 "index too large" << endl;
2529 exit(1);
2530 }
2531 p1 = pt_P;
2532 p2 = type_and_index_to_point_rk(5, index, verbose_level);
2533
2534 if (f_v) {
2535 cout << "parabolic_unrank_line_L8 index=" << index
2536 << " p1=" << p1 << " p2=" << p2 << endl;
2537 }
2538}
2539
2540long int orthogonal::parabolic_rank_line_L8(long int p1, long int p2, int verbose_level)
2541{
2542 int f_v = (verbose_level >= 1);
2543 //int f_vv = (verbose_level >= 2);
2544 //int f_vvv = (verbose_level >= 3);
2545 long int type, index;
2546
2547 if (f_v) {
2548 cout << "parabolic_rank_line_L8 p1=" << p1 << " p2=" << p2 << endl;
2549 }
2550 if (p1 != pt_P) {
2551 cout << "parabolic_rank_line_L8 p1 != pt_P" << endl;
2552 exit(1);
2553 }
2554 point_rk_to_type_and_index(p2, type, index, verbose_level);
2555 if (type != 5) {
2556 cout << "parabolic_rank_line_L8 type != 5" << endl;
2557 exit(1);
2558 }
2559
2560 if (f_v) {
2561 cout << "parabolic_rank_line_L8 index=" << index << endl;
2562 }
2563 return index;
2564}
2565
2566long int orthogonal::parabolic_line_type_given_point_types(long int pt1, long int pt2,
2567 long int pt1_type, long int pt2_type, int verbose_level)
2568{
2569 int f_v = (verbose_level >= 1);
2570
2571
2572 if (f_v) {
2573 cout << "parabolic_line_type_given_point_types "
2574 "pt1=" << pt1 << " pt2=" << pt2 << endl;
2575 }
2576 if (pt1_type > pt2_type) {
2578 pt2, pt1, pt2_type, pt1_type, verbose_level);
2579 }
2580
2581 // from now on, we assume pt1_type <= pt2_type
2582
2583 if (pt1_type == 1) {
2584 if (f_even) {
2585 return 1;
2586 }
2587 else {
2588 if (pt2_type == 1) {
2589 return parabolic_decide_P11_odd(pt1, pt2);
2590 }
2591 else if (pt2_type == 2) {
2592 return 3;
2593 }
2594 else if (pt2_type == 3) {
2595 return 3;
2596 }
2597 else if (pt2_type == 4) {
2598 return 3;
2599 }
2600 else if (pt2_type == 5) {
2601 return 1;
2602 }
2603 }
2604 }
2605 else if (pt1_type == 2) {
2606 if (f_even) {
2607 if (pt2_type == 2) {
2608 return parabolic_decide_P22_even(pt1, pt2);
2609 }
2610 else if (pt2_type == 3) {
2611 return 3;
2612 }
2613 else if (pt2_type == 4) {
2614 return 3;
2615 }
2616 else if (pt2_type == 5) {
2617 return parabolic_decide_P22_even(pt1, pt2);
2618 }
2619 }
2620 else {
2621 if (pt2_type == 2) {
2622 return parabolic_decide_P22_odd(pt1, pt2);
2623 }
2624 else if (pt2_type == 3) {
2625 return 3;
2626 }
2627 else if (pt2_type == 4) {
2628 return 3;
2629 }
2630 else if (pt2_type == 5) {
2631 return 2;
2632 }
2633 }
2634 }
2635 else if (pt1_type == 3) {
2636 if (f_even) {
2637 if (pt2_type == 3) {
2638 return parabolic_decide_P33(pt1, pt2);
2639 }
2640 else if (pt2_type == 4) {
2641 return 3;
2642 }
2643 else if (pt2_type == 5) {
2644 return parabolic_decide_P35(pt1, pt2);
2645 }
2646 else if (pt2_type == 6) {
2647 return 7;
2648 }
2649 }
2650 else {
2651 if (pt2_type == 3) {
2652 return parabolic_decide_P33(pt1, pt2);
2653 }
2654 else if (pt2_type == 4) {
2655 return 3;
2656 }
2657 else if (pt2_type == 5) {
2658 return parabolic_decide_P35(pt1, pt2);
2659 }
2660 else if (pt2_type == 6) {
2661 return 7;
2662 }
2663 }
2664 }
2665 else if (pt1_type == 4) {
2666 if (f_even) {
2667 if (pt2_type == 4) {
2668 return parabolic_decide_P44(pt1, pt2);
2669 }
2670 else if (pt2_type == 5) {
2671 return parabolic_decide_P45(pt1, pt2);
2672 }
2673 else if (pt2_type == 7) {
2674 return 8;
2675 }
2676 }
2677 else {
2678 if (pt2_type == 4) {
2679 return parabolic_decide_P44(pt1, pt2);
2680 }
2681 else if (pt2_type == 5) {
2682 return parabolic_decide_P45(pt1, pt2);
2683 }
2684 else if (pt2_type == 7) {
2685 return 8;
2686 }
2687 }
2688 }
2689 else if (pt1_type == 5) {
2690 if (pt2_type == 5) {
2691 return 6;
2692 }
2693 else if (pt2_type == 6) {
2694 return 7;
2695 }
2696 else if (pt2_type == 7) {
2697 return 8;
2698 }
2699 }
2700 cout << "orthogonal::parabolic_line_type_given_point_types "
2701 "illegal combination" << endl;
2702 cout << "pt1_type = " << pt1_type << endl;
2703 cout << "pt2_type = " << pt2_type << endl;
2704 exit(1);
2705}
2706
2707int orthogonal::parabolic_decide_P11_odd(long int pt1, long int pt2)
2708{
2709 int verbose_level = 0;
2710
2711 unrank_point(v1, 1, pt1, verbose_level - 1);
2712 unrank_point(v2, 1, pt2, verbose_level - 1);
2713 //cout << "parabolic_decide_P11_odd" << endl;
2714 //int_vec_print(cout, v1, n); cout << endl;
2715 //int_vec_print(cout, v2, n); cout << endl;
2716
2717 if (is_ending_dependent(v1, v2)) {
2718 return 1;
2719 }
2720 else {
2721 return 3;
2722 }
2723}
2724
2725int orthogonal::parabolic_decide_P22_even(long int pt1, long int pt2)
2726{
2727 int verbose_level = 0;
2728
2729 unrank_point(v1, 1, pt1, verbose_level - 1);
2730 unrank_point(v2, 1, pt2, verbose_level - 1);
2731 //cout << "parabolic_decide_P22_even" << endl;
2732 //int_vec_print(cout, v1, n); cout << endl;
2733 //int_vec_print(cout, v2, n); cout << endl;
2734
2735
2736 if (is_ending_dependent(v1, v2)) {
2737 //cout << "ending is dependent, i.e. 1 or 2" << endl;
2739 return 1;
2740 }
2741 else {
2742 return 2;
2743 }
2744 }
2745 else {
2746 //cout << "ending is not dependent, hence 3" << endl;
2747 return 3;
2748 }
2749}
2750
2751int orthogonal::parabolic_decide_P22_odd(long int pt1, long int pt2)
2752{
2753 int verbose_level = 0;
2754
2755 unrank_point(v1, 1, pt1, verbose_level - 1);
2756 unrank_point(v2, 1, pt2, verbose_level - 1);
2757 if (is_ending_dependent(v1, v2)) {
2758 return 2;
2759 }
2760 else {
2761 return 3;
2762 }
2763}
2764
2765int orthogonal::parabolic_decide_P33(long int pt1, long int pt2)
2766{
2767 int verbose_level = 0;
2768
2769 unrank_point(v1, 1, pt1, verbose_level - 1);
2770 unrank_point(v2, 1, pt2, verbose_level - 1);
2771 //cout << "parabolic_decide_P33" << endl;
2772 if (is_ending_dependent(v1, v2)) {
2773 //cout << "ending is dependent" << endl;
2774 if (triple_is_collinear(pt1, pt2, pt_Q)) {
2775 return 7;
2776 }
2777 else {
2778 return 4;
2779 }
2780 }
2781 else {
2782 cout << "parabolic_decide_P33 ending is not dependent" << endl;
2783 exit(1);
2784 }
2785}
2786
2787int orthogonal::parabolic_decide_P35(long int pt1, long int pt2)
2788{
2789 //cout << "parabolic_decide_P35 pt1 = " << pt1
2790 //<< " pt2=" << pt2 << endl;
2791 //unrank_point(v1, 1, pt1, verbose_level - 1);
2792 //unrank_point(v2, 1, pt2, verbose_level - 1);
2793 if (triple_is_collinear(pt1, pt2, pt_Q)) {
2794 return 7;
2795 }
2796 else {
2797 return 4;
2798 }
2799}
2800
2801int orthogonal::parabolic_decide_P45(long int pt1, long int pt2)
2802{
2803 //unrank_point(v1, 1, pt1, verbose_level - 1);
2804 //unrank_point(v2, 1, pt2, verbose_level - 1);
2805 if (triple_is_collinear(pt1, pt2, pt_P)) {
2806 return 8;
2807 }
2808 else {
2809 return 5;
2810 }
2811}
2812
2813int orthogonal::parabolic_decide_P44(long int pt1, long int pt2)
2814{
2815 int verbose_level = 0;
2816
2817 unrank_point(v1, 1, pt1, verbose_level - 1);
2818 unrank_point(v2, 1, pt2, verbose_level - 1);
2819 if (is_ending_dependent(v1, v2)) {
2820 if (triple_is_collinear(pt1, pt2, pt_P)) {
2821 return 8;
2822 }
2823 else {
2824 return 5;
2825 }
2826 }
2827 else {
2828 cout << "parabolic_decide_P44 ending is not dependent" << endl;
2829 exit(1);
2830 }
2831}
2832
2834 long int rk2, int *x, int *y, int *z, int verbose_level)
2835// m = Witt index
2836{
2837 int f_v = (verbose_level >= 1);
2838 int i;
2839
2840 for (i = 0; i < n; i++) {
2841 x[i] = 0;
2842 z[i] = 0;
2843 }
2844 x[1] = 1;
2845
2846 if (f_v) {
2847 cout << "find_root_parabolic_xyz rk2=" << rk2 << endl;
2848 }
2849 unrank_point(y, 1, rk2, verbose_level - 1);
2850 if (f_v) {
2851 Int_vec_print(cout, y, n);
2852 cout << endl;
2853 }
2854 if (y[1]) {
2855 z[2] = 1;
2856 return;
2857 }
2858 if (y[2] && y[0] == 0) {
2859 z[0] = 1;
2860 z[1] = 1;
2861 z[2] = F->negate(1);
2862 return;
2863 }
2864 if (n == 3) {
2865 cout << "find_root_parabolic_xyz n == 3, "
2866 "we should not be in this case" << endl;
2867 exit(1);
2868 }
2869 // now y[2] = 0 or y = (*0*..) and
2870 // m > 1 and y_i \neq 0 for some i \ge 3
2871 for (i = 3; i < n; i++) {
2872 if (y[i]) {
2873 if (EVEN(i)) {
2874 z[2] = 1;
2875 z[i - 1] = 1;
2876 return;
2877 }
2878 else {
2879 z[2] = 1;
2880 z[i + 1] = 1;
2881 return;
2882 }
2883 }
2884 }
2885 cout << "error in find_root_parabolic_xyz" << endl;
2886 exit(1);
2887}
2888
2889long int orthogonal::find_root_parabolic(long int rk2, int verbose_level)
2890// m = Witt index
2891{
2892 int f_v = (verbose_level >= 1);
2893 long int root, u, v;
2894
2895 if (f_v) {
2896 cout << "find_root_parabolic rk2=" << rk2 << endl;
2897 }
2898 if (rk2 == 0) {
2899 cout << "find_root_parabolic: rk2 must not be 0" << endl;
2900 exit(1);
2901 }
2902#if 0
2903 if (m == 1) {
2904 cout << "find_root_parabolic: m must not be 1" << endl;
2905 exit(1);
2906 }
2907#endif
2909 find_root_x, find_root_y, find_root_z, verbose_level);
2910 if (f_v) {
2911 cout << "found root: ";
2912 Int_vec_print(cout, find_root_x, n);
2913 Int_vec_print(cout, find_root_y, n);
2914 Int_vec_print(cout, find_root_z, n);
2915 cout << endl;
2916 }
2918 if (u == 0) {
2919 cout << "find_root_parabolic u=" << u << endl;
2920 exit(1);
2921 }
2923 if (v == 0) {
2924 cout << "find_root_parabolic v=" << v << endl;
2925 exit(1);
2926 }
2927 root = rank_point(find_root_z, 1, verbose_level - 1);
2928 if (f_v) {
2929 cout << "find_root_parabolic root=" << root << endl;
2930 }
2931 return root;
2932}
2933
2935 int line_type, long int pt1, long int pt2,
2936 long int &cpt1, long int &cpt2, int verbose_level)
2937{
2938 int f_v = (verbose_level >= 1);
2939
2940 if (f_v) {
2941 cout << "parabolic_canonical_points_of_line "
2942 "line_type=" << line_type
2943 << " pt1=" << pt1 << " pt2=" << pt2 << endl;
2944 }
2945 if (line_type == 1) {
2946 if (f_even) {
2947 parabolic_canonical_points_L1_even(pt1, pt2, cpt1, cpt2);
2948 }
2949 else {
2950 parabolic_canonical_points_separate_P5(pt1, pt2, cpt1, cpt2);
2951 }
2952 }
2953 else if (line_type == 2) {
2954 parabolic_canonical_points_separate_P5(pt1, pt2, cpt1, cpt2);
2955 }
2956 else if (line_type == 3) {
2957 parabolic_canonical_points_L3(pt1, pt2, cpt1, cpt2);
2958 }
2959 else if (line_type == 4) {
2960 parabolic_canonical_points_separate_P5(pt1, pt2, cpt1, cpt2);
2961 }
2962 else if (line_type == 5) {
2963 parabolic_canonical_points_separate_P5(pt1, pt2, cpt1, cpt2);
2964 }
2965 else if (line_type == 6) {
2966 cpt1 = pt1;
2967 cpt2 = pt2;
2968 }
2969 else if (line_type == 7) {
2970 parabolic_canonical_points_L7(pt1, pt2, cpt1, cpt2);
2971 }
2972 else if (line_type == 8) {
2973 parabolic_canonical_points_L8(pt1, pt2, cpt1, cpt2);
2974 }
2975 if (f_v) {
2976 cout << "parabolic_canonical_points_of_line "
2977 "of type " << line_type << endl;
2978 cout << "pt1=" << pt1 << " pt2=" << pt2 << endl;
2979 cout << "cpt1=" << cpt1 << " cpt2=" << cpt2 << endl;
2980 }
2981}
2982
2984 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
2985{
2986 int verbose_level = 0;
2987 int i;
2988
2989 unrank_point(v1, 1, pt1, verbose_level - 1);
2990 unrank_point(v2, 1, pt2, verbose_level - 1);
2991
2992 //cout << "parabolic_canonical_points_L1_even" << endl;
2993 //int_vec_print(cout, v1, n); cout << endl;
2994 //int_vec_print(cout, v2, n); cout << endl;
2995
2996 Gauss_step(v2, v1, n, n - 1);
2997
2998
2999 //cout << "after Gauss_step n - 1" << endl;
3000 //int_vec_print(cout, v1, n); cout << endl;
3001 //int_vec_print(cout, v2, n); cout << endl;
3002
3003 if (!is_zero_vector(v1 + n - 2, 1, 2)) {
3004 cout << "parabolic_canonical_points_L1_even ending "
3005 "of v1 is not zero" << endl;
3006 exit(1);
3007 }
3008 for (i = 1; i < n - 2; i++) {
3009 if (v2[i]) {
3010 Gauss_step(v1, v2, n, i);
3011 //cout << "after Gauss_step " << i << endl;
3012 //int_vec_print(cout, v1, n); cout << endl;
3013 //int_vec_print(cout, v2, n); cout << endl;
3014
3015 if (!is_zero_vector(v2 + 1, 1, n - 3)) {
3016 cout << "parabolic_canonical_points_L1_even "
3017 "not zero" << endl;
3018 exit(1);
3019 }
3020 break;
3021 }
3022 }
3023 cpt1 = rank_point(v1, 1, verbose_level - 1);
3024 cpt2 = rank_point(v2, 1, verbose_level - 1);
3025 return;
3026}
3027
3029 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
3030{
3031 int verbose_level = 0;
3032 int i;
3033
3034 unrank_point(v1, 1, pt1, verbose_level - 1);
3035 unrank_point(v2, 1, pt2, verbose_level - 1);
3036#if 0
3037 cout << "parabolic_canonical_points_separate_P5" << endl;
3038 cout << "v1=";
3039 int_vec_print(cout, v1, n);
3040 cout << "v2=";
3041 int_vec_print(cout, v2, n);
3042 cout << endl;
3043#endif
3044 for (i = n - 2; i < n; i++)
3045 if (v1[i])
3046 break;
3047 if (i < n)
3048 Gauss_step(v2, v1, n, i);
3049#if 0
3050 cout << "after Gauss_step" << endl;
3051 cout << "v1=";
3052 int_vec_print(cout, v1, n);
3053 cout << "v2=";
3054 int_vec_print(cout, v2, n);
3055 cout << endl;
3056#endif
3057 if (!is_zero_vector(v1 + n - 2, 1, 2)) {
3058 cout << "parabolic_canonical_points_separate_P5 "
3059 "ending of v1 is not zero" << endl;
3060 cout << "v1=";
3061 Int_vec_print(cout, v1, n);
3062 cout << endl;
3063 exit(1);
3064 }
3065 cpt1 = rank_point(v1, 1, verbose_level - 1);
3066 cpt2 = rank_point(v2, 1, verbose_level - 1);
3067 return;
3068}
3069
3071 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
3072{
3073 int verbose_level = 0;
3074
3075 unrank_point(v1, 1, pt1, verbose_level - 1);
3076 unrank_point(v2, 1, pt2, verbose_level - 1);
3077 Gauss_step(v2, v1, n, n - 2);
3078 if (v1[n - 2]) {
3079 cout << "parabolic_canonical_points_L3 v1[n - 2]" << endl;
3080 exit(1);
3081 }
3082 Gauss_step(v1, v2, n, n - 1);
3083 if (v2[n - 1]) {
3084 cout << "parabolic_canonical_points_L3 v2[n - 1]" << endl;
3085 exit(1);
3086 }
3087 cpt1 = rank_point(v1, 1, verbose_level - 1);
3088 cpt2 = rank_point(v2, 1, verbose_level - 1);
3089 return;
3090}
3091
3093 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
3094{
3095 int verbose_level = 0;
3096 int i;
3097
3098 unrank_point(v1, 1, pt1, verbose_level - 1);
3099 unrank_point(v2, 1, pt2, verbose_level - 1);
3100 Gauss_step(v1, v2, n, n - 1);
3101 if (!is_zero_vector(v2 + n - 2, 1, 2)) {
3102 cout << "parabolic_canonical_points_L7 "
3103 "ending of v2 is not zero" << endl;
3104 exit(1);
3105 }
3106 // now v2 is a point in P5
3107
3108 for (i = 0; i < n - 2; i++) {
3109 if (v1[i]) {
3110 Gauss_step(v2, v1, n, i);
3111 if (!is_zero_vector(v1, 1, n - 2)) {
3112 cout << "parabolic_canonical_points_L7 "
3113 "not zero" << endl;
3114 exit(1);
3115 }
3116 break;
3117 }
3118 }
3119 cpt1 = rank_point(v1, 1, verbose_level - 1);
3120 cpt2 = rank_point(v2, 1, verbose_level - 1);
3121 if (cpt1 != pt_Q) {
3122 cout << "parabolic_canonical_points_L7 "
3123 "cpt1 != pt_Q" << endl;
3124 exit(1);
3125 }
3126 return;
3127}
3128
3130 long int pt1, long int pt2, long int &cpt1, long int &cpt2)
3131{
3132 int verbose_level = 0;
3133 int i;
3134
3135 unrank_point(v1, 1, pt1, verbose_level - 1);
3136 unrank_point(v2, 1, pt2, verbose_level - 1);
3137 Gauss_step(v1, v2, n, n - 2);
3138 if (!is_zero_vector(v2 + n - 2, 1, 2)) {
3139 cout << "parabolic_canonical_points_L8 "
3140 "ending of v2 is not zero" << endl;
3141 exit(1);
3142 }
3143 // now v2 is a point in P5
3144
3145 for (i = 0; i < n - 2; i++) {
3146 if (v1[i]) {
3147 Gauss_step(v2, v1, n, i);
3148 if (!is_zero_vector(v1, 1, n - 2)) {
3149 cout << "parabolic_canonical_points_L8 "
3150 "not zero" << endl;
3151 exit(1);
3152 }
3153 break;
3154 }
3155 }
3156 cpt1 = rank_point(v1, 1, verbose_level - 1);
3157 cpt2 = rank_point(v2, 1, verbose_level - 1);
3158 if (cpt1 != pt_P) {
3159 cout << "parabolic_canonical_points_L8 "
3160 "cpt1 != pt_P" << endl;
3161 exit(1);
3162 }
3163 return;
3164}
3165
3167 int *u, int *v, int stride, int m)
3168{
3169 int a, b, c;
3170
3172 u + stride, v + stride, stride, m);
3173 if (f_even) {
3174 return a;
3175 }
3176 b = F->mult(2, u[0]);
3177 b = F->mult(b, v[0]);
3178 c = F->add(a, b);
3179 return c;
3180}
3181
3182
3184 int *v, int stride, int n)
3185{
3186 if (v[0]) {
3187 if (v[0] != 1) {
3188 F->PG_element_normalize_from_front(v, stride, n);
3189 }
3190 }
3191 else {
3192 F->PG_element_normalize(v, stride, n);
3193 }
3194}
3195
3197 int *v, int stride)
3198{
3199 int i, a, av;
3200
3201 if (v[0]) {
3202 F->PG_element_normalize_from_front(v, stride, n);
3203 return;
3204 }
3205 for (i = n - 3; i >= 0; i--) {
3206 if (v[i * stride])
3207 break;
3208 }
3209 if (i < 0) {
3210 cout << "parabolic_normalize_point_wrt_subspace i < 0" << endl;
3211 exit(1);
3212 }
3213 a = v[i * stride];
3214 //cout << "parabolic_normalize_point_wrt_subspace "
3215 // "a=" << a << " in position " << i << endl;
3216 av = F->inverse(a);
3217 for (i = 0; i < n; i++) {
3218 v[i * stride] = F->mult(av, v[i * stride]);
3219 }
3220}
3221
3222void orthogonal::parabolic_point_properties(int *v, int stride, int n,
3223 int &f_start_with_one, int &middle_value, int &end_value,
3224 int verbose_level)
3225{
3226 int f_v = (verbose_level >= 1);
3227 int m;
3228
3229 if (f_v) {
3230 cout << "orthogonal::parabolic_point_properties ";
3231 Int_vec_print(cout, v, n);
3232 cout << endl;
3233 }
3234 m = (n - 1) / 2;
3235 if (v[0]) {
3236 if (v[0] != 1) {
3237 cout << "error in parabolic_point_properties: "
3238 "v[0] != 1" << endl;
3239 exit(1);
3240 }
3241 f_start_with_one = TRUE;
3242 }
3243 else {
3244 f_start_with_one = FALSE;
3245 F->PG_element_normalize(v + 1, stride, n - 1);
3246 if (f_v) {
3247 cout << "orthogonal::parabolic_point_properties "
3248 "after normalization: ";
3249 Int_vec_print(cout, v, n);
3250 cout << endl;
3251 }
3252 }
3254 v + 1 * stride, stride, m - 1);
3256 v + (1 + 2 * (m - 1)) * stride, stride, 1);
3257}
3258
3260{
3261 int i, j, *V1, *V2, a, b;
3262
3263 V1 = NULL;
3264 V2 = NULL;
3265 for (i = 1; i < n - 2; i++) {
3266 if (vec1[i] == 0 && vec2[i] == 0)
3267 continue;
3268 if (vec1[i] == 0) {
3269 V1 = vec2;
3270 V2 = vec1;
3271 }
3272 else {
3273 V1 = vec1;
3274 V2 = vec2;
3275 }
3276 a = F->mult(V2[i], F->inverse(V1[i]));
3277 for (j = i; j < n - 2; j++) {
3278 b = F->add(F->mult(a, V1[j]), V2[j]);
3279 V2[j] = b;
3280 }
3281 break;
3282 }
3283 return is_zero_vector(V2 + 1, 1, n - 3);
3284}
3285
3286
3287}}}
3288
void parabolic_neighbor54_unrank(long int index, int *v, int verbose_level)
long int parabolic_rank_line_L1_even(long int p1, long int p2, int verbose_level)
long int rank_point(int *v, int stride, int verbose_level)
void parabolic_odd_type2_index_to_point(long int index, int *v, int verbose_level)
void parabolic_unrank_line(long int &p1, long int &p2, long int rk, int verbose_level)
void parabolic_canonical_points_L8(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void Siegel_move_backward_by_index(long int rk1, long int rk2, int *w, int *v, int verbose_level)
void Siegel_move_forward_by_index(long int rk1, long int rk2, int *v, int *w, int verbose_level)
long int parabolic_odd_type_and_index_to_point_rk(long int type, long int index, int verbose_level)
void find_root_parabolic_xyz(long int rk2, int *x, int *y, int *z, int verbose_level)
void parabolic_unrank_line_L2_odd(long int &p1, long int &p2, long int index, int verbose_level)
int evaluate_hyperbolic_bilinear_form(int *u, int *v, int stride, int m)
void parabolic_canonical_points_L7(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void parabolic_odd_type1_index_to_point(long int index, int *v, int verbose_level)
void unrank_point(int *v, int stride, long int rk, int verbose_level)
int parabolic_type_and_index_to_point_rk(int type, int index, int verbose_level)
void Gauss_step(int *v1, int *v2, int len, int idx)
void parabolic_neighbor52_even_unrank(long int index, int *v, int verbose_level)
void parabolic_neighbor51_odd_unrank(long int index, int *v, int verbose_level)
long int parabolic_rank_line_L6(long int p1, long int p2, int verbose_level)
long int parabolic_rank_line(long int p1, long int p2, int verbose_level)
void parabolic_even_point_to_type_and_index(int *v, long int &type, long int &index, int verbose_level)
void change_form_value(int *u, int stride, int m, int multiplier)
void parabolic_point_properties(int *v, int stride, int n, int &f_start_with_one, int &value_middle, int &value_end, int verbose_level)
long int parabolic_rank_line_L4(long int p1, long int p2, int verbose_level)
void parabolic_neighbor34_unrank(long int index, int *v, int verbose_level)
long int parabolic_rank_line_L8(long int p1, long int p2, int verbose_level)
void parabolic_unrank_line_L1_odd(long int &p1, long int &p2, long int index, int verbose_level)
void parabolic_canonical_points_L3(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void Siegel_move_backward(int *v1, int *v2, int *v3, int *v4, int verbose_level)
void parabolic_unrank_line_L3(long int &p1, long int &p2, long int index, int verbose_level)
void scalar_multiply_vector(int *u, int stride, int len, int multiplier)
void parabolic_unrank_line_L4(long int &p1, long int &p2, long int index, int verbose_level)
int evaluate_parabolic_bilinear_form(int *u, int *v, int stride, int m)
int parabolic_even_type_and_index_to_point_rk(int type, int index, int verbose_level)
void parabolic_point_rk_to_type_and_index(long int rk, long int &type, long int &index, int verbose_level)
void parabolic_neighbor52_odd_unrank(long int index, int *v, int verbose_level)
void parabolic_odd_point_rk_to_type_and_index(long int rk, long int &type, long int &index, int verbose_level)
long int parabolic_rank_line_L7(long int p1, long int p2, int verbose_level)
long int parabolic_line_type_given_point_types(long int pt1, long int pt2, long int pt1_type, long int pt2_type, 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)
void parabolic_canonical_points_of_line(int line_type, long int pt1, long int pt2, long int &cpt1, long int &cpt2, int verbose_level)
long int parabolic_rank_line_L5(long int p1, long int p2, int verbose_level)
void parabolic_neighbor53_unrank(long int index, int *v, int verbose_level)
int triple_is_collinear(long int pt1, long int pt2, long int pt3)
void parabolic_unrank_line_L8(long int &p1, long int &p2, long int index, int verbose_level)
long int parabolic_rank_line_L2_odd(long int p1, long int p2, int verbose_level)
void parabolic_unrank_line_L7(long int &p1, long int &p2, long int index, int verbose_level)
void parabolic_canonical_points_L1_even(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void parabolic_even_point_rk_to_type_and_index(long int rk, long int &type, long int &index, int verbose_level)
int parabolic_rank_line_L2_even(long int p1, long int p2, int verbose_level)
void parabolic_unrank_line_L1_even(long int &p1, long int &p2, long int index, int verbose_level)
void parabolic_unrank_line_L2_even(long int &p1, long int &p2, long int index, int verbose_level)
void parabolic_canonical_points_separate_P5(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void parabolic_unrank_line_L5(long int &p1, long int &p2, long int index, int verbose_level)
void Siegel_move_forward(int *v1, int *v2, int *v3, int *v4, int verbose_level)
void parabolic_unrank_line_L6(long int &p1, long int &p2, long int index, int verbose_level)
long int parabolic_rank_line_L1_odd(long int p1, long int p2, int verbose_level)
long int parabolic_rank_line_L3(long int p1, long int p2, int verbose_level)
void parabolic_odd_point_to_type_and_index(int *v, long int &type, long int &index, int verbose_level)
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#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