42 auto len =
p.numTerms();
52 len =
heap[i].numTerms();
61 len =
heap[i].numTerms();
72 if (
heap[i].numTerms() == 0)
continue;
92 const std::vector<std::string>& names,
94 const std::vector<int>& degrees,
95 const std::vector<int>& wtvecs,
96 const std::vector<int>& heftVector
107 std::shared_ptr<FreeMonoid> M
122 for (
auto a : f.mCoefficients)
125 f.mCoefficients.clear();
126 f.mMonomials.clear();
133 result.getCoeffInserter().push_back(a);
152 if (!worked)
return false;
160 auto& resultCoeff =
result.getCoeffInserter();
161 auto& resultMonom =
result.getMonomInserter();
162 resultCoeff.insert(resultCoeff.end(),
163 fBegin.cCoeffIterator(),
164 fEnd.cCoeffIterator());
165 resultMonom.insert(resultMonom.end(),
166 fBegin.cMonomIterator(),
167 fEnd.cMonomIterator());
176 auto& fCoeff = f.getCoeffInserter();
177 auto& fMonom = f.getMonomInserter();
178 auto& gCoeff = g.getCoeffInserter();
179 auto& gMonom = g.getMonomInserter();
194 int numVarsFound = 0;
195 std::vector<int> exp, exp2;
196 auto fIt = f.cbegin();
197 auto fEnd = f.cend();
199 for (
auto i = 0; i <
numVars(); i++)
202 for ( ; fIt != fEnd; fIt++)
213 if (numVarsFound ==
numVars())
break;
217 for (
int i = 0; i <
numVars(); i++)
218 if (exp2[i] > 0) exp.push_back(i);
223 result->array[next++] = i;
236 auto& resultCoeff =
result.getCoeffInserter();
237 auto& resultMonom =
result.getMonomInserter();
238 resultCoeff.push_back(coeff);
255 if (f.numTerms() != 1)
return false;
262 auto fIt = f.cbegin();
263 auto gIt = g.cbegin();
264 auto fEnd = f.cend();
265 auto gEnd = g.cend();
267 for ( ; ; fIt++, gIt++)
271 if (gIt == gEnd)
return EQ;
274 if (gIt == gEnd)
return GT;
279 if (cmp != 0)
return cmp;
284 if (cmp != 0)
return cmp;
290 if (f.numTerms() != g.numTerms())
return false;
291 if (f.getMonomVector() != g.getMonomVector())
return false;
292 auto fCoeffIt = f.cbeginCoeff();
293 auto gCoeffIt = g.cbeginCoeff();
294 auto fEnd = f.cendCoeff();
295 for ( ; fCoeffIt != fEnd ; fCoeffIt++, gCoeffIt++)
298 if (!cmp)
return false;
305 auto& outmonom =
result.getMonomInserter();
306 auto& outcoeff =
result.getCoeffInserter();
308 for (
auto i = f.cbeginMonom(); i != f.cendMonom(); ++i)
309 outmonom.push_back(*i);
311 for (
auto i=f.cbeginCoeff(); i != f.cendCoeff(); ++i)
316 Poly::const_iterator fBegin,
317 Poly::const_iterator fEnd,
318 Poly::const_iterator gBegin,
319 Poly::const_iterator gEnd,
322 auto& outcoeff =
result.getCoeffInserter();
323 auto& outmonom =
result.getMonomInserter();
327 while ((fBegin != fEnd) && (gBegin != gEnd))
329 auto fMon = fBegin.monom();
330 auto gMon = gBegin.monom();
331 auto fCoeff = fBegin.coeff();
332 auto gCoeff = gBegin.coeff();
340 outcoeff.push_back(coeffResult);
346 outcoeff.push_back(fCoeff);
355 outcoeff.push_back(coeffResult);
364 for ( ; gBegin != gEnd; gBegin++)
366 auto gMon = gBegin.monom();
367 auto gCoeff = gBegin.coeff();
371 outcoeff.push_back(coeffResult);
378 for ( ; fBegin != fEnd; fBegin++)
380 auto fMon = fBegin.monom();
381 auto fCoeff = fBegin.coeff();
382 outcoeff.push_back(fCoeff);
399 Poly::const_iterator fBegin,
400 Poly::const_iterator fEnd,
401 Poly::const_iterator gBegin,
402 Poly::const_iterator gEnd)
const
508 if (f.numTerms() <= g.numTerms())
510 for (
auto fIt = f.cbegin(); fIt != f.cend(); fIt++)
519 for (
auto gIt = g.cbegin(); gIt != g.cend(); gIt++)
536 auto& outcoeff =
result.getCoeffInserter();
537 auto& outmonom =
result.getMonomInserter();
538 for(
auto i=f.cbegin(); i != f.cend(); i++)
545 outcoeff.push_back(d);
558 Monom tmpMonom(tmp.data());
569 auto& outcoeff =
result.getCoeffInserter();
570 auto& outmonom =
result.getMonomInserter();
571 for(
auto i=f.cbegin(); i != f.cend(); i++)
577 outcoeff.push_back(d);
589 Monom tmpMonom(tmp.data());
598 const Monom rightM)
const
601 auto& outcoeff =
result.getCoeffInserter();
602 auto& outmonom =
result.getMonomInserter();
603 for(
auto i=f.cbegin(); i != f.cend(); i++)
608 outcoeff.push_back(d);
609 monoid().
mult3(leftM, i.monom(), rightM, outmonom);
616 const Monom rightM)
const
619 auto& outcoeff =
result.getCoeffInserter();
620 auto& outmonom =
result.getMonomInserter();
621 for(
auto i=f.cbegin(); i != f.cend(); i++)
623 outcoeff.push_back(i.coeff());
624 monoid().
mult3(leftM, i.monom(), rightM, outmonom);
632 const Word& rightW)
const
637 Monom leftTmpMonom(leftTmp.data());
638 Monom rightTmpMonom(rightTmp.data());
647 const Word& rightW)
const
652 Monom leftTmpMonom(leftTmp.data());
653 Monom rightTmpMonom(rightTmp.data());
672 auto& outcoeff =
result.getCoeffInserter();
673 auto& outmonom =
result.getMonomInserter();
674 outcoeff.insert(outcoeff.end(),f.cbeginCoeff(),f.cbeginCoeff()+1);
675 outmonom.insert(outmonom.end(),f.cbeginMonom(),f.cbeginMonom()+*(f.cbeginMonom()));
681 auto& outcoeff = f.getCoeffInserter();
682 auto& outmonom = f.getMonomInserter();
683 outcoeff.insert(outcoeff.end(),g.cbeginCoeff(),g.cendCoeff());
684 outmonom.insert(outmonom.end(),g.cbeginMonom(),g.cendMonom());
690 auto& outcoeff = f.getCoeffInserter();
691 auto& outmonom = f.getMonomInserter();
692 outcoeff.push_back(coeff);
693 outmonom.insert(outmonom.end(),monom.
begin(), monom.
end());
700 for (
int i=0; i<n; i++)
721 if (mpz_sgn(n) > 0 and n1.first)
725 ERROR(
"exponent too large");
750 for (
auto i = f.cbegin(); i != f.cend(); ++i)
763 auto& outmonom =
result.getMonomInserter();
764 auto& outcoeff =
result.getCoeffInserter();
766 for (
auto i = f.cbeginMonom(); i != f.cendMonom(); ++i)
767 outmonom.push_back(*i);
769 for (
auto i=f.cbeginCoeff(); i != f.cendCoeff(); ++i)
776 for (
auto iter = f.beginCoeff(); iter != f.endCoeff(); ++iter)
786 if (f.numTerms() == 0)
792 bool two_terms = (f.numTerms() > 1);
793 bool needs_parens = p_parens && two_terms;
796 if (p_plus) o <<
'+';
801 for (
auto i = f.cbegin(); i != f.cend(); i++)
805 bool p_one_this = (is_one && needs_parens) || (is_one && p_one);
812 if (needs_parens) o <<
')';
818 if (f.numTerms() <= 1)
return true;
824 for (++i; i !=
end; ++i)
839 monomial already_allocated_degree_vector)
const
841 monomial degVec = already_allocated_degree_vector;
846 for (++i; i != f.cend(); ++i)
864 if (i == f.cend())
return std::make_pair(0,
true);
867 for (++i; i != f.cend(); ++i)
871 if (thisheft != maxheft)
874 if (thisheft > maxheft)
878 return std::make_pair(maxheft, ishomog);
std::ostream & operator<<(std::ostream &o, const FreeAlgebraElement &f)
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.
Polynomial< CoefficientRingType > Poly
Modern Monom / Polynomial value types shared by NC algebras and the refactored F4.
Word and WordWithData — non-owning views over the flat-int encoding of a non-commutative word.
Legacy RingZZ — a Ring-derived integer ring backed by GMP mpz_t.
Append-only GC-backed byte buffer used throughout the engine for text output.
const Ring * coefficientRing() const
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 copy(Poly &result, Poly::const_iterator fBegin, Poly::const_iterator fEnd) const
void mult_by_term_right(Poly &result, const Poly &f, const ring_elem c, const Monom m) const
void add_to_end(Poly &f, const Poly &g) const
void from_long(Poly &result, long n) const
void mult_by_term_left(Poly &result, const Poly &f, const ring_elem c, const Monom m) const
void makeMonicInPlace(Poly &f) const
std::pair< int, bool > heft_degree(const Poly &f) const
void from_coefficient(Poly &result, const ring_elem a) const
bool is_homogeneous(const Poly &f) const
void subtractScalarMultipleOf(Poly &result, const Poly &f, const Poly &g, ring_elem coeff) const
void mult(Poly &result, const Poly &f, const Poly &g) const
bool from_rational(Poly &result, const mpq_srcptr q) const
M2_arrayint support(const Poly &f) const
bool multi_degree(const Poly &f, monomial already_allocated_degree_vector) const
void mult_by_coeff(Poly &result, const Poly &f, const ring_elem c) const
void clear(Poly &f) const
void var(Poly &result, int v) const
const Monoid & degreeMonoid() const
Word lead_word_prefix(const Poly &f, int endIndex) const
const Ring & mCoefficientRing
SumCollector * make_SumCollector() const
FreeAlgebra(const Ring *K, std::shared_ptr< FreeMonoid > M)
Word lead_word(const Poly &f) const
const FreeMonoid & monoid() const
void lead_term_as_poly(Poly &result, const Poly &f) const
bool is_zero(const Poly &f) 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 makeMonic(Poly &result, Poly &f) const
void mult_by_term_left_and_right(Poly &result, const Poly &f, const ring_elem c, const Monom leftM, const Monom rightM) const
void from_word(Poly &result, const Word &word) const
void swap(Poly &f, Poly &g) const
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
std::shared_ptr< FreeMonoid > mMonoid
ring_elem eval(const RingMap *map, const Poly &f, int first_var) const
void from_int(Poly &result, mpz_srcptr n) const
int compare_elems(const Poly &f, const Poly &g) const
Word lead_word_suffix(const Poly &f, int beginIndex) const
void addScalarMultipleOf(Poly &result, Poly::const_iterator fBegin, Poly::const_iterator fEnd, Poly::const_iterator gBegin, Poly::const_iterator gEnd, ring_elem coeff) const
void setZero(Poly &f) const
const FreeAlgebra & ring() const
Owned Poly value paired with its FreeAlgebra*, providing natural operator-overloaded arithmetic.
FreeAlgebraHeap(const FreeAlgebra &F)
Geobucket-style accumulator for many Poly summands in the free associative algebra.
Free associative algebra over a coefficient ring: the non-commutative analogue of PolynomialRing.
void getMonomialReversed(Monom monom, std::vector< int > &result) const
void mult3(const Monom &m1, const Monom &m2, const Monom &m3, MonomialInserter &result) const
int wordHeft(Word &word) const
void support(const Monom &m, std::vector< int > &result) const
int compare(const Monom &m1, const Monom &m2) const
void monomInsertFromWord(MonomialInserter &result, const Word &w) const
void copy(const Monom &m, MonomialInserter &result) const
void elem_text_out(buffer &o, const Monom &m1) const
void wordFromMonom(Word &result, const Monom &m) const
void mult(const Monom &m1, const Monom &m2, MonomialInserter &result) const
void multi_degree(const Monom &m, monomial already_allocated_degree_vector) const
void one(MonomialInserter &m) const
void var(int v, MonomialInserter &result) const
void wordPrefixFromMonom(Word &result, const Monom &m, int endIndex) const
void wordSuffixFromMonom(Word &result, const Monom &m, int beginIndex) const
bool is_one(const Monom &m) const
The free non-commutative monoid on a set of named variables, with monomial ordering and degree / weig...
void lcm(const_monomial m, const_monomial n, monomial result) const
monomial make_one() const
void remove(monomial d) const
Abstract base for the engine's polynomial-ring hierarchy.
virtual void remove(ring_elem &f) const =0
virtual ring_elem divide(const ring_elem f, const ring_elem g) const =0
virtual bool is_unit(const ring_elem f) const =0
virtual ring_elem add(const ring_elem f, const ring_elem g) const =0
virtual bool is_equal(const ring_elem f, const ring_elem g) 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
virtual int compare_elems(const ring_elem f, const ring_elem g) const =0
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 ring_elem mult(const ring_elem f, const ring_elem g) const =0
virtual bool from_rational(const mpq_srcptr q, ring_elem &result) const =0
virtual SumCollector * make_SumCollector() const
const Ring * get_ring() const
ring_elem eval_term(const Ring *coeff_ring, const ring_elem coeff, const int *vp, int first_var, int nvars_in_source) const
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
static std::pair< bool, int > get_si(mpz_srcptr n)
virtual ring_elem getValue()=0
virtual void add(ring_elem f)=0
SumCollector adapter that funnels engine-side ring_elem adds into a FreeAlgebraHeap.
Abstract incremental accumulator that builds a ring_elem from many add(f) calls.
void init(const int *begin, const int *end)
Non-owning view of a non-commutative word: [begin, end) of int variable indices.
MPREAL_MSVC_DEBUGVIEW_DATA void clear(::mpfr_ptr)
const int heap_size[GEOHEAP_SIZE]
Engine error-reporting primitives: ERROR, INTERNAL_ERROR, error, error_message.
static int compare(const vecterm *t, const vecterm *s)
VALGRIND_MAKE_MEM_DEFINED & result(result)
M2_arrayint M2_makearrayint(int n)
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
void swap(mpfr::mpreal &x, mpfr::mpreal &y)
typename std::vector< T, gc_allocator< T > > gc_vector
a version of the STL vector, which allocates its backing memory with gc.
TermIterator< Nterm > end(Nterm *)
RingMap — engine representation of a ring homomorphism.
const int * begin() const
Non-owning view onto a [length, degree, v1, v2, ..., vn] packed monomial in some externally managed b...
const PolynomialRing * degreeRing(const std::vector< std::string > &names)