16namespace layer1_foundations {
75 int f_v = (verbose_level >= 1);
84 cout <<
"hermitian::init Q=" <<
F->
q <<
" q=" <<
q
85 <<
" nb_vars=" << nb_vars << endl;
88 cout <<
"hermitian::init field must have a "
89 "quadratic subfield" << endl;
104 for (i = 2; i <=
k; i++) {
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;
123 for (i = 0; i <
Q; i++) {
127 for (i = 0; i <
q + 1; i++) {
133 cout <<
"the norm one elements are: ";
137 cout <<
"i : norm_one_elements[i] : "
138 "F->N2(norm_one_elements[i])" << endl;
139 for (i = 0; i <
q + 1; i++) {
145 for (i = 0; i <
q - 1; i++) {
171 long int *&Pts,
int &nb_pts,
int verbose_level)
179 for (i = 0; i < nb_pts; i++) {
191 cout <<
"list_all_N:" << endl;
193 for (i = 0; i <
cnt_N[
k]; i++) {
199 cout << setw(5) << i <<
" : ";
201 cout <<
" : " << val0;
202 cout <<
" : " << val << endl;
204 cout <<
"error" << endl;
207 j =
N_rank(v,
k, verbose_level - 2);
209 cout <<
"error in ranking, i=" << i <<
" j=" << j << endl;
220 cout <<
"list_all_N1:" << endl;
222 for (i = 0; i <
cnt_N1[
k]; i++) {
228 cout << setw(5) << i <<
" : ";
230 cout <<
" : " << val0;
231 cout <<
" : " << val << endl;
233 cout <<
"error" << endl;
236 j =
N1_rank(v,
k, verbose_level - 2);
238 cout <<
"error in ranking, i=" << i <<
" j=" << j << endl;
249 cout <<
"list_all_S:" << endl;
251 for (i = 0; i <
cnt_S[
k]; i++) {
257 cout << setw(5) << i <<
" : ";
259 cout <<
" : " << val0;
260 cout <<
" : " << val << endl;
262 cout <<
"error" << endl;
265 j =
S_rank(v,
k, verbose_level - 2);
267 cout <<
"error in ranking, i=" << i <<
" j=" << j << endl;
276 int i, j, a, h, val0, val;
278 cout <<
"list_all_Sbar:" << endl;
284 for (h = 0; h <
q - 1; h++) {
292 for (u = 0; u <
k; u++) {
293 v[u] =
F->
mult(a, v[u]);
298 cout << setw(5) << i <<
"," << h <<
" : ";
300 cout <<
" : " << val0;
301 cout <<
" : " << val << endl;
303 cout <<
"error" << endl;
308 cout <<
"error in ranking, i=" << i <<
" j=" << j << endl;
322 for (i = 0; i < len; i++) {
335 int f_v = (verbose_level >= 1);
336 int rk1, coset, rk0, coset0, A, val, m_val, log;
339 cout <<
"N_unrank len=" << len <<
" rk=" << rk << endl;
341 if (rk >=
cnt_N[len]) {
342 cout <<
"hermitian::N_unrank fatal: rk >= cnt_N[len]" << endl;
348 cout <<
"N_unrank len=" << len <<
" done: ";
355 if (rk < A *
cnt_N[len - 1]) {
357 cout <<
"N_unrank case 1" << endl;
359 coset = rk /
cnt_N[len - 1];
360 rk1 = rk %
cnt_N[len - 1];
361 N_unrank(v, len - 1, rk1, verbose_level - 1);
369 cout <<
"N_unrank case 1 val=" << val << endl;
371 coset0 = coset / (
q + 1);
372 rk0 = coset % (
q + 1);
374 cout <<
"N_unrank case 1 coset0=" << coset0
375 <<
" rk0=" << rk0 << endl;
379 cout <<
"N_unrank case 1 m_val=" << m_val << endl;
383 cout <<
"N_unrank case 1 log=" << log << endl;
386 cout <<
"hermitian::N_unrank fatal: log == -1" << endl;
393 cout <<
"N_unrank case 1 coset0=" << coset0 << endl;
401 cout <<
"N_unrank case 2" << endl;
403 rk -= A *
cnt_N[len - 1];
405 coset = rk /
cnt_S[len - 1];
407 cout <<
"N_unrank case 2 coset=" << coset << endl;
409 rk1 = rk %
cnt_S[len - 1];
411 cout <<
"N_unrank case 2 rk1=" << rk1 << endl;
413 S_unrank(v, len - 1, rk1, verbose_level - 1);
414 v[len - 1] = 1 + coset;
417 cout <<
"N_unrank len=" << len <<
" done: ";
425 int f_v = (verbose_level >= 1);
426 int rk, rk1, coset, rk0, coset0, val, m_val, log, a;
429 cout <<
"N_rank len=" << len << endl;
436 cout <<
"N_rank len=" << len <<
" done, rk=" << rk << endl;
443 cout <<
"N_rank case 1" << endl;
445 rk1 =
N_rank(v, len - 1, verbose_level - 1);
447 if (v[len - 1] == 0) {
453 cout <<
"N_rank case 1 m_val=" << m_val << endl;
457 cout <<
"N_rank case 1 log=" << log << endl;
460 cout <<
"hermitian::N_rank fatal: log == -1" << endl;
463 a =
F->
N2(v[len - 1]);
466 cout <<
"N_rank case 1 coset0=" << coset0 << endl;
473 cout <<
"N_rank case 1 coset0=" << coset0 << endl;
477 cout <<
"N_rank not an norm one element" << endl;
481 cout <<
"N_rank case 1 rk0=" << rk0 << endl;
483 coset = coset0 * (
q + 1) + rk0;
486 rk = coset *
cnt_N[len - 1] + rk1;
490 cout <<
"N_rank case 2" << endl;
492 rk = (
Q -
q - 1) *
cnt_N[len - 1];
493 coset = v[len - 1] - 1;
495 cout <<
" case 2 coset=" << coset << endl;
497 rk1 =
S_rank(v, len - 1, verbose_level - 1);
499 cout <<
"N_rank case 2 rk1=" << rk1 << endl;
501 rk += coset *
cnt_S[len - 1] + rk1;
504 cout <<
"N_rank len=" << len <<
" done, rk=" << rk << endl;
511 int f_v = (verbose_level >= 1);
512 int coset, rk2, coset2, rk1, coset1, val, new_val, log, A, a, i;
515 cout <<
"N1_unrank len=" << len <<
" rk=" << rk << endl;
518 cout <<
"hermitian::N1_unrank fatal: rk >= cnt_N1[len]" << endl;
524 cout <<
"N1_unrank len=" << len <<
" done: ";
530 if (rk <
cnt_N1[len - 1]) {
532 cout <<
"N1_unrank case 0" << endl;
534 N1_unrank(v, len - 1, rk, verbose_level - 1);
537 cout <<
"N1_unrank len=" << len <<
" done: ";
545 A = (
q + 1) * (
q - 2) *
cnt_N1[len - 1];
548 cout <<
"N1_unrank case 1" << endl;
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];
555 cout <<
"N1_unrank case 1 coset1=" << coset1
556 <<
" rk1=" << rk1 << endl;
559 cout <<
"N1_unrank case 1 coset2=" << coset2
560 <<
" rk2=" << rk2 << endl;
563 N1_unrank(v, len - 1, rk2, verbose_level - 1);
566 cout <<
"N1_unrank case 1 val=" << val << endl;
569 cout <<
"N1_unrank case 1 error val=" << val
570 <<
" should be 1" << endl;
575 cout <<
"N1_unrank case 1 coset2=" << coset2 << endl;
579 cout <<
"N1_unrank case 1 a=" << a << endl;
581 for (i = 0; i < len - 1; i++) {
582 v[i] =
F->
mult(a, v[i]);
586 cout <<
"N1_unrank case 1 val=" << val << endl;
590 cout <<
"N1_unrank case 1 new_val=" << new_val << endl;
594 cout <<
"N_unrank case 1 log=" << log << endl;
597 cout <<
"hermitian::N_unrank fatal: log == -1" << endl;
606 cout <<
"N1_unrank case 2" << endl;
610 coset = rk /
cnt_S[len - 1];
611 rk1 = rk %
cnt_S[len - 1];
613 cout <<
"N1_unrank case 2 coset=" << coset
614 <<
" rk1=" << rk1 << endl;
616 S_unrank(v, len - 1, rk1, verbose_level - 1);
620 cout <<
"N1_unrank len=" << len <<
" done: ";
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;
633 cout <<
"N1_rank len=" << len <<
" : ";
640 cout <<
"N1_rank len=" << len <<
" done, "
645 if (v[len - 1] == 0) {
647 cout <<
"N1_rank case 0" << endl;
649 rk =
N1_rank(v, len - 1, verbose_level - 1);
651 cout <<
"N1_rank len=" << len <<
" done, "
660 A = (
q + 1) * (
q - 2) *
cnt_N1[len - 1];
664 cout <<
"N1_rank case 1" << endl;
670 cout <<
"N1_rank case 1 a=" << a << endl;
672 for (i = 0; i < len - 1; i++) {
673 v[i] =
F->
mult(av, v[i]);
675 rk2 =
N1_rank(v, len - 1, verbose_level - 1);
679 cout <<
"N1_rank val != 1" << endl;
687 cout <<
"N1_rank case 1 new_val=" << new_val << endl;
691 cout <<
"N1_rank case 1 log=" << log << endl;
694 cout <<
"hermitian::N1_rank fatal: log == -1" << endl;
697 a =
F->
N2(v[len - 1]);
700 cout <<
"hermitian::N1_rank fatal: log1 != log" << endl;
704 a =
F->
mult(a, v[len - 1]);
707 cout <<
"hermitian::N1_rank fatal: coset1 == -1" << endl;
710 rk1 = coset2 *
cnt_N1[len - 1] + rk2;
711 rk += coset1 * ((
q - 2) *
cnt_N1[len - 1]) + rk1;
715 cout <<
"N1_rank case 2" << endl;
719 rk1 =
S_rank(v, len - 1, verbose_level - 1);
722 cout <<
"N1_rank case 2 coset=" << coset
723 <<
" rk1=" << rk1 << endl;
726 rk += coset *
cnt_S[len - 1] + rk1;
731 cout <<
"N1_rank len=" << len <<
" done, rk=" << rk << endl;
737 int len,
int rk,
int verbose_level)
739 int f_v = (verbose_level >= 1);
740 int rk1, coset, log, val, m_val;
742 if (rk >=
cnt_S[len]) {
743 cout <<
"hermitian::S_unrank fatal: "
744 "rk >= cnt_S[len]" << endl;
751 if (rk < (
q + 1) *
cnt_N[len - 1]) {
753 cout <<
"S_unrank case 1" << endl;
755 coset = rk /
cnt_N[len - 1];
756 rk1 = rk %
cnt_N[len - 1];
758 cout <<
"S_unrank case 1 coset=" << coset
759 <<
" rk1=" << rk1 << endl;
761 N_unrank(v, len - 1, rk1, verbose_level);
764 cout <<
"S_unrank case 1 val=" << val << endl;
768 cout <<
"S_unrank case 1 m_val=" << m_val << endl;
772 cout <<
"S_unrank case 1 log=" << log << endl;
775 cout <<
"hermitian::S_unrank fatal: log == -1" << endl;
783 cout <<
"S_unrank case 2" << endl;
785 rk -= (
q + 1) *
cnt_N[len - 1];
786 S_unrank(v, len - 1, rk, verbose_level);
790 cout <<
"S_unrank len=" << len <<
" done: ";
799 int f_v = (verbose_level >= 1);
800 int rk, rk1, coset, log, val, m_val, a, log1;
803 cout <<
"S_rank len=" << len <<
": ";
809 cout <<
"hermitian::S_rank v[0]" << endl;
816 cout <<
"S_rank case 1" << endl;
818 rk1 =
N_rank(v, len - 1, verbose_level);
821 cout <<
"S_rank case 1 val=" << val << endl;
825 cout <<
"S_rank case 1 m_val=" << m_val << endl;
829 cout <<
"S_rank case 1 log=" << log << endl;
832 cout <<
"hermitian::S_rank fatal: log == -1" << endl;
835 a =
F->
N2(v[len - 1]);
838 cout <<
"hermitian::S_rank fatal: log1 != log" << endl;
843 rk = coset *
cnt_N[len - 1] + rk1;
847 cout <<
"S_rank case 2" << endl;
849 rk =
S_rank(v, len - 1, verbose_level);
850 rk += (
q + 1) *
cnt_N[len - 1];
853 cout <<
"S_rank len=" << len <<
" done, rk=" << rk << endl;
860 int len,
int rk,
int verbose_level)
862 int f_v = (verbose_level >= 1);
866 cout <<
"hermitian::Sbar_unrank fatal: "
867 "rk >= cnt_Sbar[len]" << endl;
871 cout <<
"hermitian::Sbar_unrank fatal: "
877 cout <<
"Sbar_unrank case 1" << endl;
884 cout <<
"Sbar_unrank case 2" << endl;
888 N1_unrank(v, len - 1, rk, verbose_level);
893 cout <<
"Sbar_unrank case 2 log=" << log << endl;
896 cout <<
"hermitian::Sbar_unrank fatal: "
900 for (i = 0; i < len - 1; i++) {
901 v[i] =
F->
mult(b, v[i]);
908 cout <<
"Sbar_unrank len=" << len <<
" done: ";
917 int f_v = (verbose_level >= 1);
918 int rk, val, a, b, bv, log, i;
921 cout <<
"Sbar_rank len=" << len <<
" : ";
926 cout <<
"hermitian::Sbar_rank fatal: len == 1" << endl;
929 if (v[len - 1] == 0) {
931 cout <<
"Sbar_rank case 1" << endl;
933 rk =
Sbar_rank(v, len - 1, verbose_level);
937 cout <<
"Sbar_rank case 2" << endl;
947 cout <<
"Sbar_rank case 2 val != F->negate(1)" << endl;
953 for (i = 0; i < len - 1; i++) {
954 v[i] =
F->
mult(v[i], bv);
958 cout <<
"Sbar_rank case 2 val != 1" << endl;
962 rk +=
N1_rank(v, len - 1, verbose_level);
966 cout <<
"Sbar_rank done, rk=" << rk << endl;
973 int f_v = (verbose_level >= 1);
977 cout <<
"hermitian::create_latex_report" << endl;
986 snprintf(str, 1000,
"H_%d_%d.tex",
k - 1,
Q);
988 snprintf(title, 1000,
"Hermitian Variety ${\\rm H}(%d,%d)$",
k - 1,
Q);
1010 cout <<
"hermitian::create_latex_report before report" << endl;
1012 report(ost, verbose_level);
1014 cout <<
"hermitian::create_latex_report after report" << endl;
1023 cout <<
"written file " << fname <<
" of size "
1028 cout <<
"hermitian::create_latex_report done" << endl;
1034 int f_v = (verbose_level >= 1);
1037 cout <<
"hermitian::report" << endl;
1049 cout <<
"hermitian::report done" << endl;
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++) {
1074 ost <<
"$P_{" << rk <<
"} = ";
1076 ost <<
"=" << rk_in_PG[rk] <<
"$\\\\" << endl;
1078 ost <<
"\\end{multicols}" << endl;
1079 ost <<
"All points: ";
1081 ost <<
"\\\\" << endl;
void PG_element_rank_modified(int *v, int stride, int len, int &a)
void PG_element_normalize(int *v, int stride, int len)
linear_algebra::linear_algebra * Linear_algebra
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)
int * index_of_norm_one_element
int N_rank(int *v, int len, int verbose_level)
void list_all_N1(int verbose_level)
field_theory::finite_field * F
void report(std::ostream &ost, int verbose_level)
void list_all_S(int verbose_level)
int N1_rank(int *v, int len, int verbose_level)
void N1_unrank(int *v, int len, int rk, int verbose_level)
void list_all_N(int verbose_level)
int evaluate_hermitian_form(int *v, int len)
void Sbar_unrank(int *v, int len, int rk, int verbose_level)
void list_all_Sbar(int verbose_level)
void N_unrank(int *v, int len, int rk, int verbose_level)
void report_points(std::ostream &ost, int verbose_level)
void create_latex_report(int verbose_level)
void S_unrank(int *v, int len, int rk, int verbose_level)
void unrank_point(int *v, int rk)
int S_rank(int *v, int len, int verbose_level)
int Sbar_rank(int *v, int len, int verbose_level)
void list_of_points_embedded_in_PG(long int *&Pts, int &nb_pts, int verbose_level)
void scalar_multiply_vector_in_place(int c, int *A, int m)
basic number theoretic functions
int i_power_j(int i, int j)
a collection of functions related to file io
long int file_size(std::string &fname)
interface to create latex output files
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)
void foot(std::ostream &ost)
#define Lint_vec_print(A, B, C)
#define Int_vec_print(A, B, C)
the orbiter library for the classification of combinatorial objects