Macaulay2 Engine
Loading...
Searching...
No Matches
polyring.hpp
Go to the documentation of this file.
1// Copyright 2004 Michael E. Stillman
2
3#ifndef _polyring_hpp_
4#define _polyring_hpp_
5
47
48#include "ringelem.hpp"
49
50#include <vector>
51
53#include "skew.hpp"
54
55class buffer;
56class Monoid;
57class Ring;
58class MonomialIdeal;
59class MonomialTable;
60class MonomialTableZZ;
61
62class PolynomialRing;
63class PolyRingFlat;
64class PolyRing;
65class PolyRingSkew;
66class PolyRingWeyl;
67class PolyRingNC;
68class PolyQuotient;
69
70class GBRing;
71class GBRingSkew;
72class GBComputation;
73
74#include "ring.hpp"
75#include "qring.hpp"
76
95class PolynomialRing : public Ring
96{
98
99 protected:
100 // Most skew-mult specific poly code is in skewpoly.{hpp,cpp}. However, var,
101 // homogenize,
102 // and diff_term all have a small amount of skew commutative specific code.
104 SkewMultiplication skew_; // Completely ignored if is_skew_ is false.
105
106 bool is_weyl_; // true iff numerR_ is a Weyl algebra.
107 bool is_solvable_; // true iff numerR_ is a solvable algebra.
108
110 bool overZZ_; // true iff this is a quotient over ZZ.
112 bool is_ZZ_quotient_; // true if this is a quotient of a polynomial ring over
113 // ZZ, AND
114 // there is an integer in the factored ideal.
115 ring_elem ZZ_quotient_value_; // This is the integer in the factor ideal, if
116 // is_ZZ_quotient is set.
117
119
121 int exp_size; // in bytes, only used for local stack storage for exponent
122 // vectors
123 const Ring *K_;
124 const Monoid *M_;
125 const PolyRing *numerR_; // numerator ring, possibly 'this'
126 // This is always a PolyRing, with no quotient elements
127 // If ring is basic[M]/I, then numerR is basic[M]
128 // If ring is QQ[M]/I, then numerR is ZZ[M].
129 // skew and weyl multiplication is determined by this ring.
130 // initialize_PolynomialRing will set these values,
131 // if numerR_ != this.
132 const Ring *denomR_; // denominator ring, or NULL
133 // If ring is basic[M]/I, this is NULL
134 // If ring is QQ[M]/I, this is ZZ
135 const PolynomialRing
136 *ambientR_; // ambient ring (i.e. no quotients), possibly 'this'.
137 // If ring is basic[M]/I, then ambientR_ is same as numerR_
138 // If ring is QQ[M]/I, then ambientR_ is QQ[M].
139
141
142 void setIsGraded(bool new_val) { is_graded_ = new_val; }
143 void setQuotientInfo(QRingInfo *qinfo0);
144 void initialize_PolynomialRing(const Ring *K,
145 const Monoid *M,
146 const PolyRing *numeratorR,
147 const PolynomialRing *ambientR,
148 const Ring *denomR);
149
150 virtual ~PolynomialRing();
153 VECTOR(Nterm *) & elems);
154 // Grabs 'elems'. Each element of 'elems' should be in the ring R.
155 // They should also form a GB.
156
157 public:
159 const Matrix *M);
160
162 const PolynomialRing *B);
163 // R should be an ambient poly ring
164 // B should have: ambient of B is the logical coeff ring of R
165 // i.e. R = A[x], B = A/I
166 // return A[x]/I.
167
168 virtual void clear() { qinfo_->destroy(gb_ring_); }
169 // Removes all space associated with 'this', at least the part
170 // that is stashed: gb_ring_ (if it was created by this ring), qinfo_.
171
172 Matrix *getPresentation() const;
173
174 unsigned long get_precision() const { return K_->get_precision(); }
175 bool is_basic_ring() const
176 {
177 return false;
178 } // The default is to be a basic ring.
179
180 bool is_poly_ring() const { return true; }
181 // Returns true if this is a polynomial ring, possibly with fractions
182 // and possibly with quotient ideal, and possibly with non-commutative
183 // multiplication. Equivalent to (cast_to_PolynomialRing() != 0).
184
185 bool is_graded() const { return is_graded_; }
186 // Is this ring graded, with the given grading?
187 // polynomial rings are graded
188 // Weyl algebras can be graded or not
189 // quotient polynomial rings can be graded or not.
190
192 // What the ultimate coefficient type is. ZZ, QQ, finite fields return these
193 // three values. Fraction fields return their ultimate value, as do poly
194 // rings.
195
196 int n_vars() const { return nvars_; }
198
199 QRingInfo *get_quotient_info() const { return qinfo_; }
200 const Ring *getCoefficientRing() const { return getCoefficients(); }
201 // getCoefficientRing needs to be totally removed.
202
203 // Quotient ring information
205 {
206 return qinfo_->get_quotient_MonomialTable();
207 }
208
210 {
211 return qinfo_->get_quotient_monomials();
212 }
213
215 {
216 return qinfo_->get_quotient_MonomialTableZZ();
217 }
218
219 int n_quotients() const { return qinfo_->n_quotients(); }
220 Nterm *quotient_element(int i) const { return qinfo_->quotient_element(i); }
221 const gbvector *quotient_gbvector(int i) const
222 {
223 return qinfo_->quotient_gbvector(i);
224 }
225
227 {
228 return get_quotient_monomials();
229 }
230 // Returns the monomial ideal consisting of monomials which are initial terms
231 // in this quotient ring. IE, the set of all monomials outside of this
232 // ideal form a generating set for the ring as a
233 // module over the ring getLogicalCoefficients().
234
235 bool is_quotient_ring() const { return n_quotients() > 0; }
236 // skew commutativity
237 bool is_skew_commutative() const { return is_skew_; }
238 int n_skew_commutative_vars() const { return skew_.n_skew_vars(); }
239 int skew_variable(int i) const { return skew_.skew_variable(i); }
240 bool is_skew_var(int v) const { return skew_.is_skew_var(v); }
241 const SkewMultiplication &getSkewInfo() const { return skew_; }
242 virtual bool is_commutative_ring() const
243 {
244 return !is_weyl_ && !is_skew_ && !is_solvable_;
245 }
246 // Returns true iff this is a commutative ring.
247
248 virtual bool is_weyl_algebra() const { return is_weyl_; }
249 // Returns true if this is a polynomial ring (possibly with quotient)
250 // (possibly with ZZ fractions, or other commutative fractions)
251 // but with Weyl algebra multiplication on some of the variables.
252
253 virtual bool is_skew_commutative_ring() const { return is_skew_; }
254 // Returns true if this is a polynomial ring (possibly with quotient)
255 // (possibly with ZZ fractions, or other commutative fractions)
256 // but with some variables anti-commuting.
257
258 virtual bool is_solvable_algebra() const { return is_solvable_; }
259 virtual const PolyRing *getNumeratorRing() const { return numerR_; }
260 virtual const PolynomialRing *getAmbientRing() const { return ambientR_; }
261 // Yields the ambient PolyRing corresponding to this polynomial ring
262 // This ring has no quotients, no fractions (not even QQ), but may have
263 // skew, weyl, or solvable multiplication, or even (later) be an associative
264 // free algebra.
265
266 virtual const Ring /* or null */ *getDenominatorRing() const
267 {
268 return denomR_;
269 }
270 // If this ring has no denominators, NULL is returned. Otherwise the ring
271 // which
272 // implements denominators is returned. When one asks for a denominator for
273 // elements of
274 // 'this', the result value is its ring.
275
276 virtual GBRing *get_gb_ring() const { return gb_ring_; }
277 virtual const Ring *getCoefficients() const { return K_; }
278 // The implementation coeff ring of 'this'. This is either a basic ring
279 // (field, ZZ), or
280 // is another PolyRing.
281
282 virtual const Monoid *getMonoid() const { return M_; }
283 // The implementation monoid of this ring.
284
285 virtual bool is_fraction_poly_ring() const
286 {
287 return getDenominatorRing() != 0;
288 }
289 // returns true if this ring has fractions. This includes
290 // polynomial rings over QQ, polynomial rings over fraction fields,
291 // fraction rings, and localizations.
292 // If this returns true, then 'get_denominator_ring()' returns non-NULL value.
293 //
294
295 virtual int n_fraction_vars() const
296 {
297 const Ring *D = getDenominatorRing();
298 if (D == 0) return 0;
299 const PolynomialRing *DR = D->cast_to_PolynomialRing();
300 if (DR == 0) return 0;
301 return DR->n_vars();
302 }
303
304 virtual const PolynomialRing *cast_to_PolynomialRing() const { return this; }
305 virtual PolynomialRing *cast_to_PolynomialRing() { return this; }
307
309 // To possibly be over-ridded //
311
312 virtual void text_out(buffer &o) const = 0;
313
315 // Arithmetic //////////
317 virtual unsigned int computeHashValue(const ring_elem a) const;
318
319 virtual ring_elem var(int v) const = 0;
320
322 // Polynomial routines //
324 virtual int index_of_var(const ring_elem a) const = 0;
325 virtual M2_arrayint support(const ring_elem a) const = 0;
326
327 virtual bool is_homogeneous(const ring_elem f) const = 0;
328 virtual bool multi_degree(const ring_elem f, monomial d) const = 0;
329 virtual void degree_weights(const ring_elem f,
330 const std::vector<int> &wts,
331 int &lo,
332 int &hi) const = 0;
334 int v,
335 int deg,
336 const std::vector<int> &wts) const = 0;
338 int v,
339 const std::vector<int> &wts) const = 0;
340
342 const ring_elem c,
343 const_monomial m) const = 0;
344
345 virtual int n_flat_terms(const ring_elem f) const = 0;
346 virtual int n_logical_terms(int nvars0, const ring_elem f) const = 0;
347
349 const ring_elem f) const = 0;
350 virtual ring_elem *get_parts(const std::vector<int> &wts,
351 const ring_elem f,
352 long &result_len) const = 0;
353 virtual ring_elem get_part(const std::vector<int> &wts,
354 const ring_elem f,
355 bool lobound_given,
356 bool hibound_given,
357 long lobound,
358 long hibound) const = 0;
359
360 int n_terms(const ring_elem f) const { return n_flat_terms(f); }
361 // This is here mainly because geopoly requires n_terms.
362
363 virtual ring_elem make_flat_term(const ring_elem a, const_monomial m) const = 0;
364 virtual ring_elem make_logical_term(const Ring *coeffR,
365 const ring_elem a,
366 const_exponents exp) const = 0;
367 // virtual ring_elem term(const ring_elem a, const_monomial m) const = 0;
368
369 virtual ring_elem lead_flat_coeff(const ring_elem f) const = 0;
370 virtual ring_elem lead_logical_coeff(const Ring *coeffR,
371 const ring_elem f) const = 0;
372
373 virtual ring_elem get_coeff(const Ring *coeffR,
374 const ring_elem f,
375 const_varpower vp) const = 0;
376 // vp is a varpower monomial, in the logical monoid.
377 // The result will be an element in the logical coefficient ring.
378
379 virtual ring_elem get_terms(int nvars0,
380 const ring_elem f,
381 int lo,
382 int hi) const = 0;
383 // get the (logical) terms from lo to hi in f. A negative value means count
384 // from
385 // the end. get_terms(--,f,0,0) is the logical lead term of f.
386
387 virtual const_monomial lead_flat_monomial(const ring_elem f) const = 0;
388 virtual void lead_logical_exponents(int nvars0,
389 const ring_elem f,
390 exponents_t result_exp) const = 0;
391
392 virtual void mult_coeff_to(ring_elem a, ring_elem &f) const = 0;
393 virtual void divide_coeff_to(ring_elem &f, ring_elem a) const = 0;
394
395 virtual void monomial_divisor(const ring_elem a, exponents_t exp) const = 0;
396 virtual ring_elem diff(ring_elem a, ring_elem b, int use_coeff) const = 0;
397 virtual bool in_subring(int nslots, const ring_elem a) const = 0;
398 virtual void degree_of_var(int n,
399 const ring_elem a,
400 int &lo,
401 int &hi) const = 0;
402 virtual ring_elem divide_by_var(int n, int d, const ring_elem a) const = 0;
404 const ring_elem a) const = 0;
405
406 virtual Nterm *numerator(ring_elem f) const = 0;
407
408 protected:
409 void sort(Nterm *&f) const;
410
411 public:
412 virtual const vecterm *vec_locate_lead_term(const FreeModule *F,
413 vec v) const = 0;
414 // Returns a pointer to the vector term of v which contains the lead term (of
415 // the
416 // numerator).
417 // If result = R->vec_locate_lead_term(F,v), (if v is non-zero)
418 // To get the lead coeff, use result->comp
419 // To get the lead flat monomial (of numerator), use
420 // R->lead_flat_monomial(result->coeff).
421
422 virtual vec vec_lead_term(int nparts, const FreeModule *F, vec v) const = 0;
423
424 virtual vec vec_top_coefficient(const vec v, int &var, int &exp) const = 0;
425
427
429 const FreeModule *F,
430 const vec v,
431 ring_elem &result_denominator) const = 0;
432 // result/denom == v.
433 // result_denom will be an element in getDenominatorRing() (if non-NULL).
434
436 const gbvector *v) const = 0;
437
439 const gbvector *v,
440 const ring_elem denom) const = 0;
441 // Translate v/denom to a vector in F. denom does not need to be positive,
442 // although it had better be non-zero.
443 // denom should be an element of getDenominatorRing() (if non-NULL, otherwise
444 // 'denom'
445 // is ignored).
446};
447
465// The class of polynomial rings implemented as a pointer (single value).
466{
467 public:
468 virtual Nterm *numerator(ring_elem f) const { return f.poly_val; }
469 virtual const PolyRingFlat *cast_to_PolyRingFlat() const { return this; }
470 virtual PolyRingFlat *cast_to_PolyRingFlat() { return this; }
471};
472
473#endif
474
475// Local Variables:
476// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
477// indent-tabs-mode: nil
478// End:
varpower::ConstExponents const_varpower
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
Engine-side free module R^n over a Ring.
Definition freemod.hpp:66
base class for Groebner basis computations.
Definition comp-gb.hpp:69
Polynomial-ring view tuned for the inner loop of classical Buchberger Groebner-basis computations.
Definition gbring.hpp:120
GBRing specialisation for skew-commutative (exterior-like) polynomial rings.
Definition gbring.hpp:645
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
Engine-side monomial ideal: a decision tree of Nmi_nodes storing the (typically minimal) generators b...
Definition monideal.hpp:136
Indexed table of monomials with fast "find a divisor" lookup, keyed by a free integer val per entry.
Definition montable.hpp:81
MonomialTable analogue for monomials carrying a ZZ coefficient.
virtual PolyRingFlat * cast_to_PolyRingFlat()
Definition polyring.hpp:470
virtual Nterm * numerator(ring_elem f) const
Definition polyring.hpp:468
virtual const PolyRingFlat * cast_to_PolyRingFlat() const
Definition polyring.hpp:469
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
virtual ring_elem get_coeff(const Ring *coeffR, const ring_elem f, const_varpower vp) const =0
virtual M2_arrayint support(const ring_elem a) const =0
virtual bool is_solvable_algebra() const
Definition polyring.hpp:258
virtual ring_elem mult_by_term(const ring_elem f, const ring_elem c, const_monomial m) const =0
virtual ring_elem divide_by_expvector(const_exponents exp, const ring_elem a) const =0
int n_terms(const ring_elem f) const
Definition polyring.hpp:360
virtual int index_of_var(const ring_elem a) const =0
int n_quotients() const
Definition polyring.hpp:219
Ring::CoefficientType coeff_type_
Definition polyring.hpp:109
int n_skew_commutative_vars() const
Definition polyring.hpp:238
virtual int n_flat_terms(const ring_elem f) const =0
QRingInfo * get_quotient_info() const
Definition polyring.hpp:199
const Ring * getCoefficientRing() const
Definition polyring.hpp:200
virtual int n_fraction_vars() const
Definition polyring.hpp:295
virtual int n_logical_terms(int nvars0, const ring_elem f) const =0
QRingInfo * qinfo_
Definition polyring.hpp:111
virtual bool is_commutative_ring() const
Definition polyring.hpp:242
virtual ring_elem var(int v) const =0
void setQuotientInfo(QRingInfo *qinfo0)
Definition polyring.cpp:12
virtual void text_out(buffer &o) const =0
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 GBRing * get_gb_ring() const
Definition polyring.hpp:276
SkewMultiplication skew_
Definition polyring.hpp:104
void initialize_PolynomialRing(const Ring *K, const Monoid *M, const PolyRing *numeratorR, const PolynomialRing *ambientR, const Ring *denomR)
Definition polyring.cpp:29
virtual gbvector * translate_gbvector_from_ringelem(ring_elem coeff) const =0
void setIsGraded(bool new_val)
Definition polyring.hpp:142
virtual const PolynomialRing * getAmbientRing() const
Definition polyring.hpp:260
virtual ring_elem homogenize(const ring_elem f, int v, int deg, const std::vector< int > &wts) const =0
virtual vec vec_lead_term(int nparts, const FreeModule *F, vec v) const =0
const Ring * K_
Definition polyring.hpp:123
virtual bool is_homogeneous(const ring_elem f) const =0
virtual void lead_logical_exponents(int nvars0, const ring_elem f, exponents_t result_exp) const =0
ring_elem ZZ_quotient_value_
Definition polyring.hpp:115
const Ring * denomR_
Definition polyring.hpp:132
virtual ~PolynomialRing()
Definition polyring.cpp:11
const PolynomialRing * ambientR_
Definition polyring.hpp:136
bool is_poly_ring() const
Definition polyring.hpp:180
static PolynomialRing * create_quotient(const PolynomialRing *R, VECTOR(Nterm *) &elems)
Definition polyring.cpp:79
virtual ring_elem divide_by_var(int n, int d, const ring_elem a) const =0
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
virtual bool in_subring(int nslots, const ring_elem a) const =0
size_t poly_size_
Definition polyring.hpp:118
void sort(Nterm *&f) const
virtual PolynomialRing * cast_to_PolynomialRing()
Definition polyring.hpp:305
const Monoid * M_
Definition polyring.hpp:124
virtual ring_elem homogenize(const ring_elem f, int v, const std::vector< int > &wts) const =0
virtual ring_elem lead_flat_coeff(const ring_elem f) const =0
const MonomialIdeal * get_quotient_monomials() const
Definition polyring.hpp:209
static PolynomialRing * create_quotient_ring(const Matrix *M)
Matrix * getPresentation() const
Definition polyring.cpp:174
bool is_graded() const
Definition polyring.hpp:185
virtual void mult_coeff_to(ring_elem a, ring_elem &f) const =0
const PolyRing * numerR_
Definition polyring.hpp:125
virtual vec translate_gbvector_to_vec_denom(const FreeModule *F, const gbvector *v, const ring_elem denom) const =0
SumCollector * make_SumCollector() const
Definition polyring.cpp:209
bool is_basic_ring() const
Definition polyring.hpp:175
const MonomialTableZZ * get_quotient_MonomialTableZZ() const
Definition polyring.hpp:214
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition polyring.hpp:304
const MonomialIdeal * make_basis_MonomialIdeal() const
Definition polyring.hpp:226
virtual ring_elem make_flat_term(const ring_elem a, const_monomial m) const =0
virtual bool is_fraction_poly_ring() const
Definition polyring.hpp:285
virtual Nterm * numerator(ring_elem f) const =0
Nterm * quotient_element(int i) const
Definition polyring.hpp:220
virtual vec vec_top_coefficient(const vec v, int &var, int &exp) const =0
bool is_quotient_ring() const
Definition polyring.hpp:235
bool is_skew_var(int v) const
Definition polyring.hpp:240
virtual void degree_weights(const ring_elem f, const std::vector< int > &wts, int &lo, int &hi) const =0
int skew_variable(int i) const
Definition polyring.hpp:239
virtual const Ring * getCoefficients() const
Definition polyring.hpp:277
MonomialTable * get_quotient_MonomialTable() const
Definition polyring.hpp:204
virtual bool multi_degree(const ring_elem f, monomial d) const =0
virtual void degree_of_var(int n, const ring_elem a, int &lo, int &hi) const =0
virtual gbvector * translate_gbvector_from_vec(const FreeModule *F, const vec v, ring_elem &result_denominator) const =0
virtual void divide_coeff_to(ring_elem &f, ring_elem a) const =0
virtual bool is_weyl_algebra() const
Definition polyring.hpp:248
virtual const PolyRing * getNumeratorRing() const
Definition polyring.hpp:259
virtual unsigned int computeHashValue(const ring_elem a) const
Definition polyring.cpp:214
virtual ring_elem * get_parts(const std::vector< int > &wts, const ring_elem f, long &result_len) const =0
virtual ring_elem get_terms(int nvars0, const ring_elem f, int lo, int hi) const =0
virtual ring_elem make_logical_term(const Ring *coeffR, const ring_elem a, const_exponents exp) const =0
virtual void clear()
Definition polyring.hpp:168
virtual ring_elem diff(ring_elem a, ring_elem b, int use_coeff) const =0
virtual const vecterm * vec_locate_lead_term(const FreeModule *F, vec v) const =0
virtual ring_elem lead_logical_coeff(const Ring *coeffR, const ring_elem f) const =0
virtual bool is_skew_commutative_ring() const
Definition polyring.hpp:253
const gbvector * quotient_gbvector(int i) const
Definition polyring.hpp:221
CoefficientType coefficient_type() const
Definition polyring.hpp:191
GBRing * gb_ring_
Definition polyring.hpp:140
virtual const Ring * getDenominatorRing() const
Definition polyring.hpp:266
const SkewMultiplication & getSkewInfo() const
Definition polyring.hpp:241
virtual engine_RawArrayPairOrNull list_form(const Ring *coeffR, const ring_elem f) const =0
int n_vars() const
Definition polyring.hpp:196
bool is_skew_commutative() const
Definition polyring.hpp:237
virtual const_monomial lead_flat_monomial(const ring_elem f) const =0
virtual void monomial_divisor(const ring_elem a, exponents_t exp) const =0
virtual vec translate_gbvector_to_vec(const FreeModule *F, const gbvector *v) const =0
unsigned long get_precision() const
Definition polyring.hpp:174
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
Bookkeeping helper holding the defining ideal of a polynomial-ring quotient R / I in the two represen...
Definition qring.hpp:78
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
CoefficientType
Definition ring.hpp:222
Ring()
Definition ring.hpp:136
xxx xxx xxx
Definition ring.hpp:102
Sign-rule helper used by every ring that has a skew-commutative subset of variables (exterior factor,...
Definition skew.hpp:54
Abstract incremental accumulator that builds a ring_elem from many add(f) calls.
Definition ring.hpp:669
ComputationStatusCode / StopConditions / StrategyValues / Algorithms / gbTraceValues — engine-to-inte...
#define Matrix
Definition factory.cpp:14
#define monomial
Definition gb-toric.cpp:11
const int * const_monomial
Definition imonorder.hpp:45
engine_RawArrayPair engine_RawArrayPairOrNull
Definition m2-types.h:184
#define VECTOR(T)
Definition newdelete.hpp:78
QRingInfo family — bookkeeping plus normal-form machinery attached to a PolyRingQuotient for R / I re...
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.
SkewMultiplication — configuration object naming the skew-commuting variables of a ring.
Singly linked-list node carrying one term of a polynomial-ring element.
Definition ringelem.hpp:156
Nterm * poly_val
Definition ringelem.hpp:86