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)#

Bases: TensorFreeModule

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)'