The function CanonicalHom
can be used to create certain simple
canonical homomorphisms. If it is unable to produce the required
homomorphism then it will throw an exception of type ErrorInfo
having error code ERR::CanonicalHom
(see error
).
In all cases the syntax is:
CanonicalHom(domain, codomain)
You can use CanonicalHom
whenever the domain is RingZ
or RingQ
, or if
codomain
is formed from domain
in a single step. Here is a complete list
of the cases when CanonicalHom
will work:
domain == codomain
then result is IdentityHom
domain
is RingZ
then result is ZEmbeddingHom
domain
is RingQ
then result is QEmbeddingHom
(may be a partial hom)
codomain == FractionField(domain)
then result is fraction field EmbeddingHom
domain == CoeffRing(codomain)
then result is CoeffEmbeddingHom
codomain
is a quotient of domain
then result is QuotientingHom
Structurally simple and rather tedious. It is important that the cases of the
domain being RingZ
or RingQ
are tested last because the other cases offer
shortcuts (compared to ZEmbeddingHom
and QEmbeddingHom
).
JAA does not like the structure of the code. Also teh restriction to a "single step" seems artificial, but how to generalize this without perhaps producing annoying "semi-intelligent" code?
If you don't like goto
, have a go at rewriting the implementation. I'll
accept it so long as it is no more complicated than the current implementation!
Pity I cannot combine IsPolyRing
and AsPolyRing
to produce simpler code.
Are there any missing cases?