Examples
User documentation
The class ideal
is for representing values which are ideals of some
ring
. There are several ways to create an ideal
:
NOTE: THIS SYNTAX WILL PROBABLY CHANGE
ideal I(r)
--I
is the principal ideal generated byr
(aRingElem
) in the ringowner(r)
ideal I(r1, r2)
--RingElem
s in the samering
ideal I(r1, r2, r3)
--RingElem
s in the samering
ideal I(r1, r2, r3, r4)
--RingElem
s in the samering
ideal I(R, gens)
--I
is the ideal ofR
generated by theRingElem
s of the C++vector<RingElem>
gens
, (all in the ringR
)ideal I(gens)
--gens
must be a non-emptyvector<RingElem>
all in the samering
; equivalent toI(owner(gens[0]), gens)
. Ifgens
is empty, throws ERROR.
If you want to make an ideal in R
with no generators use this syntax
ideal(R, vector<RingElem>() )
Operations
The permitted operations on ideal
s are:
let I
and J
be two ideals of the same ring
I+J
-- the sum of two idealsI += J
-- equivalent toI = I+J
intersection(I, J)
-- intersection of two idealscolon(I, J)
-- the quotient of two idealsRingOf(I)
-- the ring in which the idealI
residesNumGens(I)
-- length of list of generators ofI
gens(I)
-- a C++ vector<> ofRingElem
s which generateI
TidyGens(I)
-- see also GBasis (below); returns a C++ vector ofRingElem
s which generateI
(this generating set is in some way "reduced", and will never contain a zero element) It is also possible to store some information about an ideal: (NOTE: making an incorrect assertion using these functions may lead to a program crash, wrong result, or poorer run-time performance)I->UserAssertsIsPrime() to specify that I is known to be prime I->UserAssertsIsNotPrime() to specify that I is known not to be prime I->UserAssertsIsMaximal() to specify that I is known to be maximal I->UserAssertsIsNotMaximal() to specify that I is known not to be maximal
Queries
IsZero(I)
-- true iff the ideal is a zero idealIsOne(I)
-- true iff the ideal is the whole ringIsMaximal(I)
-- true iff the ideal is maximal in its ring (i.e. iff the quotient ring is a field)IsPrime(I)
-- true iff the ideal is prime (i.e. quotient ring has no zero-divisors)IsContained(I, J)
-- true iff the idealI
is a subset of the idealJ
I == J
-- true iff the ideals are equal (their generating sets may be different)IsElem(r, I)
-- true iffr
is an element of the idealI
Additional operations for ideals in a SparsePolyRing
GBasis(I)
-- returns a Groebner basis forI
using the term-ordering of the polynomial ring in whichI
resides; the basis is stored insideI
, so will not be recomputed in the future); equivalent toTidyGens
.ReducedGBasis(I)
-- likeGBasis
but guarantees that the result is a reduced basis.GBasisTimeout(I, Tmax)
-- likeGBasis
but will throw anInterruptedByTimeout
object if computation takes longer thanTmax
seconds.LT(I)
-- returns a monomial ideal, being the leading term ideal (also known as initial ideal)LF(I)
-- returns a homogeneous ideal, being the leading form ideal (forms of maximum degree)IdealOfGBasis(I)
-- returns a new ideal generated by the GBasis ofI
IdealOfMinGens(I)
-- returns a new ideal equal toI
but generated by a minimal set of gens (only for homogeneous ideals)PrimaryDecomposition(I)
-- returnsvector<ideal>
only for square free monomial ideals or zero-dim ideals(for now)QuotientBasis(I)
-- basis of the quotient as aK
-vector spaceQuotientBasisSorted(I)
-- same asQuotientBasis(I)
but elements are sorted into increasing order.AlexanderDual(I)
-- only for square free monomial ideals (for now)homog(h, I)
-- returns the homogenized ideal, with homogenization with the indeterminateh
, aRingElem
, indeterminate inRingOf(I)
MinPowerInIdeal(f, I)
-- returns the smallest integern
such thatpower(f,n)
is inI
; returns -1 if polynomialf
is not in the radical.
Additional queries
IsZeroDim(I)
-- true iffI
is zero-dimensional (and not the whole ring!)IsHomog(I)
-- true iffI
is homogeneousAreGensMonomial(I)
-- true iff givengens(I)
are all monomial. NB0
is NOT monomialAreGensSqFreeMonomial(I)
-- true iff givengens(I)
are all monomial and radical. NB0
is NOT monomialHasGBasis(I)
-- true iffGBasis(I)
has been computed and is storedIsInRadical(f, I)
--true
iffRingElem
f
is in the radical ofI
(generally faster thanIsElem(f, radical(I))
)
Using Frobby library
PrimaryDecompositionFrobby(I)
AlexanderDual(I)
,AlexanderDual(I, pp)
- and more...
Writing new types of ideal
Anyone who writes a new type of ring class will have to consider writing a new type of ideal class to go with that ring. The ideal class must be derived from the abstract class IdealBase (and to be instantiable must offer implementations of all pure virtual functions). Be especially careful to update the data members IamPrime and IamMaximal in the non-const member functions (add, intersection, and colon).
Some guidance may be obtained from looking at the FieldIdealImpl class which
implements ideals in a field (there are only two: ideal(0) and ideal(1)).
See the file FieldIdeal
.
Maintainer documentation for the classes ideal, IdealBase
The class ideal is little more than a reference counting smart pointer class pointing to an object of type derived from IdealBase. This approach allows many different implementations of ideals to be manipulated in a convenient and transparent manner using a common abstract interface.
The abstract class IdealBase specifies the interface which every concrete ideal class must offer. It is more complicated than one might expect partly because we want to allow the advanced user to tell the ideal whether it has certain important properties (which might be computationally expensive to determine automatically).
RadicalMembership: The implementation is straightforward (once you have learned the theory about "Rabinowitch's Trick"). We can be slightly clever when the ideal is homogeneous. (Can be terribly slow: see in test-RadicalMembership1.C for some commented out cases.)
Bugs, Shortcomings and other ideas
The maintainer documentation is still quite incomplete.
Shouldn't ideals be created by a function called NewIdeal???
I am not at all sure about the wisdom of having implemented IamPrime
and IamMaximal
. It seems to be terribly easy to forget to update
these values when ideal values are modified (e.g. in IdealBase::add).
It has also led to rather more complication that I would have liked.
BUT I don't see how to allow the user to state that an ideal is
maximal/prime without incurring such complication.
Functions to examine the bool3 flags could be handy for heuristic short-cuts when an ideal is already known to have a certain property.
Is it worth having a constructor for principal ideals generated by a number rather than a RingElem? e.g. NewIdeal(R,5) or NewIdeal(R,BigInt(5)).
Several member functions have names not in accordance with the coding conventions.
Main changes
2022
- March (v0.99800): added IsInRadical, MinPowerInIdeal; reorganized
2017
- February (v0.99543): added examples ex-ideal1 and ex-ideal2
2016
- November (v0.99543):
- added HasGBasis
- renamed AreGensSquareFreeMonomial into AreGensSqFreeMonomial -