62 ERROR(
"unable to coerce rational into ring");
72 ERROR(
"cannot create element of this ring from an element of CC");
80 ERROR(
"cannot create element of this ring from an element of RR");
88 ERROR(
"cannot create element of this ring from an element of RRi");
96 ERROR(
"cannot create element of this ring from an element of CCi");
118 mpz_init_set_si(
result,
static_cast<int>(res.second));
122 ERROR(
"Expected ZZ or ZZ/p as base ring");
130 ERROR(
"expected an element of QQ");
157 ERROR(
"expected an element of RRR");
190 ERROR(
"expected an element of RRi");
202 RCCC->ring().from_ring_elem_const(a->
get_value());
210 RCC->ring().from_ring_elem_const(a->
get_value());
214 ERROR(
"expected an element of CCC");
230 mpfi_init2(
result->re, 53);
231 mpfi_init2(
result->im, 53);
233 mpfi_set_d(
result->im, 0);
244 mpfi_set_d(
result->im, 0);
280 ERROR(
"expected an element of CCi");
326 if (
error())
return nullptr;
356 "ring remainder requires both elements to have the same base "
363 if (
error())
return nullptr;
403 ERROR(
"cannot promote given ring element");
445 ERROR(
"the zero element has no degree");
484 if (
error())
return nullptr;
488 mpz_init_set_si(
const_cast<mpz_ptr
>(
p->a),
static_cast<long>(lo));
489 mpz_init_set_si(
const_cast<mpz_ptr
>(
p->b),
static_cast<long>(hi));
551 if (Q->coefficientRing() != a->
get_ring())
553 ERROR(
"wrong coefficient ring");
560 ERROR(
"requires a polynomial ring");
584 const Ring *coeffRing,
602 const Ring *coeffRing,
637 const Ring *coeffRing,
663 ERROR(
"expected a polynomial");
683 ERROR(
"expected a polynomial");
689 engine_RawRingElementArray
result =
691 result->len =
static_cast<int>(relems_len);
692 for (
int i = 0; i <
result->len; i++)
709 int n = input_relems.size() - 1;
711 output_relems[0] = input_relems[0];
712 output_relems[1] = input_relems[1];
713 for (
int i=2; i<=n; i++)
716 for (
int j=i-1; j>=1; --j)
721 output_relems[i] =
result;
734 input_relems.size() - 1;
736 output_relems[0] = input_relems[0];
737 for (
int i = 1; i <= n; i++)
742 for (
int j = i - 1; j >= 1; --j)
745 Nterm *g = input_relems[j];
753 if (convolve_type == 1)
758 output_relems[i] =
result;
779 ERROR(
"expected ring element array of length at least 2");
782 const PolyRing *P = H->array[1]->get_ring()->cast_to_PolyRing();
785 ERROR(
"expected a polynomial ring");
790 for (
int i = 0; i < len; i++) input_relems[i] = H->array[i]->get_value();
791 convolve(P, input_relems, output_relems, convolve_type);
793 engine_RawRingElementArray
result =
796 for (
int i = 0; i <
result->len; i++)
824 ERROR(
"expected a polynomial");
863 ERROR(
"expected an element of a polynomial ring");
868 ERROR(
"cannot find preferred associates for this ring");
934 if (
error())
return nullptr;
950 ERROR(
"expected a polynomial over a Schur ring");
971 ERROR(
"expected a SchurSn ring element");
976 ERROR(
"expected SchurSn ring elements");
1000 ERROR(
"expected a Schur ring");
1021 if (R ==
nullptr)
return -1;
1029 if (R ==
nullptr)
return 0;
1032 ERROR(
"use rawCharacteristic to find the characteristic");
1043 ERROR(
"not implemented for this ring");
1054 ERROR(
"not implemented for this ring");
1067 ERROR(
"not implemented for this ring");
1072 ERROR(
"expected elements in the same ring");
Variable-length sparse (variable, exponent) encoding of monomials.
exponents::Exponents exponents_t
Ring-shaped wrapper that exposes a non-commutative FreeAlgebra to the rest of the engine.
Ring-shaped façade around a non-commutative quotient algebra.
M2::ARingCC — machine-precision complex numbers (pair of doubles).
M2::ARingCCC — arbitrary-precision complex numbers (pair of MPFR floats).
M2::ARingCCi — certified complex intervals as Cartesian rectangles of MPFI intervals.
M2::ARingRR — machine-precision real numbers (IEEE 754 double).
M2::ARingRRR — arbitrary-precision real numbers backed by MPFR.
M2::ARingRRi — certified real intervals [a, b] with MPFR endpoints, MPFI arithmetic.
ConcreteRing<RingType> — the templated bridge between aring and the legacy Ring API.
Shared base of the aring framework (namespace M2) that unifies the engine's coefficient rings.
Append-only GC-backed byte buffer used throughout the engine for text output.
Engine-side immutable monomial value type wrapping a varpower- encoded exponent vector.
unsigned int hash() const
static void to_expvector(int n, ConstExponents a, exponents::Exponents result)
int discrete_log(ring_elem a) const
Engine-side finite field GF(p^n) built on top of (Z/p)[t] / f(t) for a primitive element of the resul...
aring-style adapter for arbitrary-precision real numbers, backed by MPFR.
virtual unsigned long get_precision() const
virtual engine_RawArrayPairOrNull list_form(const Ring *coeffR, const ring_elem f) const
Concrete Ring wrapper around an owned FreeAlgebra (no quotient).
Abstract Ring subclass that lifts either a FreeAlgebra or a FreeAlgebraQuotient into the engine's Rin...
const M2FreeAlgebra & m2FreeAlgebra() const
Concrete Ring wrapper around an owned FreeAlgebraQuotient (the quotient counterpart of M2FreeAlgebra)...
void internal_add_to(ring_elem &f, ring_elem &g) const
ring_elem preferred_associate_divisor(ring_elem ff) const
virtual void mult_coeff_to(ring_elem a, ring_elem &f) const
virtual ring_elem mult_by_term(const ring_elem f, const ring_elem c, const_monomial m) const
virtual ring_elem copy(const ring_elem f) const
Concrete PolyRingFlat subclass implementing ordinary commutative polynomial rings K[x_1,...
const Ring * getCoefficientRing() 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 =0
virtual const Ring * getCoefficients() const
virtual ring_elem * get_parts(const std::vector< int > &wts, const ring_elem f, long &result_len) const =0
virtual ring_elem make_logical_term(const Ring *coeffR, const ring_elem a, const_exponents exp) const =0
virtual engine_RawArrayPairOrNull list_form(const Ring *coeffR, const ring_elem f) const =0
Abstract base for the engine's polynomial-ring hierarchy.
virtual bool is_ZZ() const
virtual ring_elem var(int v) const
virtual const SchurSnRing * cast_to_SchurSnRing() const
virtual bool from_BigReal(gmp_RR a, ring_elem &result) const
virtual M2::RingID ringID() const
virtual bool from_Interval(gmp_RRi a, ring_elem &result) const
virtual const SchurRing2 * cast_to_SchurRing2() const
virtual std::pair< bool, long > coerceToLongInteger(ring_elem a) const
virtual ring_elem add(const ring_elem f, const ring_elem g) const =0
virtual bool from_ComplexInterval(gmp_CCi z, ring_elem &result) const
virtual bool has_associate_divisors() const
virtual bool is_equal(const ring_elem f, const ring_elem g) const =0
virtual const PolyRing * cast_to_PolyRing() const
virtual ring_elem remainderAndQuotient(const ring_elem f, const ring_elem g, ring_elem ") const
virtual bool from_BigComplex(gmp_CC z, ring_elem &result) const
virtual ring_elem invert(const ring_elem f) const =0
virtual ring_elem from_long(long n) const =0
virtual const PolynomialRing * cast_to_PolynomialRing() const
virtual const RingElement * getGenerator() const
virtual const GF * cast_to_GF() const
virtual ring_elem copy(const ring_elem f) const =0
virtual ring_elem antipode(ring_elem f) const
virtual int index_of_var(const ring_elem a) const
virtual bool is_zero(const ring_elem f) const =0
virtual long discreteLog(const ring_elem &a) const
virtual bool is_QQ() const
virtual int compare_elems(const ring_elem f, const ring_elem g) const =0
virtual ring_elem from_int(mpz_srcptr n) const =0
virtual ring_elem mult(const ring_elem f, const ring_elem g) const =0
virtual bool isFinitePrimeField() const
virtual const SchurRing * cast_to_SchurRing() const
virtual M2_arrayint support(const ring_elem a) const
const Monoid * degree_monoid() const
virtual const Z_mod * cast_to_Z_mod() const
virtual bool from_rational(const mpq_srcptr q, ring_elem &result) const =0
virtual const Tower * cast_to_Tower() const
void text_out(buffer &o) const
RingElement * fraction(const Ring *R, const RingElement *bottom) const
bool is_homogeneous() const
EngineMonomial * lead_monom(int nvars) const
const_monomial degree() const
RingElement * denominator() const
ring_elem get_value() const
bool promote(const Ring *S, const RingElement *&result) const
const RingElement * split_off_content(const RingElement *&result) const
int n_terms(int nvars) const
RingElement * lead_coeff(const Ring *coeffR) const
RingElement * get_terms(int nvars, int lo, int hi) const
RingElement * numerator() const
static RingElement * make_raw(const Ring *R, ring_elem f)
void degree_weights(const std::vector< int > &wts, int &lo, int &hi) const
const RingElement * remove_content() const
RingElement * get_coeff(const Ring *coeffR, const EngineMonomial *m) const
bool lift(const Ring *S, const RingElement *&result) const
const RingElement * content() const
const Ring * get_ring() const
RingElement * homogenize(int v, const std::vector< int > &wts) const
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
bool is_valid_partition(M2_arrayint part, bool set_error=true) const
engine_RawArrayPairOrNull list_form(const Ring *coeffR, const ring_elem f) const
ring_elem from_partition(M2_arrayint part) const
Refactored Schur (symmetric-function) ring whose elements are schur_poly sums of partitions over a co...
void dimension(const int *exp, mpz_t result) const
PolyRing subclass implementing the Schur (symmetric-function) ring whose monomials are partitions and...
ring_elem tensor_mult(const ring_elem f, const ring_elem g) const
SchurRing2 subclass implementing the symmetric-group character ring (the "Schur ring of `S_n`"),...
ring_elem lowerP(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
int degreeInVariable(int var, const ring_elem f) const
int extension_degree(int nvars) const
Ring subclass for tower polynomial rings (Z/p)[x_0][x_1]...[x_{n-1}] modulo a chain of algebraic exte...
Engine-side Z/p ring for small primes (p < 32767), using a discrete-log (Zech) representation.
Engine error-reporting primitives: ERROR, INTERNAL_ERROR, error, error_message.
namespace exc — internal C++ exception types and the TRY / CATCH macro pair.
gmp_CCi moveTo_gmpCCi(gmp_CCimutable _z)
mpfr_srcptr moveTo_gmpRR(mpfr_ptr _z)
mpfi_srcptr moveTo_gmpRRi(mpfi_ptr _z)
void mpz_reallocate_limbs(mpz_ptr _z)
M2_arrayint to_degree_vector(const Monoid *M, const_monomial d)
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define getmemarraytype(S, len)
#define getmemstructtype(S)
struct gmp_CC_struct * gmp_CC
engine_RawRingElementArray engine_RawRingElementArrayOrNull
gmp_ZZpair gmp_ZZpairOrNull
struct engine_RawRingElementPair_struct * engine_RawRingElementPair
struct gmp_ZZpair_struct * gmp_ZZpair
engine_RawArrayPair engine_RawArrayPairOrNull
mpfi_srcptr gmp_RRiorNull
struct gmp_CCi_struct * gmp_CCi
struct gmp_CCimutable_struct * gmp_CCimutable
Engine-boundary C API for constructing and inspecting Monoid objects.
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(T, len)
our_new_delete — per-class opt-in routing of new / delete through bdwgc.
Concrete commutative PolyRing — standard polynomial ring inheriting from PolyRingFlat.
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.
ring_elem — the universal value type carried by every Ring* in the engine.
M2_bool IM2_RingElement_is_equal(const RingElement *a, const RingElement *b)
M2_arrayint rawRingElementIndices(const RingElement *f)
int IM2_RingElement_index_if_var(const RingElement *f)
const RingElement * IM2_RingElement_denominator(const RingElement *a)
const RingElement * IM2_RingElement_get_coeff(const Ring *coeffRing, const RingElement *a, const EngineMonomial *m)
const RingElement * rawRingElementRemoveContent(const RingElement *f)
const RingElement * IM2_RingElement_term(const Ring *R, const RingElement *a, const EngineMonomial *m)
const EngineMonomial * IM2_RingElement_lead_monomial(int nvars, const RingElement *a)
M2_bool IM2_RingElement_is_zero(const RingElement *a)
const RingElement * rawLowerP(const RingElement *f)
const RingElement * IM2_RingElement_promote(const Ring *S, const RingElement *f)
gmp_QQorNull IM2_RingElement_to_rational(const RingElement *a)
engine_RawRingElementPair IM2_RingElement_divmod(const RingElement *a, const RingElement *b)
const RingElement * IM2_RingElement_from_ComplexInterval(const Ring *R, gmp_CCi z)
const RingElement * IM2_RingElement_homogenize(const RingElement *a, int v, M2_arrayint wts)
const RingElement * IM2_RingElement_from_BigComplex(const Ring *R, gmp_CC z)
const RingElement * IM2_RingElement_get_terms(int nvars, const RingElement *a, int lo, int hi)
const RingElement * IM2_RingElement_from_Integer(const Ring *R, gmp_ZZ d)
const RingElement * rawGetPart(const M2_arrayint wts, const RingElement *f, M2_bool lobound_given, M2_bool hibound_given, long lobound, long hibound)
const Ring * IM2_RingElement_ring(const RingElement *a)
const RingElement * IM2_RingElement_lead_coeff(const Ring *coeffRing, const RingElement *a)
const RingElement * IM2_RingElement_from_Interval(const Ring *R, gmp_RRi z)
gmp_ZZpairOrNull rawWeightRange(M2_arrayint wts, const RingElement *a)
void convolve(const PolyRing *R, const VECTOR(ring_elem) &input_relems, VECTOR(ring_elem) &output_relems, int convolve_type)
int rawDegree(int v, const RingElement *f)
unsigned int rawRingElementHash(const RingElement *a)
engine_RawRingElementArray rawGetParts(const M2_arrayint wts, const RingElement *f)
const RingElement * rawMultiplicativeGenerator(const Ring *R)
engine_RawRingElementArrayOrNull rawConvolve(engine_RawRingElementArray H, int convolve_type)
gmp_RRiorNull IM2_RingElement_to_Interval(const RingElement *a)
const RingElement * IM2_RingElement_from_rational(const Ring *R, mpq_srcptr r)
gmp_CCiorNull IM2_RingElement_to_ComplexInterval(const RingElement *a)
M2_string IM2_RingElement_to_string(const RingElement *f)
int rawRingElementCompare(const RingElement *a, const RingElement *b)
gmp_RRorNull IM2_RingElement_to_BigReal(const RingElement *a)
const RingElement * rawRingElementSplitContent(const RingElement *f, const RingElement **result)
const RingElement * rawRingElementAntipode(const RingElement *f)
const RingElement * IM2_RingElement_fraction(const Ring *R, const RingElement *a, const RingElement *b)
const RingElement * rawDiff(int v, const RingElement *f)
int IM2_RingElement_n_terms(int nvars, const RingElement *a)
const RingElement * IM2_RingElement_from_BigReal(const Ring *R, gmp_RR z)
const RingElement * rawSchurFromPartition(const Ring *R, M2_arrayint part)
long rawDiscreteLog(const RingElement *h)
const RingElement * IM2_RingElement_make_var(const Ring *R, int v)
const RingElement * rawSchurSnTensorMult(const RingElement *a, const RingElement *b)
engine_RawArrayPairOrNull IM2_RingElement_list_form(const Ring *coeffRing, const RingElement *f)
const RingElement * IM2_RingElement_homogenize_to_degree(const RingElement *a, int v, int deg, M2_arrayint wts)
const RingElement * rawPowerMod(const RingElement *f, mpz_srcptr n, const RingElement *g)
const RingElement * rawAssociateDivisor(const RingElement *f)
const RingElement * rawRingElementContent(const RingElement *f)
M2_arrayint IM2_RingElement_multidegree(const RingElement *a)
const RingElement * IM2_RingElement_lift(int *success_return, const Ring *S, const RingElement *f)
M2_bool IM2_RingElement_is_graded(const RingElement *a)
const RingElement * IM2_RingElement_numerator(const RingElement *a)
gmp_ZZorNull rawSchurDimension(const RingElement *f)
gmp_ZZorNull IM2_RingElement_to_Integer(const RingElement *a)
int rawExtensionDegree(int firstvar, const Ring *R1)
gmp_CCorNull IM2_RingElement_to_BigComplex(const RingElement *a)
Engine-boundary C API for constructing, querying, and operating on RingElement values.
SchurRing2 — refactored Schur ring with length-prefixed partitions and an explicit Ring base.
SchurRing — symmetric-function ring with Schur-basis multiplication via Littlewood-Richardson.
SchurSnRing — SchurRing2 subclass intended for symmetric-group representation rings (Kronecker produc...
Singly linked-list node carrying one term of a polynomial-ring element.
Legacy Tower — Ring-derived iterated extension of Z/p (pre-aring).
mpfr_srcptr get_mpfr() const
mpfi_srcptr get_mpfi() const
double get_double() const
mpq_srcptr get_mpq() const
cci_srcptr get_cci() const
mpz_srcptr get_mpz() const
std::vector< T > M2_arrayint_to_stdvector(M2_arrayint arr)
Conversion helpers between M2 boundary types and standard C++ containers.