8#ifndef SRC_LIB_FOUNDATIONS_FINITE_FIELDS_FINITE_FIELDS_H_
9#define SRC_LIB_FOUNDATIONS_FINITE_FIELDS_FINITE_FIELDS_H_
12namespace layer1_foundations {
13namespace field_theory {
277 int argc, std::string *argv,
327 int *frobenius_table;
328 int *absolute_trace_table;
329 int *log_alpha_table;
332 int *alpha_power_table;
338 int f_has_quadratic_subfield;
339 int *f_belongs_to_quadratic_subfield;
341 int *reordered_list_of_elements;
342 int *reordered_list_of_elements_inv;
365 int add(
int i,
int j);
408 int factor_polynomial_degree;
409 int *factor_polynomial_coefficients_negated;
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);
451 int argc, std::string *argv,
472 std::string symbol_for_print;
511 int f_without_tables,
int verbose_level);
515 int f_latex, std::ostream &ost,
527 int mult(
int i,
int j);
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);
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,
549 int add8(
int i1,
int i2,
int i3,
int i4,
int i5,
int i6,
553 int power(
int a,
int n);
574 void abc2xy(
int a,
int b,
int c,
int &x,
int &y,
582 int *v_in,
int *v_out,
int len,
int verbose_level);
586 int *&components,
int *&embedding,
587 int *&pair_embedding,
int verbose_level);
608 long int *set_in,
long int *set_out,
int sz,
609 int old_length,
int new_length,
int *v);
611 long int rk,
int old_length,
int new_length,
int *v);
613 int *v,
int len,
int a);
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);
638 int *genma,
int k,
int n,
long int *&point_list,
int &nb_points,
641 int *genma,
int k,
int n,
long int *point_list,
int &nb_points,
647 long int *set_in,
int set_size_in,
648 long int *&set_out,
int &set_size_out,
651 long int *set_in,
int set_size,
652 long int *&the_set_out,
int &set_size_out,
657 std::string &fname,
int &nb_pts,
long int *&Pts,
663 std::string &label_txt,
665 int &nb_pts,
long int *&Pts,
668 std::string &label_txt,
670 int &nb_pts,
long int *&Pts,
673 std::string &label_txt,
675 int &nb_pts,
long int *&Pts,
679 int f_construction_A,
int f_hyperoval,
int f_construction_B,
680 std::string &fname,
int &nb_pts,
long int *&Pts,
684 std::string &label_txt,
686 int &nb_pts,
long int *&Pts,
690 long int *the_set_in,
int set_size_in,
691 long int *&the_set_out,
int &set_size_out,
697 long int *set_in,
long int *&set_out,
int set_size,
700 long int *set_in,
long int *&set_out,
int set_size,
703 void simeon(
int n,
int len,
long int *S,
int s,
int verbose_level);
708 int &a,
int &b,
int verbose_level);
717 void report(std::ostream &ost,
int verbose_level);
727 int *
p,
int m,
int n);
729 int *components,
int *embedding,
int *pair_embedding);
743 int *components,
int *embedding,
int *pair_embedding);
748 int a,
int f_exponential,
int width, std::string &symbol);
750 int a,
int f_exponential,
int width, std::string &symbol);
753 int *v,
int len, std::string &symbol_for_print);
763 int f_elements_exponential, std::string &symbol_for_print);
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);
769 void cheat_sheet(std::ostream &f,
int verbose_level);
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);
873 int *&field_basis,
int verbose_level);
874 void report(std::ostream &ost,
int verbose_level);
925 int *given_basis,
int verbose_level);
927 void report(std::ostream &ost);
930 void lift_matrix(
int *MQ,
int m,
int *Mq,
int verbose_level);
934 long int *&Pts,
int &nb_pts,
int verbose_level);
936 std::string &fname,
int &nb_pts,
long int *&Pts,
description of a finite field activity
std::string unrank_point_in_PG_text
int read_arguments(int argc, std::string *argv, int verbose_level)
long int mult_polynomials_r0
int f_cheat_sheet_desarguesian_spread
std::string write_code_for_division_B
long int mult_polynomials_r1
std::string field_reduction_label
int f_polynomial_division_from_file_all_k_bit_error_patterns
std::string polynomial_mult_mod_M
std::string apply_power_function_fname_csv_in
std::string polynomial_division_from_file_fname
std::string inverse_isomorphism_klein_quadric_matrix_A6
std::string transversal_line_1_basis
int f_generator_matrix_cyclic_code
std::string product_of_elements
int f_write_code_for_division
std::string Walsh_Hadamard_transform_fname_csv_in
int f_search_APN_function
int f_polynomial_division_ranked
int f_EC_Koblitz_encoding
std::string transversal_point
int f_make_BCH_code_and_encode
int cheat_sheet_hermitian_projective_dimension
finite_field_activity_description()
int polynomial_division_from_file_all_k_bit_error_patterns_k
std::string rank_point_in_PG_label
std::string power_map_elements
int f_polynomial_mult_mod
int f_Walsh_Hadamard_transform
std::string write_code_for_division_fname
int f_find_CRC_polynomials
long int apply_power_function_d
std::string negate_elements
int f_make_table_of_irreducible_polynomials
std::string EC_bsgs_cipher_text
int f_polynomial_find_roots
std::string Berlekamp_matrix_coeffs
int f_normalize_from_the_right
int f_polynomial_center_lift
int f_polynomial_reduce_mod_p
std::string make_BCH_code_and_encode_text
std::string polynomial_division_A
int f_inverse_isomorphism_klein_quadric
int f_apply_trace_function
std::string polynomial_mult_mod_B
int Walsh_Hadamard_transform_n
int f_polynomial_division
int f_normalize_from_the_left
std::string EC_discrete_log_pt_text
long int sift_polynomials_r0
std::string make_BCH_code_and_encode_fname
std::string sum_of_elements
std::string NTRU_encrypt_Msg
int f_apply_power_function
int make_table_of_irreducible_polynomials_degree
std::string NTRU_encrypt_H
long int sift_polynomials_r1
std::string write_code_for_division_A
int f_EC_baby_step_giant_step
std::string field_reduction_text
std::string evaluate_formula_label
std::string identity_function_fname_csv_out
std::string transversal_line_2_basis
std::string evaluate_parameters
int polynomial_division_from_file_all_k_bit_error_patterns_r1
std::string polynomial_division_from_file_all_k_bit_error_patterns_fname
int cheat_sheet_desarguesian_spread_m
int find_CRC_polynomials_nb_errors
int f_algebraic_normal_form
std::string nullspace_input_matrix
std::string polynomial_reduce_mod_p_A
~finite_field_activity_description()
std::string apply_trace_function_fname_csv_in
long int polynomial_division_r0
int algebraic_normal_form_n
int generator_matrix_cyclic_code_n
std::string inverse_elements
int f_cheat_sheet_hermitian
std::string algebraic_normal_form_fname_csv_in
int f_extended_gcd_for_polynomials
std::string polynomial_mult_mod_A
std::string generator_matrix_cyclic_code_poly
int f_intersection_of_two_lines
std::string polynomial_find_roots_A
long int polynomial_division_from_file_r1
std::string NTRU_encrypt_R
int f_polynomial_division_from_file
std::string parse_name_of_formula
long int polynomial_division_r1
int f_EC_baby_step_giant_step_decode
std::string weight_enumerator_input_matrix
std::string polynomial_division_B
std::string parse_parameters
std::string polynomial_center_lift_A
int find_CRC_polynomials_check_bits
std::string parse_managed_variables
std::string RREF_input_matrix
int find_CRC_polynomials_information_bits
perform a finite field activity
void perform_activity(int verbose_level)
void init(finite_field_activity_description *Descr, finite_field *F, int verbose_level)
finite_field * F_secondary
finite_field_activity_description * Descr
description of a finite field
int read_arguments(int argc, std::string *argv, int verbose_level)
std::string override_polynomial
int f_override_polynomial
finite_field_description()
~finite_field_description()
implementation of a finite Galois field Fq using tables
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)
implementation of a finite Galois field Fq without any tables
~finite_field_implementation_wo_tables()
int inverse(int i, int verbose_level)
void init(finite_field *F, int verbose_level)
int negate(int i, int verbose_level)
int add(int i, int j, int verbose_level)
int mult(int i, int j, int verbose_level)
finite_field_implementation_wo_tables()
int add5(int i1, int i2, int i3, int i4, int i5)
void display_T2(std::ostream &ost)
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)
int add4(int i1, int i2, int i3, int i4)
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 PG_element_normalize_from_front(int *v, int stride, int len)
void all_PG_elements_in_subspace(int *genma, int k, int n, long int *&point_list, int &nb_points, int verbose_level)
int f_print_as_exponentials
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 multiplication_table_save_csv(int verbose_level)
void addition_table_reordered_save_csv(int verbose_level)
void display_N3(std::ostream &ost)
void init(finite_field_description *Descr, int verbose_level)
int product5(int a1, int a2, int a3, int a4, int a5)
void print_indicator_square_nonsquare(int a)
void print_matrix_latex(std::ostream &ost, int *A, int m, int n)
int * private_mult_table()
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)
std::string override_poly
int nb_times_add_called()
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)
long int nb_calls_to_PG_element_unrank_modified
int nb_times_mult_called()
void PG_element_rank_modified_not_in_subspace(int *v, int stride, int len, int m, long int &a)
long int nb_calls_to_PG_element_rank_modified
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 print_call_stats(std::ostream &ost)
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 make_fname_addition_table_csv(std::string &fname)
void cheat_sheet(std::ostream &f, int verbose_level)
void PG_element_normalize(int *v, int stride, int len)
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)
void print_detailed(int f_add_mult_table)
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)
int belongs_to_quadratic_subfield(int a)
void init_symbol_for_print(const char *symbol)
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_T3(std::ostream &ost)
void display_table_of_projective_points_easy(std::ostream &ost, long int *Pts, int nb_pts, int len)
int evaluate_Fermat_cubic(int *v)
int mult3(int a1, int a2, int a3)
void PG_element_unrank_fining(int *v, int len, int a)
int multiplicative_order(int a)
void display_N2(std::ostream &ost)
int test_if_vectors_are_projectively_equal(int *v1, int *v2, 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)
int product3(int a1, int a2, int a3)
int product_n(int *a, int n)
int product4(int a1, int a2, int a3, int a4)
void print_element_str(std::stringstream &ost, int a)
int frobenius_power(int a, int frob_power)
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)
int PG_element_rank_fining(int *v, int len)
void report(std::ostream &ost, int verbose_level)
int mult5(int a1, int a2, int a3, int a4, int a5)
int add3(int i1, int i2, int i3)
void cheat_sheet_main_table_bottom(std::ostream &f)
int a_over_b(int a, int b)
void display_all_PG_elements(int n)
void addition_table_save_csv(int verbose_level)
void make_fname_addition_table_reordered_csv(std::string &fname)
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 make_fname_multiplication_table_csv(std::string &fname)
void init_override_polynomial(int q, std::string &poly, int f_without_tables, int verbose_level)
void print_set_in_affine_plane(int len, long int *S)
void set_default_symbol_for_print()
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)
int find_primitive_element(int verbose_level)
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)
int absolute_trace(int i)
void klein_to_wedge(int *K, int *W)
int * private_add_table()
void display_all_AG_elements(int n)
long int projective_point_rank(int n, int *v)
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)
linear_algebra::linear_algebra * Linear_algebra
void print_embedding(finite_field &subfield, int *components, int *embedding, int *pair_embedding)
void projective_point_unrank(int n, int *v, int rk)
void print_element(std::ostream &ost, int a)
void display_all_PG_elements_not_in_subspace(int n, int m)
long int PG_element_embed(long int rk, int old_length, int new_length, int *v)
long int nb_calls_to_mult_matrix_matrix
void cheat_sheet_multiplication_table(std::ostream &f, int verbose_level)
void compute_subfields(int verbose_level)
int has_quadratic_subfield()
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)
int mult4(int a1, int a2, int a3, int a4)
void make_fname_multiplication_table_reordered_csv(std::string &fname)
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 multiplication_table_reordered_save_csv(int verbose_level)
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 wedge_to_klein(int *W, int *K)
void PG_element_apply_frobenius(int n, int *v, int f)
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)
void PG_element_unrank_gary_cook(int *v, int len, int a)
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)
the nth roots over Fq using an extension field
ring_theory::longinteger_object * Qm1
number_theory::cyclotomic_sets * Cyc
ring_theory::unipoly_object * Fq_Elements
ring_theory::unipoly_object Min_poly
ring_theory::longinteger_object * Index
ring_theory::unipoly_domain * FX
void report(std::ostream &ost, int verbose_level)
ring_theory::unipoly_domain * Fq
ring_theory::unipoly_object * Beta
ring_theory::longinteger_object * Subfield_Index
ring_theory::unipoly_object ** generator
ring_theory::longinteger_object * Qm
void init(finite_field *F, int n, int verbose_level)
void compute_subfield(int subfield_degree, int *&field_basis, int verbose_level)
ring_theory::unipoly_object * generator_Fq
ring_theory::unipoly_domain * FpX
a finite field as a vector space over a subfield
void report(std::ostream &ost)
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)
int evaluate_over_FQ(int *v)
int evaluate_over_Fq(int *v)
void lift_matrix(int *MQ, int m, int *Mq, int verbose_level)
linear algebra over a finite field
cyclotomic sets for cyclic codes
indexing of points in an orthogonal geometry O^epsilon(n,q)
Penttila's unusual model to create BLT-sets.
a class to represent arbitrary precision integers
domain of polynomials in one variable over a finite field
the orbiter library for the classification of combinatorial objects