Orbiter 2022
Combinatorial Objects
coding_theory.h
Go to the documentation of this file.
1// coding_theory.h
2//
3// Anton Betten
4//
5// moved here from galois.h: July 27, 2018
6// started as orbiter: October 23, 2002
7// 2nd version started: December 7, 2003
8// galois started: August 12, 2005
9
10
11#ifndef ORBITER_SRC_LIB_FOUNDATIONS_CODING_THEORY_CODING_THEORY_H_
12#define ORBITER_SRC_LIB_FOUNDATIONS_CODING_THEORY_CODING_THEORY_H_
13
14
15namespace orbiter {
16namespace layer1_foundations {
17namespace coding_theory {
18
19
20// #############################################################################
21// coding_theory_domain.cpp:
22// #############################################################################
23
25
26
28public:
29
32
33
34
36 int n, int k, int q, int verbose_level);
38 int n_max, int q, int verbose_level);
40 int n, int k, int d, int q,
41 geometry::projective_space *P, int verbose_level);
43 geometry::projective_space *P, int n, int d,
44 long int *set, int *f_forbidden, int level, int verbose_level);
45
46 int gilbert_varshamov_lower_bound_for_d(int n, int k, int q, int verbose_level);
47 int singleton_bound_for_d(int n, int k, int q, int verbose_level);
48 int hamming_bound_for_d(int n, int k, int q, int verbose_level);
49 int plotkin_bound_for_d(int n, int k, int q, int verbose_level);
50 int griesmer_bound_for_d(int n, int k, int q, int verbose_level);
51 int griesmer_bound_for_n(int k, int d, int q, int verbose_level);
52
53 void do_make_macwilliams_system(int q, int n, int k, int verbose_level);
54 void make_Hamming_graph_and_write_file(int n, int q,
55 int f_projective, int verbose_level);
57 std::ostream &ost, field_theory::finite_field *F, int *M, int n, int k);
59 int *code, int verbose_level);
60 // code[k * n]
61 void codewords_affine(field_theory::finite_field *F, int n, int k,
62 int *code, // [k * n]
63 int *codewords, // q^k
64 int verbose_level);
66 int *code, // [k * n]
67 int *weight_enumerator, // [n + 1]
68 int verbose_level);
70 int *code, // [k * n]
71 int *weight_enumerator, // [n + 1]
72 int verbose_level);
74 int *code, // [k * n]
75 int *weight_enumerator, // [n + 1]
76 int verbose_level);
78 int *code, // [k * n]
79 int *&weights,
80 // will be allocated [N]
81 // where N = theta_{k-1}
82 int verbose_level);
83 void mac_williams_equations(ring_theory::longinteger_object *&M, int n, int k, int q);
86 int *M, int m, int n,
87 int f_normalize_from_the_left, int f_normalize_from_the_right,
88 int verbose_level);
89
91 int n,
92 long int *basis_set, int k,
93 int f_embellish,
94 int verbose_level);
97 int n, int k, long int *columns_set_of_size_n,
98 int *genma,
99 int verbose_level);
101 int n,
102 long int *columns_set, int k,
103 int verbose_level);
105 int n,
106 long int *columns_set, int k,
107 int verbose_level);
108 void do_polynomial(
109 int n,
110 int polynomial_degree,
111 int polynomial_nb_vars,
112 std::string &polynomial_text,
113 int f_embellish,
114 int verbose_level);
115 void do_sylvester_hadamard(int n,
116 int f_embellish,
117 int verbose_level);
118 void do_long_code(
119 int n,
120 std::vector<std::string> &long_code_generators_text,
121 int f_nearest_codeword,
122 std::string &nearest_codeword_text,
123 int verbose_level);
124 void code_diagram(
125 std::string &label,
126 long int *Words,
127 int nb_words, int n, int f_metric_balls, int radius_of_metric_ball,
128 int f_enhance, int radius,
129 int verbose_level);
130 void investigate_code(long int *Words,
131 int nb_words, int n, int f_embellish, int verbose_level);
132 void embellish(int *M, int nb_rows, int nb_cols, int i0, int j0, int a, int rad);
133 void place_entry(int *M, int nb_rows, int nb_cols, int i, int j, int a);
134 void do_it(int n, int r, int a, int c, int seed, int verbose_level);
135 void dimensions(int n, int &nb_rows, int &nb_cols);
136 void dimensions_N(int N, int &nb_rows, int &nb_cols);
137 void print_binary(int n, int *v);
138 void convert_to_binary(int n, long int h, int *v);
139 int distance(int n, int a, int b);
140 void place_binary(long int h, int &i, int &j);
141 void place_binary(int *v, int n, int &i, int &j);
143 std::string &label,
144 int m, int n, std::string &genma_text,
145 int verbose_level);
147 std::string &text, std::string &fname,
148 int verbose_level);
149 void encode_text_5bits(std::string &text,
150 std::string &fname, int verbose_level);
151 void field_induction(std::string &fname_in,
152 std::string &fname_out, int nb_bits, int verbose_level);
153 int Hamming_distance(int *v1, int *v2, int n);
154 int Hamming_distance_binary(int a, int b, int n);
156 int n,
157 std::string &poly_coeffs,
158 int verbose_level);
159
160
161 // cyclic_codes.cpp:
162 void make_BCH_code(int n, field_theory::finite_field *F, int d,
164 int verbose_level);
165 void make_cyclic_code(int n, int q, int t,
166 int *roots, int nb_roots, int f_poly, std::string &poly,
167 int f_dual, std::string &fname_txt, std::string &fname_csv,
168 int verbose_level);
170 int degree, int *generator_polynomial, int *&M);
172 int degree, ring_theory::unipoly_object *coeffs);
173 void print_polynomial_tight(std::ostream &ost, ring_theory::unipoly_domain &Fq,
174 int degree, ring_theory::unipoly_object *coeffs);
175 void field_reduction(int n, int q, int p, int e, int m,
177 int degree, ring_theory::unipoly_object *generator, int *&generator_subfield,
178 int f_poly, std::string &poly,
179 int verbose_level);
183 int designed_distance, int &bose_distance,
184 int &transversal_length, int *&transversal,
185 ring_theory::longinteger_object *&rank_of_irreducibles,
186 int verbose_level);
188 int n, int &k, int verbose_level);
189 void make_BCH_codes(int n, int q, int t, int b, int f_dual, int verbose_level);
190
191
192
193 // mindist.cpp:
194 int mindist(int n, int k, int q, int *G,
195 int f_verbose_level, int idx_zero, int idx_one,
196 int *add_table, int *mult_table);
197 //Main routine for the code minimum distance computation.
198 //The tables are only needed if $q = p^f$ with $f > 1$.
199 //In the GF(p) case, just pass a NULL pointer.
200
201
202 // tensor_codes.cpp:
203
205 int *&H_subfield, int &m, int &n,
207 int f_construction_A, int f_hyperoval,
208 int f_construction_B, int verbose_level);
209 void create_matrix_M(
210 int *&M,
212 int &m, int &n, int &beta, int &r, int *exponents,
213 int f_construction_A, int f_hyperoval, int f_construction_B,
214 int f_elements_exponential, std::string &symbol_for_print,
215 int verbose_level);
216 // int exponents[9]
218 int *H_subfield, int *C, int *C_inv, int *M, int m, int n,
219 int beta, int beta_q,
220 int f_elements_exponential, std::string &symbol_for_print,
221 std::string &symbol_for_print_subfield,
222 int f_construction_A, int f_hyperoval, int f_construction_B,
223 int verbose_level);
225 int m, int n, int *M, int *MM, int verbose_level);
226
227
229 int *&the_set, int &length,
230 int verbose_level);
232 std::string &override_poly_Q, std::string &override_poly,
233 int f_hyperoval,
234 int *&code, int &length,
235 int verbose_level);
236
237
238
240 int t, int da, int dc,
241 int verbose_level);
243 int da, int *A, int dc, int *C, int i, field_theory::finite_field *F,
244 long int &nb_sol, std::vector<std::vector<int> > &Solutions,
245 int verbose_level);
247 int da, int *A, int dc, int *C, int i,
248 long int &nb_sol, std::vector<std::vector<int> > &Solutions,
249 int verbose_level);
250 int test_all_two_bit_patterns(int da, int *A, int dc, int *C,
251 field_theory::finite_field *F, int verbose_level);
252 int test_all_three_bit_patterns(int da, int *A, int dc, int *C,
253 field_theory::finite_field *F, int verbose_level);
254 int test_all_two_bit_patterns_binary(int da, int *A, int dc, int *C,
255 int verbose_level);
256 int test_all_three_bit_patterns_binary(int da, int *A, int dc, int *C,
257 int verbose_level);
258 int remainder_is_nonzero(int da, int *A, int db, int *B, field_theory::finite_field *F);
259 int remainder_is_nonzero_binary(int da, int *A, int db, int *B);
260
261
262
263};
264
265// #############################################################################
266// create_BCH_code.cpp:
267// #############################################################################
268
270
271
273public:
274
275 int n;
276 int d;
278
280
282
283 int *Selection; // [Nth->Cyc->S->nb_sets]
284 int *Sel; // [nb_sel]
286
288 int k;
289 int *Genma; // [k * n]
290 int *generator_polynomial; // [degree + 1]
291
292
293
296 void init(field_theory::finite_field *F, int n, int d, int verbose_level);
297 void report(std::ostream &ost, int verbose_level);
298
299
300};
301
302
303}}}
304
305
306
307#endif /* ORBITER_SRC_LIB_FOUNDATIONS_CODING_THEORY_CODING_THEORY_H_ */
308
309
310
void print_polynomial(ring_theory::unipoly_domain &Fq, int degree, ring_theory::unipoly_object *coeffs)
void do_long_code(int n, std::vector< std::string > &long_code_generators_text, int f_nearest_codeword, std::string &nearest_codeword_text, int verbose_level)
void field_reduction(field_theory::finite_field *FQ, field_theory::finite_field *Fq, std::string &label, int m, int n, std::string &genma_text, int verbose_level)
int gilbert_varshamov_lower_bound_for_d(int n, int k, int q, int verbose_level)
void codewords_affine(field_theory::finite_field *F, int n, int k, int *code, int *codewords, int verbose_level)
void make_tensor_code_9_dimensional(int q, std::string &override_poly_Q, std::string &override_poly, int f_hyperoval, int *&code, int &length, int verbose_level)
void search_for_CRC_polynomials(int t, int da, int *A, int dc, int *C, int i, field_theory::finite_field *F, long int &nb_sol, std::vector< std::vector< int > > &Solutions, int verbose_level)
void tt_field_reduction(field_theory::finite_field &F, field_theory::finite_field &f, int m, int n, int *M, int *MM, int verbose_level)
void encode_text_5bits(std::string &text, std::string &fname, int verbose_level)
int code_minimum_distance(field_theory::finite_field *F, int n, int k, int *code, int verbose_level)
void CRC_encode_text(field_theory::nth_roots *Nth, ring_theory::unipoly_object &CRC_poly, std::string &text, std::string &fname, int verbose_level)
void BCH_generator_polynomial(field_theory::finite_field *F, ring_theory::unipoly_object &g, int n, int designed_distance, int &bose_distance, int &transversal_length, int *&transversal, ring_theory::longinteger_object *&rank_of_irreducibles, int verbose_level)
void create_matrix_M(int *&M, field_theory::finite_field *F, field_theory::finite_field *f, int &m, int &n, int &beta, int &r, int *exponents, int f_construction_A, int f_hyperoval, int f_construction_B, int f_elements_exponential, std::string &symbol_for_print, int verbose_level)
void do_make_macwilliams_system(int q, int n, int k, int verbose_level)
int test_all_two_bit_patterns_binary(int da, int *A, int dc, int *C, int verbose_level)
void matrix_from_projective_set(field_theory::finite_field *F, int n, int k, long int *columns_set_of_size_n, int *genma, int verbose_level)
void embellish(int *M, int nb_rows, int nb_cols, int i0, int j0, int a, int rad)
void twisted_tensor_product_codes(int *&H_subfield, int &m, int &n, field_theory::finite_field *F, field_theory::finite_field *f, int f_construction_A, int f_hyperoval, int f_construction_B, int verbose_level)
void search_for_CRC_polynomials_binary(int t, int da, int *A, int dc, int *C, int i, long int &nb_sol, std::vector< std::vector< int > > &Solutions, int verbose_level)
void make_BCH_codes(int n, int q, int t, int b, int f_dual, int verbose_level)
int singleton_bound_for_d(int n, int k, int q, int verbose_level)
void code_projective_weight_enumerator(field_theory::finite_field *F, int n, int k, int *code, int *weight_enumerator, int verbose_level)
void make_tensor_code_9dimensional_as_point_set(field_theory::finite_field *F, int *&the_set, int &length, int verbose_level)
void do_linear_code_through_columns_of_parity_check(int n, long int *columns_set, int k, int verbose_level)
void print_polynomial_tight(std::ostream &ost, ring_theory::unipoly_domain &Fq, int degree, ring_theory::unipoly_object *coeffs)
void make_gilbert_varshamov_code_recursion(geometry::projective_space *P, int n, int d, long int *set, int *f_forbidden, int level, int verbose_level)
void compute_and_print_projective_weights(std::ostream &ost, field_theory::finite_field *F, int *M, int n, int k)
int test_all_three_bit_patterns_binary(int da, int *A, int dc, int *C, int verbose_level)
void code_weight_enumerator_fast(field_theory::finite_field *F, int n, int k, int *code, int *weight_enumerator, int verbose_level)
void make_Hamming_graph_and_write_file(int n, int q, int f_projective, int verbose_level)
void do_linear_code_through_basis(int n, long int *basis_set, int k, int f_embellish, int verbose_level)
int griesmer_bound_for_d(int n, int k, int q, int verbose_level)
void do_it(int n, int r, int a, int c, int seed, int verbose_level)
int remainder_is_nonzero(int da, int *A, int db, int *B, field_theory::finite_field *F)
int test_all_two_bit_patterns(int da, int *A, int dc, int *C, field_theory::finite_field *F, int verbose_level)
void make_mac_williams_equations(ring_theory::longinteger_object *&M, int n, int k, int q, int verbose_level)
void investigate_code(long int *Words, int nb_words, int n, int f_embellish, int verbose_level)
void do_polynomial(int n, int polynomial_degree, int polynomial_nb_vars, std::string &polynomial_text, int f_embellish, int verbose_level)
void find_CRC_polynomials(field_theory::finite_field *F, int t, int da, int dc, int verbose_level)
void do_linear_code_through_columns_of_parity_check_projectively(int n, long int *columns_set, int k, int verbose_level)
void do_sylvester_hadamard(int n, int f_embellish, int verbose_level)
int test_all_three_bit_patterns(int da, int *A, int dc, int *C, field_theory::finite_field *F, int verbose_level)
void code_weight_enumerator(field_theory::finite_field *F, int n, int k, int *code, int *weight_enumerator, int verbose_level)
void make_gilbert_varshamov_code(int n, int k, int d, int q, geometry::projective_space *P, int verbose_level)
void generator_matrix_cyclic_code(field_theory::finite_field *F, int n, std::string &poly_coeffs, int verbose_level)
void code_diagram(std::string &label, long int *Words, int nb_words, int n, int f_metric_balls, int radius_of_metric_ball, int f_enhance, int radius, int verbose_level)
void code_projective_weights(field_theory::finite_field *F, int n, int k, int *code, int *&weights, int verbose_level)
int mindist(int n, int k, int q, int *G, int f_verbose_level, int idx_zero, int idx_one, int *add_table, int *mult_table)
Definition: mindist.cpp:55
void create_matrix_H_subfield(field_theory::finite_field *F, field_theory::finite_field *f, int *H_subfield, int *C, int *C_inv, int *M, int m, int n, int beta, int beta_q, int f_elements_exponential, std::string &symbol_for_print, std::string &symbol_for_print_subfield, int f_construction_A, int f_hyperoval, int f_construction_B, int verbose_level)
void make_cyclic_code(int n, int q, int t, int *roots, int nb_roots, int f_poly, std::string &poly, int f_dual, std::string &fname_txt, std::string &fname_csv, int verbose_level)
void field_induction(std::string &fname_in, std::string &fname_out, int nb_bits, int verbose_level)
void compute_generator_matrix(ring_theory::unipoly_object a, int *&genma, int n, int &k, int verbose_level)
void do_weight_enumerator(field_theory::finite_field *F, int *M, int m, int n, int f_normalize_from_the_left, int f_normalize_from_the_right, int verbose_level)
void place_entry(int *M, int nb_rows, int nb_cols, int i, int j, int a)
int griesmer_bound_for_n(int k, int d, int q, int verbose_level)
void mac_williams_equations(ring_theory::longinteger_object *&M, int n, int k, int q)
void make_BCH_code(int n, field_theory::finite_field *F, int d, field_theory::nth_roots *&Nth, ring_theory::unipoly_object &P, int verbose_level)
void report(std::ostream &ost, int verbose_level)
void init(field_theory::finite_field *F, int n, int d, int verbose_level)
the nth roots over Fq using an extension field
projective space PG(n,q) of dimension n over Fq
Definition: geometry.h:1916
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