SparsePolyRing
is an abstract class (inheriting from PolyRing
)
representing rings of polynomials; in particular, rings of sparse
multivariate polynomials (e.g. written with *sparse representation*)
with a special view towards computing Groebner bases and other related
operations. This means that the operations offered by a
SparsePolyRing on its own values are strongly oriented towards those
needed by Buchberger's algorithm.
A polynomial is viewed abstractly as a formal sum of ordered terms;
each term is a formal product of a non-zero coefficient (belonging to
the coefficient ring
), and a power product of indeterminates
(belonging to the PPMonoid
of the polynomial ring). The ordering
is determined by the PPOrdering
on the power products: distinct
terms in a polynomial must have distinct power products. The zero
polynomial is conceptually the formal sum of no terms; all other
polynomials have a leading term being the one with the largest
power product (PPMonoidElem
) in the given ordering.
See RingElem
SparsePolyRing for operations on its elements.
Currently there are four functions to create a polynomial ring:
NewPolyRing(CoeffRing, NumIndets)
CoeffRing
and having NumIndets
indeterminates. The PP ordering is StdDegRevLex
.
CoCoALib chooses automatically some names for the indeterminates
(currently the names are x[0], x[1], ... , x[NumIndets-1]).
NewPolyRing(CoeffRing, IndetNames)
CoeffRing
and having indeterminates whose names are given in IndetNames
(which
is of type vector<symbol>
). The PP ordering is StdDegRevLex
.
NewPolyRing(CoeffRing, IndetNames, ord)
CoeffRing
and having indeterminates whose names are given in IndetNames
(which
is of type vector<symbol>
). The PP ordering is given by ord
.
NewPolyRing(CoeffRing, PPM)
CoeffRing
and
with power products in PPM
which is a power product monoid which specifies
how many indeterminates, their names, and the ordering on them.
Let R
be an object of type ring
.
IsSparsePolyRing(R)
-- true
if R
is actually SparsePolyRing
AsSparsePolyRing(R)
-- if R
is a SparsePolyRing
view it as such
In addition to the standard PolyRing
operations, a
SparsePolyRing
may be used in other functions.
Let P
be an object of type SparsePolyRing
.
PPM(P)
-- the PPMonoid of P
.
GradingDim(P)
-- the dimension of the grading on P
(may be 0).
A SparsePolyIter
(class defined in SparsePolyRing.H) is a way to
iterate through the summands in the polynomial without knowing the
(private) details of the concrete implementation currently in use.
(The idea is similar to C++ iterators for STL containers.)
Let f
denote a non-const element of P.
Let i1
and i2
be two SparsePolyIter
s running over the same polynomial.
BeginIter(f)
-- a SparsePolyIter
pointing to the first term in f
.
EndIter(f)
-- a SparsePolyIter
pointing to one-past-the-last term
in f
.
Changing the value of f
invalidates all iterators over f
.
coeff(i1)
-- read-only access to the coeff of the current term
PP(i1)
-- read-only access to the pp of the current term
++i1
-- advance i1
to next term, return new value of i1
i1++
-- advance i1
to next term, return copy of old value of i1
i1 == i2
-- true iff i1
and i2
point to the same term;
throws CoCoA::ErrorInfo
with code
ERR::MixedPolyIters
if i1
and i2
are over different polys.
i1 != i2
-- same as !(i1 == i2)
IsEnded(i1)
-- true iff i1
is pointing at the one-past-the-last term
The exact nature of a term in a polynomial is hidden from public view: it is not possible to get at any term in a polynomial by any publicly accessible function. This allows wider scope for trying different implementations of polynomials where the terms may be represented in some implicit manner. On the other hand, there are many cases where an algorithm needs to iterate over the terms in a polynomial; some of these algorithms are inside PolyRing (i.e. the abstract class offers a suitable interface), but many will have to be outside for reasons of modularity and maintainability. Hence the need to have iterators which run through the terms in a polynomial.
The implementations in SparsePolyRing.C are all very simple: they just conduct some sanity checks on the function arguments before passing them to the PolyRing member function which will actually do the work.
Too many of the iterator functions are inline. Make them out of line, then use profiler to decide which should be inline.
PushFront
and PushBack
do not verify that the ordering criteria are
satisfied.
Verify the true need for myContent
, myRemoveBigContent
, myMulByCoeff
,
myDivByCoeff
, myMul
(by pp). If the coeff ring has zero divisors then
myMulByCoeff
could change the structure of the poly!
Verify the need for these member functions: myIsZeroAddLCs, myMoveLM, myDeleteLM, myDivLM, myCmpLPP, myAppendClear, myAddClear, myAddMul, myReductionStep, myReductionStepGCD, myDeriv.
Should there be a RingHom accepting IndetImage (in case of univariate polys)?