40#include <M2/gc-include.h>
42#pragma GCC diagnostic push
43#pragma GCC diagnostic ignored "-Wconversion"
44#include <flint/fmpz.h>
45#include <flint/fq_nmod.h>
46#pragma GCC diagnostic pop
70 ERROR(
"ZZP: expected a prime number p in range 2 <= p <= 32749");
140 const DividedPowerRing *
result = 0;
149 ERROR(
"not yet implemented");
161 ERROR(
"expected a polynomial ring");
185 ERROR(
"expected a polynomial ring");
210 ERROR(
"expected a polynomial ring");
224 M2_ArrayString names,
231 if (coefficientRing ==
nullptr)
233 ERROR(
"internal error: expected non-null Ring!");
239 ERROR(
"expected polynomial ring");
291 ERROR(
"internal error: expected non-null Ring!");
297 ERROR(
"expected a free algebra");
318 ERROR(
"expected polynomial ring");
324 "cannot currently make fraction field over a polynomial ring "
325 "with a non-global monomial order");
331 "cannot currently make fraction field over a polynomial ring "
332 "with Laurent variables, i.e. Inverses=>true set");
337 ERROR(
"cannot make fraction field over approximate field base");
343 "fraction fields over other fraction fields not yet implemented");
348 ERROR(
"fraction fields over other local rings not yet implemented");
367 ERROR(
"expected a polynomial ring");
372 ERROR(
"expected a Grobner basis computation");
377 ERROR(
"expected matrix to be over the same ring");
394 ERROR(
"expected matrix to be over the same ring");
398 ERROR(
"expected a one row matrix of quotient elements");
414 ERROR(
"expected a polynomial ring or free algebra");
433 if (R1 ==
nullptr || B1 ==
nullptr)
435 ERROR(
"expected a polynomial ring");
440 ERROR(
"encountered quotient polynomial ring");
460 ERROR(
"Schur ring construction: expected a polynomial ring");
518 M2_ArrayString new_names)
525 ERROR(
"expected a tower coefficient ring");
537 engine_RawRingElementArray eqns)
544 ERROR(
"expected a tower coefficient ring");
548 for (
int i = 0; i < eqns->len; i++)
553 ERROR(
"extension element has incorrect base ring");
580 return const_cast<Ring *
>(K)->declare_field();
600 ERROR(
"expected polynomial ring");
614 ERROR(
"expected polynomial ring");
626 bool find_random_if_no_conway_poly_available,
627 std::vector<long> &result_poly)
634 fmpz_set_si(
p, charac);
635 if (!find_random_if_no_conway_poly_available)
636 ret = _fq_nmod_ctx_init_conway(ctx,
p, deg,
"a");
638 fq_nmod_ctx_init(ctx,
p, deg,
"a");
640 if (ret == 0)
return false;
642 result_poly.resize(deg + 1);
643 for (
long i = 0; i <= deg; i++) result_poly[i] = 0;
644 for (
long i = 0; i < ctx->len; i++)
646 if (ctx->j[i] < 0 or ctx->j[i] > deg)
647 printf(
"error: encountered bad degree\n");
650 result_poly[ctx->j[i]] = ctx->a[i];
656 fq_nmod_ctx_clear(ctx);
662 M2_bool find_random_if_no_conway_poly_available)
664 std::vector<long> poly;
666 charac, deg, find_random_if_no_conway_poly_available, poly);
Legacy Ring-based Galois field with explicit Zech-style lookup tables.
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.
Modern Monom / Polynomial value types shared by NC algebras and the refactored F4.
Legacy RingZZ — a Ring-derived integer ring backed by GMP mpz_t.
Legacy Z_mod — a Ring-derived Z/p with log / exp tables.
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.
virtual GBComputation * cast_to_GBComputation()
Abstract base for long-running, resumable engine computations (GBComputation, ResolutionComputation,...
static FractionField * create(const PolyRingFlat *R)
virtual const Ring * get_ring() const =0
base class for Groebner basis computations.
static GF * create(const RingElement *prim)
static LocalRing * create(const PolyRing *R, GBComputation *P)
static ConcreteRing< RingType > * create(std::unique_ptr< RingType > R)
static M2FreeAlgebra * create(const Ring *K, const std::vector< std::string > &names, const PolynomialRing *degreeRing, const std::vector< int > °rees, const std::vector< int > &wtvecs, const std::vector< int > &heftVector)
Concrete Ring wrapper around an owned FreeAlgebra (no quotient).
static M2FreeAlgebraQuotient * create(const M2FreeAlgebra &F, const Matrix *GB, int maxdeg)
Concrete Ring wrapper around an owned FreeAlgebraQuotient (the quotient counterpart of M2FreeAlgebra)...
const Ring * get_ring() const
int numNonTermOrderVariables() const
int numInvertibleVariables() const
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
unsigned int hash() const
static const PolyRing * get_trivial_poly_ring()
static const PolyRing * create(const Ring *K, const Monoid *M)
PolynomialRing subclass whose elements are represented as a single flat Nterm* linked list (no fracti...
Concrete PolyRingFlat subclass implementing ordinary commutative polynomial rings K[x_1,...
virtual const PolynomialRing * getAmbientRing() const
static PolynomialRing * create_quotient(const PolynomialRing *R, VECTOR(Nterm *) &elems)
virtual const Monoid * getMonoid() const
virtual const Ring * getCoefficients() const
virtual const Ring * getDenominatorRing() const
Abstract base for the engine's polynomial-ring hierarchy.
virtual const PolyRingFlat * cast_to_PolyRingFlat() const
virtual void text_out(buffer &o) const =0
virtual const PolyRing * cast_to_PolyRing() const
virtual unsigned long get_precision() const
virtual const PolynomialRing * cast_to_PolynomialRing() const
long characteristic() const
virtual const LocalRing * cast_to_LocalRing() const
ring_elem get_non_unit() const
virtual const M2FreeAlgebra * cast_to_M2FreeAlgebra() const
virtual const FractionField * cast_to_FractionField() const
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...
static SchurRing2 * createInfinite(const Ring *A)
static SchurRing2 * create(const Ring *A, int n=-1)
Refactored Schur (symmetric-function) ring whose elements are schur_poly sums of partitions over a co...
static SchurRing * create(const PolynomialRing *R)
PolyRing subclass implementing the Schur (symmetric-function) ring whose monomials are partitions and...
static SchurSnRing * create(const Ring *A, int n=-1)
SchurRing2 subclass implementing the symmetric-group character ring (the "Schur ring of `S_n`"),...
static SkewPolynomialRing * create(const Ring *K, const Monoid *M, M2_arrayint skewvars)
PolyRing subclass for skew-commutative (exterior-style) polynomial rings: the listed skewvars anticom...
static SolvableAlgebra * create(const Ring *K, const Monoid *M, const Matrix *Q)
PolyRing subclass for solvable polynomial algebras (PBW-type non-commutative rings where each pair of...
static Tower * create(int charac, M2_ArrayString names)
Ring subclass for tower polynomial rings (Z/p)[x_0][x_1]...[x_{n-1}] modulo a chain of algebraic exte...
static WeylAlgebra * create(const Ring *K, const Monoid *M, M2_arrayint derivs, M2_arrayint comms, int homog_var)
PolyRing subclass for Weyl algebras: polynomial rings with the [d_i, x_i] = 1 derivative-variable com...
static Z_mod * create(int p)
namespace exc — internal C++ exception types and the TRY / CATCH macro pair.
void intern_polyring(const PolynomialRing *G)
intern_* helpers that register long-lived engine objects with bdwgc finalisers.
FractionField — field of fractions of an integral domain, with on-the-fly normalisation.
const Ring * IM2_Ring_QQ(void)
const Ring * rawGaloisField(const RingElement *f)
const Ring * rawDenominatorRing(const Ring *R)
const Ring * rawSchurRing2(const Ring *A, int n)
const Ring * IM2_Ring_polyring(const Ring *K, const Monoid *M)
const Ring * rawDividedPowerRing(const Ring *K, const Monoid *M)
const Ring * IM2_Ring_ZZ(void)
const Ring * rawRingM2FreeAlgebra(const Ring *coefficientRing, M2_ArrayString names, const Ring *degreeRing, M2_arrayint degrees, M2_arrayint wtvecs, M2_arrayint heftVector)
const Ring * rawSchurSnRing(const Ring *A, int n)
const Ring * IM2_Ring_weyl_algebra(const Ring *R, M2_arrayint comm_vars, M2_arrayint diff_vars, int homog_var)
const Ring * rawRingM2FreeAlgebraQuotient(const Matrix *GB, int maxdeg)
const Ring * IM2_Ring_RRi(unsigned long prec)
const Ring * IM2_Ring_CCC(unsigned long prec)
bool findConwayPolynomial(long charac, long deg, bool find_random_if_no_conway_poly_available, std::vector< long > &result_poly)
const Ring * IM2_Ring_RRR(unsigned long prec)
const Ring * rawTowerRing3(const Ring *R1, engine_RawRingElementArray eqns)
const Ring * rawSchurRing1(const Ring *A)
const Ring * IM2_Ring_ZZp(int p)
const RingElement * rawGetNonUnit(const Ring *K)
const Ring * IM2_Ring_solvable_algebra(const Ring *R, const Matrix *Q)
unsigned int rawRingHash(const Ring *R)
const Ring * rawAmbientRing(const Ring *R)
const Ring * IM2_Ring_localization(const Ring *R, Computation *C)
M2_bool IM2_Ring_declare_field(const Ring *K)
const Ring * IM2_Ring_skew_polyring(const Ring *R, M2_arrayint skewvars)
long rawRingCharacteristic(const Ring *R)
M2_bool IM2_Ring_is_field(const Ring *K)
M2_arrayint rawConwayPolynomial(long charac, long deg, M2_bool find_random_if_no_conway_poly_available)
const Ring * IM2_Ring_quotient1(const Ring *R, const Ring *B)
const Ring * IM2_Ring_trivial_polyring()
const Ring * rawTowerRing1(long charac, M2_ArrayString names)
const Ring * IM2_Ring_quotient(const Ring *R, const Matrix *I)
const Ring * IM2_Ring_CCi(unsigned long prec)
M2_string IM2_Ring_to_string(const Ring *R)
const Ring * IM2_Ring_frac(const Ring *R)
const Ring * rawTowerRing2(const Ring *R1, M2_ArrayString new_names)
const Ring * IM2_Ring_schur(const Ring *R)
LocalRing — localisation of a polynomial ring at a prime ideal P.
VALGRIND_MAKE_MEM_DEFINED & result(result)
Matrix — the engine's immutable homomorphism F -> G between free modules.
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
EngineMonomial — opaque single-monomial value type used at the engine boundary.
PolyRingQuotient — polynomial ring modulo an ideal whose Groebner basis is known.
PolynomialRing — abstract polynomial-ring base, the engine's most-reused class.
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
Engine-boundary C API for the legacy Ring hierarchy — coefficient, polynomial, and composite rings.
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...
SkewPolynomialRing — polynomial ring with a designated set of anticommuting variables.
SolvableAlgebra — scaffolding for a PBW algebra x_j x_i = x_i x_j + q_{ij} (multiplication unimplemen...
Legacy Tower — Ring-derived iterated extension of Z/p (pre-aring).
const PolynomialRing * degreeRing(const std::vector< std::string > &names)
M2_arrayint stdvector_to_M2_arrayint(const std::vector< T > &v)
void M2_ArrayString_to_stdvector(M2_ArrayString strs, std::vector< std::string > &result)
std::vector< T > M2_arrayint_to_stdvector(M2_arrayint arr)
WeylAlgebra — ring of polynomial differential operators with [d_i, x_i] = 1.