Macaulay2 Engine
Loading...
Searching...
No Matches
polyquotient.hpp
Go to the documentation of this file.
1// Copyright 2004 Michael E. Stillman
2
3#ifndef _polyquotient_hpp_
4#define _polyquotient_hpp_
5
38
39#include "engine-includes.hpp"
40
41#include "poly.hpp"
42#include "polyring.hpp"
43#include "qring.hpp"
44#include "ringelem.hpp"
45
46class FreeModule;
47class GBComputation;
48class Ring;
49class buffer;
50class gbvector;
51struct RingMap;
52
70{
71 friend class PolynomialRing;
72
73 protected:
74 void normal_form(ring_elem &f) const { return qinfo_->normal_form(f); }
75 virtual ~PolyRingQuotient();
77 GBComputation *make_gb(const ring_elem g) const;
78 ring_elem ann(const ring_elem a, const ring_elem b) const;
79 // return an element h such that h*a is in (b).
80
81 public:
83 {
84 return this;
85 }
86 virtual PolyRingQuotient *cast_to_PolyRingQuotient() { return this; }
87 virtual void text_out(buffer &o) const;
88
90 // Arithmetic //////////
92
93 virtual ring_elem from_long(long n) const
94 {
95 ring_elem result = numerR_->from_long(n);
97 return result;
98 }
99 virtual ring_elem from_int(mpz_srcptr n) const
100 {
101 ring_elem result = numerR_->from_int(n);
103 return result;
104 }
105 virtual bool from_rational(mpq_srcptr q, ring_elem &result) const
106 {
107 bool ok = numerR_->from_rational(q, result);
108 if (not ok) return false;
110 return true;
111 }
112 virtual bool from_BigReal(gmp_RR a, ring_elem &result) const
113 {
114 bool ret = numerR_->from_BigReal(a, result);
116 return ret;
117 }
118 virtual bool from_BigComplex(gmp_CC z, ring_elem &result) const
119 {
120 bool ret = numerR_->from_BigComplex(z, result);
122 return ret;
123 }
124 virtual bool from_Interval(gmp_RRi a, ring_elem &result) const
125 {
126 bool ret = numerR_->from_Interval(a, result);
128 return ret;
129 }
131 {
132 bool ret = numerR_->from_ComplexInterval(a, result);
134 return ret;
135 }
136 virtual bool from_double(double a, ring_elem &result) const
137 {
138 bool ret = numerR_->from_double(a, result);
140 return ret;
141 }
142 virtual bool from_complex_double(double re,
143 double im,
144 ring_elem &result) const
145 {
146 bool ret = numerR_->from_complex_double(re, im, result);
148 return ret;
149 }
150
151 virtual ring_elem var(int v) const
152 {
153 ring_elem result = numerR_->var(v);
155 return result;
156 }
157 virtual bool promote(const Ring *R,
158 const ring_elem f,
159 ring_elem &result) const;
160 virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const;
161
163 {
164 return numerR_->preferred_associate(f);
165 }
166
167 virtual void lower_content(ring_elem &c, ring_elem g) const
168 {
169 numerR_->lower_content(c, g);
170 }
171 virtual ring_elem content(ring_elem f) const { return numerR_->content(f); }
173 {
174 return numerR_->divide_by_given_content(f, c);
175 }
176
177 virtual bool is_unit(const ring_elem f) const; // TODO
178
179 virtual bool is_zero(const ring_elem f) const
180 {
181 return numerR_->PolyRing::is_zero(f);
182 }
183
184 virtual bool is_equal(const ring_elem f, const ring_elem g) const
185 {
186 return numerR_->PolyRing::is_equal(f, g);
187 }
188
189 virtual int compare_elems(const ring_elem f, const ring_elem g) const
190 {
191 return numerR_->PolyRing::compare_elems(f, g);
192 }
193
194 virtual ring_elem copy(const ring_elem f) const
195 {
196 return numerR_->PolyRing::copy(f);
197 }
198 virtual void remove(ring_elem &f) const { numerR_->PolyRing::remove(f); }
199 virtual ring_elem negate(const ring_elem f) const
200 {
201 ring_elem result = numerR_->PolyRing::negate(f);
203 return result;
204 }
205
206 virtual ring_elem add(const ring_elem f, const ring_elem g) const
207 {
208 ring_elem result = numerR_->PolyRing::add(f, g);
210 return result;
211 }
212
213 virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
214 {
215 ring_elem result = numerR_->PolyRing::subtract(f, g);
217 return result;
218 }
219
220 virtual ring_elem mult(const ring_elem f, const ring_elem g) const
221 {
222 ring_elem result = numerR_->PolyRing::mult(f, g);
224 return result;
225 }
226
227 virtual ring_elem power(const ring_elem f, mpz_srcptr n) const;
228
229 virtual ring_elem power(const ring_elem f, int n) const;
230
231 virtual ring_elem invert(const ring_elem f) const;
232
233 virtual ring_elem divide(const ring_elem f, const ring_elem g) const;
234
235 virtual ring_elem remainder(const ring_elem f, const ring_elem g) const;
236
237 virtual ring_elem quotient(const ring_elem f, const ring_elem g) const;
238
240 const ring_elem g,
241 ring_elem &quot) const;
242
243 virtual void syzygy(const ring_elem a,
244 const ring_elem b,
245 ring_elem &x,
246 ring_elem &y) const;
247
248 virtual ring_elem random() const;
249
250 virtual void elem_text_out(buffer &o,
251 const ring_elem f,
252 bool p_one = true,
253 bool p_plus = false,
254 bool p_parens = false) const
255 {
256 numerR_->PolyRing::elem_text_out(o, f, p_one, p_plus, p_parens);
257 }
258
259 virtual ring_elem eval(const RingMap *map,
260 const ring_elem f,
261 int first_var) const;
262
264 // Polynomial routines //
266 virtual int index_of_var(const ring_elem a) const
267 {
268 return numerR_->PolyRing::index_of_var(a);
269 }
270
271 virtual M2_arrayint support(const ring_elem a) const
272 {
273 return numerR_->PolyRing::support(a);
274 }
275
276 virtual bool is_homogeneous(const ring_elem f) const
277 {
278 return is_graded() && numerR_->PolyRing::is_homogeneous(f);
279 }
280
281 virtual bool multi_degree(const ring_elem f, monomial d) const
282 {
283 return numerR_->PolyRing::multi_degree(f, d);
284 }
285
286 virtual void degree_weights(const ring_elem f,
287 const std::vector<int> &wts,
288 int &lo,
289 int &hi) const
290 {
291 return numerR_->PolyRing::degree_weights(f, wts, lo, hi);
292 }
293
295 int v,
296 int deg,
297 const std::vector<int> &wts) const
298 {
299 ring_elem result = numerR_->PolyRing::homogenize(f, v, deg, wts);
301 return result;
302 }
303
305 int v,
306 const std::vector<int> &wts) const
307 {
308 ring_elem result = numerR_->PolyRing::homogenize(f, v, wts);
310 return result;
311 }
312
314 const ring_elem c,
315 const_monomial m) const
316 {
317 ring_elem result = numerR_->mult_by_term(f, c, m);
319 return result;
320 }
321
322 virtual int n_flat_terms(const ring_elem f) const
323 {
324 return numerR_->PolyRing::n_flat_terms(f);
325 }
326
327 virtual int n_logical_terms(int nvars0, const ring_elem f) const
328 {
329 return numerR_->PolyRing::n_logical_terms(nvars0, f);
330 }
331
333 const ring_elem f) const
334 {
335 return numerR_->PolyRing::list_form(coeffR, f);
336 }
337
338 virtual ring_elem *get_parts(const std::vector<int> &wts,
339 const ring_elem f,
340 long &result_len) const
341 {
342 return numerR_->PolyRing::get_parts(wts, f, result_len);
343 }
344
345 virtual ring_elem get_part(const std::vector<int> &wts,
346 const ring_elem f,
347 bool lobound_given,
348 bool hibound_given,
349 long lobound,
350 long hibound) const
351 {
352 return numerR_->PolyRing::get_part(
353 wts, f, lobound_given, hibound_given, lobound, hibound);
354 }
355
357 {
358 ring_elem result = numerR_->PolyRing::make_flat_term(a, m);
360 return result;
361 }
362
363 virtual ring_elem make_logical_term(const Ring *coeffR,
364 const ring_elem a,
365 const_exponents exp) const
366 {
367 ring_elem result = numerR_->PolyRing::make_logical_term(coeffR, a, exp);
369 return result;
370 }
371 // virtual ring_elem term(const ring_elem a, const_monomial m) const = 0;
372
373 virtual ring_elem lead_flat_coeff(const ring_elem f) const
374 {
375 return numerR_->PolyRing::lead_flat_coeff(f);
376 }
377
378 virtual ring_elem lead_logical_coeff(const Ring *coeffR,
379 const ring_elem f) const
380 {
381 return numerR_->PolyRing::lead_logical_coeff(coeffR, f);
382 }
383
384 virtual ring_elem get_coeff(const Ring *coeffR,
385 const ring_elem f,
386 const_varpower vp) const
387 {
388 return numerR_->PolyRing::get_coeff(coeffR, f, vp);
389 }
390 // vp is a varpower monomial, in the logical monoid.
391 // The result will be an element in the logical coefficient ring.
392
393 virtual ring_elem get_terms(int nvars0,
394 const ring_elem f,
395 int lo,
396 int hi) const
397 {
398 return numerR_->PolyRing::get_terms(nvars0, f, lo, hi);
399 }
400 // get the (logical) terms from lo to hi in f. A negative value means count
401 // from
402 // the end. get_terms(--,f,0,0) is the logical lead term of f.
403
405 {
406 return numerR_->PolyRing::lead_flat_monomial(f);
407 }
408
409 virtual void lead_logical_exponents(int nvars0,
410 const ring_elem f,
411 exponents_t result_exp) const
412 {
413 numerR_->PolyRing::lead_logical_exponents(nvars0, f, result_exp);
414 }
415
416 virtual void mult_coeff_to(ring_elem a, ring_elem &f) const
417 {
418 numerR_->PolyRing::mult_coeff_to(a, f);
419 normal_form(f);
420 }
421 virtual void divide_coeff_to(ring_elem &f, ring_elem a) const
422 {
423 numerR_->PolyRing::divide_coeff_to(f, a);
424 // I dont believe that a normal form is required here (MES)
425 }
426
427 virtual void monomial_divisor(const ring_elem a, exponents_t exp) const
428 {
429 return numerR_->PolyRing::monomial_divisor(a, exp);
430 }
431
432 virtual ring_elem diff(ring_elem a, ring_elem b, int use_coeff) const
433 {
434#ifdef DEVELOPMENT
435#warning "diff for quotient rings: should do what?"
436#endif
437 return numerR_->PolyRing::diff(a, b, use_coeff);
438 }
439
440 virtual bool in_subring(int nslots, const ring_elem a) const
441 {
442 return numerR_->PolyRing::in_subring(nslots, a);
443 }
444
445 virtual void degree_of_var(int n, const ring_elem a, int &lo, int &hi) const
446 {
447 return numerR_->PolyRing::degree_of_var(n, a, lo, hi);
448 }
449
450 virtual ring_elem divide_by_var(int n, int d, const ring_elem a) const
451 {
452 return numerR_->PolyRing::divide_by_var(n, d, a);
453 }
454
456 {
457 return numerR_->PolyRing::divide_by_expvector(exp, a);
458 }
459
460 const vecterm *vec_locate_lead_term(const FreeModule *F, vec v) const
461 {
462 // Returns a pointer to the lead vector of v.
463 // This works if F has a Schreyer order, or an up/down order.
464 return numerR_->PolyRing::vec_locate_lead_term(F, v);
465 }
466
467 virtual vec vec_lead_term(int nparts, const FreeModule *F, vec v) const
468 {
469 return numerR_->PolyRing::vec_lead_term(nparts, F, v);
470 }
471
472 virtual vec vec_top_coefficient(const vec v, int &x, int &e) const
473 {
474 return numerR_->vec_top_coefficient(v, x, e);
475 }
476
478 {
479 return numerR_->PolyRing::translate_gbvector_from_ringelem(coeff);
480 }
481
482 // result/denom == v.
483 // result_denom will be an element in getDenominatorRing() (if non-NULL).
485 const FreeModule *F,
486 const vec v,
487 ring_elem &result_denominator) const
488 {
489 return numerR_->PolyRing::translate_gbvector_from_vec(
490 F, v, result_denominator);
491 }
492
494 const gbvector *v) const
495 {
496 return numerR_->PolyRing::translate_gbvector_to_vec(F, v);
497 }
498
499 // Translate v/denom to a vector in F. denom does not need to be positive,
500 // although it had better be non-zero.
501 // denom should be an element of getDenominatorRing() (if non-NULL, otherwise
502 // 'denom'
503 // is ignored).
505 const gbvector *v,
506 const ring_elem denom) const
507 {
508 return numerR_->PolyRing::translate_gbvector_to_vec_denom(F, v, denom);
509 }
510};
511
512#endif
513
514// Local Variables:
515// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
516// indent-tabs-mode: nil
517// 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
PolynomialRing subclass whose elements are represented as a single flat Nterm* linked list (no fracti...
Definition polyring.hpp:466
virtual bool in_subring(int nslots, const ring_elem a) const
virtual void mult_coeff_to(ring_elem a, ring_elem &f) const
virtual vec translate_gbvector_to_vec_denom(const FreeModule *F, const gbvector *v, const ring_elem denom) const
virtual bool from_Interval(gmp_RRi a, ring_elem &result) const
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
virtual ring_elem divide_by_var(int n, int d, const ring_elem a) const
virtual void divide_coeff_to(ring_elem &f, ring_elem a) const
virtual void degree_weights(const ring_elem f, const std::vector< int > &wts, int &lo, int &hi) const
virtual ring_elem from_int(mpz_srcptr n) const
virtual ring_elem * get_parts(const std::vector< int > &wts, const ring_elem f, long &result_len) const
virtual ring_elem diff(ring_elem a, ring_elem b, int use_coeff) const
virtual bool from_ComplexInterval(gmp_CCi a, ring_elem &result) const
virtual int index_of_var(const ring_elem a) const
friend class PolynomialRing
virtual void text_out(buffer &o) const
virtual gbvector * translate_gbvector_from_ringelem(ring_elem coeff) const
virtual vec vec_lead_term(int nparts, const FreeModule *F, vec v) const
virtual ring_elem get_terms(int nvars0, const ring_elem f, int lo, int hi) const
virtual ring_elem from_long(long n) const
virtual ring_elem divide_by_expvector(const_exponents exp, const ring_elem a) const
ring_elem ann(const ring_elem a, const ring_elem b) const
virtual ring_elem lead_logical_coeff(const Ring *coeffR, const ring_elem f) const
virtual ring_elem make_logical_term(const Ring *coeffR, const ring_elem a, const_exponents exp) const
virtual ring_elem add(const ring_elem f, const ring_elem g) const
virtual bool from_BigComplex(gmp_CC z, ring_elem &result) const
virtual gbvector * translate_gbvector_from_vec(const FreeModule *F, const vec v, ring_elem &result_denominator) const
virtual ~PolyRingQuotient()
virtual ring_elem quotient(const ring_elem f, const ring_elem g) const
virtual bool from_BigReal(gmp_RR a, ring_elem &result) const
virtual int compare_elems(const ring_elem f, const ring_elem g) const
virtual ring_elem negate(const ring_elem f) const
virtual M2_arrayint support(const ring_elem a) const
virtual engine_RawArrayPairOrNull list_form(const Ring *coeffR, const ring_elem f) const
virtual ring_elem make_flat_term(const ring_elem a, const_monomial m) const
virtual ring_elem homogenize(const ring_elem f, int v, const std::vector< int > &wts) const
virtual bool is_equal(const ring_elem f, const ring_elem g) const
virtual void degree_of_var(int n, const ring_elem a, int &lo, int &hi) const
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
GBComputation * make_gb(const ring_elem g) const
virtual ring_elem invert(const ring_elem f) const
virtual ring_elem random() const
virtual ring_elem content(ring_elem f) const
virtual ring_elem remainder(const ring_elem f, const ring_elem g) const
virtual ring_elem copy(const ring_elem f) const
virtual int n_flat_terms(const ring_elem f) const
virtual int n_logical_terms(int nvars0, const ring_elem f) const
virtual ring_elem divide_by_given_content(ring_elem f, ring_elem c) 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 void lead_logical_exponents(int nvars0, const ring_elem f, exponents_t result_exp) const
virtual ring_elem lead_flat_coeff(const ring_elem f) const
virtual vec vec_top_coefficient(const vec v, int &x, int &e) const
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const
virtual bool from_rational(mpq_srcptr q, ring_elem &result) const
virtual bool multi_degree(const ring_elem f, monomial d) const
virtual ring_elem remainderAndQuotient(const ring_elem f, const ring_elem g, ring_elem &quot) const
virtual ring_elem mult_by_term(const ring_elem f, const ring_elem c, const_monomial m) const
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const
virtual vec translate_gbvector_to_vec(const FreeModule *F, const gbvector *v) const
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const
virtual ring_elem var(int v) 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 PolyRingQuotient * cast_to_PolyRingQuotient()
const vecterm * vec_locate_lead_term(const FreeModule *F, vec v) const
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const
virtual ring_elem homogenize(const ring_elem f, int v, int deg, const std::vector< int > &wts) const
virtual void lower_content(ring_elem &c, ring_elem g) const
virtual bool is_homogeneous(const ring_elem f) const
virtual const PolyRingQuotient * cast_to_PolyRingQuotient() const
void normal_form(ring_elem &f) const
virtual bool from_double(double a, ring_elem &result) const
virtual const_monomial lead_flat_monomial(const ring_elem f) const
virtual ring_elem preferred_associate(ring_elem f) const
virtual bool from_complex_double(double re, double im, ring_elem &result) const
virtual bool is_zero(const ring_elem f) const
virtual void monomial_divisor(const ring_elem a, exponents_t exp) const
virtual ring_elem get_coeff(const Ring *coeffR, const ring_elem f, const_varpower vp) const
virtual bool is_unit(const ring_elem f) const
virtual void remove(ring_elem &f) const
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
QRingInfo * qinfo_
Definition polyring.hpp:111
bool is_graded() const
Definition polyring.hpp:185
const PolyRing * numerR_
Definition polyring.hpp:125
Ring()
Definition ring.hpp:136
xxx xxx xxx
Definition ring.hpp:102
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
Definition ringmap.hpp:60
Engine-wide include prelude — a single point of truth for portability shims.
#define monomial
Definition gb-toric.cpp:11
const int * const_monomial
Definition imonorder.hpp:45
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
mpfi_srcptr gmp_RRi
Definition m2-types.h:153
engine_RawArrayPair engine_RawArrayPairOrNull
Definition m2-types.h:184
struct gmp_CCi_struct * gmp_CCi
Definition m2-types.h:162
volatile int x
Concrete commutative PolyRing — standard polynomial ring inheriting from PolyRingFlat.
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...
ring_elem — the universal value type carried by every Ring* in the engine.