# Morphisms¶

Morphisms

AUTHORS:

• William Stein: initial version
• David Joyner (12-17-2005): added examples
class sage.categories.morphism.CallMorphism

INPUT:

There can be one or two arguments of this init method. If it is one argument, it must be a hom space. If it is two arguments, it must be two parent structures that will be domain and codomain of the map-to-be-created.

TESTS:

sage: from sage.categories.map import Map


Using a hom space:

sage: Map(Hom(QQ, ZZ, Rings()))
Generic map:
From: Rational Field
To:   Integer Ring


Using domain and codomain:

sage: Map(QQ['x'], SymmetricGroup(6))
Generic map:
From: Univariate Polynomial Ring in x over Rational Field
To:   Symmetric group of order 6! as a permutation group

class sage.categories.morphism.FormalCoercionMorphism
class sage.categories.morphism.IdentityMorphism
class sage.categories.morphism.Morphism

Bases: sage.categories.map.Map

INPUT:

There can be one or two arguments of this init method. If it is one argument, it must be a hom space. If it is two arguments, it must be two parent structures that will be domain and codomain of the map-to-be-created.

TESTS:

sage: from sage.categories.map import Map


Using a hom space:

sage: Map(Hom(QQ, ZZ, Rings()))
Generic map:
From: Rational Field
To:   Integer Ring


Using domain and codomain:

sage: Map(QQ['x'], SymmetricGroup(6))
Generic map:
From: Univariate Polynomial Ring in x over Rational Field
To:   Symmetric group of order 6! as a permutation group

category()

Return the category of the parent of this morphism.

EXAMPLES:

sage: R.<t> = ZZ[]
sage: f = R.hom([t**2])
sage: f.category()
Category of endsets of unital magmas and right modules over (euclidean domains and infinite enumerated sets) and left modules over (euclidean domains and infinite enumerated sets)

sage: K = CyclotomicField(12)
sage: L = CyclotomicField(132)
sage: phi = L._internal_coerce_map_from(K)
sage: phi.category()

is_endomorphism()

Return True if this morphism is an endomorphism.

EXAMPLES:

sage: R.<t> = ZZ[]
sage: f = R.hom([t])
sage: f.is_endomorphism()
True

sage: K = CyclotomicField(12)
sage: L = CyclotomicField(132)
sage: phi = L._internal_coerce_map_from(K)
sage: phi.is_endomorphism()
False

is_identity()

Return True if this morphism is the identity morphism.

Note

Implemented only when the domain has a method gens()

EXAMPLES:

sage: R.<t> = ZZ[]
sage: f = R.hom([t])
sage: f.is_identity()
True
sage: g = R.hom([t+1])
sage: g.is_identity()
False


A morphism between two different spaces cannot be the identity:

sage: R2.<t2> = QQ[]
sage: h = R.hom([t2])
sage: h.is_identity()
False


AUTHOR:

• Xavier Caruso (2012-06-29)
pushforward(I)
register_as_coercion()

Register this morphism as a coercion to Sage’s coercion model (see sage.structure.coerce).

EXAMPLES:

By default, adding polynomials over different variables triggers an error:

sage: X.<x> = ZZ[]
sage: Y.<y> = ZZ[]
sage: x^2 + y
Traceback (most recent call last):
...
TypeError: unsupported operand parent(s) for '+': 'Univariate Polynomial Ring in x over Integer Ring' and 'Univariate Polynomial Ring in y over Integer Ring'


Let us declare a coercion from $$\ZZ[x]$$ to $$\ZZ[z]$$:

sage: Z.<z> = ZZ[]
sage: phi = Hom(X, Z)(z)
sage: phi(x^2+1)
z^2 + 1
sage: phi.register_as_coercion()


Now we can add elements from $$\ZZ[x]$$ and $$\ZZ[z]$$, because the elements of the former are allowed to be implicitly coerced into the later:

sage: x^2 + z
z^2 + z


Caveat: the registration of the coercion must be done before any other coercion is registered or discovered:

sage: phi = Hom(X, Y)(y)
sage: phi.register_as_coercion()
Traceback (most recent call last):
...
AssertionError: coercion from Univariate Polynomial Ring in x over Integer Ring to Univariate Polynomial Ring in y over Integer Ring already registered or discovered

register_as_conversion()

Register this morphism as a conversion to Sage’s coercion model

(see sage.structure.coerce).

EXAMPLES:

Let us declare a conversion from the symmetric group to $$\ZZ$$ through the sign map:

sage: S = SymmetricGroup(4)
sage: phi = Hom(S, ZZ)(lambda x: ZZ(x.sign()))
sage: x = S.an_element(); x
(1,2,3,4)
sage: phi(x)
-1
sage: phi.register_as_conversion()
sage: ZZ(x)
-1

class sage.categories.morphism.SetMorphism

INPUT:

• parent – a Homset
• function – a Python function that takes elements of the domain as input and returns elements of the domain.

EXAMPLES:

sage: from sage.categories.morphism import SetMorphism
sage: f = SetMorphism(Hom(QQ, ZZ, Sets()), numerator)
sage: f.parent()
Set of Morphisms from Rational Field to Integer Ring in Category of sets
sage: f.domain()
Rational Field
sage: f.codomain()
Integer Ring
sage: TestSuite(f).run()

sage.categories.morphism.is_Morphism(x)
sage.categories.morphism.make_morphism(_class, parent, _dict, _slots)

Homsets

Functors