# Free submodules of tensor modules defined by monoterm symmetries#

AUTHORS:

• Matthias Koeppe (2020-2022): initial version

class sage.tensor.modules.tensor_free_submodule.TensorFreeSubmodule_sym(fmodule, tensor_type, name=None, latex_name=None, sym=None, antisym=None, *, category=None, ambient=None)#

Class for free submodules of tensor products of free modules that are defined by some monoterm symmetries.

EXAMPLES:

sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
sage: e = M.basis('e')
sage: T60M = M.tensor_module(6, 0); T60M
Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring
sage: T60M._name
'T^(6, 0)(M)'
sage: latex(T60M)
T^{(6, 0)}\left(M\right)
sage: T40Sym45M = M.tensor_module(6, 0, sym=((4, 5))); T40Sym45M
Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring,
with symmetry on the index positions (4, 5)
sage: T40Sym45M._name
'T^{0,1,2,3}(M)⊗Sym^{4,5}(M)'
sage: latex(T40Sym45M)
T^{\{0,1,2,3\}}(M) \otimes \mathrm{Sym}^{\{4,5\}}(M)
sage: Sym0123x45M = M.tensor_module(6, 0, sym=((0, 1, 2, 3), (4, 5))); Sym0123x45M
Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring,
with symmetry on the index positions (0, 1, 2, 3),
with symmetry on the index positions (4, 5)
sage: Sym0123x45M._name
'Sym^{0,1,2,3}(M)⊗Sym^{4,5}(M)'
sage: latex(Sym0123x45M)
\mathrm{Sym}^{\{0,1,2,3\}}(M) \otimes \mathrm{Sym}^{\{4,5\}}(M)
sage: Sym012x345M = M.tensor_module(6, 0, sym=((0, 1, 2), (3, 4, 5))); Sym012x345M
Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring,
with symmetry on the index positions (0, 1, 2),
with symmetry on the index positions (3, 4, 5)
sage: Sym012x345M._name
'Sym^{0,1,2}(M)⊗Sym^{3,4,5}(M)'
sage: latex(Sym012x345M)
\mathrm{Sym}^{\{0,1,2\}}(M) \otimes \mathrm{Sym}^{\{3,4,5\}}(M)
sage: Sym012345M = M.tensor_module(6, 0, sym=((0, 1, 2, 3, 4, 5))); Sym012345M
Free module of fully symmetric type-(6,0) tensors
on the Rank-3 free module M over the Integer Ring
sage: Sym012345M._name
'Sym^6(M)'
sage: latex(Sym012345M)
\mathrm{Sym}^6(M)


Canonical injections from submodules are coercions:

sage: Sym0123x45M.has_coerce_map_from(Sym012345M)
True
sage: T60M.has_coerce_map_from(Sym0123x45M)
True
sage: t = e[0] * e[0] * e[0] * e[0] * e[0] * e[0]
sage: t.parent()
Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring
sage: Sym012345M(t) is t
False

construction()#

Return the functorial construction of self.

This implementation just returns None.

EXAMPLES:

sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
sage: Sym2M = M.tensor_module(2, 0, sym=range(2)); Sym2M
Free module of fully symmetric type-(2,0) tensors on the Rank-3 free module M over the Integer Ring
sage: Sym2M.construction() is None
True

is_submodule(other)#

Return True if self is a submodule of other.

EXAMPLES:

sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
sage: T60M = M.tensor_module(6, 0)
sage: Sym0123x45M = M.tensor_module(6, 0, sym=((0, 1, 2, 3), (4, 5)))
sage: Sym012x345M = M.tensor_module(6, 0, sym=((0, 1, 2), (3, 4, 5)))
sage: Sym012345M  = M.tensor_module(6, 0, sym=((0, 1, 2, 3, 4, 5)))
sage: Sym012345M.is_submodule(Sym012345M)
True
sage: Sym012345M.is_submodule(Sym0123x45M)
True
sage: Sym0123x45M.is_submodule(Sym012345M)
False
sage: Sym012x345M.is_submodule(Sym0123x45M)
False
sage: all(S.is_submodule(T60M) for S in (Sym0123x45M, Sym012x345M, Sym012345M))
True

lift()#

The lift (embedding) map from self to the ambient space.

EXAMPLES:

sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
sage: Sym0123x45M = M.tensor_module(6, 0, sym=((0, 1, 2, 3), (4, 5)))
sage: Sym0123x45M.lift
Generic morphism:
From: Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring,
with symmetry on the index positions (0, 1, 2, 3),
with symmetry on the index positions (4, 5)
To:   Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring

reduce()#

The reduce map.

This map reduces elements of the ambient space modulo this submodule.

EXAMPLES:

sage: M = FiniteRankFreeModule(QQ, 3, name='M')
sage: e = M.basis('e')
sage: X = M.tensor_module(6, 0)
sage: Y = M.tensor_module(6, 0, sym=((0, 1, 2, 3), (4, 5)))
sage: Y.reduce
Generic endomorphism of
Free module of type-(6,0) tensors on the 3-dimensional vector space M over the Rational Field
sage: t = e[0]*e[0]*e[0]*e[0]*e[1]*e[2]; t.disp()
e_0⊗e_0⊗e_0⊗e_0⊗e_1⊗e_2 = e_0⊗e_0⊗e_0⊗e_0⊗e_1⊗e_2
sage: r = Y.reduce(t); r
Type-(6,0) tensor on the 3-dimensional vector space M over the Rational Field
sage: r.disp()
1/2 e_0⊗e_0⊗e_0⊗e_0⊗e_1⊗e_2 - 1/2 e_0⊗e_0⊗e_0⊗e_0⊗e_2⊗e_1
sage: r.parent()._name
'T^(6, 0)(M)'


If the base ring is not a field, this may fail:

sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
sage: e = M.basis('e')
sage: X = M.tensor_module(6, 0)
sage: Y = M.tensor_module(6, 0, sym=((0, 1, 2, 3), (4, 5)))
sage: Y.reduce
Generic endomorphism of
Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring
sage: t = e[0]*e[0]*e[0]*e[0]*e[1]*e[2]; t.disp()
e_0⊗e_0⊗e_0⊗e_0⊗e_1⊗e_2 = e_0⊗e_0⊗e_0⊗e_0⊗e_1⊗e_2
sage: Y.reduce(t)
Traceback (most recent call last):
...
TypeError: no conversion of this rational to integer

retract()#

The retract map from the ambient space.

This is a partial map, which gives an error for elements not in the subspace.

Calling this map on elements of the ambient space is the same as calling the element constructor of self.

EXAMPLES:

sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
sage: e = M.basis('e')
sage: X = M.tensor_module(6, 0)
sage: Y = M.tensor_module(6, 0, sym=((0, 1, 2, 3), (4, 5)))
sage: e_Y = Y.basis('e')
sage: Y.retract
Generic morphism:
From: Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring
To:   Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring,
with symmetry on the index positions (0, 1, 2, 3),
with symmetry on the index positions (4, 5)

sage: t = e[0]*e[0]*e[0]*e[0]*e[1]*e[2]; t.disp()
e_0⊗e_0⊗e_0⊗e_0⊗e_1⊗e_2 = e_0⊗e_0⊗e_0⊗e_0⊗e_1⊗e_2
sage: Y.retract(t)
Traceback (most recent call last):
...
ValueError: this tensor does not have the symmetries of
Free module of type-(6,0) tensors on the Rank-3 free module M over the Integer Ring,
with symmetry on the index positions (0, 1, 2, 3),
with symmetry on the index positions (4, 5)
sage: t = e[0]*e[0]*e[0]*e[0]*e[1]*e[2] + e[0]*e[0]*e[0]*e[0]*e[2]*e[1]
sage: y = Y.retract(t); y
Type-(6,0) tensor on the Rank-3 free module M over the Integer Ring
sage: y.disp()
e_0⊗e_0⊗e_0⊗e_0⊗e_1⊗e_2 + e_0⊗e_0⊗e_0⊗e_0⊗e_2⊗e_1
sage: y.parent()._name
'Sym^{0,1,2,3}(M)⊗Sym^{4,5}(M)'