Macaulay2 Engine
Loading...
Searching...
No Matches
M2FreeAlgebraQuotient.hpp
Go to the documentation of this file.
1#ifndef _m2_free_algebra_quotient_hpp_
2#define _m2_free_algebra_quotient_hpp_
3
33
34#include "engine-includes.hpp"
35
36#include <memory>
37
38#include "M2FreeAlgebra.hpp"
41#include "Polynomial.hpp"
42#include "ringelem.hpp"
43
44class FreeAlgebra;
45class Matrix;
46class Monoid;
47class Ring;
48class RingMap;
49class SumCollector;
50class buffer;
51
67{
68private:
70 const std::unique_ptr<FreeAlgebraQuotient> mFreeAlgebraQuotient;
71
73 const M2FreeAlgebra& F,
74 std::unique_ptr<FreeAlgebraQuotient> A
75 );
76public:
78 const Matrix* GB,
79 int maxdeg // -1 means complete GB, otherwise mx deg GB computed to
80 );
81
82 const M2FreeAlgebra& m2FreeAlgebra() const { return mM2FreeAlgebra; }
84 const FreeMonoid& monoid() const { return m2FreeAlgebra().monoid(); }
85 const FreeAlgebra& freeAlgebra() const { return m2FreeAlgebra().freeAlgebra(); }
86
87 const Monoid& degreeMonoid() const { return m2FreeAlgebra().monoid().degreeMonoid(); }
88 const Ring* coefficientRing() const { return m2FreeAlgebra().coefficientRing(); }
89
90 int numVars() const { return monoid().numVars(); }
91 int n_vars() const { return numVars(); }
92
93 // these are all the functions from Ring that must exist for M2FreeAlgebraQuotient to be instantiated
94 virtual int index_of_var(const ring_elem a) const;
95
96 virtual void text_out(buffer &o) const;
97 virtual unsigned int computeHashValue(const ring_elem a) const;
98 virtual ring_elem from_coefficient(const ring_elem a) const;
99 virtual ring_elem from_long(long n) const;
100 virtual ring_elem from_int(mpz_srcptr n) const;
101 virtual bool from_rational(const mpq_srcptr q, ring_elem &result) const;
102
103 virtual ring_elem var(int v) const;
104 virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const;
105 virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const;
106 virtual bool is_unit(const ring_elem f) const;
107 virtual bool is_zero(const ring_elem f) const;
108 virtual bool is_equal(const ring_elem f, const ring_elem g) const;
109 virtual int compare_elems(const ring_elem f, const ring_elem g) const;
110 virtual ring_elem copy(const ring_elem f) const;
111 virtual void remove(ring_elem &f) const;
112 virtual ring_elem negate(const ring_elem f) const;
113 virtual ring_elem add(const ring_elem f, const ring_elem g) const;
114 virtual ring_elem subtract(const ring_elem f, const ring_elem g) const;
115 virtual ring_elem mult(const ring_elem f, const ring_elem g) const;
116
117 virtual ring_elem power(const ring_elem f, mpz_srcptr n) const;
118 virtual ring_elem power(const ring_elem f, int n) const;
119
120 virtual ring_elem invert(const ring_elem f) const;
121 virtual ring_elem divide(const ring_elem f, const ring_elem g) const;
122 virtual void syzygy(const ring_elem a, const ring_elem b,
123 ring_elem &x, ring_elem &y) const;
124 virtual void elem_text_out(buffer &o,
125 const ring_elem f,
126 bool p_one,
127 bool p_plus,
128 bool p_parens) const;
129 virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const;
130
131 virtual engine_RawArrayPairOrNull list_form(const Ring *coeffR,
132 const ring_elem f) const;
133
134 virtual bool is_homogeneous(const ring_elem f) const;
135 virtual bool multi_degree(const ring_elem f, monomial d) const;
136
137 virtual SumCollector *make_SumCollector() const;
138
139 long n_terms(const ring_elem f) const;
140
141 bool is_homogeneous(const Poly* f) const;
142
143 // returns true if f is homogeneous, and sets already_allocated_degree_vector
144 // to be the LCM of the exponent vectors of the degrees of all terms in f.
145 virtual bool multi_degree(const Poly* f, monomial already_allocated_degree_vector) const;
146
147 // lead coefficient, monomials and terms.
148 ring_elem lead_coefficient(const Ring* coeffRing, const Poly* f) const;
149 ring_elem lead_coefficient(const Ring* coeffRing, const ring_elem f) const
150 {
151 return lead_coefficient(coeffRing, reinterpret_cast<const Poly*>(f.get_Poly()));
152 }
153
154 #if 0
155 // lead_monomial: returns an allocated EngineMonomial meant for the front end of M2.
156 const int* lead_monomial(const Poly* f) const;
157 const int* lead_monomial(const ring_elem f) const { return lead_monomial reinterpret_cast<const Poly*>((f.get_Poly())); }
158 #endif
159
160 // lead terms, or get contiguous terms
161 Poly* get_terms(const Poly* f, int lo, int hi) const
162 {
163 return m2FreeAlgebra().get_terms(f, lo, hi);
164 }
165 ring_elem get_terms(const ring_elem f, int lo, int hi) const
166 {
167 return m2FreeAlgebra().get_terms(f, lo, hi);
168 }
169
170 // casting functions
171 virtual const M2FreeAlgebraQuotient * cast_to_M2FreeAlgebraQuotient() const { return this; }
173
174 void debug_display(const Poly* f) const;
175 void debug_display(const ring_elem ff) const;
176
177 void makeTerm(Poly& result, const ring_elem a, const int* monom) const;
178
179 ring_elem makeTerm(const ring_elem a, const int* monom) const;
180 // 'monom' is in 'varpower' format
181 // [2n+1 v1 e1 v2 e2 ... vn en], where each ei > 0, (in 'varpower' format)
182};
183
184#endif
185
186// Local Variables:
187// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
188// indent-tabs-mode: nil
189// End:
A FreeAlgebra modulo a two-sided ideal carried by an embedded NCGroebner.
FreeMonoid — monoid of length-prefixed non-commutative words with weight-vector prefix.
Ring-shaped wrapper that exposes a non-commutative FreeAlgebra to the rest of the engine.
Polynomial< CoefficientRingType > Poly
Modern Monom / Polynomial value types shared by NC algebras and the refactored F4.
Free associative algebra over a coefficient ring: the non-commutative analogue of PolynomialRing.
Quotient of a FreeAlgebra by a Groebner basis up to a fixed degree bound.
const Monoid & degreeMonoid() const
unsigned int numVars() const
The free non-commutative monoid on a set of named variables, with monomial ordering and degree / weig...
const FreeAlgebra & freeAlgebra() const
const Ring * coefficientRing() const
const FreeMonoid & monoid() const
Poly * get_terms(const Poly *f, int lo, int hi) const
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...
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
virtual ring_elem invert(const ring_elem f) const
virtual bool multi_degree(const ring_elem f, monomial d) const
virtual const M2FreeAlgebraQuotient * cast_to_M2FreeAlgebraQuotient() const
static M2FreeAlgebraQuotient * create(const M2FreeAlgebra &F, const Matrix *GB, int maxdeg)
virtual SumCollector * make_SumCollector() const
virtual bool is_equal(const ring_elem f, const ring_elem g) const
virtual ring_elem from_int(mpz_srcptr n) const
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const
virtual bool from_rational(const mpq_srcptr q, ring_elem &result) const
virtual ring_elem negate(const ring_elem f) const
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
virtual void remove(ring_elem &f) const
virtual ring_elem var(int v) const
const FreeAlgebra & freeAlgebra() const
const M2FreeAlgebra & mM2FreeAlgebra
virtual engine_RawArrayPairOrNull list_form(const Ring *coeffR, const ring_elem f) const
virtual void elem_text_out(buffer &o, const ring_elem f, bool p_one, bool p_plus, bool p_parens) const
const FreeAlgebraQuotient & freeAlgebraQuotient() const
ring_elem get_terms(const ring_elem f, int lo, int hi) const
void debug_display(const Poly *f) const
virtual ring_elem from_coefficient(const ring_elem a) const
Poly * get_terms(const Poly *f, int lo, int hi) const
virtual ring_elem from_long(long n) const
void makeTerm(Poly &result, const ring_elem a, const int *monom) const
virtual bool is_zero(const ring_elem f) const
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
const Ring * coefficientRing() const
virtual void text_out(buffer &o) const
virtual ring_elem add(const ring_elem f, const ring_elem g) const
virtual int index_of_var(const ring_elem a) const
ring_elem lead_coefficient(const Ring *coeffRing, const Poly *f) const
virtual ring_elem power(const ring_elem f, mpz_srcptr n) const
Exponentiation. This is the default function, if a class doesn't define this.
virtual int compare_elems(const ring_elem f, const ring_elem g) const
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const
const M2FreeAlgebra & m2FreeAlgebra() const
long n_terms(const ring_elem f) const
ring_elem makeTerm(const ring_elem a, const int *monom) const
virtual ring_elem copy(const ring_elem f) const
ring_elem lead_coefficient(const Ring *coeffRing, const ring_elem f) const
virtual bool is_homogeneous(const ring_elem f) const
M2FreeAlgebraQuotient(const M2FreeAlgebra &F, std::unique_ptr< FreeAlgebraQuotient > A)
virtual bool is_unit(const ring_elem f) const
const Monoid & degreeMonoid() const
virtual M2FreeAlgebraQuotient * cast_to_M2FreeAlgebraQuotient()
virtual unsigned int computeHashValue(const ring_elem a) const
const FreeMonoid & monoid() const
const std::unique_ptr< FreeAlgebraQuotient > mFreeAlgebraQuotient
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
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
Abstract incremental accumulator that builds a ring_elem from many add(f) calls.
Definition ring.hpp:669
Engine-wide include prelude — a single point of truth for portability shims.
#define Matrix
Definition factory.cpp:14
#define monomial
Definition gb-toric.cpp:11
VALGRIND_MAKE_MEM_DEFINED & result(result)
engine_RawArrayPair engine_RawArrayPairOrNull
Definition m2-types.h:184
volatile int x
ring_elem — the universal value type carried by every Ring* in the engine.
const void * get_Poly() const
Definition ringelem.hpp:128