23#define POLY(q) ((q).poly_val)
157 result->coeff.poly_val =
nullptr;
197 bool ok =
K_->from_rational(q, a);
198 if (not ok)
return false;
206 resultpoly->
coeff = a;
216 if (
K_->is_zero(coeff))
229 if (!
K_->from_BigComplex(z, a))
241 if (!
K_->from_BigReal(z, a))
253 if (!
K_->from_Interval(z, a))
265 if (!
K_->from_ComplexInterval(z, a))
277 if (!
K_->from_double(z, a))
290 if (!
K_->from_complex_double(re, im, a))
302 for (
int i = 0; i <
nvars_; i++) EXP1[i] = 0;
307 std::cerr <<
"internal error: PolyRing::var(int v) with v = " << v
308 <<
" nvars = " <<
nvars_ << std::endl;
309 std::cerr <<
"aborting" << std::endl;
315 M_->from_expvector(EXP1,
result->monom);
322 if (f ==
nullptr || f->
next !=
nullptr)
return -1;
323 if (!
K_->is_equal(f->
coeff,
K_->from_long(1)))
return -1;
326 M_->to_expvector(f->
monom, EXP1);
327 for (
int i = 0; i <
n_vars(); i++)
330 else if (EXP1[i] == 1)
332 if (
result >= 0)
return -1;
343 for (
int i = 0; i <
n_vars(); i++) EXP1[i] = 0;
346 M_->to_expvector(t.monom, EXP2);
350 for (
int i = 0; i <
n_vars(); i++)
351 if (EXP1[i] > 0) nelems++;
354 for (
int i = 0; i <
n_vars(); i++)
355 if (EXP1[i] > 0)
result->array[next++] = i;
375 if (nvars < 0)
ERROR(
"expected coefficient ring");
403 if (Rf1 && nvars0 == 0)
481 if (
begin(f) ==
end(f))
return false;
501 if (b ==
nullptr)
return true;
504 if (b ==
nullptr)
return false;
519 if (b ==
nullptr)
return 0;
522 if (b ==
nullptr)
return 1;
526 if (cmp != 0)
return cmp;
529 if (cmp != 0)
return cmp;
536 if (
begin(f) ==
end(f))
return true;
538 auto degf = D->make_one();
540 M_->multi_degree(t.
monom, degf);
543 auto e = D->make_one();
545 if (
EQ != D->compare(degf, e))
563 M_->multi_degree(t.
monom, degf);
566 auto e = D->make_one();
568 if (
EQ != D->compare(degf, e))
571 D->lcm(degf, e, degf);
581 const std::vector<int> &wts,
591 int e =
M_->degree_weights(t->
monom, wts);
593 for (t = t->
next; t !=
nullptr; t = t->
next)
595 e =
M_->degree_weights(t->
monom, wts);
606 const std::vector<int> &wts)
const
616 M_->to_expvector(a.monom, exp);
618 if (((d - e) % wts[v]) != 0)
622 ERROR(
"homogenization impossible");
626 exp[v] += (d - e) / wts[v];
627 if (
is_skew_ &&
skew_.is_skew_var(v) && exp[v] > 1)
continue;
631 M_->from_expvector(exp,
result->monom);
642 const std::vector<int> &wts)
const
649 int d = (wts[v] > 0 ? hi : lo);
680 if (g ==
nullptr)
return;
758 result->coeff =
K_->negate(a.coeff);
792 result->coeff =
K_->mult(a.coeff, c);
793 M_->mult(m, a.monom,
result->monom);
802 if (t ==
nullptr)
return;
803 for (; t !=
nullptr; t = t->
next)
813 if (t ==
nullptr)
return;
814 for (; t !=
nullptr; t = t->
next)
833 if (mpz_sgn(n) == 0)
return from_long(1);
860 ERROR(
"exponent too large");
892 mpz_init_set_ui(bin_c, 1);
894 for (
int i = 1; i <= n; i++)
899 mpz_mul_ui(bin_c, bin_c, n - i + 1);
900 mpz_fdiv_q_ui(bin_c, bin_c, i);
902 coef1 =
K_->from_int(bin_c);
904 if (!
K_->is_zero(coef1))
906 coef2 =
K_->power(lead->
coeff, n - i);
907 coef3 =
K_->mult(coef1, coef2);
908 M_->power(lead->
monom, n - i, m);
944 for(
Nterm *it=ff, *jt=gg; it!=
nullptr; it=it->next, jt=jt->next)
946 jt->coeff =
K_->power(it->coeff, pk);
947 M_->power(it->monom, pk, jt->monom);
966 ERROR(
"cannot divide by zero");
969 if (ft->
next ==
nullptr)
978 else if (
M_->is_invertible(ft->
monom))
987 ERROR(
"element is not invertible in this ring");
1018 if (t ==
nullptr ||
s ==
nullptr)
return true;
1021 coeff =
K_->divide(t->
coeff,
s->coeff);
1032 throw exc::internal_error(
"should not get to this code in imp_attempt_to_cancel_lead_term");
1037 if (!
K_->is_zero(coeff))
1044 M_->to_expvector(t->
monom, EXP1);
1045 M_->to_expvector(
s->monom, EXP2);
1046 int sign =
skew_.divide(EXP1, EXP2, EXP3);
1047 M_->from_expvector(EXP3, monom);
1048 if (sign < 0)
K_->negate_to(coeff);
1053 M_->divide(t->
monom,
s->monom, monom);
1064 ERROR(
"multivariate gcd not yet implemented");
1107 temp1 =
mult(q, v1);
1140 if (t ==
nullptr)
return;
1142 for (t = t->
next; t !=
nullptr; t = t->
next)
M_->gcd(t->
monom, monom, monom);
1167 if (
K_->get_precision() > 0)
1170 "polynomial division not yet implemented for RR or CC coefficients");
1190 if (has_negative_exponent_variables and not has_vars_lt_one)
1198 else if (has_vars_lt_one)
1312 bool p_parens)
const
1321 int two_terms = (t->
next !=
nullptr);
1323 int needs_parens = p_parens && two_terms;
1326 if (p_plus) o <<
'+';
1331 for (t = f; t !=
nullptr; t = t->
next)
1333 int isone =
M_->is_one(t->
monom);
1335 bool p_one_this = (isone && needs_parens) || (isone && p_one);
1336 K_->elem_text_out(o, t->
coeff, p_one_this, p_plus, p_parens);
1339 M_->elem_text_out(o, t->
monom, p_one_this);
1343 if (needs_parens) o <<
')';
1348 int first_var)
const
1359 M_->to_varpower(t.monom, vp);
1374 if (!
K_->is_zero(c))
1387 for (
Nterm& a : f)
K_->increase_maxnorm(norm, a.coeff);
1407 for (
int i=0; i<
n_vars(); i++)
1411 for (t = t->
next; t !=
nullptr; t = t->
next)
1414 for (
int i=0; i<
n_vars(); i++)
1436 for (
auto& a : expf) a = -a;
1437 for (
auto& a : expg) a = -a;
1443 for (
int i=0; i<
n_vars(); ++i)
1444 expf[i] = -expf[i] + expg[i];
1451 Nterm* quot1 =
nullptr;
1471 Nterm *divt = &divhead;
1472 Nterm *remt = &remhead;
1476 while (t !=
nullptr)
1490 if (!
K_->is_zero(nextterm->
coeff))
1492 divt->
next = nextterm;
1511 remt->
next =
nullptr;
1512 divt->
next =
nullptr;
1513 quot = divhead.
next;
1514 return remhead.
next;
1526 Nterm *remt = &remhead;
1529 while (t !=
nullptr)
1549 remt->
next =
nullptr;
1550 return remhead.
next;
1601 if (!
M_->weight_value_exists())
1608 Nterm *divt = &divhead;
1609 Nterm *remt = &remhead;
1611 long gval = 0, flast = 0;
1616 for (; z->
next !=
nullptr; z = z->
next)
1619 flast =
M_->first_weight_value(z->
monom);
1627 if (z->
next ==
nullptr)
1631 gfirst =
M_->first_weight_value(z->
monom);
1632 long gsecond =
M_->first_weight_value(z->
next->
monom);
1633 if (gfirst == gsecond)
1638 for (; z->
next !=
nullptr; z = z->
next)
1640 glast =
M_->first_weight_value(z->
monom);
1641 gval = gfirst - glast;
1646 while (t !=
nullptr)
1650 ffirst =
M_->first_weight_value(t->
monom);
1651 long fval = ffirst - flast;
1669 if (!
K_->is_zero(nextterm->
coeff))
1671 divt->
next = nextterm;
1691 remt->
next =
nullptr;
1692 divt->
next =
nullptr;
1693 quot = divhead.
next;
1694 return remhead.
next;
1711 if (f ==
nullptr)
return coeffR->zero();
1722 Nterm *inresult = &head;
1723 inresult->
next =
nullptr;
1727 M_->to_expvector(f->monom, exp);
1734 t->
coeff = f->coeff;
1738 if (f ==
nullptr)
break;
1739 M_->to_expvector(f->monom, exp2);
1742 inresult->
next =
nullptr;
1753 M_->to_expvector(g->
monom, exp);
1769 if (t ==
nullptr)
return 0;
1772 M_->to_expvector(t->
monom, exp1);
1774 for (; t !=
nullptr; t = t->
next)
1776 M_->to_expvector(t->
monom, exp2);
1798 if (nvars0 < 0)
return nullptr;
1800 engine_RawMonomialArray monoms =
1802 engine_RawRingElementArray coeffs =
1813 for (
int next = 0; next < n; next++)
1823 assert(monoms->array[next] != NULL);
1824 assert(coeffs->array[next] != NULL);
1840 long &result_len)
const
1863 Nterm *inresult = &head;
1869 M_->to_expvector(t.monom, exp);
1871 if (lobound_given && wt < lobound)
continue;
1872 if (hibound_given && wt > hibound)
continue;
1874 inresult = inresult->
next;
1877 inresult->
next =
nullptr;
1892 M_->from_expvector(exp0, m);
1895 if (logicalK ==
nullptr)
1897 ERROR(
"expected actual coefficient ring");
1900 nvars0 -= logicalK->
n_vars();
1903 Nterm *inresult = &head;
1913 M_->from_expvector(exp, t->
monom);
1915 inresult->
next =
nullptr;
1925 if (lo < 0) lo = nterms + lo;
1926 if (hi < 0) hi = nterms + hi;
1929 if (t ==
nullptr)
return t;
1935 M_->to_expvector(t->
monom, exp1);
1937 while (t !=
nullptr)
1946 if (t ==
nullptr)
break;
1947 M_->to_expvector(t->
monom, exp2);
1978 if (t ==
nullptr)
return K_->from_long(0);
2002 for (; t !=
nullptr; t = t->
next)
2004 M_->to_expvector(t->
monom, exp2);
2026 K_->mult_to(d->
coeff, t.coeff);
2039 int use_coeff)
const
2042 if (!
M_->divides(m, n))
return K_->from_long(0);
2048 M_->to_expvector(m, EXP1);
2049 M_->to_expvector(n, EXP2);
2050 sign =
skew_.diff(EXP1, EXP2, EXP3);
2051 M_->from_expvector(EXP3, resultmon);
2054 M_->divide(n, m, resultmon);
2056 if (!use_coeff)
return result;
2060 M_->to_expvector(m, exp1);
2061 M_->to_expvector(n, exp2);
2065 for (
int i = 0; i <
n_vars(); i++)
2067 for (
int j = exp1[i] - 1; j >= 0; j--)
2083 if (f ==
nullptr || f->
next ==
nullptr)
return;
2084 Nterm *f1 =
nullptr;
2085 Nterm *f2 =
nullptr;
2086 while (f !=
nullptr)
2093 if (f ==
nullptr)
break;
2111 if (!
M_->in_subring(nslots, t.monom))
return false;
2120 ERROR(
"attempting to find degree of a zero element");
2124 M_->to_expvector(t->
monom, exp);
2126 for (t = t->
next; t !=
nullptr; t = t->
next)
2128 M_->to_expvector(t->
monom, exp);
2131 else if (exp[n] > hi)
2144 M_->to_expvector(t.monom, exp1);
2154 if (d == 0)
return a;
2160 M_->to_expvector(t.monom, exp);
2168 M_->from_expvector(exp,
result->monom);
2181 M_->to_expvector(t.monom, exp0);
2185 M_->from_expvector(exp0, u->
monom);
2197 for (
Nterm& t : g)
K_->lower_content(c, t.coeff);
2203 if (t ==
nullptr)
return K_->zero();
2205 for (t = t->
next; t !=
nullptr; t = t->
next)
K_->lower_content(c, t->
coeff);
2212 if (t ==
nullptr)
return K_->zero();
2214 for (t = t->
next; t !=
nullptr; t = t->
next)
K_->lower_content(c, t->
coeff);
2215 for (t = g; t !=
nullptr; t = t->
next)
K_->lower_content(c, t->
coeff);
2222 if (a ==
nullptr)
return f;
2226 for (; a !=
nullptr; a = a->
next)
2243 if (P ==
nullptr)
return nullptr;
2244 if (P->
n_vars() != 1)
return nullptr;
2250 const std::vector<long> &coeffs,
2258 for (
long i = 0; i < coeffs.size(); i++)
2260 exp[
var] =
static_cast<int>(i);
2262 if (
K_->is_zero(c))
continue;
2266 M_->from_expvector(exp, t->
monom);
2282 int nslots =
M_->n_slots(nparts);
2285 if (
M_->compare(nslots, lead->
monom, a.monom) !=
EQ)
break;
2299 if (v ==
nullptr)
return v;
2304 for (vec w = v->next; w !=
nullptr; w = w->next)
2308 POLY(w->coeff)->monom,
2317 for (vec w = v->next; w !=
nullptr; w = w->next)
2321 POLY(w->coeff)->monom,
2335 if (v ==
nullptr)
return nullptr;
2350 vecterm *vec_result = &vec_head;
2357 M_->to_expvector(f.
monom, exp);
2358 if (exp[
x] != e)
continue;
2363 M_->from_expvector(exp,
result->monom);
2367 vec_result = vec_result->
next;
2370 vec_result->
next =
nullptr;
2371 return vec_head.
next;
2391 for (vec t = v; t !=
nullptr; t = t->next)
2394 M_->to_expvector(f.
monom, exp);
2395 for (
int i = 0; i <
x; i++)
2404 if (
x <
n_vars() && exp[
x] > e) e = exp[
x];
2419 mpz_ptr denom_so_far)
const
2426 mpq_srcptr a =
MPQ_VAL(t.coeff);
2427 mpz_lcm(denom_so_far, denom_so_far, mpq_denref(a));
2438 assert(
tpoly(f) != 0);
2442 mpz_init_set_si(denom, 1);
2461 mpz_init_set_si(denom, 1);
2463 for (vec w = f; w !=
nullptr; w = w->next)
2476 for (
Nterm& t : coeff)
2482 inresult = inresult->
next;
2494 for (
Nterm& t : coeff)
2499 inresult = inresult->
next;
2511 result_denominator =
globalZZ->one();
2521 for (vec w = v; w !=
nullptr; w = w->next)
2524 int comp = w->
comp + 1;
2529 mpz_mul(a, result_denominator.
get_mpz(), mpq_numref(b));
2530 mpz_divexact(a, a, mpq_denref(b));
2534 inresult = inresult->
next;
2550 if (v ==
nullptr)
return nullptr;
2555 for (vec w = v; w !=
nullptr; w = w->next)
2558 int comp = w->
comp + 1;
2564 inresult = inresult->
next;
2580 if (v ==
nullptr)
return nullptr;
2584 int firstcomp = v->
comp;
2585 int lastcomp = firstcomp;
2588 if (firstcomp > t->comp)
2589 firstcomp = t->comp;
2590 else if (lastcomp < t->comp)
2596 for (
int i = 0; i < lastcomp - firstcomp + 1; i++)
2598 vec_comps[i] =
nullptr;
2599 vec_last[i] =
nullptr;
2607 s->coeff =
globalQQ->fraction(t->coeff, denom);
2609 int x = t->comp - firstcomp;
2624 for (
int x = 0;
x < lastcomp - firstcomp + 1;
x++)
2627 vec w =
make_vec(
x + firstcomp - 1, vec_comps[
x]);
2642 if (v ==
nullptr)
return nullptr;
2648 int firstcomp = v->
comp;
2649 int lastcomp = firstcomp;
2652 if (firstcomp > t->comp)
2653 firstcomp = t->comp;
2654 else if (lastcomp < t->comp)
2660 for (
int i = 0; i < lastcomp - firstcomp + 1; i++)
2662 vec_comps[i] =
nullptr;
2663 vec_last[i] =
nullptr;
2671 s->coeff = t->coeff;
2673 int x = t->comp - firstcomp;
2688 for (
int x = 0;
x < lastcomp - firstcomp + 1;
x++)
2691 vec w =
make_vec(
x + firstcomp - 1, vec_comps[
x]);
varpower::ConstExponents const_varpower
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
Dense exponent-vector template [e_0, ..., e_{nvars-1}] for monomial operations.
Legacy RingZZ — a Ring-derived integer ring backed by GMP mpz_t.
ConcreteRing<RingType> — the templated bridge between aring and the legacy Ring API.
static EngineMonomial * make(int v, int e)
static void from_expvector(int n, exponents::ConstExponents a, Vector &result)
static void to_expvector(int n, ConstExponents a, exponents::Exponents result)
static Exponent weight(int nvars, ConstExponents a, const std::vector< Exponent > &wts)
static void gcd(int nvars, ConstExponents a, ConstExponents b, Exponents result)
static void one(int nvars, Exponents result)
static bool is_one(int nvars, ConstExponents a)
static void copy(int nvars, ConstExponents a, Exponents result)
static void quotient(int nvars, ConstExponents a, ConstExponents b, Exponents result)
static int lex_compare(int nvars, ConstExponents a, ConstExponents b)
static void lcm(int nvars, ConstExponents a, ConstExponents b, Exponents result)
void gbvector_remove(gbvector *f)
static GBRing * create_PolynomialRing(const Ring *K, const Monoid *M)
void gbvector_get_lead_monomial(const FreeModule *F, const gbvector *f, int *result)
gbvector * gbvector_term(const FreeModule *F, ring_elem coeff, int comp)
gbvector * gbvector_mult_by_coeff(const gbvector *f, ring_elem u)
Polynomial-ring view tuned for the inner loop of classical Buchberger Groebner-basis computations.
int numNonTermOrderVariables() const
static void set_trivial_monoid_degree_ring(const PolynomialRing *DR)
void to_expvector(const_monomial m, exponents_t result_exp) const
const PolynomialRing * get_degree_ring() const
monomial make_one() const
const std::vector< int > & get_heft_vector() const
int numInvertibleVariables() const
static Monoid * get_trivial_monoid()
void from_expvector(const_exponents exp, monomial result) const
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
virtual bool from_ComplexInterval(gmp_CCi z, ring_elem &result) const
void internal_negate_to(ring_elem &f) const
ring_elem power_direct(const ring_elem f, int n) const
virtual bool is_equal(const ring_elem f, const ring_elem g) const
ring_elem diff_term(const_monomial m, const_monomial n, monomial resultmon, int use_coeff) const
virtual vec vec_lead_term(int nparts, const FreeModule *F, vec v) const
virtual void text_out(buffer &o) const
void internal_add_to(ring_elem &f, ring_elem &g) const
static const PolyRing * get_trivial_poly_ring()
virtual void increase_maxnorm(gmp_RRmutable norm, const ring_elem f) const
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const
static const PolyRing * create(const Ring *K, const Monoid *M)
Nterm * copy_term(const Nterm *t) const
virtual void degree_weights(const ring_elem f, const std::vector< int > &wts, int &lo, int &hi) const
virtual vec vec_top_coefficient(const vec v, int &var, int &exp) const
vec translate_gbvector_to_vec_denom(const FreeModule *F, const gbvector *v, const ring_elem denom) 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 void elem_text_out(buffer &o, const ring_elem f, bool p_one=true, bool p_plus=false, bool p_parens=false) const
void initialize_poly_ring(const Ring *K, const Monoid *M, const PolynomialRing *deg_ring)
virtual ring_elem from_long(long n) const
virtual void divide_coeff_to(ring_elem &f, ring_elem a) const
virtual int n_flat_terms(const ring_elem f) const
ring_elem preferred_associate_divisor(ring_elem ff) const
ring_elem fromCoefficient(ring_elem &coeff) const
std::vector< int > setNegativeExponentMonomial(Nterm *f) const
Create an exponent vector whose i-th value is the minimum of the exponents of that variable,...
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
virtual void mult_coeff_to(ring_elem a, ring_elem &f) const
virtual bool from_BigComplex(gmp_CC z, ring_elem &result) const
virtual ring_elem content(ring_elem f) const
virtual ring_elem homogenize(const ring_elem f, int v, int deg, const std::vector< int > &wts) const
virtual ring_elem remainder(const ring_elem f, const ring_elem g) const
virtual ring_elem var(int v) const
ring_elem get_denominator_QQ(ring_elem f) const
virtual ring_elem divide_by_expvector(const_exponents exp, const ring_elem a) const
gbvector * translate_gbvector_from_ringelem_QQ(ring_elem coeff) const
void imp_subtract_multiple_to(ring_elem &f, ring_elem a, const_monomial m, const ring_elem g) const
ring_elem vec_get_denominator_QQ(vec f) const
virtual bool from_complex_double(double re, double im, ring_elem &result) const
virtual ring_elem invert(const ring_elem f) const
virtual bool is_unit(const ring_elem f) const
virtual ring_elem diff(ring_elem a, ring_elem b, int use_coeff) const
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const
virtual ring_elem divide_by_given_content(ring_elem f, ring_elem c) const
virtual ring_elem zeroize_tiny(gmp_RR epsilon, const ring_elem f) const
Nterm * division_algorithm_with_laurent_variables(Nterm *f, Nterm *g, Nterm *") const
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const
virtual bool is_homogeneous(const ring_elem f) const
virtual ring_elem from_int(mpz_srcptr n) const
virtual ring_elem mult_by_term(const ring_elem f, const ring_elem c, const_monomial m) const
virtual int index_of_var(const ring_elem a) const
virtual ring_elem make_flat_term(const ring_elem a, const_monomial m) const
virtual ring_elem copy(const ring_elem f) const
Nterm * division_algorithm(Nterm *f, Nterm *g, Nterm *") const
vec translate_gbvector_to_vec(const FreeModule *F, const gbvector *v) const
virtual void monomial_divisor(const ring_elem a, exponents_t exp) const
virtual ring_elem remainderAndQuotient(const ring_elem f, const ring_elem g, ring_elem ") const
virtual ring_elem get_part(const std::vector< int > &wts, const ring_elem f, bool lobound_given, bool hibound_given, long lobound, long hibound) const
virtual ring_elem add(const ring_elem f, const ring_elem g) const
virtual bool from_double(double a, ring_elem &result) const
ring_elem gcd_extended(const ring_elem f, const ring_elem g, ring_elem &u, ring_elem &v) const
virtual ring_elem * get_parts(const std::vector< int > &wts, const ring_elem f, long &result_len) const
virtual ring_elem negate(const ring_elem f) const
ring_elem get_logical_coeff(const Ring *coeffR, const Nterm *&f) const
const vecterm * vec_locate_lead_term(const FreeModule *F, vec v) const
virtual void remove(ring_elem &f) const
gbvector * translate_gbvector_from_ringelem(ring_elem coeff) const
virtual int compare_elems(const ring_elem f, const ring_elem g) const
virtual ring_elem make_logical_term(const Ring *coeffR, const ring_elem a, const_exponents exp) const
gbvector * translate_gbvector_from_vec_QQ(const FreeModule *F, const vec v, ring_elem &result_denominator) const
virtual ring_elem get_terms(int nvars0, const ring_elem f, int lo, int hi) const
Nterm * powerseries_division_algorithm(Nterm *f, Nterm *g, Nterm *") const
virtual ring_elem random() const
virtual bool from_BigReal(gmp_RR z, ring_elem &result) const
bool imp_attempt_to_cancel_lead_term(ring_elem &f, ring_elem g, ring_elem &coeff, monomial monom) const
virtual ring_elem preferred_associate(ring_elem f) const
ring_elem gcd(const ring_elem f, const ring_elem g) const
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
void minimal_monomial(ring_elem f, monomial &monom) const
virtual void lead_logical_exponents(int nvars0, const ring_elem f, exponents_t result_exp) const
virtual bool in_subring(int nslots, const ring_elem a) const
vec vec_coefficient_of_var(vec v, int var, int exp) const
virtual void degree_of_var(int n, const ring_elem a, int &lo, int &hi) const
virtual void lower_content(ring_elem &cont, ring_elem new_coeff) const
virtual bool multi_degree(const ring_elem f, monomial d) const
static void make_trivial_ZZ_poly_ring()
virtual bool from_rational(mpq_srcptr q, ring_elem &result) const
virtual int n_logical_terms(int nvars0, const ring_elem f) const
ring_elem fromSmallIntegerCoefficients(const std::vector< long > &coeffs, int var) const
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
Warning! This function works even if g does not divide f.
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const
virtual bool from_Interval(gmp_RRi z, ring_elem &result) const
ring_elem lead_term(const ring_elem f) const
virtual ring_elem get_coeff(const Ring *coeffR, const ring_elem f, const_varpower vp) const
vec translate_gbvector_to_vec_QQ(const FreeModule *F, const gbvector *v, const ring_elem denom) const
virtual engine_RawArrayPairOrNull list_form(const Ring *coeffR, const ring_elem f) const
virtual bool is_zero(const ring_elem f) const
void determine_common_denominator_QQ(ring_elem f, mpz_ptr denom_so_far) const
virtual M2_arrayint support(const ring_elem a) const
virtual ring_elem lead_logical_coeff(const Ring *coeffR, const ring_elem f) const
void sort(Nterm *&f) const
virtual const_monomial lead_flat_monomial(const ring_elem f) const
virtual ring_elem quotient(const ring_elem f, const ring_elem g) const
virtual ring_elem lead_flat_coeff(const ring_elem f) const
gbvector * translate_gbvector_from_vec(const FreeModule *F, const vec v, ring_elem &result_denominator) const
static PolyRing * trivial_poly_ring
void internal_subtract_to(ring_elem &f, ring_elem &g) const
virtual ring_elem divide_by_var(int n, int d, const ring_elem a) const
Concrete PolyRingFlat subclass implementing ordinary commutative polynomial rings K[x_1,...
int n_terms(const ring_elem f) const
const Ring * getCoefficientRing() const
virtual GBRing * get_gb_ring() const
void initialize_PolynomialRing(const Ring *K, const Monoid *M, const PolyRing *numeratorR, const PolynomialRing *ambientR, const Ring *denomR)
void setIsGraded(bool new_val)
ring_elem ZZ_quotient_value_
virtual const Monoid * getMonoid() const
SumCollector * make_SumCollector() const
virtual const Ring * getCoefficients() const
virtual const PolyRing * getNumeratorRing() const
Abstract base for the engine's polynomial-ring hierarchy.
void subtract_to(ring_elem &f, const ring_elem &g) const
vec make_vec(int r, ring_elem a) const
virtual bool has_associate_divisors() const
void initialize_ring(long charac, const PolynomialRing *DR=nullptr, const std::vector< int > &heft_vec={})
virtual const PolyRing * cast_to_PolyRing() const
virtual ring_elem from_long(long n) const =0
ring_elem minus_one() const
virtual const PolynomialRing * cast_to_PolynomialRing() const
long characteristic() const
void add_to(ring_elem &f, const ring_elem &g) const
virtual bool lower_associate_divisor(ring_elem &f, ring_elem g) const
const Monoid * degree_monoid() const
virtual SumCollector * make_SumCollector() const
static RingElement * make_raw(const Ring *R, ring_elem f)
const Ring * get_ring() const
ring_elem eval_term(const Ring *coeff_ring, const ring_elem coeff, const int *vp, int first_var, int nvars_in_source) const
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
static std::pair< bool, int > get_si(mpz_srcptr n)
int schreyer_compare(const_monomial m, int m_comp, const_monomial n, int n_comp) const
Per-component tie-breaker data for a Schreyer monomial order on a FreeModule.
virtual ring_elem getValue()=0
virtual void add(ring_elem f)=0
Abstract incremental accumulator that builds a ring_elem from many add(f) calls.
Debugger-callable d* helpers that pretty-print engine values to stderr.
FractionField — field of fractions of an integral domain, with on-the-fly normalisation.
GBRing and gbvector — the GB-tuned polynomial-ring view used by classical Buchberger code.
polyheap — polynomial-specialised geometric heap for reduction accumulators.
vecHeap — geometric heap specialised for accumulating vec values.
void subtract(int &result, int a, int b)
const int * const_monomial
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define sizeofarray(s, len)
M2_arrayint M2_makearrayint(int n)
struct gmp_CC_struct * gmp_CC
struct engine_RawArrayPair_struct * engine_RawArrayPair
engine_RawArrayPair engine_RawArrayPairOrNull
struct gmp_CCi_struct * gmp_CCi
Matrix — the engine's immutable homomorphism F -> G between free modules.
#define ALLOCATE_EXPONENTS(byte_len)
#define EXPONENT_BYTE_SIZE(nvars)
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
EngineMonomial — opaque single-monomial value type used at the engine boundary.
#define newarray_atomic_clear(T, len)
typename std::vector< T, gc_allocator< T > > gc_vector
a version of the STL vector, which allocates its backing memory with gc.
#define newarray_atomic(T, len)
int check_coeff_ring(const Ring *coeffR, const PolyRing *P)
const PolyRing * isUnivariateOverPrimeField(const Ring *R)
Concrete commutative PolyRing — standard polynomial ring inheriting from PolyRingFlat.
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
RingZZ * makeIntegerRing()
TermIterator< Nterm > begin(Nterm *ptr)
TermIterator< Nterm > end(Nterm *)
RingMap — engine representation of a ring homomorphism.
Singly linked-list node carrying one term of a polynomial-ring element.
Text-formatting helpers layered on buffer: bignum print, line wrapping, M2_gbTrace-gated emit.
mpz_srcptr get_mpz() const