Macaulay2 Engine
Loading...
Searching...
No Matches
M2FreeAlgebra.hpp
Go to the documentation of this file.
1#ifndef _m2_free_algebra_hpp_
2#define _m2_free_algebra_hpp_
3
40
41#include <M2/math-include.h>
42#include "engine-includes.hpp"
43
44#include <memory>
45#include <string>
46#include <vector>
47
50#include "Polynomial.hpp"
51#include "ring.hpp"
52#include "ringelem.hpp"
53
54class PolynomialRing;
55class RingMap;
56class buffer;
57struct Monoid;
58
59//struct CoefficientRingTypeExample
60//{
61// typedef ring_elem ElementType;
62//};
63
78{
79public:
80 const Poly* toPoly(const ring_elem f) const { return reinterpret_cast<const Poly*>(f.get_Poly()); }
81
82 ring_elem fromPoly(Poly* f) const { return reinterpret_cast<Nterm*>(f); }
83
84 void appendFromModuleMonom(Poly& f, const ModuleMonom& m) const;
85
87
88public:
89 virtual const FreeAlgebra& freeAlgebra() const = 0;
90
91 virtual int n_vars() const = 0;
92
93 virtual const Ring* coefficientRing() const = 0;
94
95 virtual ring_elem from_coefficient(const ring_elem a) const = 0;
96
97 virtual ring_elem makeTerm(const ring_elem a, const_varpower monom) const = 0;
98
99 // casting functions
100 virtual const M2FreeAlgebraOrQuotient * cast_to_M2FreeAlgebraOrQuotient() const { return this; }
102
103 bool is_commutative_ring() const { return false; }
104
105};
106
121{
122private:
123 const std::unique_ptr<FreeAlgebra> mFreeAlgebra;
124
125 M2FreeAlgebra(std::unique_ptr<FreeAlgebra> F);
126
127public:
128 static M2FreeAlgebra* create(const Ring* K,
129 const std::vector<std::string>& names,
131 const std::vector<int>& degrees,
132 const std::vector<int>& wtvecs,
133 const std::vector<int>& heftVector
134 );
135
136 const FreeAlgebra& freeAlgebra() const { return *mFreeAlgebra; }
137 const FreeMonoid& monoid() const { return freeAlgebra().monoid(); }
138 const Monoid& degreeMonoid() const { return monoid().degreeMonoid(); }
139
140 const PolynomialRing* degreeRing() const { return monoid().degreeRing(); }
141 const Ring* coefficientRing() const { return freeAlgebra().coefficientRing(); }
142
143 int numVars() const { return monoid().numVars(); }
144 virtual int n_vars() const { return numVars(); }
145
146 // these are all the functions from Ring that must exist for M2FreeAlgebra to be instantiated
147 virtual int index_of_var(const ring_elem a) const;
148
149 virtual void text_out(buffer &o) const;
150 virtual unsigned int computeHashValue(const ring_elem a) const;
151 virtual ring_elem from_coefficient(const ring_elem a) const;
152 virtual ring_elem from_long(long n) const;
153 virtual ring_elem from_int(mpz_srcptr n) const;
154 virtual bool from_rational(const mpq_srcptr q, ring_elem &result) const;
155
156 virtual ring_elem var(int v) const;
157 virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const;
158 virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const;
159 virtual bool is_unit(const ring_elem f) const;
160 virtual bool is_zero(const ring_elem f) const;
161 virtual bool is_equal(const ring_elem f, const ring_elem g) const;
162 virtual int compare_elems(const ring_elem f, const ring_elem g) const;
163 virtual ring_elem copy(const ring_elem f) const;
164 virtual void remove(ring_elem &f) const;
165 virtual ring_elem negate(const ring_elem f) const;
166 virtual ring_elem add(const ring_elem f, const ring_elem g) const;
167 virtual ring_elem subtract(const ring_elem f, const ring_elem g) const;
168 virtual ring_elem mult(const ring_elem f, const ring_elem g) const;
169
170 virtual ring_elem power(const ring_elem f, mpz_srcptr n) const;
171 virtual ring_elem power(const ring_elem f, int n) const;
172
173 virtual ring_elem invert(const ring_elem f) const;
174 virtual ring_elem divide(const ring_elem f, const ring_elem g) const;
175 virtual void syzygy(const ring_elem a, const ring_elem b,
176 ring_elem &x, ring_elem &y) const;
177 virtual void elem_text_out(buffer &o,
178 const ring_elem f,
179 bool p_one,
180 bool p_plus,
181 bool p_parens) const;
182 virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const;
183
184 virtual engine_RawArrayPairOrNull list_form(const Ring *coeffR,
185 const ring_elem f) const;
186
187 virtual bool is_homogeneous(const ring_elem f) const;
188 virtual bool multi_degree(const ring_elem f, monomial d) const;
189
190 virtual SumCollector *make_SumCollector() const;
191
192 long n_terms(const ring_elem f) const;
193
194 bool is_homogeneous(const Poly* f) const;
195
196 // returns true if f is homogeneous, and sets already_allocated_degree_vector
197 // to be the LCM of the exponent vectors of the degrees of all terms in f.
198 virtual bool multi_degree(const Poly* f, monomial already_allocated_degree_vector) const;
199
200 // lead coefficient, monomials and terms.
201 ring_elem lead_coefficient(const Ring* coeffRing, const Poly* f) const;
202 ring_elem lead_coefficient(const Ring* coeffRing, const ring_elem f) const
203 {
204 return lead_coefficient(coeffRing, reinterpret_cast<const Poly*>(f.get_Poly()));
205 }
206
207 #if 0
208 // lead_monomial: returns an allocated EngineMonomial meant for the front end of M2.
209 const int* lead_monomial(const Poly* f) const;
210 const int* lead_monomial(const ring_elem f) const { return lead_monomial reinterpret_cast<const Poly*>((f.get_Poly())); }
211 #endif
212
213 // lead terms, or get contiguous terms
214 Poly* get_terms(const Poly* f, int lo, int hi) const;
215 ring_elem get_terms(const ring_elem f, int lo, int hi) const
216 {
217 const Poly* result = get_terms(reinterpret_cast<const Poly*>(f.get_Poly()), lo, hi);
218 return ring_elem(reinterpret_cast<const Poly*>(result));
219 }
220
221 // support functions
222 virtual M2_arrayint support(const ring_elem a) const;
223
224 // casting functions
225 virtual const M2FreeAlgebra * cast_to_M2FreeAlgebra() const { return this; }
226 virtual M2FreeAlgebra * cast_to_M2FreeAlgebra() { return this; }
227
228 void debug_display(const Poly* f) const;
229 void debug_display(const ring_elem ff) const;
230
231 ring_elem makeTerm(const ring_elem a, const_varpower monom) const;
232
233 void makeTerm(Poly& result, const ring_elem a, const_varpower monom) const;
234};
235
237 const PolyList& polys);
238
239#endif
240
241// Local Variables:
242// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
243// indent-tabs-mode: nil
244// End:
varpower::ConstExponents const_varpower
Free associative algebra k<x_1,...,x_n> over an arbitrary coefficient ring.
FreeMonoid — monoid of length-prefixed non-commutative words with weight-vector prefix.
PolyList copyPolyVector(const M2FreeAlgebraOrQuotient *A, const PolyList &polys)
Polynomial< CoefficientRingType > Poly
gc_vector< Poly * > PolyList
Modern Monom / Polynomial value types shared by NC algebras and the refactored F4.
const Ring * coefficientRing() const
const FreeMonoid & monoid() const
Free associative algebra over a coefficient ring: the non-commutative analogue of PolynomialRing.
const Monoid & degreeMonoid() const
const PolynomialRing * degreeRing() const
unsigned int numVars() const
The free non-commutative monoid on a set of named variables, with monomial ordering and degree / weig...
virtual M2_arrayint support(const ring_elem a) const
long n_terms(const ring_elem f) const
void debug_display(const Poly *f) const
virtual bool multi_degree(const ring_elem f, monomial d) const
virtual void syzygy(const ring_elem a, const ring_elem b, ring_elem &x, ring_elem &y) const
virtual ring_elem from_coefficient(const ring_elem a) const
virtual bool lift(const Ring *R, const ring_elem f, ring_elem &result) const
virtual ring_elem add(const ring_elem f, const ring_elem g) const
virtual int n_vars() const
virtual const M2FreeAlgebra * cast_to_M2FreeAlgebra() const
virtual ring_elem copy(const ring_elem f) const
virtual bool is_homogeneous(const ring_elem f) const
virtual ring_elem invert(const ring_elem f) const
virtual ring_elem eval(const RingMap *map, const ring_elem f, int first_var) const
ring_elem lead_coefficient(const Ring *coeffRing, const Poly *f) const
const FreeAlgebra & freeAlgebra() const
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
virtual bool is_equal(const ring_elem f, const ring_elem g) const
virtual bool is_zero(const ring_elem f) const
const Ring * coefficientRing() const
virtual bool promote(const Ring *R, const ring_elem f, ring_elem &result) const
virtual ring_elem var(int v) const
virtual void text_out(buffer &o) const
virtual M2FreeAlgebra * cast_to_M2FreeAlgebra()
virtual int compare_elems(const ring_elem f, const ring_elem g) const
const FreeMonoid & monoid() const
M2FreeAlgebra(std::unique_ptr< FreeAlgebra > F)
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
virtual bool is_unit(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
ring_elem makeTerm(const ring_elem a, const_varpower monom) const
virtual bool from_rational(const mpq_srcptr q, ring_elem &result) const
virtual int index_of_var(const ring_elem a) const
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
int numVars() 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.
ring_elem get_terms(const ring_elem f, int lo, int hi) const
static M2FreeAlgebra * create(const Ring *K, const std::vector< std::string > &names, const PolynomialRing *degreeRing, const std::vector< int > &degrees, const std::vector< int > &wtvecs, const std::vector< int > &heftVector)
Poly * get_terms(const Poly *f, int lo, int hi) const
const std::unique_ptr< FreeAlgebra > mFreeAlgebra
virtual engine_RawArrayPairOrNull list_form(const Ring *coeffR, const ring_elem f) const
virtual SumCollector * make_SumCollector() const
virtual unsigned int computeHashValue(const ring_elem a) const
const Monoid & degreeMonoid() const
const PolynomialRing * degreeRing() const
ring_elem lead_coefficient(const Ring *coeffRing, const ring_elem f) const
virtual ring_elem from_int(mpz_srcptr n) const
virtual ring_elem from_long(long n) const
virtual void remove(ring_elem &f) const
virtual ring_elem negate(const ring_elem f) const
ring_elem fromPoly(Poly *f) const
virtual ring_elem from_coefficient(const ring_elem a) const =0
const Poly * toPoly(const ring_elem f) const
virtual const M2FreeAlgebraOrQuotient * cast_to_M2FreeAlgebraOrQuotient() const
virtual int n_vars() const =0
void appendFromModuleMonom(Poly &f, const ModuleMonom &m) const
ring_elem fromModuleMonom(const ModuleMonom &m) const
virtual M2FreeAlgebraOrQuotient * cast_to_M2FreeAlgebraOrQuotient()
virtual ring_elem makeTerm(const ring_elem a, const_varpower monom) const =0
virtual const FreeAlgebra & freeAlgebra() const =0
virtual const Ring * coefficientRing() const =0
Abstract Ring subclass that lifts either a FreeAlgebra or a FreeAlgebraQuotient into the engine's Rin...
Monom extended with a module component, a stored index, and a memoised hash — the value type of IntsS...
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
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 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 — the legacy abstract base class for every coefficient and polynomial ring.
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
const void * get_Poly() const
Definition ringelem.hpp:128