20namespace layer1_foundations {
21namespace field_theory {
35 frobenius_table = NULL;
36 absolute_trace_table = NULL;
37 log_alpha_table = NULL;
40 alpha_power_table = NULL;
44 f_has_quadratic_subfield =
FALSE;
45 f_belongs_to_quadratic_subfield = NULL;
47 reordered_list_of_elements = NULL;
48 reordered_list_of_elements_inv = NULL;
68 if (frobenius_table) {
72 if (absolute_trace_table) {
76 if (log_alpha_table) {
80 if (alpha_power_table) {
92 if (f_belongs_to_quadratic_subfield) {
93 FREE_int(f_belongs_to_quadratic_subfield);
95 if (reordered_list_of_elements) {
96 FREE_int(reordered_list_of_elements);
98 if (reordered_list_of_elements_inv) {
99 FREE_int(reordered_list_of_elements_inv);
106 int f_v = (verbose_level >= 1);
109 cout <<
"finite_field_implementation_by_tables::init" << endl;
112 finite_field_implementation_by_tables::F = F;
120 cout <<
"finite_field_implementation_by_tables::init before create_alpha_table" << endl;
124 cout <<
"finite_field_implementation_by_tables::init after create_alpha_table" << endl;
131 cout <<
"finite_field_implementation_by_tables::init before init_binary_operations" << endl;
135 cout <<
"finite_field_implementation_by_tables::init after init_binary_operations" << endl;
145 cout <<
"finite_field_implementation_by_tables::init "
146 "before init_quadratic_subfield" << endl;
150 cout <<
"finite_field_implementation_by_tables::init "
151 "after init_quadratic_subfield" << endl;
155 cout <<
"finite_field_implementation_by_tables::init "
156 "before init_frobenius_table" << endl;
160 cout <<
"finite_field_implementation_by_tables::init "
161 "after init_frobenius_table" << endl;
165 cout <<
"finite_field_implementation_by_tables::init "
166 "before init_absolute_trace_table" << endl;
170 cout <<
"finite_field_implementation_by_tables::init "
171 "after init_absolute_trace_table" << endl;
176 cout <<
"finite_field_implementation_by_tables::init field of order "
177 << F->
q <<
" initialized" << endl;
193 cout <<
"finite_field_implementation_by_tables::init done" << endl;
209 return f_has_quadratic_subfield;
214 return f_belongs_to_quadratic_subfield[a];
219 int f_v = (verbose_level >= 1);
225 cout <<
"finite_field_implementation_by_tables::create_alpha_table q=" << F->
q
226 <<
" p=" << F->
p <<
" e=" << F->
e << endl;
230 cout <<
"finite_field_implementation_by_tables::create_alpha_table "
231 "before create_alpha_table_prime_field" << endl;
235 cout <<
"finite_field_implementation_by_tables::create_alpha_table "
236 "after create_alpha_table_prime_field" << endl;
241 cout <<
"finite_field_implementation_by_tables::create_alpha_table "
242 "before create_alpha_table_extension_field" << endl;
246 cout <<
"finite_field_implementation_by_tables::create_alpha_table "
247 "after create_alpha_table_extension_field" << endl;
251 cout <<
"finite_field_implementation_by_tables::create_alpha_table done" << endl;
257 int f_v = (verbose_level >= 1);
263 cout <<
"finite_field_implementation_by_tables::create_alpha_table_prime_field, "
264 "q=" << F->
q <<
" p=" << F->
p <<
" e=" << F->
e << endl;
268 cout <<
"finite_field_implementation_by_tables::create_alpha_table_prime_field "
269 "primitive element is alpha=" << F->
alpha << endl;
271 for (i = 0; i < F->
p; i++) {
272 log_alpha_table[i] = -1;
273 alpha_power_table[i] = -1;
275 log_alpha_table[0] = -1;
277 for (i = 0; i < F->
p; i++) {
278 if (a < 0 || a >= F->
q) {
279 cout <<
"finite_field_implementation_by_tables::create_alpha_table_prime_field "
280 "error: a = " << a << endl;
282 alpha_power_table[i] = a;
283 if (log_alpha_table[a] == -1) {
284 log_alpha_table[a] = i;
288 cout <<
"finite_field_implementation_by_tables::create_alpha_table_prime_field "
289 "alpha_power_table[" << i <<
"]=" << a << endl;
296 cout <<
"finite_field_implementation_by_tables::create_alpha_table_prime_field "
297 "table, p=" << F->
p << endl;
298 cout <<
"i : alpha_power_table[i] : log_alpha_table[i]" << endl;
299 for (i = 0; i < F->
p; i++) {
300 cout << i <<
" : " << alpha_power_table[i] <<
" : "
301 << log_alpha_table[i] << endl;
305 cout <<
"finite_field_implementation_by_tables::create_alpha_table_prime_field done" << endl;
311 int f_v = (verbose_level >= 1);
312 int f_vv = (verbose_level >= 2);
316 cout <<
"finite_field_implementation_by_tables::create_alpha_table_extension_field "
317 "q=" << F->
q <<
" p=" << F->
p <<
" e=" << F->
e << endl;
322 cout <<
"finite_field_implementation_by_tables::create_alpha_table_extension_field "
323 "before find_primitive_element" << endl;
327 cout <<
"finite_field_implementation_by_tables::create_alpha_table_extension_field "
328 "after find_primitive_element" << endl;
331 cout <<
"finite_field_implementation_by_tables::create_alpha_table_extension_field "
332 "alpha = " << F->
alpha << endl;
335 log_alpha_table[0] = -1;
359 for (i = 0; i < F->
q; i++) {
362 cout <<
"i=" << i << endl;
368 cout <<
" has rank " << k << endl;
370 if (k < 0 || k >= F->
q) {
371 cout <<
"finite_field_implementation_by_tables::create_alpha_table_extension_field "
372 "error: k = " << k << endl;
374 if (k == 1 && i > 0 && i < F->q - 1) {
375 cout <<
"finite_field_implementation_by_tables::create_alpha_table_extension_field "
376 "the polynomial is not primitive" << endl;
377 cout <<
"k == 1 and i = " << i << endl;
381 alpha_power_table[i] = k;
383 log_alpha_table[k] = i;
387 cout <<
"alpha_power_table[" << i <<
"]=" << k << endl;
390 Fq.
mult(a, Alpha, c, verbose_level - 1);
391 Fq.
assign(c, a, verbose_level - 2);
400 cout <<
"finite_field_implementation_by_tables::create_alpha_table_extension_field done" << endl;
406 int f_v = (verbose_level >= 1);
409 cout <<
"finite_field_implementation_by_tables::init_binary_operations" << endl;
413 cout <<
"finite_field_implementation_by_tables::init_binary_operations "
414 "creating tables q=" << F->
q << endl;
421 reordered_list_of_elements =
NEW_int(F->
q);
422 reordered_list_of_elements_inv =
NEW_int(F->
q);
426 cout <<
"finite_field_implementation_by_tables::init_binary_operations "
427 "before create_tables_prime_field" << endl;
431 cout <<
"finite_field_implementation_by_tables::init_binary_operations "
432 "after create_tables_prime_field" << endl;
437 cout <<
"finite_field_implementation_by_tables::init_binary_operations "
438 "before create_tables_extension_field" << endl;
442 cout <<
"finite_field_implementation_by_tables::init_binary_operations "
443 "after create_tables_extension_field" << endl;
451 cout <<
"finite_field_implementation_by_tables::init_binary_operations done" << endl;
458 int f_v = (verbose_level >= 1);
462 cout <<
"finite_field_implementation_by_tables::create_tables_prime_field" << endl;
467 for (i = 0; i < F->
q; i++) {
468 for (j = 0; j < F->
q; j++) {
470 add_table[i * F->
q + j] = k;
480 for (i = 0; i < F->
q; i++) {
481 for (j = 0; j < F->
q; j++) {
482 if (i == 0 || j == 0) {
483 mult_table[i * F->
q + j] = 0;
487 mult_table[i * F->
q + j] = k;
493 inv_table[0] = -999999999;
498 reordered_list_of_elements[0] = 0;
499 reordered_list_of_elements[1] = 1;
501 reordered_list_of_elements[2] = F->
alpha;
503 reordered_list_of_elements_inv[0] = 0;
504 reordered_list_of_elements_inv[F->
alpha] = 1;
506 for (i = 3; i < F->
q; i++) {
507 a = mult_table[reordered_list_of_elements[i - 1] * F->
q + F->
alpha];
508 reordered_list_of_elements[i] = a;
509 reordered_list_of_elements_inv[a] = i;
513 cout <<
"finite_field_implementation_by_tables::create_tables_prime_field finished" << endl;
520 int f_v = (verbose_level >= 1);
521 long int i, j, l, k, ii, jj, kk, a;
525 cout <<
"finite_field_implementation_by_tables::create_tables_extension_field" << endl;
530 for (i = 0; i < F->
q; i++) {
532 for (j = 0; j < F->
q; j++) {
534 for (l = 0; l < F->
e; l++) {
535 v3[l] = (v1[l] + v2[l]) % F->
p;
538 add_table[i * F->
q + j] = k;
548 for (i = 0; i < F->
q; i++) {
549 mult_table[i * F->
q + 0] = 0;
550 mult_table[0 * F->
q + i] = 0;
553 for (i = 1; i < F->
q; i++) {
554 ii = log_alpha_table[i];
555 for (j = 1; j < F->
q; j++) {
556 jj = log_alpha_table[j];
557 kk = (ii + jj) % (F->
q - 1);
558 k = alpha_power_table[kk];
559 mult_table[i * F->
q + j] = k;
561 cout <<
"finite_field_implementation_by_tables::create_tables_extension_field " << i <<
" * " << j <<
" = " << k << endl;
572 reordered_list_of_elements[0] = 0;
573 reordered_list_of_elements[1] = F->
p;
574 reordered_list_of_elements_inv[0] = 0;
575 reordered_list_of_elements_inv[F->
p] = 1;
577 for (i = 2; i < F->
q; i++) {
578 a = mult_table[reordered_list_of_elements[i - 1] * F->
q + F->
p];
579 reordered_list_of_elements[i] = a;
580 reordered_list_of_elements_inv[a] = i;
584 cout <<
"finite_field_implementation_by_tables::create_tables_extension_field finished" << endl;
590 ost <<
"addition table:" << endl;
595 ost <<
"multiplication table:" << endl;
605 fname.assign(fname_base);
606 fname.append(
".cpp");
611 ost <<
"//addition, multiplication, inversion and negation table:" << endl;
612 ost <<
"int add_table[] = ";
617 ost <<
"int mult_table[] = ";
621 ost <<
"int inv_table[] = ";
625 ost <<
"int neg_table[] = ";
635 int f_v = (verbose_level >= 1);
638 cout <<
"finite_field_implementation_by_tables::init_quadratic_subfield" << endl;
640 f_belongs_to_quadratic_subfield =
NEW_int(F->
q);
644 int i, a, b, idx, sqrt_q;
648 f_has_quadratic_subfield =
TRUE;
650 idx = (F->
q - 1) / (sqrt_q - 1);
651 f_belongs_to_quadratic_subfield[0] =
TRUE;
652 for (i = 0; i < sqrt_q - 1; i++) {
655 f_belongs_to_quadratic_subfield[b] =
TRUE;
659 f_has_quadratic_subfield =
FALSE;
662 cout <<
"finite_field_implementation_by_tables::init_quadratic_subfield done" << endl;
668 int f_v = (verbose_level >= 1);
672 cout <<
"finite_field_implementation_by_tables::init_frobenius_table" << endl;
678 for (i = 0; i < F->
q; i++) {
679 frobenius_table[i] = i;
684 for (i = 0; i < F->
q; i++) {
687 cout <<
"finite_field_implementation_by_tables::init_frobenius_table frobenius_table[" << i <<
"]="
688 << frobenius_table[i] << endl;
694 cout <<
"finite_field_implementation_by_tables::init_frobenius_table done" << endl;
700 int f_v = (verbose_level >= 1);
704 cout <<
"finite_field_implementation_by_tables::init_absolute_trace_table" << endl;
708 absolute_trace_table =
NEW_int(F->
q);
710 for (i = 0; i < F->
q; i++) {
711 absolute_trace_table[i] = 0;
715 for (i = 0; i < F->
q; i++) {
721 cout <<
"finite_field_implementation_by_tables::init_absolute_trace_table done" << endl;
728 int verbose_level = 0;
745 cout <<
"i : inverse(i) : frobenius_power(i, 1) : alpha_power(i) : "
746 "log_alpha(i) : elt[i]" << endl;
747 for (i = 0; i < F->
q; i++) {
758 cout << setw(4) << i <<
" : "
759 << setw(4) << a <<
" : "
760 << setw(4) << b <<
" : "
761 << setw(4) << c <<
" : "
762 << setw(4) << l <<
" : ";
773 cout <<
"inverse table:" << endl;
775 for (i = 1; i < q; i++) {
780 cout <<
"};" << endl;
781 cout <<
"frobenius_table:" << endl;
783 cout <<
"i : i^p" << endl;
784 for (i = 0; i < q; i++) {
785 cout << i <<
" : " << frobenius_table[i] << endl;
789 cout <<
"primitive element alpha = " << alpha << endl;
790 cout <<
"i : alpha^i" << endl;
791 for (i = 0; i < q; i++) {
793 cout << i <<
" : " << alpha_power_table[i] << endl;
795 cout <<
"i : log_alpha(i)" << endl;
796 for (i = 0; i < q; i++) {
797 cout << i <<
" : " << log_alpha_table[i] << endl;
811 if (i < 0 || i >= F->
q) {
812 cout <<
"finite_field_implementation_by_tables::add out of range, i = " << i << endl;
815 if (j < 0 || j >= F->
q) {
816 cout <<
"finite_field_implementation_by_tables::add out of range, j = " << j << endl;
820 return add_table[i * F->
q + j];
827 if (i < 0 || i >= F->
q) {
828 cout <<
"finite_field_implementation_by_tables::add_without_table out of range, i = " << i << endl;
831 if (j < 0 || j >= F->
q) {
832 cout <<
"finite_field_implementation_by_tables::add_without_table out of range, j = " << j << endl;
840 for (l = 0; l < F->
e; l++) {
841 v3[l] = (v1[l] + v2[l]) % F->
p;
849 int f_v = (verbose_level >= 1);
853 cout <<
"finite_field_implementation_by_tables::mult_verbose" << endl;
855 if (i < 0 || i >= F->
q) {
856 cout <<
"finite_field_implementation_by_tables::mult_verbose out of range, i = " << i << endl;
859 if (j < 0 || j >= F->
q) {
860 cout <<
"finite_field_implementation_by_tables::mult_verbose out of range, j = " << j << endl;
864 cout <<
"finite_field_implementation_by_tables::mult_verbose with table" << endl;
866 c = mult_table[i * F->
q + j];
868 cout <<
"finite_field_implementation_by_tables::mult_verbose " << i <<
" * " << j <<
" = " << c << endl;
875 int f_v = (verbose_level >= 1);
879 cout <<
"finite_field_implementation_by_tables::mult_using_discrete_log" << endl;
881 if (i < 0 || i >= F->
q) {
882 cout <<
"finite_field_implementation_by_tables::mult_using_discrete_log "
883 "out of range, i = " << i << endl;
886 if (j < 0 || j >= F->
q) {
887 cout <<
"finite_field_implementation_by_tables::mult_using_discrete_log "
888 "out of range, j = " << j << endl;
892 cout <<
"finite_field_implementation_by_tables::mult_using_discrete_log with table" << endl;
898 cout <<
"finite_field_implementation_by_tables::mult_using_discrete_log without table" << endl;
900 if (i == 0 || j == 0) {
903 ii = log_alpha_table[i];
905 cout <<
"finite_field_implementation_by_tables::mult_using_discrete_log ii = " << ii << endl;
907 jj = log_alpha_table[j];
909 cout <<
"finite_field_implementation_by_tables::mult_using_discrete_log jj = " << jj << endl;
911 kk = (ii + jj) % (F->
q - 1);
913 cout <<
"finite_field_implementation_by_tables::mult_using_discrete_log kk = " << kk << endl;
915 c = alpha_power_table[kk];
917 cout <<
"finite_field_implementation_by_tables::mult_using_discrete_log c = " << c << endl;
921 cout <<
"finite_field_implementation_by_tables::mult_using_discrete_log done" << endl;
930 if (i < 0 || i >= F->
q) {
931 cout <<
"finite_field_implementation_by_tables::negate out of range, i = " << i << endl;
935 return negate_table[i];
942 if (i < 0 || i >= F->
q) {
943 cout <<
"finite_field_implementation_by_tables::negate_without_table out of range, i = " << i << endl;
949 for (l = 0; l < F->
e; l++) {
950 v2[l] = (F->
p - v1[l]) % F->
p;
960 if (i <= 0 || i >= F->
q) {
961 cout <<
"finite_field_implementation_by_tables::inverse out of range, i = " << i << endl;
970 if (i <= 0 || i >= F->
q) {
971 cout <<
"finite_field_implementation_by_tables::inverse_without_table out of range, i = " << i << endl;
977 ii = log_alpha_table[i];
978 jj = (F->
q - 1 - ii) % (F->
q - 1);
979 j = alpha_power_table[jj];
986 return frobenius_table[a];
997 for (j = 0; j < frob_power; j++) {
998 b = frobenius_table[b];
1005 return alpha_power_table[i];
1010 return log_alpha_table[i];
1015 int f_v = (verbose_level >= 1);
1018 cout <<
"finite_field_implementation_by_tables::addition_table_reordered_save_csv" << endl;
1025 for (i = 0; i < F->
q; i++) {
1026 a = reordered_list_of_elements[i];
1027 for (j = 0; j < F->
q; j++) {
1028 b = reordered_list_of_elements[j];
1031 M[i * F->
q + j] = c;
1037 cout <<
"finite_field_implementation_by_tables::addition_table_reordered_save_csv Written file " << fname <<
" of size " << Fio.
file_size(fname) << endl;
1044 int f_v = (verbose_level >= 1);
1047 cout <<
"finite_field_implementation_by_tables::multiplication_table_reordered_save_csv" << endl;
1054 for (i = 1; i < F->
q; i++) {
1055 a = reordered_list_of_elements[i];
1056 for (j = 1; j < F->
q; j++) {
1057 b = reordered_list_of_elements[j];
1061 cout <<
"finite_field_implementation_by_tables::multiplication_table_reordered_save_csv c == 0" << endl;
1064 M[(i - 1) * (F->
q - 1) + j - 1] = c;
1070 cout <<
"finite_field_implementation_by_tables::multiplication_table_reordered_save_csv Written file " << fname <<
" of size " << Fio.
file_size(fname) << endl;
int add_without_table(int i, int j)
void init(finite_field *F, int verbose_level)
int mult_verbose(int i, int j, int verbose_level)
int frobenius_power(int a, int frob_power)
int negate_without_table(int i)
int frobenius_image(int a)
void multiplication_table_reordered_save_csv(std::string &fname, int verbose_level)
void create_tables_extension_field(int verbose_level)
int has_quadratic_subfield()
int mult_using_discrete_log(int i, int j, int verbose_level)
~finite_field_implementation_by_tables()
void print_add_mult_tables(std::ostream &ost)
void create_tables_prime_field(int verbose_level)
void print_add_mult_tables_in_C(std::string &fname_base)
void print_tables_extension_field(std::string &poly)
int inverse_without_table(int i)
void init_absolute_trace_table(int verbose_level)
void create_alpha_table_extension_field(int verbose_level)
void init_binary_operations(int verbose_level)
int * private_add_table()
void addition_table_reordered_save_csv(std::string &fname, int verbose_level)
void create_alpha_table_prime_field(int verbose_level)
void init_frobenius_table(int verbose_level)
int belongs_to_quadratic_subfield(int a)
int * private_mult_table()
void init_quadratic_subfield(int verbose_level)
finite_field_implementation_by_tables()
void create_alpha_table(int verbose_level)
int power_verbose(int a, int n, int verbose_level)
int frobenius_power(int a, int frob_power)
int find_primitive_element(int verbose_level)
int absolute_trace(int i)
various functions related to geometries
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
long int AG_element_rank(int q, int *v, int stride, int len)
basic number theoretic functions
int i_power_j(int i, int j)
long int primitive_root(long int p, int verbose_level)
a collection of functions related to file io
void int_matrix_write_csv(std::string &fname, int *M, int m, int n)
long int file_size(std::string &fname)
domain of polynomials in one variable over a finite field
void delete_object(unipoly_object &p)
void mult(unipoly_object a, unipoly_object b, unipoly_object &c, int verbose_level)
int rank(unipoly_object p)
void create_object_by_rank(unipoly_object &p, long int rk, const char *file, int line, int verbose_level)
void create_object_by_rank_string(unipoly_object &p, std::string &rk, int verbose_level)
void assign(unipoly_object a, unipoly_object &b, int verbose_level)
void print_object(unipoly_object p, std::ostream &ost)
#define Int_vec_zero(A, B)
#define Int_vec_print_integer_matrix_in_C_source(A, B, C, D)
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
the orbiter library for the classification of combinatorial objects