# Sets of morphisms between free modules¶

The class FreeModuleHomset implements sets of homomorphisms between two free modules of finite rank over the same commutative ring.

AUTHORS:

• Eric Gourgoulhon, Michal Bejger (2014-2015): initial version

REFERENCES:

class sage.tensor.modules.free_module_homset.FreeModuleHomset(fmodule1, fmodule2, name=None, latex_name=None)

Set of homomorphisms between free modules of finite rank over a commutative ring.

Given two free modules $$M$$ and $$N$$ of respective ranks $$m$$ and $$n$$ over a commutative ring $$R$$, the class FreeModuleHomset implements the set $$\mathrm{Hom}(M,N)$$ of homomorphisms $$M\rightarrow N$$. The set $$\mathrm{Hom}(M,N)$$ is actually a free module of rank $$mn$$ over $$R$$, but this aspect is not taken into account here.

This is a Sage parent class, whose element class is FiniteRankFreeModuleMorphism.

INPUT:

• fmodule1 – free module $$M$$ (domain of the homomorphisms), as an instance of FiniteRankFreeModule
• fmodule2 – free module $$N$$ (codomain of the homomorphisms), as an instance of FiniteRankFreeModule
• name – (default: None) string; name given to the hom-set; if none is provided, Hom(M,N) will be used
• latex_name – (default: None) string; LaTeX symbol to denote the hom-set; if none is provided, $$\mathrm{Hom}(M,N)$$ will be used

EXAMPLES:

Set of homomorphisms between two free modules over $$\ZZ$$:

sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
sage: H = Hom(M,N) ; H
Set of Morphisms from Rank-3 free module M over the Integer Ring
to Rank-2 free module N over the Integer Ring
in Category of finite dimensional modules over Integer Ring
sage: type(H)
<class 'sage.tensor.modules.free_module_homset.FreeModuleHomset_with_category_with_equality_by_id'>
sage: H.category()
Category of homsets of modules over Integer Ring


Hom-sets are cached:

sage: H is Hom(M,N)
True


The LaTeX formatting is:

sage: latex(H)
\mathrm{Hom}\left(M,N\right)


As usual, the construction of an element is performed by the __call__ method; the argument can be the matrix representing the morphism in the default bases of the two modules:

sage: e = M.basis('e')
sage: f = N.basis('f')
sage: phi = H([[-1,2,0], [5,1,2]]) ; phi
Generic morphism:
From: Rank-3 free module M over the Integer Ring
To:   Rank-2 free module N over the Integer Ring
sage: phi.parent() is H
True


An example of construction from a matrix w.r.t. bases that are not the default ones:

sage: ep = M.basis('ep', latex_symbol=r"e'")
sage: fp = N.basis('fp', latex_symbol=r"f'")
sage: phi2 = H([[3,2,1], [1,2,3]], bases=(ep,fp)) ; phi2
Generic morphism:
From: Rank-3 free module M over the Integer Ring
To:   Rank-2 free module N over the Integer Ring


The zero element:

sage: z = H.zero() ; z
Generic morphism:
From: Rank-3 free module M over the Integer Ring
To:   Rank-2 free module N over the Integer Ring
sage: z.matrix(e,f)
[0 0 0]
[0 0 0]


The test suite for H is passed:

sage: TestSuite(H).run()


The set of homomorphisms $$M\rightarrow M$$, i.e. endomorphisms, is obtained by the function End:

sage: End(M)
Set of Morphisms from Rank-3 free module M over the Integer Ring
to Rank-3 free module M over the Integer Ring
in Category of finite dimensional modules over Integer Ring


End(M) is actually identical to Hom(M,M):

sage: End(M) is Hom(M,M)
True


The unit of the endomorphism ring is the identity map:

sage: End(M).one()
Identity endomorphism of Rank-3 free module M over the Integer Ring


whose matrix in any basis is of course the identity matrix:

sage: End(M).one().matrix(e)
[1 0 0]
[0 1 0]
[0 0 1]


There is a canonical identification between endomorphisms of $$M$$ and tensors of type $$(1,1)$$ on $$M$$. Accordingly, coercion maps have been implemented between $$\mathrm{End}(M)$$ and $$T^{(1,1)}(M)$$ (the module of all type-$$(1,1)$$ tensors on $$M$$, see TensorFreeModule):

sage: T11 = M.tensor_module(1,1) ; T11
Free module of type-(1,1) tensors on the Rank-3 free module M over
the Integer Ring
sage: End(M).has_coerce_map_from(T11)
True
sage: T11.has_coerce_map_from(End(M))
True


See TensorFreeModule for examples of the above coercions.

There is a coercion $$\mathrm{GL}(M) \rightarrow \mathrm{End}(M)$$, since every automorphism is an endomorphism:

sage: GL = M.general_linear_group() ; GL
General linear group of the Rank-3 free module M over the Integer Ring
sage: End(M).has_coerce_map_from(GL)
True


Of course, there is no coercion in the reverse direction, since only bijective endomorphisms are automorphisms:

sage: GL.has_coerce_map_from(End(M))
False


The coercion $$\mathrm{GL}(M) \rightarrow \mathrm{End}(M)$$ in action:

sage: a = GL.an_element() ; a
Automorphism of the Rank-3 free module M over the Integer Ring
sage: a.matrix(e)
[ 1  0  0]
[ 0 -1  0]
[ 0  0  1]
sage: ea = End(M)(a) ; ea
Generic endomorphism of Rank-3 free module M over the Integer Ring
sage: ea.matrix(e)
[ 1  0  0]
[ 0 -1  0]
[ 0  0  1]

Element
one()

Return the identity element of self considered as a monoid (case of an endomorphism set).

This applies only when the codomain of self is equal to its domain, i.e. when self is of the type $$\mathrm{Hom}(M,M)$$.

OUTPUT:

EXAMPLES:

Identity element of the set of endomorphisms of a free module over $$\ZZ$$:

sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
sage: e = M.basis('e')
sage: H = End(M)
sage: H.one()
Identity endomorphism of Rank-3 free module M over the Integer Ring
sage: H.one().matrix(e)
[1 0 0]
[0 1 0]
[0 0 1]
sage: H.one().is_identity()
True


NB: mathematically, H.one() coincides with the identity map of the free module $$M$$. However the latter is considered here as an element of $$\mathrm{GL}(M)$$, the general linear group of $$M$$. Accordingly, one has to use the coercion map $$\mathrm{GL}(M) \rightarrow \mathrm{End}(M)$$ to recover H.one() from M.identity_map():

sage: M.identity_map()
Identity map of the Rank-3 free module M over the Integer Ring
sage: M.identity_map().parent()
General linear group of the Rank-3 free module M over the Integer Ring
sage: H.one().parent()
Set of Morphisms from Rank-3 free module M over the Integer Ring
to Rank-3 free module M over the Integer Ring
in Category of finite dimensional modules over Integer Ring
sage: H.one() == H(M.identity_map())
True


Conversely, one can recover M.identity_map() from H.one() by means of a conversion $$\mathrm{End}(M)\rightarrow \mathrm{GL}(M)$$:

sage: GL = M.general_linear_group()
sage: M.identity_map() == GL(H.one())
True