WARNING THIS IS STILL A PRELIMINARY IMPLEMENTATION as indicated by
the names of the implementation files:
This class is for dealing with lists of power-products.
This class has been designed to be used by monomial ideal operations, Hilbert, and Mayer-Vietoris trees.
The key functions interpret the list as generators of a monomial ideal: interreduction, divisibility test (ideal membership), lcms (ideal intersection).
The elements are
PPWithMask, to make fast divisibility tests.
Constructor requires a
PPMonoid and a
DivMask), so that the user can choose the best suited
implementations (mostly depending on the number of indeterminates and
on the size of the exponents).
Member fields are
PPMonoid myPPM; DivMaskRule myDMR; std::vector<PPWithMask> myVec;
PPVector(PPMonoid PPM, DivMaskRule DMR);
PPVector(PPMonoid PPM, DivMaskRule DMR, const std::vector<RingElem>& v);
bool IsEmpty(const PPVector& PPs)
bool IsDivisible(const PPWithMask& pp, const PPVector& ByL);true is pp is divisible by an element of L
bool IsDivisible(ConstRefPPMonoidElem pp, const PPVector& ByL);true is pp is divisible by an element of L
void interreduce(PPVector& PPs);interreduce PPs (NOT exception clean)
void InterreduceSort(PPVector& PPs);interreduce and sort PPs (NOT exception clean)
void lcms(PPVector& PPs, const PPVector& PPs1, const PPVector& PPs2);all the lcm between elements of PPs1 and PPs2, effectively the generators of the intersection ideal
PPMonoid PPM(const PPVector& PPs)
DivMaskRule DMR(const PPVector& PPs)
std::ostream& operator<<(std::ostream&, PPVector)
long len(const PPVector& PPs)
void convert(std::vector<RingElem>& v, ring P, const PPVector& PPs)converts PP's into RingElem's
void convert(PPVector PPs, const std::vector<RingElem>& v)converts vector<RingElem> (if monomial!) into PPVector
void PushBack(PPVector& PPs, ConstRefPPMonoidElem pp)if owner(pp) != PPM(PPs) it maps it
void PushBackPopBack(PPVector& ToPPs, PPVector& FromPPs)move last PP from
void swap(PPVector& PPs1, PPVector& PPs2)swap PPs1 and PPs1
There was an attempt to make it an abstract class,
PPVectorElem, with the plan to have concrete classes a
PPMonoidElem, and of square-free pps
(which cannot make a
PPMonoid because x*x is not square-free).
But this failed because most operations would need to know the type of the elements in the vector making it more suitable for templates. But
So it was sadly abandoned.