Macaulay2 Engine
Loading...
Searching...
No Matches
polyring.cpp
Go to the documentation of this file.
1#include "util.hpp"
2#include "polyring.hpp"
3#include "ring.hpp"
4#include "monoid.hpp"
5#include "qring.hpp"
6#include "polyquotient.hpp"
7#include "matrix.hpp"
8#include "matrix-con.hpp"
9#include "geopoly.hpp"
10
13{
14 qinfo_ = qinfo0;
15 const PolyRing *numerR = getNumeratorRing(); // might be 'this'
16
17 for (int i = 0; i < n_quotients(); i++)
18 {
19 if (!numerR->is_homogeneous(quotient_element(i)))
20 {
21 setIsGraded(false);
22 break;
23 }
24 }
25
27}
28
30 const Monoid *M,
31 const PolyRing *numeratorR,
32 const PolynomialRing *ambientR,
33 const Ring *denomR)
34{
35 nvars_ = M->n_vars();
36 K_ = K;
37 M_ = M;
38 numerR_ = numeratorR;
39 ambientR_ = ambientR;
40 denomR_ = denomR;
41
43
44 if (K->is_QQ() || (K == globalZZ && denomR != nullptr))
46 else if (K == globalZZ && denomR == nullptr)
48 else
50
51 is_weyl_ = false;
52 is_solvable_ = false;
53 is_skew_ = false;
54 overZZ_ = false;
55 qinfo_ = new QRingInfo;
56 is_ZZ_quotient_ = false;
58
59 if (numeratorR != this)
60 {
61 // We must set the non-commutative settings ourselves at this time
62 if (numeratorR->cast_to_WeylAlgebra() != nullptr)
63 is_weyl_ = true;
64 else if (numeratorR->cast_to_SolvableAlgebra() != nullptr)
65 is_solvable_ = true;
66 else if (numeratorR->is_skew_commutative())
67 {
68 is_skew_ = true;
69 skew_ = numeratorR->getSkewInfo();
70 }
71 }
72
73 poly_size_ = 0; // The callee needs to set this later
74 gb_ring_ = nullptr; // The callee needs to set this later
75
76 // Also: callee should call setIsGraded, and set oneV, minus_oneV, zeroV
77}
78
80 VECTOR(Nterm *) & elems)
81// Grabs 'elems'. Each element of 'elems' should be in the ring R.
82// They should also form a GB.
83{
84 // Here are the cases:
85 // (1) R is a polynomial ring over a basic field
86 // (2) R is a polynomial ring over ZZ
87 // (3) R is a polynomial ring over QQ
88
89 // case (1), (2): PolyRingQuotient
90 // case (3): PolyQQ
91
92 PolynomialRing *result = nullptr;
94
95 QRingInfo *qrinfo = nullptr;
96 switch (coeff_type)
97 {
98 case COEFF_BASIC:
99 qrinfo = new QRingInfo_field_basic(R->getNumeratorRing(), elems);
101 break;
102 case COEFF_QQ:
103 qrinfo = new QRingInfo_field_QQ(R->getNumeratorRing(), elems);
105 break;
106 case COEFF_ZZ:
107 QRingInfo_ZZ *qrinfoZZ = new QRingInfo_ZZ(R->getNumeratorRing(), elems);
108 qrinfo = qrinfoZZ;
110 result->is_ZZ_quotient_ = qrinfoZZ->is_ZZ_quotient();
111 result->ZZ_quotient_value_ = qrinfoZZ->ZZ_quotient_value();
112 break;
113 }
114
115 result->initialize_ring(
117
118 result->initialize_PolynomialRing(R->getCoefficients(),
119 R->getMonoid(),
120 R->getNumeratorRing(),
121 R->getAmbientRing(),
122 R->getDenominatorRing());
123
124 result->gb_ring_ = R->get_gb_ring();
125 result->setQuotientInfo(qrinfo); // Also sets graded-ness
126
127 result->zeroV = result->from_long(0);
128 result->oneV = result->from_long(1);
129 result->minus_oneV = result->from_long(-1);
130
131 return result;
132}
133
135 const Matrix *M)
136{
137 if (M->get_ring() != R)
138 {
139 ERROR("quotient elements not in the expected polynomial ring");
140 return nullptr;
141 }
142 VECTOR(Nterm *) elems;
143
144 for (int i = 0; i < M->n_cols(); i++)
145 {
146 Nterm *f = R->numerator(M->elem(0, i));
147 elems.push_back(f);
148 }
149
150 for (int i = 0; i < R->n_quotients(); i++)
151 elems.push_back(R->quotient_element(i));
152
153 return create_quotient(R->getAmbientRing(), elems);
154}
155
157 const PolynomialRing *B)
158// R should be an ambient poly ring
159// B should have: ambient of B is the logical coeff ring of R
160// i.e. R = A[x], B = A/I
161// return A[x]/I.
162{
163 VECTOR(Nterm *) elems;
164
165 for (int i = 0; i < B->n_quotients(); i++)
166 {
167 ring_elem f;
168 R->promote(B->getNumeratorRing(), B->quotient_element(i), f);
169 elems.push_back(f);
170 }
171 return create_quotient(R, elems);
172}
173
175{
176 const PolynomialRing *R = getAmbientRing();
177
179 for (int i = 0; i < n_quotients(); i++)
180 // NEED: to make this into a fraction, if R has fractions.
181 mat.append(R->make_vec(0, quotient_element(i)));
182 return mat.to_matrix();
183}
184
199{
201
202 public:
205 virtual void add(ring_elem f) { H.add(f); }
206 virtual ring_elem getValue() { return H.value(); }
207};
208
213
215{
216 unsigned int hash = 0;
217 unsigned int seed1 = 103;
218 unsigned int seed2 = 347654;
219 for (Nterm& t : a.poly_val)
220 {
221 unsigned int hash1 = getCoefficientRing()->computeHashValue(t.coeff);
222 unsigned int hash2 = getMonoid()->computeHashValue(t.monom);
223 hash += seed1 * hash1 + seed2 * hash2;
224 seed1 += 463633;
225 seed2 += 7858565;
226 }
227 return hash;
228}
229
230// Local Variables:
231// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
232// indent-tabs-mode: nil
233// End:
const Ring * get_ring() const
Definition matrix.hpp:134
ring_elem elem(int i, int j) const
Definition matrix.cpp:307
int n_cols() const
Definition matrix.hpp:147
Matrix * to_matrix()
void append(vec v)
Mutable builder used to assemble an immutable Matrix one column (or one term) at a time.
int n_vars() const
Definition monoid.hpp:207
unsigned int computeHashValue(const_monomial m) const
Definition monoid.cpp:349
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
unsigned int hash() const
Definition hash.hpp:106
virtual bool is_homogeneous(const ring_elem f) const
Definition poly.cpp:533
Concrete PolyRingFlat subclass implementing ordinary commutative polynomial rings K[x_1,...
Definition poly.hpp:64
PolyRingFlat subclass for quotients R / I of a polynomial ring by an ideal.
int n_quotients() const
Definition polyring.hpp:219
Ring::CoefficientType coeff_type_
Definition polyring.hpp:109
const Ring * getCoefficientRing() const
Definition polyring.hpp:200
QRingInfo * qinfo_
Definition polyring.hpp:111
void setQuotientInfo(QRingInfo *qinfo0)
Definition polyring.cpp:12
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
void setIsGraded(bool new_val)
Definition polyring.hpp:142
virtual const PolynomialRing * getAmbientRing() const
Definition polyring.hpp:260
const Ring * K_
Definition polyring.hpp:123
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
static PolynomialRing * create_quotient(const PolynomialRing *R, VECTOR(Nterm *) &elems)
Definition polyring.cpp:79
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
size_t poly_size_
Definition polyring.hpp:118
const Monoid * M_
Definition polyring.hpp:124
Matrix * getPresentation() const
Definition polyring.cpp:174
const PolyRing * numerR_
Definition polyring.hpp:125
SumCollector * make_SumCollector() const
Definition polyring.cpp:209
virtual Nterm * numerator(ring_elem f) const =0
Nterm * quotient_element(int i) const
Definition polyring.hpp:220
virtual const Ring * getCoefficients() const
Definition polyring.hpp:277
virtual const PolyRing * getNumeratorRing() const
Definition polyring.hpp:259
virtual unsigned int computeHashValue(const ring_elem a) const
Definition polyring.cpp:214
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
bool is_skew_commutative() const
Definition polyring.hpp:237
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
bool is_ZZ_quotient() const
Definition qring.hpp:259
ring_elem ZZ_quotient_value() const
Definition qring.hpp:260
QRingInfo specialisation for quotients of polynomial rings over ZZ.
Definition qring.hpp:244
QRingInfo_field specialisation for QQ coefficients, which need denominator tracking through reduction...
Definition qring.hpp:211
QRingInfo_field specialisation for basic-field coefficients (everything except QQ).
Definition qring.hpp:184
Bookkeeping helper holding the defining ideal of a polynomial-ring quotient R / I in the two represen...
Definition qring.hpp:78
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const =0
virtual FreeModule * make_FreeModule() const
Definition ring.cpp:53
vec make_vec(int r, ring_elem a) const
Definition ring-vecs.cpp:60
virtual unsigned int computeHashValue(const ring_elem a) const =0
virtual const SolvableAlgebra * cast_to_SolvableAlgebra() const
Definition ring.hpp:286
long characteristic() const
Definition ring.hpp:159
CoefficientType
Definition ring.hpp:222
@ COEFF_QQ
Definition ring.hpp:222
@ COEFF_ZZ
Definition ring.hpp:222
@ COEFF_BASIC
Definition ring.hpp:222
virtual const WeylAlgebra * cast_to_WeylAlgebra() const
Definition ring.hpp:288
const PolynomialRing * get_degree_ring() const
Definition ring.hpp:161
virtual bool is_QQ() const
Definition ring.hpp:172
const std::vector< int > & get_heft_vector() const
Definition ring.hpp:162
Ring()
Definition ring.hpp:136
Abstract incremental accumulator that builds a ring_elem from many add(f) calls.
Definition ring.hpp:669
SumCollectorPolyHeap(const PolynomialRing *R0)
Definition polyring.cpp:203
virtual ring_elem getValue()
Definition polyring.cpp:206
virtual void add(ring_elem f)
Definition polyring.cpp:205
SumCollector implementation that funnels engine-side ring_elem additions through a polyheap (geobucke...
Definition polyring.cpp:199
#define Matrix
Definition factory.cpp:14
RingZZ * globalZZ
Definition relem.cpp:13
polyheap — polynomial-specialised geometric heap for reduction accumulators.
const int ERROR
Definition m2-mem.cpp:55
VALGRIND_MAKE_MEM_DEFINED & result(result)
MatrixConstructor — the mutable builder that produces an immutable Matrix.
Matrix — the engine's immutable homomorphism F -> G between free modules.
#define EXPONENT_BYTE_SIZE(nvars)
Definition monoid.hpp:63
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
#define VECTOR(T)
Definition newdelete.hpp:78
PolyRingQuotient — polynomial ring modulo an ideal whose Groebner basis is known.
PolynomialRing — abstract polynomial-ring base, the engine's most-reused class.
QRingInfo family — bookkeeping plus normal-form machinery attached to a PolyRingQuotient for R / I re...
#define ZERO_RINGELEM
Definition ring.hpp:677
Ring — the legacy abstract base class for every coefficient and polynomial ring.
ring_elem coeff
Definition ringelem.hpp:158
int monom[1]
Definition ringelem.hpp:160
Singly linked-list node carrying one term of a polynomial-ring element.
Definition ringelem.hpp:156
Nterm * poly_val
Definition ringelem.hpp:86
Conversion helpers between M2 boundary types and standard C++ containers.