QuotientRing

© 2005 John Abbott
GNU Free Documentation License, Version 1.2



CoCoALib Documentation Index

User documentation for QuotientRing

The type QuotientRing is used to represent rings constructed explicitly as quotients (of a ring by an ideal).

Examples

Constructors and Pseudo-constructors

Query and cast

Operations on QuotientRing

Given RmodI a QuotientRing representing R/I (where I is an ideal of the ring R):

Homomorphisms

Operations on RingElem of a QuotientRing

Maintainer documentation for QuotientRing, QuotientRingBase, GeneralQuotientRingImpl

While considering the design of this code it may help to keep in mind these two canonical implementations:

GeneralQuotientRingImpl
internally elements are represented as elements of a "representation ring" (which may differ from the base ring) which are kept reduced modulo some ideal (which may differ from the defining ideal)

RingFpImpl
internally elements are represented by machine integers (see doc for RingFpImpl), a representation incompatible with that used for elements of the ring of integers (which is probably the base ring)

QuotientRingBase is an abstract class derived from RingBase, and is the base class for all quotient rings. It adds the following four new pure virtual member functions which must be defined in every concrete quotient ring:

      virtual RingElem myCanonRepr(ConstRawValue r) const;
      virtual void myReduction(RawValue& image, ConstRawValue arg) const;
      virtual const RingHom& myQuotientingHom() const;
      virtual RingHom myInducedHomCtor(const RingHom& InducingHom) const;

The member function myCanonRepr has to return a copy of the value since we cannot be sure that the internal representation is compatible with the internal representation of elements of the base ring.

Bugs, Shortcomings and other ideas

IamGCDDomain always returns false. We can be clever in some easy cases, but it is hard in general (think of rings of algebraic integers which are gcd domains, but not euclidean domains).

Should NewZZmod(n) allow the case n==0? There's no mathematical reason to forbid it, but forbidding it may help detect programmer errors more quickly -- it seems unlikely that one would really want to quotient by ideal(0).

FAIRLY SERIOUS CONFUSION: the code seems to make REPEATED sanity checks see

    QuotientRingBase::QuotientRingBase
    NewQuotientRing
  
    QuotientRingHomBase::QuotientRingHomBase
    NewInducedHom

I suspect that the C++ ctors should use CoCoA_ASSERT instead of checking always (and throwing an exception).

FURTHER SERIOUS CONFUSION: there is ambiguity about the difference between myBaseRing and myReprRing esp. for creating induced homomorphisms: given ring R, and ring S = R/I, create ring T = S/J An induced hom from T should start from a hom with domain S; or is it reasonable to accept a hom with domain R? In this case for T myReprRing is R but myBaseRing is S.

Given a RingHom from a QuotientRing it is not generally possible to obtain a reference to an "inducing hom": consider the hom from ZZ/(2) to ZZ/(2)[x] created by CoeffEmbeddingHom. A RingHom equivalent to the inducing hom can be produced by composing QuotientingHom with the given hom.

20 March 2004: I have added the possibility of making a trivial ring by quotienting: previously this was disallowed for no good reason that I could discern.