15namespace layer1_foundations {
16namespace coding_theory {
23 int f_v = (verbose_level >= 1);
26 cout <<
"coding_theory_domain::make_BCH_code q=" << F->
q <<
" n=" << n
27 <<
" d=" << d << endl;
33 Nth->
init(F, n, verbose_level);
48 for (i = 0; i < d - 1; i++) {
61 cout <<
"coding_theory_domain::make_BCH_code Sel=";
71 for (i = 0; i < nb_sel; i++) {
76 cout <<
"coding_theory_domain::make_BCH_code P=";
79 cout <<
"j=" << j << endl;
85 cout <<
"coding_theory_domain::make_BCH_code Q=";
95 cout <<
"coding_theory_domain::make_BCH_code q=" << F->
q <<
" n=" << n
96 <<
" d=" << d <<
" done" << endl;
103 int *roots,
int nb_roots,
int f_poly, std::string &poly,
104 int f_dual, std::string &fname_txt, std::string &fname_csv,
107 int f_v = (verbose_level >= 1);
108 int f_vv = (verbose_level >= 2);
117 cout <<
"coding_theory_domain::make_cyclic_code q=" << q <<
" p=" << q
118 <<
" e=" << e <<
" n=" << n << endl;
119 for (i = 0; i < nb_roots; i++) {
120 cout << roots[i] <<
" ";
124 cout <<
"coding_theory_domain::make_cyclic_code dual code" << endl;
129 cout <<
"coding_theory_domain::make_cyclic_code order mod q is m=" << m << endl;
138 cout <<
"coding_theory_domain::make_cyclic_code n does not divide q^m-1" << endl;
142 cout <<
"coding_theory_domain::make_cyclic_code GF(" << q <<
"^" << m <<
") has "
143 << n <<
"-th roots of unity" << endl;
145 cout <<
"coding_theory_domain::make_cyclic_code this is a primitive code" << endl;
148 cout <<
"coding_theory_domain::make_cyclic_code we take as " << n <<
"-th root \\beta = \\alpha^"
149 << Index <<
", where \\alpha is a primitive element of "
154 int j, degree, field_degree;
156 int *transversal, tl = 0;
158 field_degree = m * e;
162 for (i = 0; i < n; i++) {
167 for (i = 0; i < nb_roots; i++) {
170 cout << q <<
"-cyclotomic coset of "
171 << j <<
" already taken" << endl;
175 transversal[tl++] = j;
180 cout << q <<
"-cyclotomic coset of "
195 cout <<
" degree=" << degree << endl;
200 cout <<
"coding_theory_domain::make_cyclic_code transversal: ";
201 for (i = 0; i < tl; i++) {
202 cout << transversal[i] <<
" ";
205 cout <<
"coding_theory_domain::make_cyclic_code exponents:";
206 for (i = 0; i < n; i++) {
213 cout <<
"coding_theory_domain::make_cyclic_code degree=" << degree << endl;
217 for (i = 0; i < n; i++) {
218 taken[i] = !taken[i];
222 cout <<
"coding_theory_domain::make_cyclic_code dually, exponents:";
223 for (i = 0; i < n; i++) {
229 cout <<
"coding_theory_domain::make_cyclic_code degree=" << degree << endl;
238 cout <<
"coding_theory_domain::make_cyclic_code creating the finite field of order " << p << endl;
247 cout <<
"coding_theory_domain::make_cyclic_code before K.get_primitive_polynomial" << endl;
252 cout <<
"coding_theory_domain::make_cyclic_code before FpX.create_object_by_rank_string" << endl;
257 cout <<
"coding_theory_domain::make_cyclic_code choosing the following irreducible "
258 "and primitive polynomial:" << endl;
263 cout <<
"coding_theory_domain::make_cyclic_code creating unipoly_domain Fq modulo M" << endl;
267 cout <<
"coding_theory_domain::make_cyclic_code extension field created" << endl;
276 cout <<
"\\alpha = ";
281 cout <<
"coding_theory_domain::make_cyclic_code before Fq.power_longinteger" << endl;
285 cout <<
"\\beta = \\alpha^" << Index <<
" = ";
292 cout <<
"coding_theory_domain::make_cyclic_code this is a primitive BCH code" << endl;
297 cout <<
"coding_theory_domain::make_cyclic_code before allocating generator etc" << endl;
308 cout <<
"coding_theory_domain::make_cyclic_code creating X-a" << endl;
310 for (i = 0; i < 2; i++) {
318 for (i = 0; i <= degree; i++) {
320 cout <<
"coding_theory_domain::make_cyclic_code creating generator[" << i <<
"]" << endl;
326 cout <<
"coding_theory_domain::make_cyclic_code creating generator[0]" << endl;
334 cout <<
"coding_theory_domain::make_cyclic_code coeffs:" << endl;
337 cout <<
"coding_theory_domain::make_cyclic_code generator:" << endl;
343 cout <<
"coding_theory_domain::make_cyclic_code creating Pc" << endl;
347 cout <<
"coding_theory_domain::make_cyclic_code creating Pd" << endl;
352 for (i = 0; i < n; i++) {
354 cout <<
"i=" << i <<
", r=" << r << endl;
360 cout <<
"coding_theory_domain::make_cyclic_code working on root " << i << endl;
363 cout <<
"coding_theory_domain::make_cyclic_code before Fq.assign beta" << endl;
365 Fq.
assign(beta, beta_i, verbose_level);
367 cout <<
"coding_theory_domain::make_cyclic_code before Fq.power_int" << endl;
371 cout <<
"coding_theory_domain::make_cyclic_code before Fq.negate" << endl;
375 cout <<
"coding_theory_domain::make_cyclic_code before Fq.assign beta_i" << endl;
377 Fq.
assign(beta_i, coeffs[0], verbose_level);
379 cout <<
"coding_theory_domain::make_cyclic_code root: " << i <<
" : ";
388 cout <<
"coding_theory_domain::make_cyclic_code before Fq.assign(generator[j], tmp[j])" << endl;
390 for (j = 0; j <= r; j++) {
391 Fq.
assign(generator[j], tmp[j], verbose_level);
399 cout <<
"coding_theory_domain::make_cyclic_code before Fq.assign(tmp[j], generator[j + 1])" << endl;
401 for (j = 0; j <= r; j++) {
402 Fq.
assign(tmp[j], generator[j + 1], verbose_level);
411 for (j = 0; j <= r; j++) {
413 cout <<
"coding_theory_domain::make_cyclic_code j=" << j << endl;
416 cout <<
"coding_theory_domain::make_cyclic_code before Fq.mult(tmp[j], coeffs[0], Pc)" << endl;
418 Fq.
mult(tmp[j], coeffs[0], Pc, verbose_level - 1);
420 cout <<
"coding_theory_domain::make_cyclic_code before Fq.add()" << endl;
422 Fq.
add(Pc, generator[j], Pd);
424 cout <<
"coding_theory_domain::make_cyclic_code before Fq.assign()" << endl;
426 Fq.
assign(Pd, generator[j], verbose_level);
430 cout <<
"coding_theory_domain::make_cyclic_code r=" << r << endl;
433 cout <<
"coding_theory_domain::make_cyclic_code current polynomial: ";
440 cout <<
"coding_theory_domain::make_cyclic_code The generator polynomial is: ";
450 int *generator_subfield;
454 cout <<
"coding_theory_domain::make_cyclic_code before field_reduction" << endl;
457 generator, generator_subfield, f_poly, poly, verbose_level);
458 cout <<
"coding_theory_domain::make_cyclic_code generator polynomial:" << endl;
459 for (j = 0; j <= degree; j++) {
460 cout << generator_subfield[j] <<
" ";
465 cout <<
"coding_theory_domain::make_cyclic_code before generator_matrix_cyclic_code" << endl;
468 cout <<
"coding_theory_domain::make_cyclic_code generator matrix: " << endl;
473 ofstream fp(fname_txt);
477 fp << n <<
" " << k <<
" " << t <<
" " << q << endl;
478 for (i = 0; i < k; i++) {
479 for (j = 0; j < n; j++) {
480 fp << Genma[i * n + j] <<
" ";
486 cout <<
"coding_theory_domain::make_cyclic_code Written file " << fname_txt <<
" of size "
495 cout <<
"coding_theory_domain::make_cyclic_code Written file " << fname_csv <<
" of size "
504 cout <<
"$$" << endl;
505 cout <<
"\\left[" << endl;
507 cout <<
"\\right]" << endl;
508 cout <<
"$$" << endl;
519 for (i = 0; i <= degree; i++) {
523 cout <<
"before FREE_OBJECTS(tmp)" << endl;
524 for (i = 0; i <= degree; i++) {
529 for (i = 0; i < 2; i++) {
537 int degree,
int *generator_polynomial,
int *&M)
544 for (i = 0; i < k; i++) {
545 for (j = 0; j <= degree; j++) {
546 M[i * n + j + i] = generator_polynomial[j];
554 int i, f_first =
TRUE;
556 for (i = 0; i <= degree; i++) {
564 if (!Fq.
is_one(coeffs[i])) {
577 int i, f_first =
TRUE;
579 for (i = 0; i <= degree; i++) {
588 ost <<
" X^{" << i <<
"}";
597 int f_poly, std::string &poly,
600 int f_v = (verbose_level >= 1);
607 cout <<
"coding_theory_domain::field_reduction" << endl;
614 cout <<
"coding_theory_domain::field_reduction q - 1 "
615 "does not divide q^m - 1" << endl;
619 cout <<
"considering the subfield GF(" << q
620 <<
") of GF(" << q <<
"^" << m <<
")" << endl;
621 cout <<
"subgroup index = " << Index << endl;
635 cout <<
"\\alpha = ";
641 cout <<
"\\beta = \\alpha^" << Index <<
" = ";
645 for (i = 1; i <= q - 1; i++) {
646 Fq.
assign(beta, beta_i, verbose_level);
652 cout <<
" : " << beta_rk_table[i] << endl;
656 generator_subfield =
NEW_int(degree + 1);
658 for (i = 0; i <= degree; i++) {
661 cout <<
"coefficient " << i <<
" has rk " << rk << endl;
664 generator_subfield[i] = 0;
667 for (j = 1; j <= q - 1; j++) {
668 if (D.
compare(rk, beta_rk_table[j]) == 0) {
669 generator_subfield[i] = j;
674 cout <<
"error, coefficient "
675 "does not lie in the subfield" << endl;
680 cout <<
"over the subfield, exponential notation:" << endl;
681 for (i = 0; i <= degree; i++) {
682 cout <<
" " << generator_subfield[i] <<
"Z^" << i;
687 cout <<
"i : beta^i" << endl;
689 for (i = 0; i <= e; i++) {
690 Fq.
assign(beta, beta_i, verbose_level);
707 cout <<
"q = " << q <<
" override polynomial = " << poly << endl;
709 for (i = 0; i <= degree; i++) {
710 j = generator_subfield[i];
717 cout <<
"over the subfield:" << endl;
718 for (i = 0; i <= degree; i++) {
719 j = generator_subfield[i];
723 cout <<
" + " << j <<
" x^" << i;
737 cout <<
"coding_theory_domain::field_reduction done" << endl;
745 int designed_distance,
int &bose_distance,
746 int &transversal_length,
int *&transversal,
750 int f_v = (verbose_level >= 1);
751 int f_vv = (verbose_level >= 2);
752 int f_vvv = (verbose_level >= 3);
760 cout <<
"coding_theory_domain::BCH_generator_polynomial "
761 "n=" << n <<
" designed_distance="
762 << designed_distance <<
" p=" << p << endl;
769 q.
create(p, __FILE__, __LINE__);
770 m1.
create(-1, __FILE__, __LINE__);
778 cout <<
"coding_theory_domain::BCH_generator_polynomial r != 0" << endl;
782 cout <<
"GF(" << q <<
") "
783 "= GF(" << p <<
"^" << e <<
") "
784 "has " << n <<
"-th roots of unity" << endl;
786 cout <<
"this is a primitive BCH code" << endl;
789 cout <<
"we take as " << n <<
"-th root \\beta = \\alpha^" << b <<
", where "
790 "\\alpha is a primitive element of the field" << endl;
807 cout <<
"choosing the following irreducible "
808 "and primitive polynomial:" << endl;
815 cout <<
"extension field created" << endl;
823 cout <<
"\\alpha = ";
830 for (i = 1; i <= b.
as_int(); i++) {
833 cout <<
"\\alpha^" << i <<
" = ";
840 cout <<
"\\beta = \\alpha^" << b <<
" = ";
847 cout <<
"this is a primitive BCH code" << endl;
854 if (1 + designed_distance - 2 >= q - 1) {
855 cout <<
"coding_theory_domain::BCH_generator_polynomial "
856 "1 + designed_distance - 2 >= q - 1" << endl;
865 for (i = 0; i < n; i++) {
869 cout <<
"\\beta^" << i <<
" = ";
871 cout <<
" = " << beta_rk_table[i] << endl;
873 Fq.
mult(beta, beta_i, c, verbose_level - 1);
874 Fq.
assign(c, beta_i, verbose_level);
877 for (i = 0; i < n; i++) {
878 cout <<
"\\beta^" << i <<
" = ";
880 cout <<
" = " << beta_rk_table[i] << endl;
891 transversal_length = 0;
893 for (i = 0; i < n; i++) {
897 for (i = 1; i <= 1 + designed_distance - 2; i++) {
898 Fq.
mult(beta, beta_i, c, verbose_level - 1);
899 Fq.
assign(c, beta_i, verbose_level);
903 cout <<
"\\beta^" << i <<
" = ";
905 cout <<
" = " << ai << endl;
911 transversal[transversal_length++] = i;
913 cout <<
"orbit of conjugate elements "
914 "(in powers of \\beta):" << endl;
932 for (j = 0; j < n; j++) {
933 if (D.
compare(bi, beta_rk_table[j]) == 0) {
938 cout <<
"couldn't find rank in the table (A)" << endl;
942 cout <<
" is \\beta^" << j << endl;
954 Fq.
mult(beta, beta_i, c, verbose_level - 1);
955 FX.
assign(c, beta_i, verbose_level);
957 for (j = 0; j < n; j++) {
958 if (D.
compare(ai, beta_rk_table[j]) == 0) {
963 cout <<
"couldn't find rank in the table (B)" << endl;
975 cout <<
"taking the minimum polynomials of { ";
976 for (i = 0; i < transversal_length; i++) {
977 cout << transversal[i] <<
" ";
985 for (i = 0; i < transversal_length; i++) {
989 beta_rk_table[transversal[i]], rk, p, f_vv);
992 cout <<
"minimal polynomial of \\beta^" << transversal[i] <<
" is ";
994 cout <<
" of rank " << rk << endl;
997 FX.
mult(g, h1, h2, verbose_level - 1);
998 FX.
assign(h2, g, verbose_level);
1011 cout <<
"BCH(" << n <<
"," << p <<
","
1012 << designed_distance <<
") = ";
1014 cout <<
" bose_distance = " << bose_distance << endl;
1022 int f_v = (verbose_level >= 1);
1031 cout <<
"coding_theory_domain::compute_generator_matrix k < 0" << endl;
1035 for (i = 0; i < k * n; i++) {
1038 for (i = 0; i < k; i++) {
1039 for (j = 0; j <= d; j++) {
1041 genma[i * n + i + j] = x;
1045 cout <<
"coding_theory_domain::compute_generator_matrix generator matrix:" << endl;
1054 int f_v = (verbose_level >= 1);
1057 cout <<
"coding_theory_domain::make_BCH_codes" << endl;
1061 std::string fname_txt;
1062 std::string fname_csv;
1070 for (i = 0; i < t - 1; i++) {
1071 j = NT.
mod(b + i, n);
1074 snprintf(fname, 1000,
"BCH_%d_%d", n, t);
1076 fname_txt.assign(fname);
1077 fname_txt.append(
".txt");
1078 fname_csv.assign(fname);
1079 fname_csv.append(
".csv");
1092 FALSE , dummy , f_dual,
1093 fname_txt, fname_csv, verbose_level);
1098 cout <<
"coding_theory_domain::make_BCH_codes done" << endl;
various functions related to coding theory
void print_polynomial(ring_theory::unipoly_domain &Fq, int degree, ring_theory::unipoly_object *coeffs)
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)
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 make_BCH_codes(int n, int q, int t, int b, int f_dual, int verbose_level)
void print_polynomial_tight(std::ostream &ost, ring_theory::unipoly_domain &Fq, int degree, ring_theory::unipoly_object *coeffs)
void generator_matrix_cyclic_code(field_theory::finite_field *F, int n, std::string &poly_coeffs, 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 compute_generator_matrix(ring_theory::unipoly_object a, int *&genma, int n, int &k, int verbose_level)
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 finite_field_init(int q, int f_without_tables, int verbose_level)
void init_override_polynomial(int q, std::string &poly, int f_without_tables, int verbose_level)
the nth roots over Fq using an extension field
number_theory::cyclotomic_sets * Cyc
ring_theory::unipoly_domain * FX
void init(finite_field *F, int n, int verbose_level)
ring_theory::unipoly_object * generator_Fq
provides access to pre-computed combinatorial data in encoded form
void get_primitive_polynomial(std::string &poly, int p, int e, int verbose_level)
data_structures::set_of_sets * S
basic number theoretic functions
long int mod(long int a, long int p)
void factor_prime_power(int q, int &p, int &e)
long int order_mod_p(long int a, long int p)
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)
interface to create latex output files
void int_matrix_print_tex(std::ostream &ost, int *p, int m, int n)
domain to compute with objects of type longinteger
int compare(longinteger_object &a, longinteger_object &b)
void add(longinteger_object &a, longinteger_object &b, longinteger_object &c)
void integral_division_by_int(longinteger_object &a, int b, longinteger_object &q, int &r)
void create_qnm1(longinteger_object &a, int q, int n)
void power_int(longinteger_object &a, int n)
a class to represent arbitrary precision integers
void assign_to(longinteger_object &b)
void create(long int i, const char *file, int line)
domain of polynomials in one variable over a finite field
void add(unipoly_object a, unipoly_object b, unipoly_object &c)
void delete_object(unipoly_object &p)
int is_zero(unipoly_object p)
void power_int(unipoly_object &a, int n, int verbose_level)
void print_object_tight(unipoly_object p, std::ostream &ost)
void mult(unipoly_object a, unipoly_object b, unipoly_object &c, int verbose_level)
void power_longinteger(unipoly_object &a, longinteger_object &n, int verbose_level)
void create_object_by_rank_longinteger(unipoly_object &p, longinteger_object &rank, const char *file, int line, int verbose_level)
int is_one(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 negate(unipoly_object a)
void rank_longinteger(unipoly_object p, longinteger_object &rank)
void minimum_polynomial_factorring_longinteger(longinteger_object &alpha, longinteger_object &rk_minpoly, int p, 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_print_integer_matrix(A, B, C, D)
#define Int_vec_zero(A, B)
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
#define NEW_OBJECTS(type, n)
#define Int_vec_print(A, B, C)
the orbiter library for the classification of combinatorial objects