16 return static_cast<unsigned int>(mpz_get_si(a));
48 if (not mpz_fits_slong_p(n))
return std::make_pair<bool, int>(
false, 0);
49 long a = mpz_get_si(n);
50 int b =
static_cast<int>(a);
51 if (a == b)
return std::make_pair<bool, int>(
true, std::move(b));
52 return std::make_pair<bool, int>(
false, 0);
59 unsigned int exp =
static_cast<unsigned int>(mpz_mod_ui(ans, n,
p));
66 return std::pair<bool, long>(mpz_fits_slong_p(a.
get_mpz()),
92 int size =
static_cast<int>(mpz_sizeinbase(a, 10)) + 2;
96 if (!is_neg && p_plus) o <<
'+';
104 str = mpz_get_str(allocstr, 10, a);
107 if (size > 1000)
freemem(allocstr);
130 bool ok = mpz_cmp_si(mpq_denref(q), 1) == 0;
131 if (not ok)
return false;
158 return mpz_sgn(a) == 0;
166 return mpz_cmp(a, b) == 0;
172 int cmp = mpz_cmp(a, b);
173 if (cmp > 0)
return 1;
174 if (cmp == 0)
return 0;
180 return mpz_sgn(a) > 0;
202 if (mpz_sgn(a) >= 0)
return from_long(1);
216 int s = (sa == 0 ? sb : sa);
234 mpz_srcptr a = c.get_mpz();
235 mpz_srcptr b = g.get_mpz();
291 return power(f, n1.second);
323 int gsign = mpz_sgn(g.
get_mpz());
328 mpz_fdiv_qr(q, r, f.
get_mpz(), gg);
329 mpz_tdiv_q_2exp(ghalf, gg, 1);
330 if (mpz_cmp(r, ghalf) > 0)
335 if (gsign < 0) mpz_neg(q, q);
400 if (mpz_cmp_ui(bb, 1) == 0)
416 if (mpz_sgn(
x.get_mpz()) > 0)
unsigned int computeHashValue_mpz(mpz_srcptr a)
unsigned int computeHashValue_mpz(mpz_srcptr a)
int mask_mpz_cmp_si(mpz_srcptr x, long int i)
Legacy RingZZ — a Ring-derived integer ring backed by GMP mpz_t.
M2::ARingZZGMP — aring integer ring backed straight by GMP mpz_t.
wrapper for the mpz_struct integer representation
Abstract base for the engine's polynomial-ring hierarchy.
void initialize_ring(long charac, const PolynomialRing *DR=nullptr, const std::vector< int > &heft_vec={})
virtual ring_elem from_int(mpz_srcptr n) const =0
const PolynomialRing * degree_ring
const Ring * get_ring() const
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
virtual ring_elem add(const ring_elem f, const ring_elem g) const
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const
virtual ring_elem negate(const ring_elem f) 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 unsigned int computeHashValue(const ring_elem a) const
virtual ring_elem quotient(const ring_elem f, const ring_elem g) const
virtual bool is_unit(const ring_elem f) const
virtual bool is_zero(const ring_elem f) const
static unsigned int mod_ui(mpz_srcptr n, unsigned int p)
virtual void lower_content(ring_elem &c, ring_elem g) const
virtual ring_elem from_long(long n) const
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const
virtual bool lower_associate_divisor(ring_elem &f, ring_elem g) const
virtual bool from_rational(mpq_srcptr q, ring_elem &result) const
virtual ring_elem remainderAndQuotient(const ring_elem f, const ring_elem g, ring_elem ") const
virtual void remove(ring_elem &f) const
bool initialize_ZZ(const PolynomialRing *deg_ring)
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
virtual ring_elem random() const
virtual ring_elem from_int(mpz_srcptr n) const
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
virtual int compare_elems(const ring_elem f, const ring_elem g) const
static std::pair< bool, int > get_si(mpz_srcptr n)
ring_elem gcd(const ring_elem f, const ring_elem g) const
int is_positive(const ring_elem a) const
virtual bool is_equal(const ring_elem f, const ring_elem g) const
virtual ring_elem invert(const ring_elem f) const
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
virtual ring_elem remainder(const ring_elem f, const ring_elem g) const
virtual std::pair< bool, long > coerceToLongInteger(ring_elem a) const
virtual void text_out(buffer &o) const
ring_elem gcd_extended(const ring_elem f, const ring_elem g, ring_elem &u, ring_elem &v) const
virtual ring_elem preferred_associate(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
virtual ring_elem copy(const ring_elem f) const
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const
namespace exc — internal C++ exception types and the TRY / CATCH macro pair.
GBRing and gbvector — the GB-tuned polynomial-ring view used by classical Buchberger code.
void mpz_reallocate_limbs(mpz_ptr _z)
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define getmemstructtype(S)
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
#define newarray_atomic(T, len)
void rawSetRandomInteger(mpz_ptr result, gmp_ZZ maxN)
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
RingMap — engine representation of a ring homomorphism.
Text-formatting helpers layered on buffer: bignum print, line wrapping, M2_gbTrace-gated emit.
mpz_srcptr get_mpz() const