118 void initialize(
long p,
int nvars0,
const TowerPolynomial* ext0);
124 void mult_by_coeff_n(
int level, TowerPolynomial &f, TowerPolynomial b);
127 void make_monic_0(TowerPolynomial &f,
long &result_multiplier);
128 void make_monic_n(
int level, TowerPolynomial &f, TowerPolynomial &result_multiplier);
130 bool make_monic3(
int level, TowerPolynomial &u1, TowerPolynomial &u2, TowerPolynomial &u3);
133 static TowerPolynomial
read_poly_n(
char *&str,
int level);
136 void add_in_place_n(
int level, TowerPolynomial &f,
const TowerPolynomial g);
141 TowerPolynomial
mult_0(
const TowerPolynomial f,
const TowerPolynomial g,
bool reduce_by_extension);
142 TowerPolynomial
mult_n(
int level,
const TowerPolynomial f,
const TowerPolynomial g,
bool reduce_by_extension);
145 TowerPolynomial
random_n(
int level,
int deg);
147 TowerPolynomial
diff_0(
const TowerPolynomial f);
148 TowerPolynomial
diff_n(
int level,
int whichvar,
const TowerPolynomial f);
150 TowerPolynomial
mult_by_int_0(
long c,
const TowerPolynomial f);
151 TowerPolynomial
mult_by_int_n(
int level,
long c,
const TowerPolynomial f);
156 bool down_level(
int newlevel,
int oldlevel, TowerPolynomial &f);
160 static TowerPolynomial
alloc_poly_n(
int deg, TowerPolynomial *elems =
nullptr);
161 static TowerPolynomial
alloc_poly_0(
int deg,
long *elems =
nullptr);
164 static void display_poly(FILE *fil,
int level,
const TowerPolynomial f);
165 static TowerPolynomial
read_poly(
char *&str,
int level);
168 const TowerPolynomial f);
169 static char *
to_string(
int level,
const TowerPolynomial f);
171 static bool is_equal(
int level,
const TowerPolynomial f,
const TowerPolynomial g);
172 static TowerPolynomial
copy(
int level,
const TowerPolynomial f);
174 static TowerPolynomial
from_long(
int level,
long c);
176 static bool is_zero(TowerPolynomial f) {
return f ==
nullptr; }
177 void remove(
int level, TowerPolynomial &f);
179 int compare(
int level,
const TowerPolynomial f,
const TowerPolynomial g);
181 TowerPolynomial
random(
int level,
int deg);
182 TowerPolynomial
random(
int level);
185 TowerPolynomial
var(
int level,
int v);
197 void add_in_place(
int level, TowerPolynomial &f,
const TowerPolynomial g);
199 TowerPolynomial
mult_by_int(
int level,
long c,
const TowerPolynomial f);
200 TowerPolynomial
mult(
int level,
const TowerPolynomial f,
const TowerPolynomial g,
bool reduce_by_extension);
201 void remainder(
int level, TowerPolynomial &f,
const TowerPolynomial g);
203 bool division_in_place(
int level, TowerPolynomial &f,
const TowerPolynomial g, TowerPolynomial &result_quot);
205 void pseudo_remainder(
int level, TowerPolynomial &f,
const TowerPolynomial g);
206 TowerPolynomial
pseudo_division(
int level, TowerPolynomial &f,
const TowerPolynomial g);
208 TowerPolynomial
gcd(
int level,
const TowerPolynomial f,
const TowerPolynomial g);
210 const TowerPolynomial f,
211 const TowerPolynomial g,
212 TowerPolynomial &result_u,
213 TowerPolynomial &result_v);
214 TowerPolynomial
resultant(
int level, TowerPolynomial f, TowerPolynomial g);
216 void make_monic(
int level, TowerPolynomial &f);
217 TowerPolynomial
invert(
int level,
const TowerPolynomial a);
226 const TowerPolynomial f,
230 M2_ArrayString names)
const;
234 int degree(
int level,
int var,
const TowerPolynomial f)
const;
235 TowerPolynomial
diff(
int level,
int var,
const TowerPolynomial f);
236 TowerPolynomial
power_mod(
int level,
const TowerPolynomial f, mpz_srcptr n,
const TowerPolynomial g);
237 TowerPolynomial
lowerP(
int level,
const TowerPolynomial f);
239 static bool is_one(
int level,
const TowerPolynomial f);
240 int index_of_var(
int level,
const TowerPolynomial f)
const;
242 const TowerPolynomial f,
243 std::vector<int> &result_max_degs)
const;
271 DRing(
long charac,
int nvars,
const TowerPolynomial *exts);
278 static DRing *
create(
long p,
int nvars0,
const TowerPolynomial *ext0);
304 else if (b ==
nullptr)
308 TowerPolynomial a1 =
D.copy(
level, a);
309 D.add_in_place(
level, a1, b);
316 TowerPolynomial a1 =
D.copy(
level, a);
317 D.subtract_in_place(
level, a1, b);
323 if (a ==
nullptr || b ==
nullptr)
return;
330 if (a ==
nullptr || b ==
nullptr)
338 if (a ==
nullptr || b ==
nullptr)
350 if (a ==
nullptr || b ==
nullptr)
361 TowerPolynomial h =
D.copy(
level, a);
367 TowerPolynomial a1 =
reinterpret_cast<TowerPolynomial
>(a.
poly_val);
379 bool is_equal(
const TowerPolynomial f,
const TowerPolynomial g) {
return D.is_equal(
level, f, g); }
380 bool compare(
const TowerPolynomial f,
const TowerPolynomial g) {
return D.compare(
level, f, g); }
402 const TowerPolynomial f,
406 M2_ArrayString names)
const;
408 void gcd(TowerPolynomial &
result,
const TowerPolynomial f,
const TowerPolynomial g)
414 TowerPolynomial &result_u,
415 TowerPolynomial &result_v,
416 const TowerPolynomial f,
417 const TowerPolynomial g)
419 result_gcd =
D.gcd_coefficients(
level, f, g, result_u, result_v);
424 D.extensions_text_out(o, names);
427 int degree(
int var,
const TowerPolynomial f)
const {
return D.degree(
level, var, f); }
428 void diff(
int var, TowerPolynomial &
result,
const TowerPolynomial f)
const
433 void power_mod(TowerPolynomial &
result,
const TowerPolynomial f, mpz_srcptr n,
const TowerPolynomial g)
const
474 void traverse(
const TowerPolynomial f);
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
Dense exponent-vector template [e_0, ..., e_{nvars-1}] for monomial operations.
Append-only GC-backed byte buffer used throughout the engine for text output.
void subtract_in_place(int level, TowerPolynomial &f, const TowerPolynomial g)
TowerPolynomial * extensions
static void increase_size_n(int newdeg, TowerPolynomial &f)
void make_monic(int level, TowerPolynomial &f)
void remove(int level, TowerPolynomial &f)
void mult_by_coeff_0(TowerPolynomial &f, long b)
void subtract_multiple_to(int level, TowerPolynomial &f, long a, int i, TowerPolynomial g)
static TowerPolynomial read_poly(char *&str, int level)
static TowerPolynomial alloc_poly_n(int deg, TowerPolynomial *elems=nullptr)
TowerPolynomial mult_n(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
TowerPolynomial random(int level, int deg)
TowerPolynomial pseudo_division(int level, TowerPolynomial &f, const TowerPolynomial g)
static TowerPolynomial copy(int level, const TowerPolynomial f)
DPoly(long p, int nvars0, const TowerPolynomial *extensions=nullptr)
TowerPolynomial diff_0(const TowerPolynomial f)
void reset_degree_n(int level, TowerPolynomial &f)
TowerPolynomial var(int level, int v)
TowerPolynomial invert(int level, const TowerPolynomial a)
int degree_of_extension(int level)
void elem_text_out(buffer &o, int level, const TowerPolynomial f, bool p_one, bool p_plus, bool p_parens, M2_ArrayString names) const
TowerPolynomial gcd_coefficients(int level, const TowerPolynomial f, const TowerPolynomial g, TowerPolynomial &result_u, TowerPolynomial &result_v)
void mult_by_coeff_n(int level, TowerPolynomial &f, TowerPolynomial b)
void remainder(int level, TowerPolynomial &f, const TowerPolynomial g)
TowerPolynomial random_0(int deg)
TowerPolynomial power_mod(int level, const TowerPolynomial f, mpz_srcptr n, const TowerPolynomial g)
void add_in_place(int level, TowerPolynomial &f, const TowerPolynomial g)
static std::ostream & append_to_stream(std::ostream &o, int level, const TowerPolynomial f)
void add_in_place_n(int level, TowerPolynomial &f, const TowerPolynomial g)
static bool is_equal(int level, const TowerPolynomial f, const TowerPolynomial g)
void make_monic_n(int level, TowerPolynomial &f, TowerPolynomial &result_multiplier)
TowerPolynomial diff_n(int level, int whichvar, const TowerPolynomial f)
static bool is_zero(TowerPolynomial f)
void degrees_of_vars(int level, const TowerPolynomial f, std::vector< int > &result_max_degs) const
TowerPolynomial mult_by_int_0(long c, const TowerPolynomial f)
void pseudo_remainder(int level, TowerPolynomial &f, const TowerPolynomial g)
static void increase_size_0(int newdeg, TowerPolynomial &f)
TowerPolynomial random_n(int level, int deg)
friend class DPolyTraverser
TowerPolynomial mult_0(const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
TowerPolynomial mult(int level, const TowerPolynomial f, const TowerPolynomial g, bool reduce_by_extension)
TowerPolynomial diff(int level, int var, const TowerPolynomial f)
void subtract_in_place_0(TowerPolynomial &f, const TowerPolynomial g)
TowerPolynomial gcd(int level, const TowerPolynomial f, const TowerPolynomial g)
void add_in_place_0(TowerPolynomial &f, const TowerPolynomial g)
static TowerPolynomial read_poly_n(char *&str, int level)
int compare(int level, const TowerPolynomial f, const TowerPolynomial g)
bool make_monic3(int level, TowerPolynomial &u1, TowerPolynomial &u2, TowerPolynomial &u3)
TowerPolynomial lowerP(int level, const TowerPolynomial f)
void initialize(long p, int nvars0, const TowerPolynomial *ext0)
static void dealloc_poly(TowerPolynomial &f)
void make_monic_0(TowerPolynomial &f, long &result_multiplier)
void add_term(int level, TowerPolynomial &result, long coeff, exponents_t exp) const
static TowerPolynomial alloc_poly_0(int deg, long *elems=nullptr)
void negate_in_place(int level, TowerPolynomial &f)
TowerPolynomial mult_by_int(int level, long c, const TowerPolynomial f)
void reset_degree_0(TowerPolynomial &f)
static TowerPolynomial read_poly_0(char *&str)
TowerPolynomial resultant(int level, TowerPolynomial f, TowerPolynomial g)
int index_of_var(int level, const TowerPolynomial f) const
static bool is_one(int level, const TowerPolynomial f)
void subtract_in_place_n(int level, TowerPolynomial &f, const TowerPolynomial g)
void extensions_text_out(buffer &o, M2_ArrayString names) const
TowerPolynomial mult_by_int_n(int level, long c, const TowerPolynomial f)
void normal_form(int level, TowerPolynomial &f)
static void display_poly(FILE *fil, int level, const TowerPolynomial f)
bool down_level(int newlevel, int oldlevel, TowerPolynomial &f)
bool division_in_place(int level, TowerPolynomial &f, const TowerPolynomial g, TowerPolynomial &result_quot)
int degree(int level, int var, const TowerPolynomial f) const
static char * to_string(int level, const TowerPolynomial f)
TowerPolynomial division_in_place_monic(int level, TowerPolynomial &f, const TowerPolynomial g)
static TowerPolynomial from_long(int level, long c)
Arithmetic engine for tower-polynomial rings: (Z/p)[x_0][x_1]...[x_{nvars-1}] modulo a chain of exten...
bool traverse1(int level, const TowerPolynomial g, exponents_t exp)
virtual ~DPolyTraverser()
void traverse(const TowerPolynomial f)
DPolyTraverser(const DRing *D0)
virtual bool viewTerm(long coeff, const_exponents exp)=0
Visitor base class that walks every term of a TowerPolynomial, calling viewTerm(coeff,...
void set_random(TowerPolynomial &result)
void set_var(TowerPolynomial &result, int n)
bool compare(const TowerPolynomial f, const TowerPolynomial g)
void swap(elem &a, elem &b) const
void power_mod(TowerPolynomial &result, const TowerPolynomial f, mpz_srcptr n, const TowerPolynomial g) const
void gcd(TowerPolynomial &result, const TowerPolynomial f, const TowerPolynomial g)
void lowerP(TowerPolynomial &result, const TowerPolynomial f)
void add_term(elem &result, long coeff, exponents_t exp) const
void from_ring_elem(elem &result, const ring_elem &a) const
void set_from_int(TowerPolynomial &result, mpz_srcptr r)
bool is_one(const TowerPolynomial f)
void extensions_text_out(buffer &o, M2_ArrayString names) const
void to_ring_elem(ring_elem &result, const elem a) const
bool is_unit(const TowerPolynomial g)
int degree(int var, const TowerPolynomial f) const
int extension_degree(int firstvar)
void divide(elem &result, elem a, elem b) const
bool is_equal(const TowerPolynomial f, const TowerPolynomial g)
bool invert(elem &result, elem a) const
void set(elem &result, elem a) const
void set_from_long(TowerPolynomial &result, long r)
void remainder(elem &result, elem a, elem b) const
void elem_text_out(buffer &o, const TowerPolynomial f, bool p_one, bool p_plus, bool p_parens, M2_ArrayString names) const
bool set_from_mpq(TowerPolynomial &result, mpq_srcptr r)
static DRing * create(long p, int nvars0, const TowerPolynomial *ext0)
bool is_zero(elem result) const
DRing(long charac, int nvars, const TowerPolynomial *exts)
void gcd_coefficients(TowerPolynomial &result_gcd, TowerPolynomial &result_u, TowerPolynomial &result_v, const TowerPolynomial f, const TowerPolynomial g)
void init_set(elem &result, elem a) const
void subtract(elem &result, elem a, elem b) const
void add(elem &result, elem a, elem b) const
void diff(int var, TowerPolynomial &result, const TowerPolynomial f) const
void mult(elem &result, elem a, elem b) const
void degrees_of_vars(const TowerPolynomial f, std::vector< int > &result) const
void subtract_multiple(elem &result, elem a, elem b) const
void set_zero(elem &result) const
int index_of_var(const TowerPolynomial f) const
Single-level view of a tower-polynomial ring: a DPoly plus a fixed working level and a Tower-flavoure...
Ring subclass for tower polynomial rings (Z/p)[x_0][x_1]...[x_{n-1}] modulo a chain of algebraic exte...
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define TOWER_RINGELEM(a)
ring_elem — the universal value type carried by every Ring* in the engine.
union TowerPolynomialStruct::@077201160245317346022251034307367344162303106102 arr
Heap-allocated node of a tower polynomial: a dense degree-indexed coefficient array that recurses thr...