Orbiter 2022
Combinatorial Objects
hermitian.cpp
Go to the documentation of this file.
1// hermitian.cpp
2//
3// Anton Betten
4// 3/19/2010
5//
6//
7//
8//
9
10#include "foundations.h"
11
12using namespace std;
13
14
15namespace orbiter {
16namespace layer1_foundations {
17namespace geometry {
18
19
21{
22 F = NULL;
23 Q = 0;
24 q = 0;
25 k = 0;
26 cnt_N = NULL;
27 cnt_N1 = NULL;
28 cnt_S = NULL;
29 cnt_Sbar = NULL;
30 norm_one_elements = NULL;
32 alpha = 0;
33 beta = 0;
34 log_beta = NULL;
35 beta_power = NULL;
36 //null();
37}
38
40{
41 if (cnt_N) {
43 }
44 if (cnt_N1) {
46 }
47 if (cnt_S) {
49 }
50 if (cnt_Sbar) {
52 }
55 }
58 }
59 if (log_beta) {
61 }
62 if (beta_power) {
64 }
65 null();
66}
67
69{
70}
71
72
73void hermitian::init(field_theory::finite_field *F, int nb_vars, int verbose_level)
74{
75 int f_v = (verbose_level >= 1);
76 int i, j, a;
78
80 hermitian::Q = F->q;
81 hermitian::q = NT.i_power_j(F->p, F->e >> 1);
82 hermitian::k = nb_vars;
83 if (f_v) {
84 cout << "hermitian::init Q=" << F->q << " q=" << q
85 << " nb_vars=" << nb_vars << endl;
86 }
87 if (F->e % 2) {
88 cout << "hermitian::init field must have a "
89 "quadratic subfield" << endl;
90 exit(1);
91 }
92 cnt_N = NEW_int(k + 1);
93 cnt_N1 = NEW_int(k + 1);
94 cnt_S = NEW_int(k + 1);
95 cnt_Sbar = NEW_int(k + 1);
96 cnt_N[0] = 0;
97 cnt_N1[0] = 0;
98 cnt_S[0] = 0;
99 cnt_Sbar[0] = 0;
100 cnt_N[1] = Q - 1;
101 cnt_N1[1] = q + 1;
102 cnt_S[1] = 1;
103 cnt_Sbar[1] = 0;
104 for (i = 2; i <= k; i++) {
105 cnt_N[i] = cnt_N[i - 1] * (Q - q - 1) + cnt_S[i - 1] * (Q - 1);
106 cnt_S[i] = cnt_N[i - 1] * (q + 1) + cnt_S[i - 1];
107 cnt_N1[i] = cnt_N[i] / (q - 1);
108 cnt_Sbar[i] = (cnt_S[i] - 1) / (Q - 1);
109 }
110 cout << " i : N1[i] : N[i] : S[i] : Sbar[i]" << endl;
111 for (i = 1; i <= k; i++) {
112 cout << setw(3) << i << " : ";
113 cout << setw(7) << cnt_N1[i] << " : ";
114 cout << setw(7) << cnt_N[i] << " : ";
115 cout << setw(7) << cnt_S[i] << " : ";
116 cout << setw(7) << cnt_Sbar[i] << endl;
117 }
118
121 log_beta = NEW_int(Q);
123 for (i = 0; i < Q; i++) {
125 log_beta[i] = -1;
126 }
127 for (i = 0; i < q + 1; i++) {
128 a = F->alpha_power(i * (q - 1));
129 norm_one_elements[i] = a;
131 }
132 if (f_v) {
133 cout << "the norm one elements are: ";
135 cout << endl;
136 }
137 cout << "i : norm_one_elements[i] : "
138 "F->N2(norm_one_elements[i])" << endl;
139 for (i = 0; i < q + 1; i++) {
140 cout << i << " : " << norm_one_elements[i] << " : "
141 << F->N2(norm_one_elements[i]) << endl;
142 }
143 alpha = F->p;
144 beta = F->alpha_power(q + 1);
145 for (i = 0; i < q - 1; i++) {
146 j = F->power(beta, i);
147 beta_power[i] = j;
148 log_beta[j] = i;
149 }
150}
151
153{
154 return cnt_Sbar[k];
155}
156
157void hermitian::unrank_point(int *v, int rk)
158{
159 Sbar_unrank(v, k, rk, 0 /*verbose_level*/);
160}
161
163{
164 int rk;
165
166 rk = Sbar_rank(v, k, 0 /*verbose_level*/);
167 return rk;
168}
169
171 long int *&Pts, int &nb_pts, int verbose_level)
172{
173 int i, rk;
174 int *v;
175
176 v = NEW_int(k);
177 nb_pts = nb_points();
178 Pts = NEW_lint(nb_pts);
179 for (i = 0; i < nb_pts; i++) {
180 unrank_point(v, i);
181 F->PG_element_rank_modified(v, 1, k, rk);
182 Pts[i] = rk;
183 }
184}
185
186void hermitian::list_all_N(int verbose_level)
187{
188 int *v;
189 int i, j, val0, val;
190
191 cout << "list_all_N:" << endl;
192 v = NEW_int(k);
193 for (i = 0; i < cnt_N[k]; i++) {
194 //cout << "i=" << i << endl;
195 //if (i == 165) {verbose_level += 2;}
196 N_unrank(v, k, i, verbose_level - 2);
197 val0 = evaluate_hermitian_form(v, k - 1);
198 val = evaluate_hermitian_form(v, k);
199 cout << setw(5) << i << " : ";
200 Int_vec_print(cout, v, k);
201 cout << " : " << val0;
202 cout << " : " << val << endl;
203 if (val == 0) {
204 cout << "error" << endl;
205 exit(1);
206 }
207 j = N_rank(v, k, verbose_level - 2);
208 if (j != i) {
209 cout << "error in ranking, i=" << i << " j=" << j << endl;
210 exit(1);
211 }
212 }
213}
214
215void hermitian::list_all_N1(int verbose_level)
216{
217 int *v;
218 int i, j, val0, val;
219
220 cout << "list_all_N1:" << endl;
221 v = NEW_int(k);
222 for (i = 0; i < cnt_N1[k]; i++) {
223 //cout << "i=" << i << endl;
224 //if (i == 15) {verbose_level += 2;}
225 N1_unrank(v, k, i, verbose_level - 2);
226 val0 = evaluate_hermitian_form(v, k - 1);
227 val = evaluate_hermitian_form(v, k);
228 cout << setw(5) << i << " : ";
229 Int_vec_print(cout, v, k);
230 cout << " : " << val0;
231 cout << " : " << val << endl;
232 if (val != 1) {
233 cout << "error" << endl;
234 exit(1);
235 }
236 j = N1_rank(v, k, verbose_level - 2);
237 if (j != i) {
238 cout << "error in ranking, i=" << i << " j=" << j << endl;
239 exit(1);
240 }
241 }
242}
243
244void hermitian::list_all_S(int verbose_level)
245{
246 int *v;
247 int i, j, val0, val;
248
249 cout << "list_all_S:" << endl;
250 v = NEW_int(k);
251 for (i = 0; i < cnt_S[k]; i++) {
252 //cout << "i=" << i << endl;
253 //if (i == 6) {verbose_level += 2;}
254 S_unrank(v, k, i, verbose_level - 2);
255 val0 = evaluate_hermitian_form(v, k - 1);
256 val = evaluate_hermitian_form(v, k);
257 cout << setw(5) << i << " : ";
258 Int_vec_print(cout, v, k);
259 cout << " : " << val0;
260 cout << " : " << val << endl;
261 if (val) {
262 cout << "error" << endl;
263 exit(1);
264 }
265 j = S_rank(v, k, verbose_level - 2);
266 if (j != i) {
267 cout << "error in ranking, i=" << i << " j=" << j << endl;
268 exit(1);
269 }
270 }
271}
272
273void hermitian::list_all_Sbar(int verbose_level)
274{
275 int *v;
276 int i, j, a, h, val0, val;
277
278 cout << "list_all_Sbar:" << endl;
279 v = NEW_int(k);
280 for (i = 0; i < cnt_Sbar[k]; i++) {
281 //cout << "i=" << i << endl;
282 //if (i == 6) {verbose_level += 2;}
283
284 for (h = 0; h < q - 1; h++) {
285 // loop over all elements in the subfield F_q:
286 a = F->alpha_power(h * (q + 1));
287
288
289 Sbar_unrank(v, k, i, 0 /*verbose_level*/);
291#if 0
292 for (u = 0; u < k; u++) {
293 v[u] = F->mult(a, v[u]);
294 }
295#endif
296 val0 = evaluate_hermitian_form(v, k - 1);
297 val = evaluate_hermitian_form(v, k);
298 cout << setw(5) << i << "," << h << " : ";
299 Int_vec_print(cout, v, k);
300 cout << " : " << val0;
301 cout << " : " << val << endl;
302 if (val) {
303 cout << "error" << endl;
304 exit(1);
305 }
306 j = Sbar_rank(v, k, 0 /*verbose_level*/);
307 if (j != i) {
308 cout << "error in ranking, i=" << i << " j=" << j << endl;
309 exit(1);
310 }
311 }
312 }
313}
314
315
317// \sum_{i=0}^{len-1} X_i^{q+1}
318{
319 int i, a, b;
320
321 a = 0;
322 for (i = 0; i < len; i++) {
323 b = F->N2(v[i]);
324 a = F->add(a, b);
325 //cout << "b=" << b << " a=" << a << endl;
326 }
327 //cout << "hermitian::evaluate_hermitian_form ";
328 //int_vec_print(cout, v, len);
329 //cout << "val=" << a << endl;
330 return a;
331}
332
333void hermitian::N_unrank(int *v, int len, int rk, int verbose_level)
334{
335 int f_v = (verbose_level >= 1);
336 int rk1, coset, rk0, coset0, A, val, m_val, log;
337
338 if (f_v) {
339 cout << "N_unrank len=" << len << " rk=" << rk << endl;
340 }
341 if (rk >= cnt_N[len]) {
342 cout << "hermitian::N_unrank fatal: rk >= cnt_N[len]" << endl;
343 exit(1);
344 }
345 if (len == 1) {
346 v[0] = rk + 1;
347 if (f_v) {
348 cout << "N_unrank len=" << len << " done: ";
349 Int_vec_print(cout, v, len);
350 cout << endl;
351 }
352 return;
353 }
354 A = Q - q - 1;
355 if (rk < A * cnt_N[len - 1]) {
356 if (f_v) {
357 cout << "N_unrank case 1" << endl;
358 }
359 coset = rk / cnt_N[len - 1];
360 rk1 = rk % cnt_N[len - 1];
361 N_unrank(v, len - 1, rk1, verbose_level - 1);
362 if (coset == 0) {
363 v[len - 1] = 0;
364 }
365 else {
366 coset--;
367 val = evaluate_hermitian_form(v, len - 1);
368 if (f_v) {
369 cout << "N_unrank case 1 val=" << val << endl;
370 }
371 coset0 = coset / (q + 1);
372 rk0 = coset % (q + 1);
373 if (f_v) {
374 cout << "N_unrank case 1 coset0=" << coset0
375 << " rk0=" << rk0 << endl;
376 }
377 m_val = F->negate(val);
378 if (f_v) {
379 cout << "N_unrank case 1 m_val=" << m_val << endl;
380 }
381 log = log_beta[m_val];
382 if (f_v) {
383 cout << "N_unrank case 1 log=" << log << endl;
384 }
385 if (log == -1) {
386 cout << "hermitian::N_unrank fatal: log == -1" << endl;
387 exit(1);
388 }
389 if (coset0 >= log) {
390 coset0++;
391 }
392 if (f_v) {
393 cout << "N_unrank case 1 coset0=" << coset0 << endl;
394 }
395 v[len - 1] = F->mult(F->alpha_power(coset0),
396 norm_one_elements[rk0]);
397 }
398 }
399 else {
400 if (f_v) {
401 cout << "N_unrank case 2" << endl;
402 }
403 rk -= A * cnt_N[len - 1];
404
405 coset = rk / cnt_S[len - 1];
406 if (f_v) {
407 cout << "N_unrank case 2 coset=" << coset << endl;
408 }
409 rk1 = rk % cnt_S[len - 1];
410 if (f_v) {
411 cout << "N_unrank case 2 rk1=" << rk1 << endl;
412 }
413 S_unrank(v, len - 1, rk1, verbose_level - 1);
414 v[len - 1] = 1 + coset;
415 }
416 if (f_v) {
417 cout << "N_unrank len=" << len << " done: ";
418 Int_vec_print(cout, v, len);
419 cout << endl;
420 }
421}
422
423int hermitian::N_rank(int *v, int len, int verbose_level)
424{
425 int f_v = (verbose_level >= 1);
426 int rk, rk1, coset, rk0, coset0, val, m_val, log, a;
427
428 if (f_v) {
429 cout << "N_rank len=" << len << endl;
430 Int_vec_print(cout, v, len);
431 cout << endl;
432 }
433 if (len == 1) {
434 rk = v[0] - 1;
435 if (f_v) {
436 cout << "N_rank len=" << len << " done, rk=" << rk << endl;
437 }
438 return rk;
439 }
440 val = evaluate_hermitian_form(v, len - 1);
441 if (val) {
442 if (f_v) {
443 cout << "N_rank case 1" << endl;
444 }
445 rk1 = N_rank(v, len - 1, verbose_level - 1);
446 // case 1
447 if (v[len - 1] == 0) {
448 coset = 0;
449 }
450 else {
451 m_val = F->negate(val);
452 if (f_v) {
453 cout << "N_rank case 1 m_val=" << m_val << endl;
454 }
455 log = log_beta[m_val];
456 if (f_v) {
457 cout << "N_rank case 1 log=" << log << endl;
458 }
459 if (log == -1) {
460 cout << "hermitian::N_rank fatal: log == -1" << endl;
461 exit(1);
462 }
463 a = F->N2(v[len - 1]);
464 coset0 = log_beta[a];
465 if (f_v) {
466 cout << "N_rank case 1 coset0=" << coset0 << endl;
467 }
468 a = F->mult(v[len - 1], F->inverse(F->alpha_power(coset0)));
469 if (coset0 > log) {
470 coset0--;
471 }
472 if (f_v) {
473 cout << "N_rank case 1 coset0=" << coset0 << endl;
474 }
476 if (rk0 == -1) {
477 cout << "N_rank not an norm one element" << endl;
478 exit(1);
479 }
480 if (f_v) {
481 cout << "N_rank case 1 rk0=" << rk0 << endl;
482 }
483 coset = coset0 * (q + 1) + rk0;
484 coset++;
485 }
486 rk = coset * cnt_N[len - 1] + rk1;
487 }
488 else {
489 if (f_v) {
490 cout << "N_rank case 2" << endl;
491 }
492 rk = (Q - q - 1) * cnt_N[len - 1];
493 coset = v[len - 1] - 1;
494 if (f_v) {
495 cout << " case 2 coset=" << coset << endl;
496 }
497 rk1 = S_rank(v, len - 1, verbose_level - 1);
498 if (f_v) {
499 cout << "N_rank case 2 rk1=" << rk1 << endl;
500 }
501 rk += coset * cnt_S[len - 1] + rk1;
502 }
503 if (f_v) {
504 cout << "N_rank len=" << len << " done, rk=" << rk << endl;
505 }
506 return rk;
507}
508
509void hermitian::N1_unrank(int *v, int len, int rk, int verbose_level)
510{
511 int f_v = (verbose_level >= 1);
512 int coset, rk2, coset2, rk1, coset1, val, new_val, log, A, a, i;
513
514 if (f_v) {
515 cout << "N1_unrank len=" << len << " rk=" << rk << endl;
516 }
517 if (rk >= cnt_N1[len]) {
518 cout << "hermitian::N1_unrank fatal: rk >= cnt_N1[len]" << endl;
519 exit(1);
520 }
521 if (len == 1) {
522 v[0] = norm_one_elements[rk];
523 if (f_v) {
524 cout << "N1_unrank len=" << len << " done: ";
525 Int_vec_print(cout, v, len);
526 cout << endl;
527 }
528 return;
529 }
530 if (rk < cnt_N1[len - 1]) {
531 if (f_v) {
532 cout << "N1_unrank case 0" << endl;
533 }
534 N1_unrank(v, len - 1, rk, verbose_level - 1);
535 v[len - 1] = 0;
536 if (f_v) {
537 cout << "N1_unrank len=" << len << " done: ";
538 Int_vec_print(cout, v, len);
539 cout << endl;
540 }
541 return;
542 }
543 rk -= cnt_N1[len - 1];
544 //A = (q + 1) * (cnt_N[len - 1] - cnt_N1[len - 1]);
545 A = (q + 1) * (q - 2) * cnt_N1[len - 1];
546 if (rk < A) {
547 if (f_v) {
548 cout << "N1_unrank case 1" << endl;
549 }
550 coset1 = rk / ((q - 2) * cnt_N1[len - 1]);
551 rk1 = rk % ((q - 2) * cnt_N1[len - 1]);
552 coset2 = rk1 / cnt_N1[len - 1];
553 rk2 = rk1 % cnt_N1[len - 1];
554 if (f_v) {
555 cout << "N1_unrank case 1 coset1=" << coset1
556 << " rk1=" << rk1 << endl;
557 }
558 if (f_v) {
559 cout << "N1_unrank case 1 coset2=" << coset2
560 << " rk2=" << rk2 << endl;
561 }
562
563 N1_unrank(v, len - 1, rk2, verbose_level - 1);
564 val = evaluate_hermitian_form(v, len - 1);
565 if (f_v) {
566 cout << "N1_unrank case 1 val=" << val << endl;
567 }
568 if (val != 1) {
569 cout << "N1_unrank case 1 error val=" << val
570 << " should be 1" << endl;
571 exit(1);
572 }
573 coset2++;
574 if (f_v) {
575 cout << "N1_unrank case 1 coset2=" << coset2 << endl;
576 }
577 a = F->alpha_power(coset2);
578 if (f_v) {
579 cout << "N1_unrank case 1 a=" << a << endl;
580 }
581 for (i = 0; i < len - 1; i++) {
582 v[i] = F->mult(a, v[i]);
583 }
584 val = evaluate_hermitian_form(v, len - 1);
585 if (f_v) {
586 cout << "N1_unrank case 1 val=" << val << endl;
587 }
588 new_val = F->add(1, F->negate(val));
589 if (f_v) {
590 cout << "N1_unrank case 1 new_val=" << new_val << endl;
591 }
592 log = log_beta[new_val];
593 if (f_v) {
594 cout << "N_unrank case 1 log=" << log << endl;
595 }
596 if (log == -1) {
597 cout << "hermitian::N_unrank fatal: log == -1" << endl;
598 exit(1);
599 }
600
601 v[len - 1] = F->mult(F->alpha_power(log),
602 norm_one_elements[coset1]);
603 }
604 else {
605 if (f_v) {
606 cout << "N1_unrank case 2" << endl;
607 }
608 rk -= A;
609
610 coset = rk / cnt_S[len - 1];
611 rk1 = rk % cnt_S[len - 1];
612 if (f_v) {
613 cout << "N1_unrank case 2 coset=" << coset
614 << " rk1=" << rk1 << endl;
615 }
616 S_unrank(v, len - 1, rk1, verbose_level - 1);
617 v[len - 1] = norm_one_elements[coset];
618 }
619 if (f_v) {
620 cout << "N1_unrank len=" << len << " done: ";
621 Int_vec_print(cout, v, len);
622 cout << endl;
623 }
624}
625
626int hermitian::N1_rank(int *v, int len, int verbose_level)
627{
628 int f_v = (verbose_level >= 1);
629 int rk, coset, rk2, coset2, rk1, coset1, val;
630 int new_val, log, A, a, av, i, log1;
631
632 if (f_v) {
633 cout << "N1_rank len=" << len << " : ";
634 Int_vec_print(cout, v, len);
635 cout << endl;
636 }
637 if (len == 1) {
638 rk = index_of_norm_one_element[v[0]];
639 if (f_v) {
640 cout << "N1_rank len=" << len << " done, "
641 "rk=" << rk << endl;
642 }
643 return rk;
644 }
645 if (v[len - 1] == 0) {
646 if (f_v) {
647 cout << "N1_rank case 0" << endl;
648 }
649 rk = N1_rank(v, len - 1, verbose_level - 1);
650 if (f_v) {
651 cout << "N1_rank len=" << len << " done, "
652 "rk=" << rk << endl;
653 }
654 return rk;
655 }
656 rk = cnt_N1[len - 1];
657
658
659 //A = (q + 1) * (cnt_N[len - 1] - cnt_N1[len - 1]);
660 A = (q + 1) * (q - 2) * cnt_N1[len - 1];
661 val = evaluate_hermitian_form(v, len - 1);
662 if (val) {
663 if (f_v) {
664 cout << "N1_rank case 1" << endl;
665 }
666 coset2 = log_beta[val];
667 a = F->alpha_power(coset2);
668 av = F->inverse(a);
669 if (f_v) {
670 cout << "N1_rank case 1 a=" << a << endl;
671 }
672 for (i = 0; i < len - 1; i++) {
673 v[i] = F->mult(av, v[i]);
674 }
675 rk2 = N1_rank(v, len - 1, verbose_level - 1);
676#if 0
677 val = evaluate_hermitian_form(v, len - 1);
678 if (val != 1) {
679 cout << "N1_rank val != 1" << endl;
680 exit(1);
681 }
682#endif
683 coset2--;
684
685 new_val = F->add(1, F->negate(val));
686 if (f_v) {
687 cout << "N1_rank case 1 new_val=" << new_val << endl;
688 }
689 log = log_beta[new_val];
690 if (f_v) {
691 cout << "N1_rank case 1 log=" << log << endl;
692 }
693 if (log == -1) {
694 cout << "hermitian::N1_rank fatal: log == -1" << endl;
695 exit(1);
696 }
697 a = F->N2(v[len - 1]);
698 log1 = log_beta[a];
699 if (log1 != log) {
700 cout << "hermitian::N1_rank fatal: log1 != log" << endl;
701 exit(1);
702 }
703 a = F->inverse(F->alpha_power(log));
704 a = F->mult(a, v[len - 1]);
705 coset1 = index_of_norm_one_element[a];
706 if (coset1 == -1) {
707 cout << "hermitian::N1_rank fatal: coset1 == -1" << endl;
708 exit(1);
709 }
710 rk1 = coset2 * cnt_N1[len - 1] + rk2;
711 rk += coset1 * ((q - 2) * cnt_N1[len - 1]) + rk1;
712 }
713 else {
714 if (f_v) {
715 cout << "N1_rank case 2" << endl;
716 }
717 rk += A;
718
719 rk1 = S_rank(v, len - 1, verbose_level - 1);
720 coset = index_of_norm_one_element[v[len - 1]];
721 if (f_v) {
722 cout << "N1_rank case 2 coset=" << coset
723 << " rk1=" << rk1 << endl;
724 }
725
726 rk += coset * cnt_S[len - 1] + rk1;
727 }
728
729
730 if (f_v) {
731 cout << "N1_rank len=" << len << " done, rk=" << rk << endl;
732 }
733 return rk;
734}
735
737 int len, int rk, int verbose_level)
738{
739 int f_v = (verbose_level >= 1);
740 int rk1, coset, log, val, m_val;
741
742 if (rk >= cnt_S[len]) {
743 cout << "hermitian::S_unrank fatal: "
744 "rk >= cnt_S[len]" << endl;
745 exit(1);
746 }
747 if (len == 1) {
748 v[0] = 0;
749 return;
750 }
751 if (rk < (q + 1) * cnt_N[len - 1]) {
752 if (f_v) {
753 cout << "S_unrank case 1" << endl;
754 }
755 coset = rk / cnt_N[len - 1];
756 rk1 = rk % cnt_N[len - 1];
757 if (f_v) {
758 cout << "S_unrank case 1 coset=" << coset
759 << " rk1=" << rk1 << endl;
760 }
761 N_unrank(v, len - 1, rk1, verbose_level);
762 val = evaluate_hermitian_form(v, len - 1);
763 if (f_v) {
764 cout << "S_unrank case 1 val=" << val << endl;
765 }
766 m_val = F->negate(val);
767 if (f_v) {
768 cout << "S_unrank case 1 m_val=" << m_val << endl;
769 }
770 log = log_beta[m_val];
771 if (f_v) {
772 cout << "S_unrank case 1 log=" << log << endl;
773 }
774 if (log == -1) {
775 cout << "hermitian::S_unrank fatal: log == -1" << endl;
776 exit(1);
777 }
778 v[len - 1] = F->mult(F->alpha_power(log),
779 norm_one_elements[coset]);
780 }
781 else {
782 if (f_v) {
783 cout << "S_unrank case 2" << endl;
784 }
785 rk -= (q + 1) * cnt_N[len - 1];
786 S_unrank(v, len - 1, rk, verbose_level);
787 v[len - 1] = 0;
788 }
789 if (f_v) {
790 cout << "S_unrank len=" << len << " done: ";
791 Int_vec_print(cout, v, len);
792 cout << endl;
793 }
794
795}
796
797int hermitian::S_rank(int *v, int len, int verbose_level)
798{
799 int f_v = (verbose_level >= 1);
800 int rk, rk1, coset, log, val, m_val, a, log1;
801
802 if (f_v) {
803 cout << "S_rank len=" << len << ": ";
804 Int_vec_print(cout, v, len);
805 cout << endl;
806 }
807 if (len == 1) {
808 if (v[0]) {
809 cout << "hermitian::S_rank v[0]" << endl;
810 exit(1);
811 }
812 return 0;
813 }
814 if (v[len - 1]) {
815 if (f_v) {
816 cout << "S_rank case 1" << endl;
817 }
818 rk1 = N_rank(v, len - 1, verbose_level);
819 val = evaluate_hermitian_form(v, len - 1);
820 if (f_v) {
821 cout << "S_rank case 1 val=" << val << endl;
822 }
823 m_val = F->negate(val);
824 if (f_v) {
825 cout << "S_rank case 1 m_val=" << m_val << endl;
826 }
827 log = log_beta[m_val];
828 if (f_v) {
829 cout << "S_rank case 1 log=" << log << endl;
830 }
831 if (log == -1) {
832 cout << "hermitian::S_rank fatal: log == -1" << endl;
833 exit(1);
834 }
835 a = F->N2(v[len - 1]);
836 log1 = log_beta[a];
837 if (log1 != log) {
838 cout << "hermitian::S_rank fatal: log1 != log" << endl;
839 exit(1);
840 }
841 a = F->mult(v[len - 1], F->inverse(F->alpha_power(log)));
842 coset = index_of_norm_one_element[a];
843 rk = coset * cnt_N[len - 1] + rk1;
844 }
845 else {
846 if (f_v) {
847 cout << "S_rank case 2" << endl;
848 }
849 rk = S_rank(v, len - 1, verbose_level);
850 rk += (q + 1) * cnt_N[len - 1];
851 }
852 if (f_v) {
853 cout << "S_rank len=" << len << " done, rk=" << rk << endl;
854 }
855 return rk;
856}
857
858
860 int len, int rk, int verbose_level)
861{
862 int f_v = (verbose_level >= 1);
863 int log, a, b, i;
864
865 if (rk >= cnt_Sbar[len]) {
866 cout << "hermitian::Sbar_unrank fatal: "
867 "rk >= cnt_Sbar[len]" << endl;
868 exit(1);
869 }
870 if (len == 1) {
871 cout << "hermitian::Sbar_unrank fatal: "
872 "len == 1" << endl;
873 exit(1);
874 }
875 if (rk < cnt_Sbar[len - 1]) {
876 if (f_v) {
877 cout << "Sbar_unrank case 1" << endl;
878 }
879 Sbar_unrank(v, len - 1, rk, verbose_level);
880 v[len - 1] = 0;
881 }
882 else {
883 if (f_v) {
884 cout << "Sbar_unrank case 2" << endl;
885 }
886 rk -= cnt_Sbar[len - 1];
887
888 N1_unrank(v, len - 1, rk, verbose_level);
889 a = F->negate(1);
890 log = log_beta[a];
891 b = F->alpha_power(log);
892 if (f_v) {
893 cout << "Sbar_unrank case 2 log=" << log << endl;
894 }
895 if (log == -1) {
896 cout << "hermitian::Sbar_unrank fatal: "
897 "log == -1" << endl;
898 exit(1);
899 }
900 for (i = 0; i < len - 1; i++) {
901 v[i] = F->mult(b, v[i]);
902 }
903 v[len - 1] = 1;
904 //v[len - 1] = F->mult(F->alpha_power(log),
905 // norm_one_elements[0]);
906 }
907 if (f_v) {
908 cout << "Sbar_unrank len=" << len << " done: ";
909 Int_vec_print(cout, v, len);
910 cout << endl;
911 }
912
913}
914
915int hermitian::Sbar_rank(int *v, int len, int verbose_level)
916{
917 int f_v = (verbose_level >= 1);
918 int rk, val, a, b, bv, log, i;
919
920 if (f_v) {
921 cout << "Sbar_rank len=" << len << " : ";
922 Int_vec_print(cout, v, len);
923 cout << endl;
924 }
925 if (len == 1) {
926 cout << "hermitian::Sbar_rank fatal: len == 1" << endl;
927 exit(1);
928 }
929 if (v[len - 1] == 0) {
930 if (f_v) {
931 cout << "Sbar_rank case 1" << endl;
932 }
933 rk = Sbar_rank(v, len - 1, verbose_level);
934 }
935 else {
936 if (f_v) {
937 cout << "Sbar_rank case 2" << endl;
938 }
939
940 F->PG_element_normalize(v, 1, len);
941 rk = cnt_Sbar[len - 1];
942
943 val = evaluate_hermitian_form(v, len - 1);
944 // val must be minus_one
945 a = F->negate(1);
946 if (val != a) {
947 cout << "Sbar_rank case 2 val != F->negate(1)" << endl;
948 exit(1);
949 }
950 log = log_beta[val];
951 b = F->alpha_power(log);
952 bv = F->inverse(b);
953 for (i = 0; i < len - 1; i++) {
954 v[i] = F->mult(v[i], bv);
955 }
956 val = evaluate_hermitian_form(v, len - 1);
957 if (val != 1) {
958 cout << "Sbar_rank case 2 val != 1" << endl;
959 exit(1);
960 }
961
962 rk += N1_rank(v, len - 1, verbose_level);
963 }
964
965 if (f_v) {
966 cout << "Sbar_rank done, rk=" << rk << endl;
967 }
968 return rk;
969}
970
971void hermitian::create_latex_report(int verbose_level)
972{
973 int f_v = (verbose_level >= 1);
974
975
976 if (f_v) {
977 cout << "hermitian::create_latex_report" << endl;
978 }
979
980 {
981 char str[1000];
982 string fname;
983 char title[1000];
984 char author[1000];
985
986 snprintf(str, 1000, "H_%d_%d.tex", k - 1, Q);
987 fname.assign(str);
988 snprintf(title, 1000, "Hermitian Variety ${\\rm H}(%d,%d)$", k - 1, Q);
989 //strcpy(author, "");
990 author[0] = 0;
991
992
993 {
994 ofstream ost(fname);
996
997 L.head(ost,
998 FALSE /* f_book*/,
999 TRUE /* f_title */,
1000 title, author,
1001 FALSE /* f_toc */,
1002 FALSE /* f_landscape */,
1003 TRUE /* f_12pt */,
1004 TRUE /* f_enlarged_page */,
1005 TRUE /* f_pagenumbers */,
1006 NULL /* extra_praeamble */);
1007
1008
1009 if (f_v) {
1010 cout << "hermitian::create_latex_report before report" << endl;
1011 }
1012 report(ost, verbose_level);
1013 if (f_v) {
1014 cout << "hermitian::create_latex_report after report" << endl;
1015 }
1016
1017
1018 L.foot(ost);
1019
1020 }
1022
1023 cout << "written file " << fname << " of size "
1024 << Fio.file_size(fname) << endl;
1025 }
1026
1027 if (f_v) {
1028 cout << "hermitian::create_latex_report done" << endl;
1029 }
1030}
1031
1032void hermitian::report(std::ostream &ost, int verbose_level)
1033{
1034 int f_v = (verbose_level >= 1);
1035
1036 if (f_v) {
1037 cout << "hermitian::report" << endl;
1038 }
1039
1040 //report_schemes(ost);
1041
1042 report_points(ost, verbose_level);
1043
1044 //report_points_by_type(ost, verbose_level);
1045
1046 //report_lines(ost, verbose_level);
1047
1048 if (f_v) {
1049 cout << "hermitian::report done" << endl;
1050 }
1051}
1052
1053void hermitian::report_points(std::ostream &ost, int verbose_level)
1054{
1055 long int rk;
1056 long int *rk_in_PG;
1057 long int nb_pts;
1058
1059 int *v;
1060
1061 v = NEW_int(k);
1062 nb_pts = nb_points();
1063
1064 rk_in_PG = NEW_lint(nb_pts);
1065
1066
1067 ost << "The Hermitian variety ${\\rm H}(" << k - 1 << "," << Q << ")$ "
1068 "contains " << nb_pts << " points:\\\\" << endl;
1069 ost << "\\begin{multicols}{2}" << endl;
1070 ost << "\\noindent" << endl;
1071 for (rk = 0; rk < nb_pts; rk++) {
1072 unrank_point(v, rk);
1073 F->PG_element_rank_modified_lint(v, 1, k, rk_in_PG[rk]);
1074 ost << "$P_{" << rk << "} = ";
1075 Int_vec_print(ost, v, k);
1076 ost << "=" << rk_in_PG[rk] << "$\\\\" << endl;
1077 }
1078 ost << "\\end{multicols}" << endl;
1079 ost << "All points: ";
1080 Lint_vec_print(ost, rk_in_PG, nb_pts);
1081 ost << "\\\\" << endl;
1082
1083 FREE_int(v);
1084 FREE_lint(rk_in_PG);
1085}
1086
1087
1088
1089}}}
1090
1091
void PG_element_rank_modified(int *v, int stride, int len, int &a)
void PG_element_rank_modified_lint(int *v, int stride, int len, long int &a)
void init(field_theory::finite_field *F, int nb_vars, int verbose_level)
Definition: hermitian.cpp:73
int N_rank(int *v, int len, int verbose_level)
Definition: hermitian.cpp:423
void report(std::ostream &ost, int verbose_level)
Definition: hermitian.cpp:1032
int N1_rank(int *v, int len, int verbose_level)
Definition: hermitian.cpp:626
void N1_unrank(int *v, int len, int rk, int verbose_level)
Definition: hermitian.cpp:509
void Sbar_unrank(int *v, int len, int rk, int verbose_level)
Definition: hermitian.cpp:859
void N_unrank(int *v, int len, int rk, int verbose_level)
Definition: hermitian.cpp:333
void report_points(std::ostream &ost, int verbose_level)
Definition: hermitian.cpp:1053
void S_unrank(int *v, int len, int rk, int verbose_level)
Definition: hermitian.cpp:736
int S_rank(int *v, int len, int verbose_level)
Definition: hermitian.cpp:797
int Sbar_rank(int *v, int len, int verbose_level)
Definition: hermitian.cpp:915
void list_of_points_embedded_in_PG(long int *&Pts, int &nb_pts, int verbose_level)
Definition: hermitian.cpp:170
void head(std::ostream &ost, int f_book, int f_title, const char *title, const char *author, int f_toc, int f_landscape, int f_12pt, int f_enlarged_page, int f_pagenumbers, const char *extras_for_preamble)
#define FREE_int(p)
Definition: foundations.h:640
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects