PolyRing is an abstract class (inheriting from ring
) representing
rings of polynomials with coefficients in a commutative ring
R
.
The polynomials may be (dense) univariate or (sparse) multivariate.
See RingElem
PolyRing for operations on its elements, but
only a few operations are available at this level of abstraction:
see RingElem
SparsePolyRing or RingElem
DenseUPolyRing for more
operations on polynomials of SparsePolyRing
or DenseUPolyRing
.
There are several functions to create polynomial rings: see
SparsePolyRing
constructors for the sparse implementation and
DenseUPolyRing
constructors for the dense (univariate) implementation.
PolyRing(R)
-- sort of downcast the ring R
to a poly ring;
will throw an ErrorInfo
object with code ERR::NotPolyRing
if needed.
Let R
be an object of type ring
.
IsPolyRing(R)
-- true
if R
is actually PolyRing
PolyRingPtr(R)
-- pointer to impl of R
(for calling mem fns);
will throw an ErrorInfo
object with code ERR::NotPolyRing
if needed
In addition to the standard ring
operations, a PolyRing
may be
used in other functions.
Let P
be an object of type PolyRing
.
NumIndets(P)
-- the number of indeterminates in P
CoeffRing(P)
-- the ring of coefficients of P
indets(P)
-- a const std::vector of RingElem
s whose i-th
element is the i-th indeterminate in P
indets(P, str)
-- a std::vector of RingElem
s with all
indeterminates in P
whose head is the string str
indet(P,i)
-- the i
-th indet of P
as a RingElem
IndetPower(P,i,n)
-- the n
-th power of the i
-th indet of P
as a RingElem
Let P
be an object of type PolyRing
.
Let R
be an object of type ring
.
CoeffEmbeddingHom(P)
CoeffRing(P)
into P
PolyRingHom(P, R, CoeffHom, IndetImages)
P
to R
which maps the coeffs using CoeffHom
, and
maps the k-th indet into IndetImages[k]
EvalHom(P, IndetImages)
P
to CoeffRing(P)
which is the identity
on the coeffs, and maps the kth indet into IndetImages[k]
PolyAlgebraHom(P, R, IndetImages)
IndetImages[k]
The hard part has been deciding which member functions should be in
PolyRingBase
and which should be in less abstract classes. If you
want to modify the code here, you should probably also look at
SparsePolyRing
and DUPolyRing
before messing with the code!
The implementations in PolyRing.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.
What precisely should the fancy version of deriv do? What are permitted values for the second arg? Must coeff=1? What if the second arg does not have precisely one term?
The range of member functions on RawValues is rather a hotch-potch. Hopefully, experience and use of the code will bring some better order to the chaos.
Verify the true need for myRemoveBigContent
, myMulByCoeff
,
myDivByCoeff
. If the coeff ring has zero divisors then
myMulByCoeff
could change the structure of the poly!
Maintainer doc is largely absent.