Orbiter 2022
Combinatorial Objects
finite_fields.h
Go to the documentation of this file.
1/*
2 * finite_fields.h
3 *
4 * Created on: Mar 2, 2021
5 * Author: betten
6 */
7
8#ifndef SRC_LIB_FOUNDATIONS_FINITE_FIELDS_FINITE_FIELDS_H_
9#define SRC_LIB_FOUNDATIONS_FINITE_FIELDS_FINITE_FIELDS_H_
10
11namespace orbiter {
12namespace layer1_foundations {
13namespace field_theory {
14
15
16
17// #############################################################################
18// finite_field_activity_description.cpp
19// #############################################################################
20
21
23
25public:
26
28
33
34
38
40
45
48
51
54
55
58
61
62 int f_RREF;
63 std::string RREF_input_matrix;
64
67
71
75
76
79
83
86
88
89 int f_norm;
90
93
95
97
100
102 std::string EC_message;
103 int EC_s;
104 // EC_b, EC_c, EC_s, EC_pt_text, EC_message
105
107 std::string EC_label;
108
110 std::string EC_pt1_text;
111 std::string EC_pt2_text;
112
114 int EC_b;
115 int EC_c;
116 std::string EC_pt_text;
117
120
121
124 // EC_b, EC_c, EC_pt_text, EC_discrete_log_pt_text
125
126
128 std::string EC_bsgs_G;
131
133 std::string EC_bsgs_A;
134 std::string EC_bsgs_keys;
135
136
137
138
142 std::string NTRU_encrypt_H;
143 std::string NTRU_encrypt_R;
144 std::string NTRU_encrypt_Msg;
145
148
151
154
158
161
164
169
173
177
181
185
190
194
195
196
200 std::string transversal_point;
201
203 std::string line_1_basis;
204 std::string line_2_basis;
205
208
209 // ranking and unranking points in PG:
210
213
216
217
218
225
226
227
231 std::string parse_text;
232 std::string parse_parameters;
233
236
238 std::string sum_of_elements;
239
241 std::string negate_elements;
242
244 std::string inverse_elements;
245
249
253
257
260
264
268
269 int f_NTT;
270 int NTT_n;
271 int NTT_q;
272
273
276 int read_arguments(
277 int argc, std::string *argv,
278 int verbose_level);
279 void print();
280
281};
282
283
284
285// #############################################################################
286// finite_field_activity.cpp
287// #############################################################################
288
289
291
293public:
297
302 int verbose_level);
303 void perform_activity(int verbose_level);
304
305};
306
307
308// #############################################################################
309// finite_field_implementation_by_tables.cpp
310// #############################################################################
311
313
315
316
317private:
318
319 finite_field *F;
320
321 int *add_table; // [q * q]
322 int *mult_table; // [q * q]
323 // add_table and mult_table are needed in mindist
324
325 int *negate_table; // [q]
326 int *inv_table; // [q]
327 int *frobenius_table; // [q], x \mapsto x^p
328 int *absolute_trace_table; // [q]
329 int *log_alpha_table; // [q]
330 // log_alpha_table[i] = the integer k s.t. alpha^k = i (if i > 0)
331 // log_alpha_table[0] = -1
332 int *alpha_power_table; // [q]
333
334 int *v1; // [e]
335 int *v2; // [e]
336 int *v3; // [e]
337
338 int f_has_quadratic_subfield; // TRUE if e is even.
339 int *f_belongs_to_quadratic_subfield; // [q]
340
341 int *reordered_list_of_elements; // [q]
342 int *reordered_list_of_elements_inv; // [q]
343
344public:
345
348 void init(finite_field *F, int verbose_level);
349 int *private_add_table();
350 int *private_mult_table();
353 void create_alpha_table(int verbose_level);
354 void create_alpha_table_prime_field(int verbose_level);
355 void create_alpha_table_extension_field(int verbose_level);
356 void init_binary_operations(int verbose_level);
357 void create_tables_prime_field(int verbose_level);
358 void create_tables_extension_field(int verbose_level);
359 void print_add_mult_tables(std::ostream &ost);
360 void print_add_mult_tables_in_C(std::string &fname_base);
361 void init_quadratic_subfield(int verbose_level);
362 void init_frobenius_table(int verbose_level);
363 void init_absolute_trace_table(int verbose_level);
364 void print_tables_extension_field(std::string &poly);
365 int add(int i, int j);
366 int add_without_table(int i, int j);
367 int mult_verbose(int i, int j, int verbose_level);
368 int mult_using_discrete_log(int i, int j, int verbose_level);
369 int negate(int i);
370 int negate_without_table(int i);
371 int inverse(int i);
372 int inverse_without_table(int i);
373 int frobenius_image(int a);
374 // computes a^p
375 int frobenius_power(int a, int frob_power);
376 // computes a^{p^frob_power}
377 int alpha_power(int i);
378 int log_alpha(int i);
379 void addition_table_reordered_save_csv(std::string &fname, int verbose_level);
380 void multiplication_table_reordered_save_csv(std::string &fname, int verbose_level);
381
382};
383
384
385// #############################################################################
386// finite_field_implementation_wo_tables.cpp
387// #############################################################################
388
390
392
393
394private:
395
396 finite_field *F;
397
398 int *v1; // [e]
399 int *v2; // [e]
400 int *v3; // [e]
401
402 finite_field *GFp;
403
405
407
408 int factor_polynomial_degree;
409 int *factor_polynomial_coefficients_negated;
410
411
413
415
416
417public:
420 void init(finite_field *F, int verbose_level);
421 int mult(int i, int j, int verbose_level);
422 int inverse(int i, int verbose_level);
423 int negate(int i, int verbose_level);
424 int add(int i, int j, int verbose_level);
425
426};
427
428
429
430// #############################################################################
431// finite_field_description.cpp
432// #############################################################################
433
434
436
438public:
439
440 int f_q;
441 int q;
442
445
447
450 int read_arguments(
451 int argc, std::string *argv,
452 int verbose_level);
453 void print();
454
455};
456
457
458// #############################################################################
459// finite_field.cpp
460// #############################################################################
461
463
465
466private:
468
470
471
472 std::string symbol_for_print;
473
474
475 int nb_times_mult;
476 int nb_times_add;
477
478public:
480 // if TRUE, T is available, otherwise Iwo is available.
481
482 std::string label;
483 std::string label_tex;
484 std::string override_poly;
485 std::string my_poly;
486 //char *polynomial;
487 // the actual polynomial we consider
488 // as integer (in text form)
490 int q, p, e;
491 int alpha; // primitive element
492 int log10_of_q; // needed for printing purposes
497
500
501
502 finite_field();
504 void print_call_stats(std::ostream &ost);
505 void init(finite_field_description *Descr, int verbose_level);
506 void finite_field_init(int q, int f_without_tables, int verbose_level);
507 void init_implementation(int f_without_tables, int verbose_level);
509 void init_symbol_for_print(const char *symbol);
510 void init_override_polynomial(int q, std::string &poly,
511 int f_without_tables, int verbose_level);
514 long int compute_subfield_polynomial(int order_subfield,
515 int f_latex, std::ostream &ost,
516 int verbose_level);
517 void compute_subfields(int verbose_level);
518 int find_primitive_element(int verbose_level);
519 int compute_order_of_element(int elt, int verbose_level);
520 int *private_add_table();
521 int *private_mult_table();
522 int zero();
523 int one();
524 int minus_one();
525 int is_zero(int i);
526 int is_one(int i);
527 int mult(int i, int j);
528 int mult_verbose(int i, int j, int verbose_level);
529 int a_over_b(int a, int b);
530 int mult3(int a1, int a2, int a3);
531 int product3(int a1, int a2, int a3);
532 int mult4(int a1, int a2, int a3, int a4);
533 int mult5(int a1, int a2, int a3, int a4, int a5);
534 int mult6(int a1, int a2, int a3, int a4, int a5, int a6);
535 int product4(int a1, int a2, int a3, int a4);
536 int product5(int a1, int a2, int a3, int a4, int a5);
537 int product_n(int *a, int n);
538 int square(int a);
539 int twice(int a);
540 int four_times(int a);
541 int Z_embedding(int k);
542 int add(int i, int j);
543 int add3(int i1, int i2, int i3);
544 int add4(int i1, int i2, int i3, int i4);
545 int add5(int i1, int i2, int i3, int i4, int i5);
546 int add6(int i1, int i2, int i3, int i4, int i5, int i6);
547 int add7(int i1, int i2, int i3, int i4, int i5, int i6,
548 int i7);
549 int add8(int i1, int i2, int i3, int i4, int i5, int i6,
550 int i7, int i8);
551 int negate(int i);
552 int inverse(int i);
553 int power(int a, int n);
554 int power_verbose(int a, int n, int verbose_level);
555 // computes a^n
556 void frobenius_power_vec(int *v, int len, int frob_power);
557 void frobenius_power_vec_to_vec(int *v_in, int *v_out, int len, int frob_power);
558 int frobenius_power(int a, int frob_power);
559 // computes a^{p^frob_power}
560 int absolute_trace(int i);
561 int absolute_norm(int i);
562 int alpha_power(int i);
563 int log_alpha(int i);
564 int multiplicative_order(int a);
565 void all_square_roots(int a, int &nb_roots, int *roots2);
566 int is_square(int i);
567 int square_root(int i);
568 int primitive_root();
569 int N2(int a);
570 int N3(int a);
571 int T2(int a);
572 int T3(int a);
573 int bar(int a);
574 void abc2xy(int a, int b, int c, int &x, int &y,
575 int verbose_level);
576 // given a, b, c, determine x and y such that
577 // c = a * x^2 + b * y^2
578 // such elements x and y exist for any choice of a, b, c.
579 int retract(finite_field &subfield, int index, int a,
580 int verbose_level);
581 void retract_int_vec(finite_field &subfield, int index,
582 int *v_in, int *v_out, int len, int verbose_level);
583 int embed(finite_field &subfield, int index, int b,
584 int verbose_level);
586 int *&components, int *&embedding,
587 int *&pair_embedding, int verbose_level);
590 void compute_nth_roots(int *&Nth_roots, int n, int verbose_level);
591 int primitive_element();
592
593
594
595 // #########################################################################
596 // finite_field_projective.cpp
597 // #########################################################################
598
599 void PG_element_apply_frobenius(int n, int *v, int f);
600 int test_if_vectors_are_projectively_equal(int *v1, int *v2, int len);
601 void PG_element_normalize(int *v, int stride, int len);
602 // last non-zero element made one
603 void PG_element_normalize_from_front(int *v, int stride, int len);
604 // first non zero element made one
605
606
608 long int *set_in, long int *set_out, int sz,
609 int old_length, int new_length, int *v);
610 long int PG_element_embed(
611 long int rk, int old_length, int new_length, int *v);
613 int *v, int len, int a);
615 int *v, int len);
617 int *v, int len, int a);
619 int *v, int stride, int len, int &a);
621 int *v, int stride, int len, int a);
623 int *v, int stride, int len, long int &a);
625 int *M, int k, int n, long int *rank_vec);
627 int *M, int k, int n, long int *rank_vec);
629 int *v, int stride, int len, long int a);
631 int *v, int stride, int len, int m, long int &a);
633 int *v, int stride, int len, int m, long int a);
634
635 void projective_point_unrank(int n, int *v, int rk);
636 long int projective_point_rank(int n, int *v);
638 int *genma, int k, int n, long int *&point_list, int &nb_points,
639 int verbose_level);
641 int *genma, int k, int n, long int *point_list, int &nb_points,
642 int verbose_level);
643 void display_all_PG_elements(int n);
645 void display_all_AG_elements(int n);
646 void do_cone_over(int n,
647 long int *set_in, int set_size_in,
648 long int *&set_out, int &set_size_out,
649 int verbose_level);
650 void do_blocking_set_family_3(int n,
651 long int *set_in, int set_size,
652 long int *&the_set_out, int &set_size_out,
653 int verbose_level);
654 // creates projective_space PG(n,q)
655 void create_Baer_substructure(int n,
656 finite_field *Fq,
657 std::string &fname, int &nb_pts, long int *&Pts,
658 int verbose_level);
659 // creates projective_space PG(n,Q)
660 // the big field FQ is given
661 void create_BLT_from_database(int f_embedded,
662 int BLT_k,
663 std::string &label_txt,
664 std::string &label_tex,
665 int &nb_pts, long int *&Pts,
666 int verbose_level);
667 void create_orthogonal(int epsilon, int n,
668 std::string &label_txt,
669 std::string &label_tex,
670 int &nb_pts, long int *&Pts,
671 int verbose_level);
672 void create_hermitian(int n,
673 std::string &label_txt,
674 std::string &label_tex,
675 int &nb_pts, long int *&Pts,
676 int verbose_level);
677 // creates hermitian
679 int f_construction_A, int f_hyperoval, int f_construction_B,
680 std::string &fname, int &nb_pts, long int *&Pts,
681 int verbose_level);
682 // this is FQ
683 void create_segre_variety(int a, int b,
684 std::string &label_txt,
685 std::string &label_tex,
686 int &nb_pts, long int *&Pts,
687 int verbose_level);
688 // creates PG(a,q), PG(b,q) and PG((a+1)*(b+1)-1,q)
689 void do_andre(finite_field *Fq,
690 long int *the_set_in, int set_size_in,
691 long int *&the_set_out, int &set_size_out,
692 int verbose_level);
693 // creates PG(2,Q) and PG(4,q)
694 // this is FQ
696 int epsilon, int n,
697 long int *set_in, long int *&set_out, int set_size,
698 int verbose_level);
699 void do_embed_points(int n,
700 long int *set_in, long int *&set_out, int set_size,
701 int verbose_level);
702 void print_set_in_affine_plane(int len, long int *S);
703 void simeon(int n, int len, long int *S, int s, int verbose_level);
704 void wedge_to_klein(int *W, int *K);
705 void klein_to_wedge(int *K, int *W);
706 void isomorphism_to_special_orthogonal(int *A4, int *A6, int verbose_level);
708 int &a, int &b, int verbose_level);
709 int evaluate_Fermat_cubic(int *v);
710
711
712
713 // #########################################################################
714 // finite_field_io.cpp
715 // #########################################################################
716
717 void report(std::ostream &ost, int verbose_level);
718 void print_minimum_polynomial(int p, std::string &polynomial);
719 void print();
720 void print_detailed(int f_add_mult_table);
721 void print_tables();
722 void display_T2(std::ostream &ost);
723 void display_T3(std::ostream &ost);
724 void display_N2(std::ostream &ost);
725 void display_N3(std::ostream &ost);
726 void print_integer_matrix_zech(std::ostream &ost,
727 int *p, int m, int n);
728 void print_embedding(finite_field &subfield,
729 int *components, int *embedding, int *pair_embedding);
730 // we think of F as two dimensional vector space
731 // over f with basis (1,alpha)
732 // for i,j \in f, with x = i + j * alpha \in F, we have
733 // pair_embedding[i * q + j] = x;
734 // also,
735 // components[x * 2 + 0] = i;
736 // components[x * 2 + 1] = j;
737 // also, for i \in f, embedding[i] is the element
738 // in F that corresponds to i
739 // components[Q * 2]
740 // embedding[q]
741 // pair_embedding[q * q]
742 void print_embedding_tex(finite_field &subfield,
743 int *components, int *embedding, int *pair_embedding);
745 void print_element(std::ostream &ost, int a);
746 void print_element_str(std::stringstream &ost, int a);
747 void print_element_with_symbol(std::ostream &ost,
748 int a, int f_exponential, int width, std::string &symbol);
749 void print_element_with_symbol_str(std::stringstream &ost,
750 int a, int f_exponential, int width, std::string &symbol);
751 void int_vec_print_field_elements(std::ostream &ost, int *v, int len);
752 void int_vec_print_elements_exponential(std::ostream &ost,
753 int *v, int len, std::string &symbol_for_print);
754 void make_fname_addition_table_csv(std::string &fname);
755 void make_fname_multiplication_table_csv(std::string &fname);
756 void make_fname_addition_table_reordered_csv(std::string &fname);
757 void make_fname_multiplication_table_reordered_csv(std::string &fname);
758 void addition_table_save_csv(int verbose_level);
759 void multiplication_table_save_csv(int verbose_level);
760 void addition_table_reordered_save_csv(int verbose_level);
761 void multiplication_table_reordered_save_csv(int verbose_level);
762 void latex_addition_table(std::ostream &f,
763 int f_elements_exponential, std::string &symbol_for_print);
764 void latex_multiplication_table(std::ostream &f,
765 int f_elements_exponential, std::string &symbol_for_print);
766 void latex_matrix(std::ostream &f, int f_elements_exponential,
767 std::string &symbol_for_print, int *M, int m, int n);
768 void power_table(int t, int *power_table, int len);
769 void cheat_sheet(std::ostream &f, int verbose_level);
770 void cheat_sheet_subfields(std::ostream &f, int verbose_level);
771 void report_subfields(std::ostream &f, int verbose_level);
772 void report_subfields_detailed(std::ostream &ost, int verbose_level);
773 void cheat_sheet_addition_table(std::ostream &f, int verbose_level);
774 void cheat_sheet_multiplication_table(std::ostream &f, int verbose_level);
775 void cheat_sheet_power_table(std::ostream &f, int f_with_polynomials, int verbose_level);
776 void cheat_sheet_power_table_top(std::ostream &ost, int f_with_polynomials, int verbose_level);
777 void cheat_sheet_power_table_bottom(std::ostream &ost, int f_with_polynomials, int verbose_level);
778 void cheat_sheet_table_of_elements(std::ostream &ost, int verbose_level);
779 void print_element_as_polynomial(std::ostream &ost, int *v, int verbose_level);
780 void cheat_sheet_main_table(std::ostream &f, int verbose_level);
781 void cheat_sheet_main_table_top(std::ostream &f, int nb_cols);
782 void cheat_sheet_main_table_bottom(std::ostream &f);
784 std::ostream &ost, long int *Pts, int nb_pts, int len);
786 std::ostream &ost, long int *Pts, int nb_pts, int len);
788 std::ostream &ost, long int *Pts, int nb_pts, int len);
789 void export_magma(int d, long int *Pts, int nb_pts, std::string &fname);
790 void export_gap(int d, long int *Pts, int nb_pts, std::string &fname);
791 void print_matrix_latex(std::ostream &ost, int *A, int m, int n);
792 void print_matrix_numerical_latex(std::ostream &ost, int *A, int m, int n);
793
794
795
796};
797
798
799
800
801
802// #############################################################################
803// norm_tables.cpp:
804// #############################################################################
805
807
809public:
816
817 norm_tables();
818 ~norm_tables();
819 void init(orthogonal_geometry::unusual_model &U, int verbose_level);
820 int choose_an_element_of_given_norm(int norm, int verbose_level);
821
822};
823
824
825// #############################################################################
826// nth_roots.cpp:
827// #############################################################################
828
830
832public:
833
834 int n;
835 finite_field *F; // F_q where q = p^e
838
840 // Min_poly = irreducible polynomial over F->p of degree field_degree
841
842 finite_field *Fp; // the prime field F_p
844 ring_theory::unipoly_domain *Fq; // polynomial ring F_p modulo Min_poly
846
848 // m is the order of q modulo n
849 // field_degree = e * m
850
852 // Qm = q^m
853 // Qm1 = q^m - 1
854 // Index = Qm1 / n
855 // Subfield_Index = Qm1 / (q - 1)
856
859
861
863 int *subfield_basis; // [subfield_degree * field_degree]
864
865
866
867
868
869 nth_roots();
870 ~nth_roots();
871 void init(finite_field *F, int n, int verbose_level);
873 int *&field_basis, int verbose_level);
874 void report(std::ostream &ost, int verbose_level);
875
876};
877
878
879
880// #############################################################################
881// subfield_structure.cpp:
882// #############################################################################
883
885
887public:
888
891 int Q;
892 int q;
893 int s; // subfield index: q^s = Q
894 int *Basis;
895 // [s], entries are elements in FQ
896
898 // [Q], entries are elements in FQ,
899 // indexed by elements in AG(s,q)
901 // [Q], entries are ranks of elements in AG(s,q),
902 // indexed by elements in FQ
903 // the inverse of embedding
904
906 // [Q * s], entries are elements in Fq
907 // the vectors corresponding to the AG(s,q)
908 // ranks in embedding_inv[]
909
911 // [q] entries are elements in FQ corresponding to
912 // the elements in Fq
914 // [Q], entries are the elements in Fq
915 // corresponding to a given FQ element
916 // or -1 if the FQ element does not belong to Fq.
917 int *v; // [s]
918
921 void null();
922 void freeself();
923 void init(finite_field *FQ, finite_field *Fq, int verbose_level);
925 int *given_basis, int verbose_level);
926 void print_embedding();
927 void report(std::ostream &ost);
928 int evaluate_over_FQ(int *v);
929 int evaluate_over_Fq(int *v);
930 void lift_matrix(int *MQ, int m, int *Mq, int verbose_level);
931 void retract_matrix(int *Mq, int n, int *MQ, int m,
932 int verbose_level);
934 long int *&Pts, int &nb_pts, int verbose_level);
936 std::string &fname, int &nb_pts, long int *&Pts,
937 int verbose_level);
938 void field_reduction(int *input, int sz, int *output,
939 int verbose_level);
940 // input[sz], output[s * (sz * n)],
941
942};
943
944
945
946}}}
947
948
949
950#endif /* SRC_LIB_FOUNDATIONS_FINITE_FIELDS_FINITE_FIELDS_H_ */
void init(finite_field_activity_description *Descr, finite_field *F, int verbose_level)
int read_arguments(int argc, std::string *argv, int verbose_level)
implementation of a finite Galois field Fq using tables
implementation of a finite Galois field Fq without any tables
int add5(int i1, int i2, int i3, int i4, int i5)
void cheat_sheet_power_table_top(std::ostream &ost, int f_with_polynomials, int verbose_level)
void print_element_with_symbol_str(std::stringstream &ost, int a, int f_exponential, int width, std::string &symbol)
int add8(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8)
void cheat_sheet_main_table(std::ostream &f, int verbose_level)
void export_gap(int d, long int *Pts, int nb_pts, std::string &fname)
void create_BLT_from_database(int f_embedded, int BLT_k, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void PG_element_rank_modified(int *v, int stride, int len, int &a)
void PG_elements_embed(long int *set_in, long int *set_out, int sz, int old_length, int new_length, int *v)
void cheat_sheet_power_table(std::ostream &f, int f_with_polynomials, int verbose_level)
void cheat_sheet_addition_table(std::ostream &f, int verbose_level)
void all_PG_elements_in_subspace(int *genma, int k, int n, long int *&point_list, int &nb_points, int verbose_level)
void cheat_sheet_table_of_elements(std::ostream &ost, int verbose_level)
void print_minimum_polynomial(int p, std::string &polynomial)
void create_ttp_code(finite_field *Fq, int f_construction_A, int f_hyperoval, int f_construction_B, std::string &fname, int &nb_pts, long int *&Pts, int verbose_level)
int power_verbose(int a, int n, int verbose_level)
void init(finite_field_description *Descr, int verbose_level)
int product5(int a1, int a2, int a3, int a4, int a5)
void print_matrix_latex(std::ostream &ost, int *A, int m, int n)
void report_subfields(std::ostream &f, int verbose_level)
void export_magma(int d, long int *Pts, int nb_pts, std::string &fname)
void PG_elements_unrank_lint(int *M, int k, int n, long int *rank_vec)
void print_embedding_tex(finite_field &subfield, int *components, int *embedding, int *pair_embedding)
void report_subfields_detailed(std::ostream &ost, int verbose_level)
void create_orthogonal(int epsilon, int n, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void create_hermitian(int n, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void PG_element_rank_modified_not_in_subspace(int *v, int stride, int len, int m, long int &a)
void do_embed_orthogonal(int epsilon, int n, long int *set_in, long int *&set_out, int set_size, int verbose_level)
void isomorphism_to_special_orthogonal(int *A4, int *A6, int verbose_level)
orthogonal_geometry::orthogonal_indexing * Orthogonal_indexing
void cheat_sheet_power_table_bottom(std::ostream &ost, int f_with_polynomials, int verbose_level)
void do_blocking_set_family_3(int n, long int *set_in, int set_size, long int *&the_set_out, int &set_size_out, int verbose_level)
void create_segre_variety(int a, int b, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void print_element_with_symbol(std::ostream &ost, int a, int f_exponential, int width, std::string &symbol)
void print_matrix_numerical_latex(std::ostream &ost, int *A, int m, int n)
void cheat_sheet(std::ostream &f, int verbose_level)
void simeon(int n, int len, long int *S, int s, int verbose_level)
void PG_element_unrank_modified(int *v, int stride, int len, int a)
void display_table_of_projective_points(std::ostream &ost, long int *Pts, int nb_pts, int len)
int mult_verbose(int i, int j, int verbose_level)
int mult6(int a1, int a2, int a3, int a4, int a5, int a6)
void latex_addition_table(std::ostream &f, int f_elements_exponential, std::string &symbol_for_print)
void all_PG_elements_in_subspace_array_is_given(int *genma, int k, int n, long int *point_list, int &nb_points, int verbose_level)
void minimal_orbit_rep_under_stabilizer_of_frame_characteristic_two(int x, int y, int &a, int &b, int verbose_level)
void do_embed_points(int n, long int *set_in, long int *&set_out, int set_size, int verbose_level)
void display_table_of_projective_points_easy(std::ostream &ost, long int *Pts, int nb_pts, int len)
void compute_nth_roots(int *&Nth_roots, int n, int verbose_level)
void retract_int_vec(finite_field &subfield, int index, int *v_in, int *v_out, int len, int verbose_level)
void int_vec_print_elements_exponential(std::ostream &ost, int *v, int len, std::string &symbol_for_print)
void display_table_of_projective_points2(std::ostream &ost, long int *Pts, int nb_pts, int len)
void do_cone_over(int n, long int *set_in, int set_size_in, long int *&set_out, int &set_size_out, int verbose_level)
void print_element_str(std::stringstream &ost, int a)
void do_andre(finite_field *Fq, long int *the_set_in, int set_size_in, long int *&the_set_out, int &set_size_out, int verbose_level)
void report(std::ostream &ost, int verbose_level)
int mult5(int a1, int a2, int a3, int a4, int a5)
int add7(int i1, int i2, int i3, int i4, int i5, int i6, int i7)
void finite_field_init(int q, int f_without_tables, int verbose_level)
int compute_order_of_element(int elt, int verbose_level)
void init_implementation(int f_without_tables, int verbose_level)
void frobenius_power_vec(int *v, int len, int frob_power)
void init_override_polynomial(int q, std::string &poly, int f_without_tables, int verbose_level)
void PG_element_unrank_modified_lint(int *v, int stride, int len, long int a)
void int_vec_print_field_elements(std::ostream &ost, int *v, int len)
void subfield_embedding_2dimensional(finite_field &subfield, int *&components, int *&embedding, int *&pair_embedding, int verbose_level)
void cheat_sheet_main_table_top(std::ostream &f, int nb_cols)
void PG_element_unrank_modified_not_in_subspace(int *v, int stride, int len, int m, long int a)
void latex_matrix(std::ostream &f, int f_elements_exponential, std::string &symbol_for_print, int *M, int m, int n)
void cheat_sheet_subfields(std::ostream &f, int verbose_level)
void print_embedding(finite_field &subfield, int *components, int *embedding, int *pair_embedding)
long int PG_element_embed(long int rk, int old_length, int new_length, int *v)
void cheat_sheet_multiplication_table(std::ostream &f, int verbose_level)
void PG_elements_rank_lint(int *M, int k, int n, long int *rank_vec)
void create_Baer_substructure(int n, finite_field *Fq, std::string &fname, int &nb_pts, long int *&Pts, int verbose_level)
void latex_multiplication_table(std::ostream &f, int f_elements_exponential, std::string &symbol_for_print)
int retract(finite_field &subfield, int index, int a, int verbose_level)
void print_integer_matrix_zech(std::ostream &ost, int *p, int m, int n)
void frobenius_power_vec_to_vec(int *v_in, int *v_out, int len, int frob_power)
void PG_element_rank_modified_lint(int *v, int stride, int len, long int &a)
void abc2xy(int a, int b, int c, int &x, int &y, int verbose_level)
void all_square_roots(int a, int &nb_roots, int *roots2)
long int compute_subfield_polynomial(int order_subfield, int f_latex, std::ostream &ost, int verbose_level)
int add6(int i1, int i2, int i3, int i4, int i5, int i6)
void power_table(int t, int *power_table, int len)
int embed(finite_field &subfield, int index, int b, int verbose_level)
void print_element_as_polynomial(std::ostream &ost, int *v, int verbose_level)
tables for the norm map in a finite field
int choose_an_element_of_given_norm(int norm, int verbose_level)
void init(orthogonal_geometry::unusual_model &U, int verbose_level)
Definition: norm_tables.cpp:65
the nth roots over Fq using an extension field
void report(std::ostream &ost, int verbose_level)
Definition: nth_roots.cpp:560
ring_theory::longinteger_object * Subfield_Index
void init(finite_field *F, int n, int verbose_level)
Definition: nth_roots.cpp:62
void compute_subfield(int subfield_degree, int *&field_basis, int verbose_level)
Definition: nth_roots.cpp:374
a finite field as a vector space over a subfield
void retract_matrix(int *Mq, int n, int *MQ, int m, int verbose_level)
void Adelaide_hyperoval(long int *&Pts, int &nb_pts, int verbose_level)
void init(finite_field *FQ, finite_field *Fq, int verbose_level)
void create_adelaide_hyperoval(std::string &fname, int &nb_pts, long int *&Pts, int verbose_level)
void field_reduction(int *input, int sz, int *output, int verbose_level)
void init_with_given_basis(finite_field *FQ, finite_field *Fq, int *given_basis, int verbose_level)
void lift_matrix(int *MQ, int m, int *Mq, int verbose_level)
indexing of points in an orthogonal geometry O^epsilon(n,q)
Definition: orthogonal.h:135
Penttila's unusual model to create BLT-sets.
Definition: orthogonal.h:676
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
domain of polynomials in one variable over a finite field
Definition: ring_theory.h:691
the orbiter library for the classification of combinatorial objects