12#define TOWER_POLYNOMIAL_VAL(f) reinterpret_cast<TowerPolynomial>((f).poly_val)
16 M2_ArrayString names0,
27 if (extensions.size() == 0)
33 TowerPolynomial* exts =
new TowerPolynomial[extensions.size()];
34 for (
int i = 0; i < extensions.size(); i++)
35 exts[i] =
reinterpret_cast<TowerPolynomial
>(extensions[i].poly_val);
50 if (!
result->initialize(charac,
names, extensions))
return nullptr;
79 for (
int i = 0; i <
nvars - 1; i++) o <<
names->array[i] <<
",";
82 D->extensions_text_out(o,
names);
88 return D->index_of_var(f1);
94 std::vector<int> max_degs;
95 D->degrees_of_vars(f1, max_degs);
97 for (
size_t i = 0; i < max_degs.size(); i++)
98 if (max_degs[i] > 0) nelems++;
101 for (
size_t i = 0; i < max_degs.size(); i++)
102 if (max_degs[i] > 0)
result->array[next++] =
static_cast<int>(i);
109 D->set_from_long(f, n);
116 D->set_from_int(f, n);
123 if (not
D->set_from_mpq(f, q))
return false;
146 return D->is_zero(f1);
154 return D->is_equal(f1, g1);
162 return D->compare(f1, g1);
183 D->subtract(h, f1, g1);
203 D->subtract(h, f1, g1);
222 if (!
D->invert(h, f1))
ERROR(
"element not invertible");
232 D->divide(h, f1, g1);
242 D->remainder(h, f1, g1);
314 H =
target->make_SumCollector();
323 return H->getValue();
379 TowerPolynomial h, u1, v1;
382 D->gcd_coefficients(h, u1, v1, f1, g1);
391 return D->degree(whichvar, f1);
397 TowerPolynomial h =
nullptr;
398 D->diff(whichvar, h, f1);
405 return D->extension_degree(firstvar);
414 TowerPolynomial h =
nullptr;
415 D->power_mod(h, f1, n, g1);
422 TowerPolynomial h =
nullptr;
436 const Tower *S =
G->get_ring()->cast_to_Tower();
437 if (R ==
nullptr || R != S)
439 ERROR(
"encountered different rings");
452 const Tower *S =
G->get_ring()->cast_to_Tower();
453 if (R ==
nullptr || R != S)
455 ERROR(
"encountered different rings");
478 TowerPolynomial
result =
nullptr;
485 int c1 =
static_cast<int>(res.second);
496 if (f == 0)
return 0;
503 ring_elem b = P->
var(level);
504 for (
int i=0; i<=f->deg; i++)
506 if (f->arr.polys[i] != 0)
508 ring_elem a = translateFromTower(level-1, P, f->arr.polys[i]);
509 ring_elem c = P->
power(b,i);
510 ring_elem d = P->
mult(c,a);
522 return D.translateFromTower(
level,
P, f);
529 return D->translateFromTower(P, f);
542 if (P !=
nullptr &&
T !=
nullptr)
544 if (P->
n_vars() !=
T->n_vars())
546 ERROR(
"expected rings with the same number of variables");
551 ERROR(
"expected rings with the same characteristic");
560 if (P != 0 &&
T != 0)
566 ERROR(
"expected an element of a TowerRing or a PolynomialRing");
Variable-length sparse (variable, exponent) encoding of monomials.
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
void traverse(const TowerPolynomial f)
DPolyTraverser(const DRing *D0)
static DRing * create(long p, int nvars0, const TowerPolynomial *ext0)
static void from_expvector(int n, exponents::ConstExponents a, Vector &result)
void to_expvector(const_monomial m, exponents_t result_exp) const
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
virtual ring_elem var(int v) const =0
virtual const Monoid * getMonoid() const
virtual const Ring * getCoefficients() const
Abstract base for the engine's polynomial-ring hierarchy.
virtual std::pair< bool, long > coerceToLongInteger(ring_elem a) const
virtual ring_elem add(const ring_elem f, const ring_elem g) const =0
void initialize_ring(long charac, const PolynomialRing *DR=nullptr, const std::vector< int > &heft_vec={})
virtual const PolynomialRing * cast_to_PolynomialRing() const
long characteristic() const
virtual ring_elem power(const ring_elem f, mpz_srcptr n) const
Exponentiation. This is the default function, if a class doesn't define this.
virtual ring_elem mult(const ring_elem f, const ring_elem g) const =0
virtual const Tower * cast_to_Tower() const
ring_elem get_value() const
static RingElement * make_raw(const Ring *R, ring_elem f)
const Ring * get_ring() const
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
Abstract incremental accumulator that builds a ring_elem from many add(f) calls.
ring_elem gcd(const ring_elem f, const ring_elem g) const
ring_elem lowerP(const ring_elem f) const
virtual ring_elem invert(const ring_elem f) const
ring_elem differentiate(int var, const ring_elem f) const
ring_elem power_mod(const ring_elem f, mpz_srcptr n, const ring_elem g) const
ring_elem translate(const PolynomialRing *R, ring_elem fR) const
virtual void text_out(buffer &o) const
virtual ring_elem copy(const ring_elem f) const
virtual unsigned int computeHashValue(const ring_elem a) const
virtual bool is_equal(const ring_elem f, const ring_elem g) const
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const
virtual int index_of_var(const ring_elem a) const
virtual ring_elem from_int(mpz_srcptr n) const
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
virtual bool is_zero(const ring_elem f) const
virtual M2_arrayint support(const ring_elem a) const
virtual ring_elem negate(const ring_elem f) const
int degreeInVariable(int var, const ring_elem f) const
virtual void remove(ring_elem &f) const
virtual bool from_rational(mpq_srcptr q, ring_elem &result) const
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
virtual ring_elem random() const
virtual ring_elem remainder(const ring_elem f, const ring_elem g) const
bool initialize(long charac0, M2_ArrayString names0, const VECTOR(ring_elem) &extensions)
virtual ring_elem from_long(long n) const
static Tower * create(int charac, M2_ArrayString names)
virtual ring_elem var(int v) const
virtual int compare_elems(const ring_elem f, const ring_elem g) const
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const
virtual ring_elem add(const ring_elem f, const ring_elem g) const
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
virtual bool is_unit(const ring_elem f) const
virtual void elem_text_out(buffer &o, const ring_elem f, bool p_one=true, bool p_plus=false, bool p_parens=false) const
int extension_degree(int nvars) const
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const
friend class TowerEvaluator
ring_elem gcd_extended(const ring_elem f, const ring_elem g, ring_elem &u, ring_elem &v) const
virtual bool viewTerm(long coeff, const_exponents exp)
TowerEvaluator(const Tower *T, const RingMap *map0, const ring_elem f0, int first_var0)
virtual ~TowerEvaluator()
Ring subclass for tower polynomial rings (Z/p)[x_0][x_1]...[x_{n-1}] modulo a chain of algebraic exte...
Native univariate polynomial arithmetic over QQ extensions and finite fields.
VALGRIND_MAKE_MEM_DEFINED & result(result)
M2_arrayint M2_makearrayint(int n)
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
typename std::vector< T, gc_allocator< T > > gc_vector
a version of the STL vector, which allocates its backing memory with gc.
PolynomialRing — abstract polynomial-ring base, the engine's most-reused class.
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
Ring — the legacy abstract base class for every coefficient and polynomial ring.
#define TOWER_RINGELEM(a)
RingMap — engine representation of a ring homomorphism.
Singly linked-list node carrying one term of a polynomial-ring element.
const RingElement * towerExtendedGCD(const RingElement *F, const RingElement *G, const RingElement **A, const RingElement **B)
const RingElement * towerGCD(const RingElement *F, const RingElement *G)
const RingElement * rawTowerTranslatePoly(const Ring *newRing, const RingElement *F)
#define TOWER_POLYNOMIAL_VAL(f)
Legacy Tower — Ring-derived iterated extension of Z/p (pre-aring).