19 auto end = polys.cend();
20 for (
auto i = polys.cbegin(); i !=
end; ++i)
44 const std::vector<std::string>& names,
46 const std::vector<int>& degrees,
47 const std::vector<int>& wtvecs,
48 const std::vector<int>& heftVector)
91 if (f->numTerms() != 1)
return -1;
118 if (!worked)
return false;
150 std::cout <<
"called lift NC case" << std::endl;
154 if (f->numTerms() != 1)
return false;
155 auto i = f->cbegin();
156 if (
monoid().is_one(i.monom()))
275 return mult(ginv, f);
294 std::cout <<
"coeffs: ";
295 for (
auto i=f->cbeginCoeff(); i != f->cendCoeff(); ++i)
299 std::cout << o.
str() <<
" ";
301 std::cout << std::endl <<
" monoms: ";
302 for (
auto i=f->cbeginMonom(); i != f->cendMonom(); ++i)
304 std::cout << (*i) <<
" ";
306 std::cout << std::endl;
318 result.getCoeffInserter().push_back(a);
358 ERROR(
"expected coefficient ring");
361 int nterms =
static_cast<int>(f->numTerms());
362 engine_RawMonomialArray monoms =
GETMEM(engine_RawMonomialArray,
sizeofarray(monoms,nterms));
363 engine_RawRingElementArray coeffs =
GETMEM(engine_RawRingElementArray,
sizeofarray(coeffs,nterms));
365 monoms->len = nterms;
366 coeffs->len = nterms;
373 for (
auto i=f->cbegin(); i != f->cend(); ++i, ++next)
391 if (f->numTerms() == 0)
return coeffRing->
zero();
392 return *(f->cbeginCoeff());
398 auto& outcoeff =
result->getCoeffInserter();
399 auto& outmonom =
result->getMonomInserter();
401 for(
auto i=f->cbegin(); i != f->cend() and which <= hi; ++i, ++which)
403 if (which < lo)
continue;
404 outcoeff.push_back(i.coeff());
424 if (f ==
nullptr)
return true;
varpower::ConstExponents const_varpower
PolyList copyPolyVector(const M2FreeAlgebraOrQuotient *A, const PolyList &polys)
Ring-shaped wrapper that exposes a non-commutative FreeAlgebra to the rest of the engine.
Polynomial< CoefficientRingType > Poly
gc_vector< Poly * > PolyList
void appendModuleMonomToMonom(const ModuleMonom &a, int &comp, T &inserter)
static EngineMonomial * make(int v, int e)
void add(Poly &result, Poly::const_iterator fBegin, Poly::const_iterator fEnd, Poly::const_iterator gBegin, Poly::const_iterator gEnd) const
void power(Poly &result, const Poly &f, int n) const
void negate(Poly &result, const Poly &f) const
bool is_unit(const Poly &f) const
void subtract(Poly &result, const Poly &f, const Poly &g) const
void from_coefficient(Poly &result, const ring_elem a) const
bool is_homogeneous(const Poly &f) const
void mult(Poly &result, const Poly &f, const Poly &g) const
M2_arrayint support(const Poly &f) const
bool multi_degree(const Poly &f, monomial already_allocated_degree_vector) const
void var(Poly &result, int v) const
SumCollector * make_SumCollector() const
static FreeAlgebra * create(const Ring *K, const std::vector< std::string > &names, const PolynomialRing *degreeRing, const std::vector< int > °rees, const std::vector< int > &wtvecs, const std::vector< int > &heftVector)
void elem_text_out(buffer &o, const Poly &f, bool p_one, bool p_plus, bool p_parens) const
bool is_equal(const Poly &f, const Poly &g) const
long n_terms(const Poly &f) const
ring_elem eval(const RingMap *map, const Poly &f, int first_var) const
int compare_elems(const Poly &f, const Poly &g) const
void getMonomialReversed(Monom monom, std::vector< int > &result) const
void fromMonomial(const_monomial monom, MonomialInserter &result) const
const std::vector< std::string > & variableNames() const
void copy(const Monom &m, MonomialInserter &result) const
int index_of_variable(const Monom &m) const
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 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 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
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.
static M2FreeAlgebra * create(const Ring *K, const std::vector< std::string > &names, const PolynomialRing *degreeRing, const std::vector< int > °rees, 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 PolynomialRing * degreeRing() 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
void appendFromModuleMonom(Poly &f, const ModuleMonom &m) const
ring_elem fromModuleMonom(const ModuleMonom &m) const
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...
Abstract base for the engine's polynomial-ring hierarchy.
virtual void text_out(buffer &o) const =0
virtual ring_elem invert(const ring_elem f) const =0
virtual ring_elem from_long(long n) const =0
virtual void elem_text_out(buffer &o, const ring_elem f, bool p_one=true, bool p_plus=false, bool p_parens=false) const =0
long characteristic() const
virtual ring_elem copy(const ring_elem f) const =0
virtual bool from_rational(const mpq_srcptr q, ring_elem &result) const =0
static RingElement * make_raw(const Ring *R, ring_elem f)
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
Abstract incremental accumulator that builds a ring_elem from many add(f) calls.
namespace exc — internal C++ exception types and the TRY / CATCH macro pair.
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define sizeofarray(s, len)
struct engine_RawArrayPair_struct * engine_RawArrayPair
engine_RawArrayPair engine_RawArrayPairOrNull
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
EngineMonomial — opaque single-monomial value type used at the engine boundary.
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
TermIterator< Nterm > end(Nterm *)
Singly linked-list node carrying one term of a polynomial-ring element.
const void * get_Poly() const