Macaulay2 Engine
Loading...
Searching...
No Matches
ring.hpp
Go to the documentation of this file.
1// Copyright 1995 Michael E. Stillman
2
3#ifndef _ring_hh_
4# define _ring_hh_
5
41
42# include <utility> // for pair
43
44# include "aring.hpp" // for RingID, ring_old
45# include "error.h" // for ERROR
46# include "exceptions.hpp" // for engine_error
47# include "hash.hpp" // for MutableEngineObject
48# include "monoid.hpp"
49# include "newdelete.hpp" // for our_new_delete
50# include "ringelem.hpp" // for ring_elem, vec, vecterm (ptr only), Nter...
51
52class ARing;
53class CCC;
55class FractionField;
56class FreeModule;
57class GF;
58class LocalRing;
59class Monoid;
60class MutableMatrix;
61class PolyQQ;
62class PolyRing;
63class PolyRingFlat;
64class PolynomialRing;
65class RRR;
66class RRi;
67class CCi;
68class RingMap;
69class RingZZ;
70class SchurRing2;
71class SchurRing;
72class SchurSnRing;
74class SolvableAlgebra;
75class M2FreeAlgebra;
78
79class FreeModule;
80class RingMap;
81
82class gbvectorHeap;
83class gbvector;
84class buffer;
85
86class SumCollector;
87class Tower;
88class WeylAlgebra;
89class Z_mod;
90class buffer;
91struct Matrix;
92struct RingElement;
93
102{
103 protected:
104 const ARing *getARing() const { return AR; }
105 long mCharacteristic; // not all rings will have characteristic that fits in
106 // a long int
107 // int P;
109 std::vector<int> mHeftVector; // FIXME: can't be const because of initialize_ring
110 // This vector, if NULL, and if there are any variables in the ring imply that
111 // the heft vector should be taken as the default: the first degree should be
112 // used
113 // If non-NULL, this should dot to a positive value for every variable in the
114 // ring.
115 // Question: does this include coefficient variables in the ring?
116
117 const ARing *AR;
118 mutable const CoefficientRingR *cR; // set to NULL. If a ring does not have
119 // a better "ARing" or "coeffring"
120 // implementation,
121 // then calling getCoefficientRingR() will set this, and return it.
123 int _isfield; // 1: means yes, or declared yes.
124 // 0: means not declared to be so.
125 // -1: means a non unit was found, and that _non_unit contains
126 // a non-zero non-unit.
127 // If a non unit is found, then _isfield is set to -1.
128
129 ring_elem zeroV; // Three generally useful values in a ring.
132
133 void initialize_ring(long charac,
134 const PolynomialRing *DR = nullptr,
135 const std::vector<int> &heft_vec = {});
137 : mCharacteristic(0),
138 degree_ring(nullptr),
139 mHeftVector({}),
140 AR(nullptr),
141 cR(nullptr),
142 _non_unit(),
143 _isfield(0),
144 zeroV(),
145 oneV(),
146 minus_oneV()
147 {
148 }
149
150 public:
151 virtual ~Ring();
152
153 const CoefficientRingR *getCoefficientRingR() const;
154
156 // Ring informational //
158
159 long characteristic() const { return mCharacteristic; }
160 const Monoid *degree_monoid() const;
161 const PolynomialRing *get_degree_ring() const { return degree_ring; }
162 const std::vector<int> &get_heft_vector() const { return mHeftVector; }
163
164 virtual M2::RingID ringID() const { return M2::ring_old; }
165 virtual bool is_basic_ring() const
166 {
167 return true;
168 } // The default is to be a basic ring.
169 virtual bool isFinitePrimeField() const { return false; }
170 virtual bool isGaloisField() const { return false; }
171 virtual bool is_ZZ() const { return false; }
172 virtual bool is_QQ() const { return false; }
173 virtual bool is_RRR() const { return false; }
174 virtual bool is_RRi() const { return false; }
175 virtual bool is_CCC() const { return false; }
176 virtual bool is_fraction_field() const { return false; }
177 virtual bool is_fraction_poly_ring() const { return false; }
178 // returns true if this ring has fractions. This includes
179 // polynomial rings over QQ, polynomial rings over fraction fields,
180 // fraction rings, and localizations.
181 // If this returns true, then 'get_denominator_ring()' returns non-NULL value.
182 //
183
184 virtual bool is_poly_ring() const { return false; }
185 // Returns true if this is a polynomial ring, possibly with fractions
186 // and possibly with quotient ideal, and possibly with non-commutative
187 // multiplication. Equivalent to (cast_to_PolynomialRing() != 0).
188
189 virtual bool is_commutative_ring() const { return true; }
190 // Returns true iff this is a commutative ring.
191
192 virtual bool is_quotient_ring() const { return false; }
193 // Returns true if this is a polynomial ring, (possibly with fractions),
194 // with a quotient ideal. This could be a non-commutative ring
195 // with skew-commutative, Weyl algebra, or other multiplication.
196
197 virtual bool is_weyl_algebra() const { return false; }
198 // Returns true if this is a polynomial ring (possibly with quotient)
199 // (possibly with ZZ fractions, or other commutative fractions)
200 // but with Weyl algebra multiplication on some of the variables.
201
202 virtual bool is_skew_commutative_ring() const { return false; }
203 // Returns true if this is a polynomial ring (possibly with quotient)
204 // (possibly with ZZ fractions, or other commutative fractions)
205 // but with some variables anti-commuting.
206
207 virtual bool is_solvable_algebra() const { return false; }
208 virtual bool is_graded() const { return true; }
209 // Is this ring graded, with the given grading?
210 // ZZ, QQ, ZZ/p, GF, RR, ... are all graded.
211 // polynomial rings are graded
212 // Weyl algebras can be graded or not
213 // quotient polynomial rings can be graded or not.
214
215 bool is_field() const;
216 bool declare_field(); // if false is returned, then an ERROR has been set.
217
218 ring_elem get_non_unit() const;
219 void set_non_unit(
220 ring_elem zero_div) const; // not really const: sets "_non_unit"
221
222 typedef enum { COEFF_ZZ, COEFF_QQ, COEFF_BASIC } CoefficientType;
223 virtual CoefficientType coefficient_type() const { return COEFF_BASIC; }
224 // What the ultimate coefficient type is. ZZ, QQ, finite fields return these
225 // three values. Fraction fields return their ultimate value, as do poly
226 // rings.
227
228 virtual bool has_associate_divisors() const { return true; }
229 // There are only a few rings which do not have such divisors: frac rings
230 // over quotients of poly rings.
231
233 // Casting up the ring hierarchy //
235 virtual const RingZZ *cast_to_RingZZ() const { return nullptr; }
236 virtual RingZZ *cast_to_RingZZ() { return nullptr; }
237 virtual const Z_mod *cast_to_Z_mod() const { return nullptr; }
238 virtual Z_mod *cast_to_Z_mod() { return nullptr; }
239 virtual const GF *cast_to_GF() const { return nullptr; }
240 virtual GF *cast_to_GF() { return nullptr; }
241 virtual const Tower *cast_to_Tower() const { return nullptr; }
242 virtual Tower *cast_to_Tower() { return nullptr; }
243 virtual const PolynomialRing *cast_to_PolynomialRing() const { return nullptr; }
244 virtual PolynomialRing *cast_to_PolynomialRing() { return nullptr; }
245 virtual const PolyRing *cast_to_PolyRing() const { return nullptr; }
246 virtual PolyRing *cast_to_PolyRing() { return nullptr; }
247 virtual const PolyQQ *cast_to_PolyQQ() const { return nullptr; }
248 virtual PolyQQ *cast_to_PolyQQ() { return nullptr; }
249 virtual const PolyRingFlat *cast_to_PolyRingFlat() const { return nullptr; }
250 virtual PolyRingFlat *cast_to_PolyRingFlat() { return nullptr; }
251 virtual const FractionField *cast_to_FractionField() const { return nullptr; }
252 virtual FractionField *cast_to_FractionField() { return nullptr; }
253 virtual const LocalRing *cast_to_LocalRing() const { return nullptr; }
254 virtual LocalRing *cast_to_LocalRing() { return nullptr; }
255
256 virtual const M2FreeAlgebra *cast_to_M2FreeAlgebra() const { return nullptr; }
257 virtual M2FreeAlgebra *cast_to_M2FreeAlgebra() { return nullptr; }
259 {
260 return nullptr;
261 }
263 {
264 return nullptr;
265 }
267 {
268 return nullptr;
269 }
271 {
272 return nullptr;
273 }
274
275 virtual const SchurRing *cast_to_SchurRing() const { return nullptr; }
276 virtual SchurRing *cast_to_SchurRing() { return nullptr; }
277 virtual const SchurRing2 *cast_to_SchurRing2() const { return nullptr; }
278 virtual SchurRing2 *cast_to_SchurRing2() { return nullptr; }
279 virtual const SchurSnRing *cast_to_SchurSnRing() const { return nullptr; }
280 virtual SchurSnRing *cast_to_SchurSnRing() { return nullptr; }
282 {
283 return nullptr;
284 }
285 virtual SkewPolynomialRing *cast_to_SkewPolynomialRing() { return nullptr; }
286 virtual const SolvableAlgebra *cast_to_SolvableAlgebra() const { return nullptr; }
287 virtual SolvableAlgebra *cast_to_SolvableAlgebra() { return nullptr; }
288 virtual const WeylAlgebra *cast_to_WeylAlgebra() const { return nullptr; }
289 virtual RRR *cast_to_RRR() { return nullptr; }
290 virtual const RRR *cast_to_RRR() const { return nullptr; }
291 virtual RRi *cast_to_RRi() { return nullptr; }
292 virtual const RRi *cast_to_RRi() const { return nullptr; }
293 virtual CCC *cast_to_CCC() { return nullptr; }
294 virtual const CCC *cast_to_CCC() const { return nullptr; }
295 // Galois Field routines. These three routines only return non-NULL values
296 // if this was created as a Galois field, isom to A = kk[b]/(f(b)), kk = prime
297 // field of char p.
298
299 // Returns NULL if not a GF. Returns f(b) in the ring kk[b]. (Variable name
300 // might be different)
301 virtual const RingElement *getMinimalPolynomial() const { return nullptr; }
302 // Returns NULL if not a GF. Returns an element of 'this', whose powers give
303 // all non-zero elements
304 // of the field.
305 virtual const RingElement *getGenerator() const
306 {
307 ERROR("not implemented for this ring");
308 return nullptr;
309 }
310
311 // For some finite fields, if a = (getGenerator())^r, return r.
312 // If it is not implemented for this ring, an exception is thrown
313 // If a is zero, then r is set to -1.
314 virtual long discreteLog(const ring_elem &a) const
315 {
316 (void) a;
317 throw exc::engine_error("cannot compute discrete logarithm in this ring");
318 }
319
320 // Returns the element in the polynomial ring A corresponding to the element
321 // a.
322 // Returns NULL if not a GF field.
323 // Essentially the same as 'lift', except that more information, not readily
324 // available, is needed
325 // for that call.
326 virtual const RingElement *getRepresentation(const ring_elem &a) const
327 {
328 (void) a;
329 return nullptr;
330 }
331
332 virtual MutableMatrix *makeMutableMatrix(size_t nrows,
333 size_t ncols,
334 bool dense) const
335 {
336 (void) nrows;
337 (void) ncols;
338 (void) dense;
339 return nullptr;
340 }
341
342 virtual FreeModule *make_FreeModule() const;
343 virtual FreeModule *make_Schreyer_FreeModule() const;
344 virtual FreeModule *make_FreeModule(int n) const;
345
346 virtual SumCollector *make_SumCollector() const;
347
348 virtual void text_out(buffer &o) const = 0;
349
351 // Ring arithmetic ///
353 virtual unsigned int computeHashValue(const ring_elem a) const = 0;
354
355 virtual std::pair<bool, long> coerceToLongInteger(ring_elem a) const;
356
357 ring_elem one() const { return oneV; }
358 ring_elem minus_one() const { return minus_oneV; }
359 ring_elem zero() const { return zeroV; }
360 virtual ring_elem from_long(long n) const = 0;
361 virtual ring_elem from_int(mpz_srcptr n) const = 0;
362
363 // from_rational: if the rational q cannot be placed into this ring, false is
364 // returned, and result is not touched.
365 virtual bool from_rational(const mpq_srcptr q, ring_elem &result) const = 0;
366
367 // The default version calls from_long(0) and returns false.
368 virtual bool from_BigReal(gmp_RR a, ring_elem &result) const;
369 // The default version calls from_long(0) and returns false.
370 virtual bool from_Interval(gmp_RRi a, ring_elem &result) const;
371 // The default version calls from_long(0) and returns false.
372 virtual bool from_BigComplex(gmp_CC z, ring_elem &result) const;
373 // The default version calls from_long(0) and returns false.
374 virtual bool from_ComplexInterval(gmp_CCi z, ring_elem &result) const;
375 // Returns false if this ring cannot coerce a double to an element in this
376 // ring
377 virtual bool from_double(double a, ring_elem &result) const;
378 // Returns false if this ring cannot coerce a complex double (re+im*ii) to an
379 // element in this ring
380 virtual bool from_complex_double(double re,
381 double im,
382 ring_elem &result) const;
383
384 virtual ring_elem var(int v) const;
385
386 virtual ring_elem preferred_associate(ring_elem f) const;
387 // Returns an invertible element c of the same ring such that c*f is the
388 // preferred associate of the element f.
389 // WARNING: The default implementation is for a field.
390
391 virtual bool lower_associate_divisor(ring_elem &f, ring_elem g) const;
392 // Replaces f with the unit c such that (fx+g)//c is the preferred associate
393 // of fx+g, in the ring A[x], where A is 'this'.
394 // Returns false if f will never be changed after this
395 // (This happens over ZZ if f is non-zero (therefore 1 or -1, over a finite
396 // filed if f != 0,
397 // but over QQ will never happen)
398 // WARNING: The default implementation is for a field.
399
400 virtual bool promote(const Ring *R,
401 const ring_elem f,
402 ring_elem &result) const = 0;
403 virtual bool lift(const Ring *R,
404 const ring_elem f,
405 ring_elem &result) const = 0;
406
407 virtual bool is_unit(const ring_elem f) const = 0;
408 virtual bool is_zero(const ring_elem f) const = 0;
409 virtual bool is_equal(const ring_elem f, const ring_elem g) const = 0;
410
411 virtual int compare_elems(const ring_elem f, const ring_elem g) const = 0;
412 // Returns -1 if f < g, 0 if f and g are either equal, or considered equal,
413 // and 1 if f > g.
414 // The specific definition is ring dependent, but for numeric rings it
415 // defaults to
416 // the standard order.
417
418 virtual ring_elem copy(const ring_elem f) const = 0;
419 virtual void remove(ring_elem &f) const = 0;
420
421 void negate_to(ring_elem &f) const;
422 void add_to(ring_elem &f, const ring_elem &g) const;
423 void subtract_to(ring_elem &f, const ring_elem &g) const;
424 void mult_to(ring_elem &f, const ring_elem g) const;
425 virtual ring_elem negate(const ring_elem f) const = 0;
426 virtual ring_elem add(const ring_elem f, const ring_elem g) const = 0;
427 virtual ring_elem subtract(const ring_elem f, const ring_elem g) const = 0;
428 virtual ring_elem mult(const ring_elem f, const ring_elem g) const = 0;
429
430 virtual ring_elem power(const ring_elem f, mpz_srcptr n) const;
431 virtual ring_elem power(const ring_elem f, int n) const;
432 // These two power routines can be used for n >= 0.
433
434 virtual ring_elem invert(const ring_elem f) const = 0;
435 virtual ring_elem divide(const ring_elem f, const ring_elem g) const = 0;
436
437 virtual ring_elem remainder(const ring_elem f, const ring_elem g) const;
438 virtual ring_elem quotient(const ring_elem f, const ring_elem g) const;
440 const ring_elem g,
441 ring_elem &quot) const;
442 // The default version is for a field:
443 // f % 0 is f, otherwise f % g is 0.
444 // f // 0 is 0, otherwise f // g is f/g
445 // These three routines: remainder, quotient and remainderAndQuotient
446 // satisfy these properties:
447 // If r = remainder(f,g), q = quotient(f,g), then
448 // (1) f = q*g + r
449 // (2) If f is in ideal(g), then r = 0.
450 // (3) If g is invertible, then r = 0, and q = f * g^(-1).
451 // (4) If the ring is ZZ, then the remainder is "balanced": -[g/2] < r <=
452 // [g/2]
453 // remainderAndQuotient combines remainder and quotient into one routine.
454
455 virtual void syzygy(const ring_elem a,
456 const ring_elem b,
457 ring_elem &x,
458 ring_elem &y) const = 0;
459 // Constructs elements x and y in the ring s.t. ax + by = 0. This syzygy is
460 // chosen as simply as possible. For example, over QQ, x is chosen
461 // to be positive. The routine must handle the case when a=0, but can
462 // ignore the case when b=0... (Really?)
463
464 virtual ring_elem random() const;
465
466 virtual void elem_text_out(buffer &o,
467 const ring_elem f,
468 bool p_one = true,
469 bool p_plus = false,
470 bool p_parens = false) const = 0;
471
472 virtual ring_elem eval(const RingMap *map,
473 const ring_elem f,
474 int first_var) const = 0;
475
476 // Polynomial routines
477 // The default implementation is for non-polynomial rings
478 virtual int index_of_var(const ring_elem a) const;
479 virtual M2_arrayint support(const ring_elem a) const;
480
481 virtual void monomial_divisor(const ring_elem a, exponents_t exp) const;
482 virtual ring_elem diff(ring_elem a, ring_elem b, int use_coeff) const;
483 virtual bool in_subring(int nslots, const ring_elem a) const;
484 virtual void degree_of_var(int n, const ring_elem a, int &lo, int &hi) const;
485 virtual ring_elem divide_by_var(int n, int d, const ring_elem a) const;
487 const ring_elem a) const;
488
489 virtual ring_elem homogenize(const ring_elem f,
490 int v,
491 int deg,
492 const std::vector<int> &wts) const;
493 virtual ring_elem homogenize(const ring_elem f,
494 int v,
495 const std::vector<int> &wts) const;
496
497 // Routines expecting a grading. The default implementation
498 // is that the only degree is 0.
499 virtual bool is_homogeneous(const ring_elem f) const;
500 inline const_monomial degree(const ring_elem f) const
501 {
502 auto d = degree_monoid()->make_one();
503 multi_degree(f, d);
504 return d;
505 }
506 virtual bool multi_degree(const ring_elem f, monomial d) const;
507 // returns true iff f is homogeneous
508 virtual void degree_weights(const ring_elem f,
509 const std::vector<int> &wts,
510 int &lo,
511 int &hi) const;
512
513 // antipode: for non skew commuting poly rings, this is the identity.
514 // Otherwise, this changes the signs of the monomials, implementing the
515 // (anti)-isomorphism
516 // of the ring with its opposite ring.
517 virtual ring_elem antipode(ring_elem f) const { return f; }
519 // Cleaning real and complex numbers /////
521 virtual unsigned long get_precision()
522 const; // if the ring is not over RRR or CCC, returns 0.
523 virtual ring_elem zeroize_tiny(gmp_RR epsilon, const ring_elem f) const;
524 // Default is to return f itself.
525 virtual void increase_maxnorm(gmp_RRmutable norm, const ring_elem f) const;
526 // If any real number appearing in f has larger absolute value than norm,
527 // replace norm.
528 // Default for rings not over RRR or CCC is to do nothing.
529 vec vec_zeroize_tiny(gmp_RR epsilon, const vec f) const;
530 // Default is to return f itself.
531 void vec_increase_maxnorm(gmp_RRmutable norm, const vec f) const;
532 // If any real number appearing in f has larger absolute value than norm,
533 // replace norm.
534 // Default for rings not over RRR or CCC is to do nothing.
535
539 // These routines all act on linked lists
540 // of vecterm's, sorted by descending component;
541 // zero-coefficient entries are omitted.
542 // We always assume that ringelem's are immutable:
543 // The same value might be shared in several vecterms.
544 //
545 // These routines are implemented in ring-vec.cpp
547 protected:
548 vec new_vec() const;
549 void remove_vec_node(vec n) const;
550
551 public:
552 void vec_sort(vecterm *&f) const;
553
554 int compare_vecs(vec v, vec w) const;
555
556 vec e_sub_i(int r) const;
557 vec make_vec(int r, ring_elem a) const;
558 vec make_vec_from_array(int len, Nterm **array)
559 const; // takes ownership of the Nterm's!!
560
561 vec copy_vec(const vecterm *v) const;
562 void remove_vec(vec v) const;
563
564 bool is_equal(const vecterm *a, const vecterm *b) const;
565 bool get_entry(const vecterm *v, int r, ring_elem &result) const;
566 ring_elem get_entry(vec v, int r) const;
567 vec sub_vector(const vecterm *v, M2_arrayint r) const;
568 int n_nonzero_terms(const vecterm *v) const;
569 void vec_text_out(buffer &o,
570 const vecterm *v,
571 bool p_one = true,
572 bool p_plus = false,
573 bool p_parens = false) const;
574 vec vec_eval(const RingMap *map, const FreeModule *F, const vec v) const;
575
576 virtual vec vec_lead_term(int nparts, const FreeModule *F, vec v) const;
577
578 vec negate_vec(vec v) const;
579 vec add_vec(vec v, vec w) const;
580 vec subtract_vec(vec v, vec w) const;
581 vec mult_vec(int n, vec v) const;
582 vec mult_vec(const ring_elem f, const vec w) const;
583 vec rightmult_vec(const vec w, const ring_elem f) const;
584
585 void set_entry(vec &v, int i, ring_elem r) const;
586 void mult_vec_to(vec &v,
587 const ring_elem r,
588 bool opposite_mult) const; // multiplies v <- r * v or v * r
589 void mult_row(vec &v, const ring_elem r, int i, bool opposite_mult) const;
590 void negate_vec_to(vec &v) const; // v <- -v.
591 void add_vec_to(vec &v, vec &w) const; // v <- v+w, w is set to 0.
592 void subtract_vec_to(vec &v, vec &w) const; // v <- v-w, w is set to 0.
593
594 vec mult_vec_matrix(const Matrix *m, vec v, bool opposite_mult) const;
595
596 vec component_shift(int n, vec v) const;
597
598 vec tensor_shift(int n, int m, vec v) const;
599
600 vec tensor(const FreeModule *F, vec v, const FreeModule *G, vec w) const;
601
602 void divide_vec_to(vec &v, const ring_elem a) const;
603 void divide_row(vec &v, int r, const ring_elem a) const;
604 ring_elem dot_product(const vecterm *v, const vecterm *w) const;
605
606 /* Polynomial routines. These all set an error if the ring is not
607 a polynomial ring. OR, they will be moved to polyring.hpp */
608 vec vec_diff(vec v, int rankFw, vec w, int use_coeff) const;
609 int vec_in_subring(int n, const vec v) const;
610 void vec_degree_of_var(int n, const vec v, int &lo, int &hi) const;
611 vec vec_divide_by_var(int n, int d, const vec v) const;
612 vec vec_divide_by_expvector(const_exponents exp, const vec v) const;
613
614 // Some divisibility routines
615 bool vec_is_scalar_multiple(vec f, vec g)
616 const; // is cf = dg, some scalars c,d? (not both zero).
617 vec vec_remove_monomial_factors(vec f, bool make_squarefree_only) const;
618
619 bool vec_multi_degree(const FreeModule *F, const vec f, monomial degf) const;
620 // returns true iff f is homogeneous
621
622 void vec_degree_weights(const FreeModule *F,
623 const vec f,
624 const std::vector<int> &wts,
625 int &lo,
626 int &hi) const;
627 bool vec_is_homogeneous(const FreeModule *F, const vec f) const;
628 vec vec_homogenize(const FreeModule *F,
629 const vec f,
630 int v,
631 int deg,
632 const std::vector<int> &wts) const;
633 vec vec_homogenize(const FreeModule *F,
634 const vec f,
635 int v,
636 const std::vector<int> &wts) const;
637
638 // content of vectors and ring elements, default implementation is for basic
639 // fields
640 virtual void lower_content(ring_elem &c, ring_elem g)
641 const; // c is a content elem, g is in ring
642 virtual ring_elem content(ring_elem f) const;
643 virtual ring_elem content(ring_elem f, ring_elem g) const;
645
648 ring_elem vec_content(vec f) const;
649 vec vec_divide_by_given_content(vec f, ring_elem c) const;
650 vec vec_divide_by_content(vec f) const;
651 ring_elem vec_split_off_content(vec f, vec &result) const;
652};
653
669{
670 public:
672 virtual ~SumCollector() {}
673 virtual void add(ring_elem f) = 0;
674 virtual ring_elem getValue() = 0;
675};
676
677# define ZERO_RINGELEM (ring_elem(static_cast<Nterm *>(0)))
678
679# include "ZZ.hpp"
680extern RingZZ *globalZZ;
681extern RingZZ *makeIntegerRing();
682
683#endif
684
685// Local Variables:
686// compile-command: "make -C $M2BUILDDIR/Macaulay2/e ring.o "
687// indent-tabs-mode: nil
688// End:
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
#define CCC
Definition NAG.hpp:195
Legacy RingZZ — a Ring-derived integer ring backed by GMP mpz_t.
Shared base of the aring framework (namespace M2) that unifies the engine's coefficient rings.
Generic CoefficientRing adapter that wraps an arbitrary const Ring* and forwards every operation to i...
Engine-side fraction field of a polynomial domain R_.
Definition frac.hpp:62
Engine-side free module R^n over a Ring.
Definition freemod.hpp:66
Engine-side finite field GF(p^n) built on top of (Z/p)[t] / f(t) for a primitive element of the resul...
Definition GF.hpp:62
Engine-side localisation of a polynomial ring at a prime ideal.
Definition localring.hpp:67
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...
Concrete Ring wrapper around an owned FreeAlgebraQuotient (the quotient counterpart of M2FreeAlgebra)...
monomial make_one() const
Definition monoid.cpp:455
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
Abstract base class for mutable matrices over an arbitrary engine Ring, the in-place counterpart of t...
Definition mat.hpp:79
PolynomialRing subclass whose elements are represented as a single flat Nterm* linked list (no fracti...
Definition polyring.hpp:466
Concrete PolyRingFlat subclass implementing ordinary commutative polynomial rings K[x_1,...
Definition poly.hpp:64
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
virtual bool is_ZZ() const
Definition ring.hpp:171
virtual ring_elem divide_by_expvector(const_exponents exp, const ring_elem a) const
Definition ring.cpp:383
vec mult_vec(int n, vec v) const
virtual void remove(ring_elem &f) const =0
vec component_shift(int n, vec v) const
void set_non_unit(ring_elem zero_div) const
Definition ring.cpp:88
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const =0
virtual void monomial_divisor(const ring_elem a, exponents_t exp) const
Definition ring.cpp:349
virtual ring_elem var(int v) const
Definition ring.cpp:97
virtual ring_elem content(ring_elem f) const
Definition ring.cpp:316
virtual const PolyRingFlat * cast_to_PolyRingFlat() const
Definition ring.hpp:249
virtual PolyRing * cast_to_PolyRing()
Definition ring.hpp:246
const ARing * getARing() const
Definition ring.hpp:104
bool vec_multi_degree(const FreeModule *F, const vec f, monomial degf) const
virtual SchurRing2 * cast_to_SchurRing2()
Definition ring.hpp:278
vec vec_homogenize(const FreeModule *F, const vec f, int v, int deg, const std::vector< int > &wts) const
virtual const SchurSnRing * cast_to_SchurSnRing() const
Definition ring.hpp:279
virtual FractionField * cast_to_FractionField()
Definition ring.hpp:252
virtual bool is_quotient_ring() const
Definition ring.hpp:192
virtual bool from_BigReal(gmp_RR a, ring_elem &result) const
Definition ring.cpp:250
void subtract_to(ring_elem &f, const ring_elem &g) const
Definition ring.cpp:206
vec sub_vector(const vecterm *v, M2_arrayint r) const
virtual PolyQQ * cast_to_PolyQQ()
Definition ring.hpp:248
virtual FreeModule * make_FreeModule() const
Definition ring.cpp:53
void negate_to(ring_elem &f) const
Definition ring.cpp:210
virtual M2::RingID ringID() const
Definition ring.hpp:164
virtual const M2FreeAlgebraOrQuotient * cast_to_M2FreeAlgebraOrQuotient() const
Definition ring.hpp:266
virtual bool from_Interval(gmp_RRi a, ring_elem &result) const
Definition ring.cpp:257
virtual const RRi * cast_to_RRi() const
Definition ring.hpp:292
vec make_vec(int r, ring_elem a) const
Definition ring-vecs.cpp:60
virtual const SchurRing2 * cast_to_SchurRing2() const
Definition ring.hpp:277
virtual ring_elem divide(const ring_elem f, const ring_elem g) const =0
vec add_vec(vec v, vec w) const
virtual bool is_unit(const ring_elem f) const =0
virtual RingZZ * cast_to_RingZZ()
Definition ring.hpp:236
long mCharacteristic
Definition ring.hpp:105
vec tensor(const FreeModule *F, vec v, const FreeModule *G, vec w) const
virtual void increase_maxnorm(gmp_RRmutable norm, const ring_elem f) const
Definition ring.cpp:446
void remove_vec_node(vec n) const
Definition ring-vecs.cpp:55
virtual void degree_weights(const ring_elem f, const std::vector< int > &wts, int &lo, int &hi) const
Definition ring.cpp:415
virtual M2FreeAlgebra * cast_to_M2FreeAlgebra()
Definition ring.hpp:257
virtual const RingElement * getMinimalPolynomial() const
Definition ring.hpp:301
virtual MutableMatrix * makeMutableMatrix(size_t nrows, size_t ncols, bool dense) const
Definition ring.hpp:332
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const =0
virtual unsigned int computeHashValue(const ring_elem a) const =0
virtual bool isGaloisField() const
Definition ring.hpp:170
virtual std::pair< bool, long > coerceToLongInteger(ring_elem a) const
Definition ring.cpp:236
virtual bool is_fraction_poly_ring() const
Definition ring.hpp:177
int n_nonzero_terms(const vecterm *v) const
void vec_text_out(buffer &o, const vecterm *v, bool p_one=true, bool p_plus=false, bool p_parens=false) const
virtual ring_elem add(const ring_elem f, const ring_elem g) const =0
virtual void text_out(buffer &o) const =0
virtual bool is_homogeneous(const ring_elem f) const
Definition ring.cpp:405
virtual bool from_ComplexInterval(gmp_CCi z, ring_elem &result) const
Definition ring.cpp:264
ring_elem one() const
Definition ring.hpp:357
virtual bool has_associate_divisors() const
Definition ring.hpp:228
virtual LocalRing * cast_to_LocalRing()
Definition ring.hpp:254
virtual ring_elem divide_by_given_content(ring_elem f, ring_elem c) const
Definition ring.cpp:329
virtual ring_elem quotient(const ring_elem f, const ring_elem g) const
Definition ring.cpp:217
bool is_field() const
Definition ring.cpp:68
bool get_entry(const vecterm *v, int r, ring_elem &result) const
virtual void degree_of_var(int n, const ring_elem a, int &lo, int &hi) const
Definition ring.cpp:368
vec vec_divide_by_content(vec f) const
vec vec_zeroize_tiny(gmp_RR epsilon, const vec f) const
vec mult_vec_matrix(const Matrix *m, vec v, bool opposite_mult) const
virtual ~Ring()
Definition ring.cpp:52
virtual bool is_equal(const ring_elem f, const ring_elem g) const =0
virtual const SkewPolynomialRing * cast_to_SkewPolynomialRing() const
Definition ring.hpp:281
void divide_row(vec &v, int r, const ring_elem a) const
virtual bool in_subring(int nslots, const ring_elem a) const
Definition ring.cpp:361
void remove_vec(vec v) const
vec tensor_shift(int n, int m, vec v) const
virtual bool is_commutative_ring() const
Definition ring.hpp:189
ring_elem minus_oneV
Definition ring.hpp:131
ring_elem zero() const
Definition ring.hpp:359
void initialize_ring(long charac, const PolynomialRing *DR=nullptr, const std::vector< int > &heft_vec={})
Definition ring.cpp:30
virtual const PolyRing * cast_to_PolyRing() const
Definition ring.hpp:245
void set_entry(vec &v, int i, ring_elem r) const
void vec_sort(vecterm *&f) const
ring_elem divide_by_content(ring_elem f) const
Definition ring.cpp:336
virtual ring_elem remainderAndQuotient(const ring_elem f, const ring_elem g, ring_elem &quot) const
Definition ring.cpp:223
virtual ring_elem homogenize(const ring_elem f, int v, int deg, const std::vector< int > &wts) const
Definition ring.cpp:389
int vec_in_subring(int n, const vec v) const
virtual bool from_BigComplex(gmp_CC z, ring_elem &result) const
Definition ring.cpp:243
virtual SkewPolynomialRing * cast_to_SkewPolynomialRing()
Definition ring.hpp:285
vec vec_remove_monomial_factors(vec f, bool make_squarefree_only) const
virtual unsigned long get_precision() const
Definition ring.cpp:438
virtual const PolyQQ * cast_to_PolyQQ() const
Definition ring.hpp:247
virtual SolvableAlgebra * cast_to_SolvableAlgebra()
Definition ring.hpp:287
virtual const SolvableAlgebra * cast_to_SolvableAlgebra() const
Definition ring.hpp:286
virtual PolynomialRing * cast_to_PolynomialRing()
Definition ring.hpp:244
virtual bool is_basic_ring() const
Definition ring.hpp:165
vec negate_vec(vec v) const
virtual void lower_content(ring_elem &c, ring_elem g) const
Definition ring.cpp:308
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const =0
const_monomial degree(const ring_elem f) const
Definition ring.hpp:500
virtual ring_elem invert(const ring_elem f) const =0
virtual SchurRing * cast_to_SchurRing()
Definition ring.hpp:276
virtual ring_elem from_long(long n) const =0
virtual bool is_fraction_field() const
Definition ring.hpp:176
ring_elem minus_one() const
Definition ring.hpp:358
virtual ring_elem negate(const ring_elem f) const =0
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
virtual void elem_text_out(buffer &o, const ring_elem f, bool p_one=true, bool p_plus=false, bool p_parens=false) const =0
vec make_vec_from_array(int len, Nterm **array) const
Definition ring-vecs.cpp:70
void divide_vec_to(vec &v, const ring_elem a) const
void subtract_vec_to(vec &v, vec &w) const
long characteristic() const
Definition ring.hpp:159
virtual const RingElement * getGenerator() const
Definition ring.hpp:305
void mult_vec_to(vec &v, const ring_elem r, bool opposite_mult) const
vec rightmult_vec(const vec w, const ring_elem f) const
virtual const RRR * cast_to_RRR() const
Definition ring.hpp:290
virtual const LocalRing * cast_to_LocalRing() const
Definition ring.hpp:253
virtual const GF * cast_to_GF() const
Definition ring.hpp:239
virtual ring_elem preferred_associate(ring_elem f) const
Definition ring.cpp:290
virtual PolyRingFlat * cast_to_PolyRingFlat()
Definition ring.hpp:250
virtual Tower * cast_to_Tower()
Definition ring.hpp:242
ring_elem get_non_unit() const
Definition ring.cpp:82
virtual ring_elem copy(const ring_elem f) const =0
vec subtract_vec(vec v, vec w) const
virtual vec vec_lead_term(int nparts, const FreeModule *F, vec v) const
virtual bool from_complex_double(double re, double im, ring_elem &result) const
Definition ring.cpp:276
ring_elem oneV
Definition ring.hpp:130
vec vec_divide_by_given_content(vec f, ring_elem c) const
virtual ring_elem antipode(ring_elem f) const
Definition ring.hpp:517
virtual int index_of_var(const ring_elem a) const
Definition ring.cpp:423
virtual const RingZZ * cast_to_RingZZ() const
Definition ring.hpp:235
virtual bool from_double(double a, ring_elem &result) const
Definition ring.cpp:270
virtual ring_elem divide_by_var(int n, int d, const ring_elem a) const
Definition ring.cpp:376
bool vec_is_homogeneous(const FreeModule *F, const vec f) const
virtual bool multi_degree(const ring_elem f, monomial d) const
Definition ring.cpp:407
bool declare_field()
Definition ring.cpp:69
vec vec_divide_by_var(int n, int d, const vec v) const
void vec_increase_maxnorm(gmp_RRmutable norm, const vec f) const
vec vec_eval(const RingMap *map, const FreeModule *F, const vec v) const
CoefficientType
Definition ring.hpp:222
@ COEFF_QQ
Definition ring.hpp:222
@ COEFF_ZZ
Definition ring.hpp:222
@ COEFF_BASIC
Definition ring.hpp:222
virtual ring_elem zeroize_tiny(gmp_RR epsilon, const ring_elem f) const
Definition ring.cpp:439
void negate_vec_to(vec &v) const
void vec_degree_of_var(int n, const vec v, int &lo, int &hi) const
virtual bool is_CCC() const
Definition ring.hpp:175
virtual FreeModule * make_Schreyer_FreeModule() const
Definition ring.cpp:58
virtual bool is_zero(const ring_elem f) const =0
virtual M2FreeAlgebraOrQuotient * cast_to_M2FreeAlgebraOrQuotient()
Definition ring.hpp:270
virtual ring_elem diff(ring_elem a, ring_elem b, int use_coeff) const
Definition ring.cpp:355
virtual CCC * cast_to_CCC()
Definition ring.hpp:293
virtual const RingElement * getRepresentation(const ring_elem &a) const
Definition ring.hpp:326
virtual const WeylAlgebra * cast_to_WeylAlgebra() const
Definition ring.hpp:288
virtual long discreteLog(const ring_elem &a) const
Definition ring.hpp:314
const PolynomialRing * get_degree_ring() const
Definition ring.hpp:161
virtual bool is_QQ() const
Definition ring.hpp:172
virtual const M2FreeAlgebra * cast_to_M2FreeAlgebra() const
Definition ring.hpp:256
std::vector< int > mHeftVector
Definition ring.hpp:109
void vec_degree_weights(const FreeModule *F, const vec f, const std::vector< int > &wts, int &lo, int &hi) const
virtual const FractionField * cast_to_FractionField() const
Definition ring.hpp:251
bool vec_is_scalar_multiple(vec f, vec g) const
ring_elem vec_content(vec f) const
virtual RRi * cast_to_RRi()
Definition ring.hpp:291
void add_vec_to(vec &v, vec &w) const
int _isfield
Definition ring.hpp:123
virtual bool is_poly_ring() const
Definition ring.hpp:184
virtual int compare_elems(const ring_elem f, const ring_elem g) const =0
int compare_vecs(vec v, vec w) const
ring_elem _non_unit
Definition ring.hpp:122
virtual bool is_RRi() const
Definition ring.hpp:174
const ARing * AR
Definition ring.hpp:117
virtual ring_elem random() const
Definition ring.cpp:284
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const =0
const CoefficientRingR * cR
Definition ring.hpp:118
vec vec_diff(vec v, int rankFw, vec w, int use_coeff) const
virtual bool is_skew_commutative_ring() const
Definition ring.hpp:202
void add_to(ring_elem &f, const ring_elem &g) const
Definition ring.cpp:205
virtual ring_elem from_int(mpz_srcptr n) const =0
const CoefficientRingR * getCoefficientRingR() const
Definition ring.cpp:24
void mult_to(ring_elem &f, const ring_elem g) const
Definition ring.cpp:204
void mult_row(vec &v, const ring_elem r, int i, bool opposite_mult) const
ring_elem vec_split_off_content(vec f, vec &result) const
virtual SchurSnRing * cast_to_SchurSnRing()
Definition ring.hpp:280
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.
Definition ring.cpp:109
virtual bool lower_associate_divisor(ring_elem &f, ring_elem g) const
Definition ring.cpp:297
const PolynomialRing * degree_ring
Definition ring.hpp:108
virtual bool is_solvable_algebra() const
Definition ring.hpp:207
virtual ring_elem mult(const ring_elem f, const ring_elem g) const =0
virtual bool is_RRR() const
Definition ring.hpp:173
virtual CoefficientType coefficient_type() const
Definition ring.hpp:223
virtual bool isFinitePrimeField() const
Definition ring.hpp:169
ring_elem split_off_content(ring_elem f, ring_elem &result) const
Definition ring.cpp:342
virtual M2FreeAlgebraQuotient * cast_to_M2FreeAlgebraQuotient()
Definition ring.hpp:262
virtual bool is_graded() const
Definition ring.hpp:208
vec vec_divide_by_expvector(const_exponents exp, const vec v) const
virtual const M2FreeAlgebraQuotient * cast_to_M2FreeAlgebraQuotient() const
Definition ring.hpp:258
ring_elem dot_product(const vecterm *v, const vecterm *w) const
virtual const CCC * cast_to_CCC() const
Definition ring.hpp:294
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const =0
virtual ring_elem remainder(const ring_elem f, const ring_elem g) const
Definition ring.cpp:211
virtual Z_mod * cast_to_Z_mod()
Definition ring.hpp:238
virtual GF * cast_to_GF()
Definition ring.hpp:240
vec copy_vec(const vecterm *v) const
Definition ring-vecs.cpp:91
virtual const SchurRing * cast_to_SchurRing() const
Definition ring.hpp:275
vec e_sub_i(int r) const
Definition ring-vecs.cpp:85
virtual M2_arrayint support(const ring_elem a) const
Definition ring.cpp:429
const Monoid * degree_monoid() const
Definition ring.cpp:13
virtual RRR * cast_to_RRR()
Definition ring.hpp:289
const std::vector< int > & get_heft_vector() const
Definition ring.hpp:162
ring_elem zeroV
Definition ring.hpp:129
virtual bool is_weyl_algebra() const
Definition ring.hpp:197
virtual const Z_mod * cast_to_Z_mod() const
Definition ring.hpp:237
virtual bool from_rational(const mpq_srcptr q, ring_elem &result) const =0
Ring()
Definition ring.hpp:136
virtual const Tower * cast_to_Tower() const
Definition ring.hpp:241
virtual SumCollector * make_SumCollector() const
Definition ring.cpp:486
vec new_vec() const
vector operations ////////////////////
Definition ring-vecs.cpp:54
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
Definition relem.hpp:67
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
Definition ringmap.hpp:60
Engine-side ring of integers, backed by GMP mpz_ptr elements.
Definition ZZ.hpp:77
Refactored Schur (symmetric-function) ring whose elements are schur_poly sums of partitions over a co...
Definition schur2.hpp:152
PolyRing subclass implementing the Schur (symmetric-function) ring whose monomials are partitions and...
Definition schur.hpp:82
SchurRing2 subclass implementing the symmetric-group character ring (the "Schur ring of `S_n`"),...
Definition schurSn.hpp:51
PolyRing subclass for skew-commutative (exterior-style) polynomial rings: the listed skewvars anticom...
Definition skewpoly.hpp:61
PolyRing subclass for solvable polynomial algebras (PBW-type non-commutative rings where each pair of...
Definition solvable.hpp:57
virtual ring_elem getValue()=0
virtual void add(ring_elem f)=0
virtual ~SumCollector()
Definition ring.hpp:672
Abstract incremental accumulator that builds a ring_elem from many add(f) calls.
Definition ring.hpp:669
Ring subclass for tower polynomial rings (Z/p)[x_0][x_1]...[x_{n-1}] modulo a chain of algebraic exte...
Definition tower.hpp:59
PolyRing subclass for Weyl algebras: polynomial rings with the [d_i, x_i] = 1 derivative-variable com...
Definition weylalg.hpp:61
Engine-side Z/p ring for small primes (p < 32767), using a discrete-log (Zech) representation.
Definition ZZp.hpp:63
Engine error-reporting primitives: ERROR, INTERNAL_ERROR, error, error_message.
namespace exc — internal C++ exception types and the TRY / CATCH macro pair.
#define Matrix
Definition factory.cpp:14
RingZZ * globalZZ
Definition relem.cpp:13
#define monomial
Definition gb-toric.cpp:11
RingID
Definition aring.hpp:75
@ ring_old
refers to all rings which are not ConcreteRing's.
Definition aring.hpp:94
EngineObject / MutableEngineObject — shared bases that supply the hash an M2 interpreter object expec...
const int * const_monomial
Definition imonorder.hpp:45
const int ERROR
Definition m2-mem.cpp:55
VALGRIND_MAKE_MEM_DEFINED & result(result)
mpfr_srcptr gmp_RR
Definition m2-types.h:148
struct gmp_CC_struct * gmp_CC
Definition m2-types.h:156
mpfr_ptr gmp_RRmutable
Definition m2-types.h:150
mpfi_srcptr gmp_RRi
Definition m2-types.h:153
struct gmp_CCi_struct * gmp_CCi
Definition m2-types.h:162
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
our_new_delete — per-class opt-in routing of new / delete through bdwgc.
volatile int x
tbb::flow::graph G
RingZZ * makeIntegerRing()
Definition ring.cpp:15
ring_elem — the universal value type carried by every Ring* in the engine.
Singly linked-list node carrying one term of a polynomial-ring element.
Definition ringelem.hpp:156