Orbiter 2022
Combinatorial Objects
ring_theory.h
Go to the documentation of this file.
1/*
2 * ring_theory.h
3 *
4 * Created on: Nov 1, 2021
5 * Author: betten
6 */
7
8#ifndef SRC_LIB_FOUNDATIONS_RING_THEORY_RING_THEORY_H_
9#define SRC_LIB_FOUNDATIONS_RING_THEORY_RING_THEORY_H_
10
11namespace orbiter {
12namespace layer1_foundations {
13namespace ring_theory {
14
15
16// #############################################################################
17// finite_ring.cpp
18// #############################################################################
19
20
22
23
24
26
27 int *add_table; // [q * q]
28 int *mult_table; // [q * q]
29
30 int *f_is_unit_table; // [q]
31 int *negate_table; // [q]
32 int *inv_table; // [q]
33
34 // only defined if we are a chain ring:
35 int p;
36 int e;
38
39public:
40 int q;
41
43
44
45
48 void null();
49 void freeself();
50 void init(int q, int verbose_level);
51 int get_e();
52 int get_p();
54 int zero();
55 int one();
56 int is_zero(int i);
57 int is_one(int i);
58 int is_unit(int i);
59 int add(int i, int j);
60 int mult(int i, int j);
61 int negate(int i);
62 int inverse(int i);
63 int Gauss_int(int *A, int f_special,
64 int f_complete, int *base_cols,
65 int f_P, int *P, int m, int n, int Pn,
66 int verbose_level);
67 // returns the rank which is the number
68 // of entries in base_cols
69 // A is a m x n matrix,
70 // P is a m x Pn matrix (if f_P is TRUE)
71 int PHG_element_normalize(int *v, int stride, int len);
72 // last unit element made one
74 int stride, int len);
75 // first non unit element made one
76 int PHG_element_rank(int *v, int stride, int len);
77 void PHG_element_unrank(int *v, int stride, int len, int rk);
78 int nb_PHG_elements(int n);
79};
80
81// #############################################################################
82// homogeneous_polynomial_domain.cpp
83// #############################################################################
84
86
87
89
90private:
91 enum monomial_ordering_type Monomial_ordering_type;
93 int nb_monomials;
94 int *Monomials; // [nb_monomials * nb_variables]
95
96 std::string *symbols;
97 std::string *symbols_latex;
98
99 char **monomial_symbols;
100 char **monomial_symbols_latex;
101 char **monomial_symbols_easy;
102 int *Variables; // [nb_monomials * degree]
103 // Variables contains the monomials written out
104 // as a sequence of length degree
105 // with entries in 0,..,nb_variables-1.
106 // the entries are listed in increasing order.
107 // For instance, the monomial x_0^2x_1x_3
108 // is recorded as 0,0,1,3
109 int nb_affine; // nb_variables^degree
110 int *Affine; // [nb_affine * degree]
111 // the affine elements are used for foiling
112 // when doing a linear substitution
113 int *v; // [nb_variables]
114 int *Affine_to_monomial; // [nb_affine]
115 // for each vector in the affine space,
116 // record the monomial associated with it.
118
119 int *coeff2; // [nb_monomials], used in substitute_linear
120 int *coeff3; // [nb_monomials], used in substitute_linear
121 int *coeff4; // [nb_monomials], used in substitute_linear
122 int *factors; // [degree]
123 int *my_affine; // [degree], used in substitute_linear
124 int *base_cols; // [nb_monomials]
125 int *type1; // [degree + 1]
126 int *type2; // [degree + 1]
127
128public:
129 int q;
130 int nb_variables; // number of variables
132
135 void freeself();
136 void null();
137 void init(field_theory::finite_field *F, int nb_vars, int degree,
138 int f_init_incidence_structure,
139 monomial_ordering_type Monomial_ordering_type,
140 int verbose_level);
141 int get_nb_monomials();
144 int get_monomial(int i, int j);
145 char *get_monomial_symbol_easy(int i);
146 int *get_monomial_pointer(int i);
147 int evaluate_monomial(int idx_of_monomial, int *coords);
148 void remake_symbols(int symbol_offset,
149 const char *symbol_mask, const char *symbol_mask_latex,
150 int verbose_level);
151 void remake_symbols_interval(int symbol_offset,
152 int from, int len,
153 const char *symbol_mask, const char *symbol_mask_latex,
154 int verbose_level);
155 void make_monomials(
156 monomial_ordering_type Monomial_ordering_type,
157 int verbose_level);
158 void rearrange_monomials_by_partition_type(int verbose_level);
159 int index_of_monomial(int *v);
161 int *&Kernel, int &dim_kernel, int verbose_level);
162 void print_monomial(std::ostream &ost, int i);
163 void print_monomial(std::ostream &ost, int *mon);
164 void print_monomial_latex(std::ostream &ost, int *mon);
165 void print_monomial_latex(std::ostream &ost, int i);
166 void print_monomial_latex(std::string &s, int *mon);
167 void print_monomial_latex(std::string &s, int i);
168 void print_monomial_str(std::stringstream &ost, int i);
169 void print_monomial_latex_str(std::stringstream &ost, int i);
170 void print_equation(std::ostream &ost, int *coeffs);
171 void print_equation_simple(std::ostream &ost, int *coeffs);
172 void print_equation_tex(std::ostream &ost, int *coeffs);
173 void print_equation_numerical(std::ostream &ost, int *coeffs);
174 void print_equation_lint(std::ostream &ost, long int *coeffs);
175 void print_equation_lint_tex(std::ostream &ost, long int *coeffs);
176 void print_equation_str(std::stringstream &ost, int *coeffs);
177 void print_equation_with_line_breaks_tex(std::ostream &ost,
178 int *coeffs, int nb_terms_per_line,
179 const char *new_line_text);
181 std::ostream &ost, long int *coeffs, int nb_terms_per_line,
182 const char *new_line_text);
183 void algebraic_set(int *Eqns, int nb_eqns,
184 long int *Pts, int &nb_pts, int verbose_level);
185 void polynomial_function(int *coeff, int *f, int verbose_level);
186 void enumerate_points(int *coeff,
187 std::vector<long int> &Pts,
188 int verbose_level);
189 void enumerate_points_lint(int *coeff,
190 long int *&Pts, int &nb_pts, int verbose_level);
191 void enumerate_points_zariski_open_set(int *coeff,
192 std::vector<long int> &Pts,
193 int verbose_level);
194 int evaluate_at_a_point_by_rank(int *coeff, int pt);
195 int evaluate_at_a_point(int *coeff, int *pt_vec);
196 void substitute_linear(int *coeff_in, int *coeff_out,
197 int *Mtx_inv, int verbose_level);
198 void substitute_semilinear(int *coeff_in, int *coeff_out,
199 int f_semilinear, int frob_power, int *Mtx_inv,
200 int verbose_level);
201 void substitute_line(
202 int *coeff_in, int *coeff_out,
203 int *Pt1_coeff, int *Pt2_coeff,
204 int verbose_level);
206 int *coeff_in, int scalar, int *coeff_out,
207 int verbose_level);
208 void multiply_mod(
209 int *coeff1, int *coeff2, int *coeff3,
210 int verbose_level);
212 int *coeff1, int *coeff2, int *coeff3,
213 int verbose_level);
214 int is_zero(int *coeff);
215 void unrank_point(int *v, int rk);
216 int rank_point(int *v);
217 void unrank_coeff_vector(int *v, long int rk);
218 long int rank_coeff_vector(int *v);
219 int test_weierstrass_form(int rk,
220 int &a1, int &a2, int &a3, int &a4, int &a6,
221 int verbose_level);
222 void vanishing_ideal(long int *Pts, int nb_pts, int &r, int *Kernel,
223 int verbose_level);
224 int compare_monomials(int *M1, int *M2);
225 int compare_monomials_PART(int *M1, int *M2);
226 void print_monomial_ordering(std::ostream &ost);
227 int *read_from_string_coefficient_pairs(std::string &str, int verbose_level);
228 int *read_from_string_coefficient_vector(std::string &str, int verbose_level);
229
230
231};
232
233
234// #############################################################################
235// longinteger_domain.cpp:
236// #############################################################################
237
239
241
242public:
245 // returns -1 if a < b, 0 if a = b,
246 // and 1 if a > b, treating a and b as unsigned.
250 // c = a - b, assuming a > b
253 // a := a - b, assuming a > b
254 void add(longinteger_object &a,
258 longinteger_object &m, int verbose_level);
260 // a := a + b
263 // a := a - b
264 void add_int_in_place(
265 longinteger_object &a, long int b);
266 void mult(longinteger_object &a,
272 longinteger_object &m, int verbose_level);
273 void multiply_up(longinteger_object &a, int *x, int len, int verbose_level);
274 void multiply_up_lint(
275 longinteger_object &a, long int *x, int len, int verbose_level);
283 int verbose_level);
285 int b, longinteger_object &q, int &r);
288 long int b, longinteger_object &q, long int &r);
291 longinteger_object &v, int verbose_level);
294 int b, int *&rep, int &len);
295 void power_int(longinteger_object &a, int n);
296 void power_int_mod(longinteger_object &a, int n,
300 int verbose_level);
301 void square_root(
303 int verbose_level);
304 int square_root_mod(int a, int p, int verbose_level);
305 // solves x^2 = a mod p. Returns x
306
307
308 void create_q_to_the_n(longinteger_object &a, int q, int n);
309 void create_qnm1(longinteger_object &a, int q, int n);
310 void create_Mersenne(longinteger_object &M, int n);
311 // $M_n = 2^n - 1$
312 void create_Fermat(longinteger_object &F, int n);
313 // $F_n = 2^{2^n} + 1$
314 void Dedekind_number(longinteger_object &Dnq, int n, int q, int verbose_level);
315
320 longinteger_object &residue, int p);
321 long int smallest_primedivisor(longinteger_object &a, int p_min,
322 int verbose_level);
324 int &nb_primes, longinteger_object *&primes,
325 int *&exponents, int verbose_level);
326 void factor(longinteger_object &a, int &nb_primes,
327 int *&primes, int *&exponents,
328 int verbose_level);
330 int verbose_level);
331
335 longinteger_object &R, int n, int verbose_level);
337 longinteger_object *&C, int Am, int An, int Bn);
339 longinteger_object &b, int Am, int An);
340 void matrix_print_GAP(std::ostream &ost, longinteger_object *A,
341 int Am, int An);
342 void matrix_print_tex(std::ostream &ost, longinteger_object *A,
343 int Am, int An);
344 void power_mod(char *aa, char *bb, char *nn,
345 longinteger_object &result, int verbose_level);
346 void factorial(longinteger_object &result, int n);
348 int n, int q, int f_semilinear);
350 longinteger_object &x, int verbose_level);
351 void print_digits(char *rep, int len);
352
353};
354
355
356
357
358// #############################################################################
359// longinteger_object.cpp:
360// #############################################################################
361
362
364
365
367
368private:
369 char sgn; // TRUE if negative
370 int l;
371 char *r;
372
373public:
376 void freeself();
377
378 char &ith(int i) { return r[i]; };
379 char &sign() { return sgn; };
380 int &len() { return l; };
381 char *&rep() { return r; };
382 void create(long int i, const char *file, int line);
383 void create_product(int nb_factors, int *factors);
384 void create_power(int a, int e);
385 // creates a^e
386 void create_power_minus_one(int a, int e);
387 // creates a^e - 1
388 void create_from_base_b_representation(int b, int *rep, int len);
389 void create_from_base_10_string(const char *str, int verbose_level);
390 void create_from_base_10_string(const char *str);
391 void create_from_base_10_string(std::string &str);
392 int as_int();
393 long int as_lint();
397 std::ostream& print(std::ostream& ost);
398 std::ostream& print_not_scientific(std::ostream& ost);
399 int log10();
400 int output_width();
401 void print_width(std::ostream& ost, int width);
402 void print_to_string(char *str);
403 void normalize();
404 void negate();
405 int is_zero();
406 void zero();
407 int is_one();
408 int is_mone();
410 void one();
411 void increment();
412 void decrement();
413 void add_int(int a);
414 void create_i_power_j(int i, int j);
415 int compare_with_int(int a);
416};
417
418std::ostream& operator<<(std::ostream& ost, longinteger_object& p);
419
420
421
422
423
424
425// #############################################################################
426// partial_derivative.cpp
427// #############################################################################
428
430
431
433
434public:
437 int *v; // [H->get_nb_monomials()]
439 int *mapping; // [H->get_nb_monomials() * H->get_nb_monomials()]
440
441
444 void freeself();
445 void null();
448 int variable_idx,
449 int verbose_level);
450 void apply(int *eqn_in,
451 int *eqn_out,
452 int verbose_level);
453};
454
455
456// #############################################################################
457// polynomial_double_domain.cpp:
458// #############################################################################
459
460
462
463
464
466public:
470 void init(int alloc_length);
472 void mult(polynomial_double *A,
474 void add(polynomial_double *A,
478 double lambda);
479 void copy(polynomial_double *A,
483 polynomial_double *det, int n, int verbose_level);
485 double *lambda, int verbose_level);
488 double lambda, int verbose_level);
489};
490
491
492// #############################################################################
493// polynomial_double.cpp:
494// #############################################################################
495
496
498
499
501public:
504 double *coeff; // [alloc_length]
507 void init(int alloc_length);
508 void print(std::ostream &ost);
509 double root_finder(int verbose_level);
510 double evaluate_at(double t);
511};
512
513
514
515// #############################################################################
516// ring_theory_global.cpp
517// #############################################################################
518
520
521
523
524public:
529 std::string &fname_code,
530 std::string &A_coeffs, std::string &B_coeffs,
531 int verbose_level);
534 std::string &A_coeffs, std::string &B_coeffs, int verbose_level);
537 std::string &A_coeffs, std::string &B_coeffs, int verbose_level);
540 std::string &A_coeffs, std::string &B_coeffs, std::string &M_coeffs,
541 int verbose_level);
544 std::string &A_coeffs,
545 int verbose_level);
546 void sift_polynomials(
548 long int rk0, long int rk1, int verbose_level);
549 void mult_polynomials(
551 long int rk0, long int rk1, int verbose_level);
554 long int rk0, long int rk1, int verbose_level);
557 std::string &input_file, long int rk1, int verbose_level);
560 std::string &input_file, long int rk1, int k, int verbose_level);
563 std::string &variety_label_txt,
564 std::string &variety_label_tex,
565 int variety_nb_vars, int variety_degree,
566 std::vector<std::string> &Variety_coeffs,
567 monomial_ordering_type Monomial_ordering_type,
568 std::string &number_of_conditions_satisfied_fname,
569 std::string &label_txt,
570 std::string &label_tex,
571 int &nb_pts, long int *&Pts,
572 int verbose_level);
573 // creates homogeneous_polynomial_domain
576 std::string &variety_label_txt,
577 std::string &variety_label_tex,
578 int variety_nb_vars, int variety_degree,
579 std::vector<std::string> &Variety_coeffs,
580 monomial_ordering_type Monomial_ordering_type,
581 std::string &label_txt,
582 std::string &label_tex,
583 int &nb_pts, long int *&Pts,
584 int verbose_level);
585 // creates homogeneous_polynomial_domain
588 std::string &variety_label,
589 std::string &variety_label_tex,
590 int variety_nb_vars, int variety_degree,
591 std::string &variety_coeffs,
592 monomial_ordering_type Monomial_ordering_type,
593 std::string &label_txt,
594 std::string &label_tex,
595 int &nb_pts, long int *&Pts,
596 int verbose_level);
597 // creates homogeneous_polynomial_domain
600 std::string &variety_label_txt,
601 std::string &variety_label_tex,
602 int curve_nb_vars, int curve_degree,
603 std::string &curve_coeffs,
604 monomial_ordering_type Monomial_ordering_type,
605 std::string &label_txt,
606 std::string &label_tex,
607 int &nb_pts, long int *&Pts,
608 int verbose_level);
609 // creates homogeneous_polynomial_domain
612 unipoly_domain *Fq,
613 unipoly_object *&Beta, int n,
614 long int *cyclotomic_set, int cylotomic_set_size,
615 unipoly_object *&generator,
616 int verbose_level);
619 unipoly_domain *FpX,
620 unipoly_domain *Fq, unipoly_object *&Beta, int n1, int n2, int verbose_level);
621 void compute_powers(
623 unipoly_domain *Fq,
624 int n, int start_idx,
625 unipoly_object *&Beta, int verbose_level);
627 int d, std::vector<std::vector<int> > &Table,
628 int verbose_level);
630 int d, int verbose_level);
632 int deg, int verbose_level);
634 int p_min, int p_max,
635 int deg_min, int deg_max,
636 int verbose_level);
638 int degree, int verbose_level);
639 void search_for_primitive_polynomials(int p_min, int p_max,
640 int n_min, int n_max, int verbose_level);
641 void factor_cyclotomic(int n, int q, int d,
642 int *coeffs, int f_poly, std::string &poly, int verbose_level);
643 void oval_polynomial(
645 int *S, unipoly_domain &D, unipoly_object &poly,
646 int verbose_level);
647 void print_longinteger_after_multiplying(std::ostream &ost,
648 int *factors, int len);
649
650};
651
652
653// #############################################################################
654// table_of_irreducible_polynomials.cpp
655// #############################################################################
656
658
660public:
661 int k;
662 int q;
667 int **Tables;
668 int *Degree;
669
672 void init(int k, field_theory::finite_field *F, int verbose_level);
673 void print(std::ostream &ost);
674 void print_polynomials(std::ostream &ost);
676 int *Select, int verbose_level);
678 int *Select, int verbose_level);
679 int is_irreducible(unipoly_object &poly, int verbose_level);
680 void factorize_polynomial(unipoly_object &char_poly, int *Mult,
681 int verbose_level);
682};
683
684
685// #############################################################################
686// unipoly_domain.cpp:
687// #############################################################################
688
690
692
693private:
695 int f_factorring;
696 int factor_degree;
697 int *factor_coeffs; // [factor_degree + 1]
698 unipoly_object factor_poly;
699 // the coefficients of factor_poly are negated
700 // so that mult_mod is easier
701
702 int f_print_sub;
703 //int f_use_variable_name;
704 std::string variable_name;
705
706public:
707
710 void init_basic(field_theory::finite_field *F, int verbose_level);
713 void init_variable_name(std::string &label);
714 void init_factorring(field_theory::finite_field *F, unipoly_object m, int verbose_level);
716 int &s_i(unipoly_object p, int i)
717 { int *rep = (int *) p; return rep[i + 1]; };
721 int d, int *coeff);
722 void create_object_by_rank(unipoly_object &p, long int rk,
723 const char *file, int line, int verbose_level);
725 unipoly_object &p, std::string &fname,
726 const char *file, int line,
727 int verbose_level);
730 const char *file, int line,
731 int verbose_level);
733 unipoly_object &p, std::string &rk, int verbose_level);
734 void create_Dickson_polynomial(unipoly_object &p, int *map);
736 void unrank(unipoly_object p, int rk);
738 int rank(unipoly_object p);
740 int degree(unipoly_object p);
741 void print_object(unipoly_object p, std::ostream &ost);
742 void print_object_tight(unipoly_object p, std::ostream &ost);
743 void print_object_sparse(unipoly_object p, std::ostream &ost);
744 void print_object_dense(unipoly_object p, std::ostream &ost);
745 void assign(unipoly_object a, unipoly_object &b, int verbose_level);
746 void one(unipoly_object p);
747 void m_one(unipoly_object p);
748 void zero(unipoly_object p);
749 int is_one(unipoly_object p);
750 int is_zero(unipoly_object p);
751 void negate(unipoly_object a);
752 void make_monic(unipoly_object &a);
754 void mult(unipoly_object a, unipoly_object b, unipoly_object &c, int verbose_level);
757 int verbose_level);
759 int factor_polynomial_degree,
760 int *factor_polynomial_coefficients_negated,
761 int verbose_level);
762 void Frobenius_matrix_by_rows(int *&Frob,
763 unipoly_object factor_polynomial, int verbose_level);
764 // the j-th row of Frob is x^{j*q} mod m
765 void Frobenius_matrix(int *&Frob, unipoly_object factor_polynomial,
766 int verbose_level);
767 void Berlekamp_matrix(int *&B, unipoly_object factor_polynomial,
768 int verbose_level);
770 unipoly_object b, unipoly_object &q, int verbose_level);
772 unipoly_object &q, unipoly_object &r, int verbose_level);
776 unipoly_object &g, int verbose_level);
779 unipoly_object &g, int verbose_level);
780 int is_squarefree(unipoly_object p, int verbose_level);
781 void compute_normal_basis(int d, int *Normal_basis,
782 int *Frobenius, int verbose_level);
783 void order_ideal_generator(int d, int idx, unipoly_object &mue,
784 int *A, int *Frobenius,
785 int verbose_level);
786 // Lueneburg~\cite{Lueneburg87a} p. 105.
787 // Frobenius is a matrix of size d x d
788 // A is a matrix of size (d + 1) x d
789 void matrix_apply(unipoly_object &p, int *Mtx, int n,
790 int verbose_level);
791 // The matrix is applied on the left
793 int *Mtx_in, int *Mtx_out, int k, int verbose_level);
794 // The matrix is substituted into the polynomial
796 int scalar, int verbose_level);
797 // The scalar 'scalar' is substituted into the polynomial
798 void module_structure_apply(int *v, int *Mtx, int n,
799 unipoly_object p, int verbose_level);
801 unipoly_object b, unipoly_object &a_without_b,
802 int verbose_level);
803 // Computes the polynomial $r$ with
804 //\begin{enumerate}
805 //\item
806 //$r$ divides $a$
807 //\item
808 //$gcd(r,b) = 1$ and
809 //\item
810 //each irreducible polynomial dividing $a/r$ divides $b$.
811 //Lueneburg~\cite{Lueneburg87a}, p. 37.
812 //\end{enumerate}
813 int is_irreducible(unipoly_object a, int verbose_level);
815 int p, int d, int b, int a);
818 int nb_primes, longinteger_object *primes,
819 int verbose_level);
821 int f, int verbose_level);
823 int f, int verbose_level);
824 void power_int(unipoly_object &a, int n, int verbose_level);
825 void power_longinteger(unipoly_object &a, longinteger_object &n, int verbose_level);
826 void power_coefficients(unipoly_object &a, int n);
828 int alpha, int p, int verbose_level);
829 int minimum_polynomial_factorring(int alpha, int p,
830 int verbose_level);
832 longinteger_object &alpha,
833 longinteger_object &rk_minpoly,
834 int p, int verbose_level);
835 void print_vector_of_polynomials(unipoly_object *sigma, int deg);
838 unipoly_object &minpol, int d, int *Frobenius,
839 int verbose_level);
840 // Lueneburg~\cite{Lueneburg87a}, p. 112.
841 void characteristic_polynomial(int *Mtx, int k,
842 unipoly_object &char_poly, int verbose_level);
843 void print_matrix(unipoly_object *M, int k);
844 void determinant(unipoly_object *M, int k, unipoly_object &p,
845 int verbose_level);
846 void deletion_matrix(unipoly_object *M, int k, int delete_row,
847 int delete_column, unipoly_object *&N, int verbose_level);
849 void reduce_modulo_p(unipoly_object a, int p);
850
851 //unipoly_domain2.cpp:
855 unipoly_object a, int m, std::ostream &ost);
856 void mult_easy_with_report(long int rk_a, long int rk_b, long int &rk_c,
857 std::ostream &ost, int verbose_level);
858 void division_with_remainder_from_file_with_report(std::string &input_fname, long int rk_b,
859 long int &rk_q, long int &rk_r, std::ostream &ost, int verbose_level);
861 std::string &input_fname, long int rk_b, int k,
862 long int *&rk_q, long int *&rk_r, int &n, int &N, std::ostream &ost, int verbose_level);
863 void division_with_remainder_numerically_with_report(long int rk_a, long int rk_b,
864 long int &rk_q, long int &rk_r, std::ostream &ost, int verbose_level);
867 int f_report, std::ostream &ost, int verbose_level);
868
869
870};
871
872}}}
873
874
875#endif /* SRC_LIB_FOUNDATIONS_RING_THEORY_RING_THEORY_H_ */
projective space PG(n,q) of dimension n over Fq
Definition: geometry.h:1916
int Gauss_int(int *A, int f_special, int f_complete, int *base_cols, int f_P, int *P, int m, int n, int Pn, int verbose_level)
int PHG_element_normalize(int *v, int stride, int len)
int PHG_element_rank(int *v, int stride, int len)
void PHG_element_unrank(int *v, int stride, int len, int rk)
int PHG_element_normalize_from_front(int *v, int stride, int len)
homogeneous polynomials of a given degree in a given number of variables over a finite field GF(q)
Definition: ring_theory.h:88
void multiply_mod_negatively_wrapped(int *coeff1, int *coeff2, int *coeff3, int verbose_level)
void init(field_theory::finite_field *F, int nb_vars, int degree, int f_init_incidence_structure, monomial_ordering_type Monomial_ordering_type, int verbose_level)
void substitute_line(int *coeff_in, int *coeff_out, int *Pt1_coeff, int *Pt2_coeff, int verbose_level)
void print_equation_with_line_breaks_tex_lint(std::ostream &ost, long int *coeffs, int nb_terms_per_line, const char *new_line_text)
int test_weierstrass_form(int rk, int &a1, int &a2, int &a3, int &a4, int &a6, int verbose_level)
void affine_evaluation_kernel(int *&Kernel, int &dim_kernel, int verbose_level)
void enumerate_points(int *coeff, std::vector< long int > &Pts, int verbose_level)
void multiply_by_scalar(int *coeff_in, int scalar, int *coeff_out, int verbose_level)
void remake_symbols(int symbol_offset, const char *symbol_mask, const char *symbol_mask_latex, int verbose_level)
void enumerate_points_lint(int *coeff, long int *&Pts, int &nb_pts, int verbose_level)
void enumerate_points_zariski_open_set(int *coeff, std::vector< long int > &Pts, int verbose_level)
void print_equation_with_line_breaks_tex(std::ostream &ost, int *coeffs, int nb_terms_per_line, const char *new_line_text)
void substitute_semilinear(int *coeff_in, int *coeff_out, int f_semilinear, int frob_power, int *Mtx_inv, int verbose_level)
void multiply_mod(int *coeff1, int *coeff2, int *coeff3, int verbose_level)
void remake_symbols_interval(int symbol_offset, int from, int len, const char *symbol_mask, const char *symbol_mask_latex, int verbose_level)
void algebraic_set(int *Eqns, int nb_eqns, long int *Pts, int &nb_pts, int verbose_level)
void substitute_linear(int *coeff_in, int *coeff_out, int *Mtx_inv, int verbose_level)
void vanishing_ideal(long int *Pts, int nb_pts, int &r, int *Kernel, int verbose_level)
void make_monomials(monomial_ordering_type Monomial_ordering_type, int verbose_level)
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
void extended_gcd(longinteger_object &a, longinteger_object &b, longinteger_object &g, longinteger_object &u, longinteger_object &v, int verbose_level)
int jacobi(longinteger_object &a, longinteger_object &m, int verbose_level)
int compare(longinteger_object &a, longinteger_object &b)
void integral_division_exact(longinteger_object &a, longinteger_object &b, longinteger_object &a_over_b)
void base_b_representation(longinteger_object &a, int b, int *&rep, int &len)
int quotient_as_int(longinteger_object &a, longinteger_object &b)
void power_mod(char *aa, char *bb, char *nn, longinteger_object &result, int verbose_level)
void multiply_up(longinteger_object &a, int *x, int len, int verbose_level)
void add_mod(longinteger_object &a, longinteger_object &b, longinteger_object &c, longinteger_object &m, int verbose_level)
long int quotient_as_lint(longinteger_object &a, longinteger_object &b)
int is_less_than(longinteger_object &a, longinteger_object &b)
void subtract_signless(longinteger_object &a, longinteger_object &b, longinteger_object &c)
int multiplicity_of_p(longinteger_object &a, longinteger_object &residue, int p)
void power_longint_mod(longinteger_object &a, longinteger_object &n, longinteger_object &m, int verbose_level)
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 mult(longinteger_object &a, longinteger_object &b, longinteger_object &c)
void group_order_PGL(longinteger_object &result, int n, int q, int f_semilinear)
long int smallest_primedivisor(longinteger_object &a, int p_min, int verbose_level)
void random_number_with_n_decimals(longinteger_object &R, int n, int verbose_level)
void integral_division_by_lint(longinteger_object &a, long int b, longinteger_object &q, long int &r)
void matrix_entries_integral_division_exact(longinteger_object *A, longinteger_object &b, int Am, int An)
void mult_in_place(longinteger_object &a, longinteger_object &b)
void square_root(longinteger_object &a, longinteger_object &sqrt_a, int verbose_level)
void mult_mod(longinteger_object &a, longinteger_object &b, longinteger_object &c, longinteger_object &m, int verbose_level)
void random_number_less_than_n(longinteger_object &n, longinteger_object &r)
void create_q_to_the_n(longinteger_object &a, int q, int n)
void square_root_floor(longinteger_object &a, longinteger_object &x, int verbose_level)
void matrix_product(longinteger_object *A, longinteger_object *B, longinteger_object *&C, int Am, int An, int Bn)
void integral_division(longinteger_object &a, longinteger_object &b, longinteger_object &q, longinteger_object &r, int verbose_level)
void subtract_in_place(longinteger_object &a, longinteger_object &b)
void factor(longinteger_object &a, int &nb_primes, int *&primes, int *&exponents, int verbose_level)
void multiply_up_lint(longinteger_object &a, long int *x, int len, int verbose_level)
void add_in_place(longinteger_object &a, longinteger_object &b)
void factor_into_longintegers(longinteger_object &a, int &nb_primes, longinteger_object *&primes, int *&exponents, int verbose_level)
void matrix_print_tex(std::ostream &ost, longinteger_object *A, int Am, int An)
void power_int_mod(longinteger_object &a, int n, longinteger_object &m)
void Dedekind_number(longinteger_object &Dnq, int n, int q, int verbose_level)
void subtract_signless_in_place(longinteger_object &a, longinteger_object &b)
void matrix_print_GAP(std::ostream &ost, longinteger_object *A, int Am, int An)
int compare_unsigned(longinteger_object &a, longinteger_object &b)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void create_from_base_10_string(const char *str, int verbose_level)
void create(long int i, const char *file, int line)
partial derivative connects two homogeneous polynomial domains
Definition: ring_theory.h:432
void apply(int *eqn_in, int *eqn_out, int verbose_level)
void init(homogeneous_polynomial_domain *H, homogeneous_polynomial_domain *Hd, int variable_idx, int verbose_level)
domain for polynomials with double coefficients
Definition: ring_theory.h:465
void mult(polynomial_double *A, polynomial_double *B, polynomial_double *C)
double divide_linear_factor(polynomial_double *p, polynomial_double *q, double lambda, int verbose_level)
void add(polynomial_double *A, polynomial_double *B, polynomial_double *C)
void determinant_over_polynomial_ring(polynomial_double *P, polynomial_double *det, int n, int verbose_level)
void find_all_roots(polynomial_double *p, double *lambda, int verbose_level)
polynomials with double coefficients, related to class polynomial_double_domain
Definition: ring_theory.h:500
void polynomial_division_with_report(field_theory::finite_field *F, long int rk0, long int rk1, int verbose_level)
void create_projective_variety(field_theory::finite_field *F, std::string &variety_label, std::string &variety_label_tex, int variety_nb_vars, int variety_degree, std::string &variety_coeffs, monomial_ordering_type Monomial_ordering_type, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void polynomial_division_from_file_all_k_error_patterns_with_report(field_theory::finite_field *F, std::string &input_file, long int rk1, int k, int verbose_level)
void write_code_for_division(field_theory::finite_field *F, std::string &fname_code, std::string &A_coeffs, std::string &B_coeffs, int verbose_level)
void make_all_irreducible_polynomials_of_degree_d(field_theory::finite_field *F, int d, std::vector< std::vector< int > > &Table, int verbose_level)
void polynomial_division(field_theory::finite_field *F, std::string &A_coeffs, std::string &B_coeffs, int verbose_level)
char * search_for_primitive_polynomial_of_given_degree(int p, int degree, int verbose_level)
void sift_polynomials(field_theory::finite_field *F, long int rk0, long int rk1, int verbose_level)
void do_make_table_of_irreducible_polynomials(field_theory::finite_field *F, int deg, int verbose_level)
void oval_polynomial(field_theory::finite_field *F, int *S, unipoly_domain &D, unipoly_object &poly, int verbose_level)
int count_all_irreducible_polynomials_of_degree_d(field_theory::finite_field *F, int d, int verbose_level)
void create_intersection_of_zariski_open_sets(field_theory::finite_field *F, std::string &variety_label_txt, std::string &variety_label_tex, int variety_nb_vars, int variety_degree, std::vector< std::string > &Variety_coeffs, monomial_ordering_type Monomial_ordering_type, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void print_longinteger_after_multiplying(std::ostream &ost, int *factors, int len)
void polynomial_division_from_file_with_report(field_theory::finite_field *F, std::string &input_file, long int rk1, int verbose_level)
void extended_gcd_for_polynomials(field_theory::finite_field *F, std::string &A_coeffs, std::string &B_coeffs, int verbose_level)
void mult_polynomials(field_theory::finite_field *F, long int rk0, long int rk1, int verbose_level)
void factor_cyclotomic(int n, int q, int d, int *coeffs, int f_poly, std::string &poly, int verbose_level)
void create_irreducible_polynomial(field_theory::finite_field *F, unipoly_domain *Fq, unipoly_object *&Beta, int n, long int *cyclotomic_set, int cylotomic_set_size, unipoly_object *&generator, int verbose_level)
void search_for_primitive_polynomials(int p_min, int p_max, int n_min, int n_max, int verbose_level)
void compute_nth_roots_as_polynomials(field_theory::finite_field *F, unipoly_domain *FpX, unipoly_domain *Fq, unipoly_object *&Beta, int n1, int n2, int verbose_level)
void polynomial_mult_mod(field_theory::finite_field *F, std::string &A_coeffs, std::string &B_coeffs, std::string &M_coeffs, int verbose_level)
void create_projective_curve(field_theory::finite_field *F, std::string &variety_label_txt, std::string &variety_label_tex, int curve_nb_vars, int curve_degree, std::string &curve_coeffs, monomial_ordering_type Monomial_ordering_type, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void do_search_for_primitive_polynomial_in_range(int p_min, int p_max, int deg_min, int deg_max, int verbose_level)
void compute_powers(field_theory::finite_field *F, unipoly_domain *Fq, int n, int start_idx, unipoly_object *&Beta, int verbose_level)
void number_of_conditions_satisfied(field_theory::finite_field *F, std::string &variety_label_txt, std::string &variety_label_tex, int variety_nb_vars, int variety_degree, std::vector< std::string > &Variety_coeffs, monomial_ordering_type Monomial_ordering_type, std::string &number_of_conditions_satisfied_fname, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void polynomial_find_roots(field_theory::finite_field *F, std::string &A_coeffs, int verbose_level)
a table of all irreducible polynomials over GF(q) of degree less than a certain value
Definition: ring_theory.h:659
void factorize_polynomial(unipoly_object &char_poly, int *Mult, int verbose_level)
domain of polynomials in one variable over a finite field
Definition: ring_theory.h:691
int substitute_scalar_in_polynomial(unipoly_object &p, int scalar, int verbose_level)
void add(unipoly_object a, unipoly_object b, unipoly_object &c)
int minimum_polynomial_factorring(int alpha, int p, int verbose_level)
void deletion_matrix(unipoly_object *M, int k, int delete_row, int delete_column, unipoly_object *&N, int verbose_level)
void create_object_of_degree_with_coefficients(unipoly_object &p, int d, int *coeff)
void power_int(unipoly_object &a, int n, int verbose_level)
void get_a_primitive_polynomial(unipoly_object &m, int f, int verbose_level)
void mult_easy_with_report(long int rk_a, long int rk_b, long int &rk_c, std::ostream &ost, int verbose_level)
void substitute_matrix_in_polynomial(unipoly_object &p, int *Mtx_in, int *Mtx_out, int k, int verbose_level)
void print_object_tight(unipoly_object p, std::ostream &ost)
int is_squarefree(unipoly_object p, int verbose_level)
void derivative(unipoly_object a, unipoly_object &b)
void print_object_dense(unipoly_object p, std::ostream &ost)
int is_primitive(unipoly_object &m, longinteger_object &qm1, int nb_primes, longinteger_object *primes, int verbose_level)
void Frobenius_matrix_by_rows(int *&Frob, unipoly_object factor_polynomial, int verbose_level)
void mult_mod(unipoly_object a, unipoly_object b, unipoly_object &c, unipoly_object m, int verbose_level)
void module_structure_apply(int *v, int *Mtx, int n, unipoly_object p, int verbose_level)
void exact_division(unipoly_object a, unipoly_object b, unipoly_object &q, int verbose_level)
void division_with_remainder_from_file_all_k_bit_error_patterns(std::string &input_fname, long int rk_b, int k, long int *&rk_q, long int *&rk_r, int &n, int &N, std::ostream &ost, int verbose_level)
void mult(unipoly_object a, unipoly_object b, unipoly_object &c, int verbose_level)
void compute_normal_basis(int d, int *Normal_basis, int *Frobenius, int verbose_level)
void mult_mod_negated(unipoly_object a, unipoly_object b, unipoly_object &c, int factor_polynomial_degree, int *factor_polynomial_coefficients_negated, int verbose_level)
void order_ideal_generator(int d, int idx, unipoly_object &mue, int *A, int *Frobenius, int verbose_level)
void extended_gcd(unipoly_object m, unipoly_object n, unipoly_object &u, unipoly_object &v, unipoly_object &g, int verbose_level)
void minimum_polynomial_extension_field(unipoly_object &g, unipoly_object m, unipoly_object &minpol, int d, int *Frobenius, int verbose_level)
void get_an_irreducible_polynomial(unipoly_object &m, int f, int verbose_level)
void division_with_remainder_from_file_with_report(std::string &input_fname, long int rk_b, long int &rk_q, long int &rk_r, std::ostream &ost, int verbose_level)
void division_with_remainder_with_report(unipoly_object &a, unipoly_object &b, unipoly_object &q, unipoly_object &r, int f_report, std::ostream &ost, int verbose_level)
void print_vector_of_polynomials(unipoly_object *sigma, int deg)
void greatest_common_divisor(unipoly_object m, unipoly_object n, unipoly_object &g, int verbose_level)
void division_with_remainder(unipoly_object a, unipoly_object b, unipoly_object &q, unipoly_object &r, int verbose_level)
int is_irreducible(unipoly_object a, int verbose_level)
void determinant(unipoly_object *M, int k, unipoly_object &p, int verbose_level)
int compare_euclidean(unipoly_object m, unipoly_object n)
void singer_candidate(unipoly_object &m, int p, int d, int b, int a)
void power_longinteger(unipoly_object &a, longinteger_object &n, int verbose_level)
void Frobenius_matrix(int *&Frob, unipoly_object factor_polynomial, int verbose_level)
void create_object_by_rank_longinteger(unipoly_object &p, longinteger_object &rank, const char *file, int line, int verbose_level)
void create_object_by_rank(unipoly_object &p, long int rk, const char *file, int line, int verbose_level)
void create_Dickson_polynomial(unipoly_object &p, int *map)
void division_with_remainder_numerically_with_report(long int rk_a, long int rk_b, long int &rk_q, long int &rk_r, std::ostream &ost, int verbose_level)
void unrank_longinteger(unipoly_object p, longinteger_object &rank)
void create_object_by_rank_string(unipoly_object &p, std::string &rk, int verbose_level)
void matrix_apply(unipoly_object &p, int *Mtx, int n, int verbose_level)
void rank_longinteger(unipoly_object p, longinteger_object &rank)
void characteristic_polynomial(int *Mtx, int k, unipoly_object &char_poly, int verbose_level)
void minimum_polynomial_factorring_longinteger(longinteger_object &alpha, longinteger_object &rk_minpoly, int p, int verbose_level)
void init_basic(field_theory::finite_field *F, int verbose_level)
void create_object_of_degree_no_test(unipoly_object &p, int d)
void print_coeffs_top_down_assuming_one_character_per_digit(unipoly_object a, std::ostream &ost)
void mult_easy(unipoly_object a, unipoly_object b, unipoly_object &c)
void print_object_sparse(unipoly_object p, std::ostream &ost)
void create_object_from_csv_file(unipoly_object &p, std::string &fname, const char *file, int line, int verbose_level)
void print_coeffs_top_down_assuming_one_character_per_digit_with_degree_given(unipoly_object a, int m, std::ostream &ost)
void assign(unipoly_object a, unipoly_object &b, int verbose_level)
void minimum_polynomial(unipoly_object &a, int alpha, int p, int verbose_level)
void Berlekamp_matrix(int *&B, unipoly_object factor_polynomial, int verbose_level)
void take_away_all_factors_from_b(unipoly_object a, unipoly_object b, unipoly_object &a_without_b, int verbose_level)
void print_object(unipoly_object p, std::ostream &ost)
void init_factorring(field_theory::finite_field *F, unipoly_object m, int verbose_level)
ostream & operator<<(ostream &ost, longinteger_object &p)
the orbiter library for the classification of combinatorial objects