Exterior powers of free modules¶
Given a free module \(M\) of finite rank over a commutative ring \(R\) and a positive integer \(p\), the \(p\)-th exterior power of \(M\) is the set \(\Lambda^p(M)\) of all alternating contravariant tensors of degree \(p\) on \(M\), i.e. of all multilinear maps
that vanish whenever any of two of their arguments are equal (\(M^*\) stands for the dual of \(M\)). Note that \(\Lambda^1(M) = M\). The exterior power \(\Lambda^p(M)\) is a free module of rank \(\binom{n}{p}\) over \(R\), where \(n\) is the rank of \(M\).
Similarly, the \(p\)-th exterior power of the dual of \(M\) is the set \(\Lambda^p(M^*)\) of all alternating forms of degree \(p\) on \(M\), i.e. of all multilinear maps
that vanish whenever any of two of their arguments are equal. Note that \(\Lambda^1(M^*) = M^*\) (the dual of \(M\)). The exterior power \(\Lambda^p(M^*)\) is a free module of rank \(\binom{n}{p}\) over \(R\), where \(n\) is the rank of \(M\).
The class ExtPowerFreeModule implements \(\Lambda^p(M)\), while
the class ExtPowerDualFreeModule implements \(\Lambda^p(M^*)\).
AUTHORS:
- Eric Gourgoulhon: initial version, regarding \(\Lambda^p(M^*)\) only (2015); add class for \(\Lambda^p(M)\) (2017) 
REFERENCES:
- class sage.tensor.modules.ext_pow_free_module.ExtPowerDualFreeModule(fmodule, degree, name=None, latex_name=None)[source]¶
- Bases: - FiniteRankFreeModule_abstract- Exterior power of the dual of a free module of finite rank over a commutative ring. - Given a free module \(M\) of finite rank over a commutative ring \(R\) and a positive integer \(p\), the \(p\)-th exterior power of the dual of \(M\) is the set \(\Lambda^p(M^*)\) of all alternating forms of degree \(p\) on \(M\), i.e. of all multilinear maps \[\underbrace{M\times\cdots\times M}_{p\ \; \mbox{times}} \longrightarrow R\]- that vanish whenever any of two of their arguments are equal. Note that \(\Lambda^1(M^*) = M^*\) (the dual of \(M\)). - \(\Lambda^p(M^*)\) is a free module of rank \(\binom{n}{p}\) over \(R\), where \(n\) is the rank of \(M\). Accordingly, the class - ExtPowerDualFreeModuleinherits from the class- FiniteRankFreeModule_abstract.- This is a Sage parent class, whose element class is - FreeModuleAltForm.- INPUT: - fmodule– free module \(M\) of finite rank, as an instance of- FiniteRankFreeModule
- degree– positive integer; the degree \(p\) of the alternating forms
- name– (default:- None) string; name given to \(\Lambda^p(M^*)\)
- latex_name– (default:- None) string; LaTeX symbol to denote \(\Lambda^p(M^*)\)
 - EXAMPLES: - 2nd exterior power of the dual of a free \(\ZZ\)-module of rank 3: - sage: M = FiniteRankFreeModule(ZZ, 3, name='M') sage: e = M.basis('e') sage: from sage.tensor.modules.ext_pow_free_module import ExtPowerDualFreeModule sage: A = ExtPowerDualFreeModule(M, 2) ; A 2nd exterior power of the dual of the Rank-3 free module M over the Integer Ring - >>> from sage.all import * >>> M = FiniteRankFreeModule(ZZ, Integer(3), name='M') >>> e = M.basis('e') >>> from sage.tensor.modules.ext_pow_free_module import ExtPowerDualFreeModule >>> A = ExtPowerDualFreeModule(M, Integer(2)) ; A 2nd exterior power of the dual of the Rank-3 free module M over the Integer Ring - Instead of importing ExtPowerDualFreeModule in the global name space, it is recommended to use the module’s method - dual_exterior_power():- sage: A = M.dual_exterior_power(2) ; A 2nd exterior power of the dual of the Rank-3 free module M over the Integer Ring sage: latex(A) \Lambda^{2}\left(M^*\right) - >>> from sage.all import * >>> A = M.dual_exterior_power(Integer(2)) ; A 2nd exterior power of the dual of the Rank-3 free module M over the Integer Ring >>> latex(A) \Lambda^{2}\left(M^*\right) - Ais a module (actually a free module) over \(\ZZ\):- sage: A.category() Category of finite dimensional modules over Integer Ring sage: A in Modules(ZZ) True sage: A.rank() 3 sage: A.base_ring() Integer Ring sage: A.base_module() Rank-3 free module M over the Integer Ring - >>> from sage.all import * >>> A.category() Category of finite dimensional modules over Integer Ring >>> A in Modules(ZZ) True >>> A.rank() 3 >>> A.base_ring() Integer Ring >>> A.base_module() Rank-3 free module M over the Integer Ring - Ais a parent object, whose elements are alternating forms, represented by instances of the class- FreeModuleAltForm:- sage: a = A.an_element() ; a Alternating form of degree 2 on the Rank-3 free module M over the Integer Ring sage: a.display() # expansion with respect to M's default basis (e) e^0∧e^1 sage: from sage.tensor.modules.free_module_alt_form import FreeModuleAltForm sage: isinstance(a, FreeModuleAltForm) True sage: a in A True sage: A.is_parent_of(a) True - >>> from sage.all import * >>> a = A.an_element() ; a Alternating form of degree 2 on the Rank-3 free module M over the Integer Ring >>> a.display() # expansion with respect to M's default basis (e) e^0∧e^1 >>> from sage.tensor.modules.free_module_alt_form import FreeModuleAltForm >>> isinstance(a, FreeModuleAltForm) True >>> a in A True >>> A.is_parent_of(a) True - Elements can be constructed from - A. In particular, 0 yields the zero element of- A:- sage: A(0) Alternating form zero of degree 2 on the Rank-3 free module M over the Integer Ring sage: A(0) is A.zero() True - >>> from sage.all import * >>> A(Integer(0)) Alternating form zero of degree 2 on the Rank-3 free module M over the Integer Ring >>> A(Integer(0)) is A.zero() True - while nonzero elements are constructed by providing their components in a given basis: - sage: e Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer Ring sage: comp = [[0,3,-1],[-3,0,4],[1,-4,0]] sage: a = A(comp, basis=e, name='a') ; a Alternating form a of degree 2 on the Rank-3 free module M over the Integer Ring sage: a.display(e) a = 3 e^0∧e^1 - e^0∧e^2 + 4 e^1∧e^2 - >>> from sage.all import * >>> e Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer Ring >>> comp = [[Integer(0),Integer(3),-Integer(1)],[-Integer(3),Integer(0),Integer(4)],[Integer(1),-Integer(4),Integer(0)]] >>> a = A(comp, basis=e, name='a') ; a Alternating form a of degree 2 on the Rank-3 free module M over the Integer Ring >>> a.display(e) a = 3 e^0∧e^1 - e^0∧e^2 + 4 e^1∧e^2 - An alternative is to construct the alternating form from an empty list of components and to set the nonzero components afterwards: - sage: a = A([], name='a') sage: a.set_comp(e)[0,1] = 3 sage: a.set_comp(e)[0,2] = -1 sage: a.set_comp(e)[1,2] = 4 sage: a.display(e) a = 3 e^0∧e^1 - e^0∧e^2 + 4 e^1∧e^2 - >>> from sage.all import * >>> a = A([], name='a') >>> a.set_comp(e)[Integer(0),Integer(1)] = Integer(3) >>> a.set_comp(e)[Integer(0),Integer(2)] = -Integer(1) >>> a.set_comp(e)[Integer(1),Integer(2)] = Integer(4) >>> a.display(e) a = 3 e^0∧e^1 - e^0∧e^2 + 4 e^1∧e^2 - The exterior powers are unique: - sage: A is M.dual_exterior_power(2) True - >>> from sage.all import * >>> A is M.dual_exterior_power(Integer(2)) True - The exterior power \(\Lambda^1(M^*)\) is nothing but \(M^*\): - sage: M.dual_exterior_power(1) is M.dual() True sage: M.dual() Dual of the Rank-3 free module M over the Integer Ring sage: latex(M.dual()) M^* - >>> from sage.all import * >>> M.dual_exterior_power(Integer(1)) is M.dual() True >>> M.dual() Dual of the Rank-3 free module M over the Integer Ring >>> latex(M.dual()) M^* - It also coincides with the module of type-\((0,1)\) tensors: - sage: M.dual_exterior_power(1) is M.tensor_module(0,1) True - >>> from sage.all import * >>> M.dual_exterior_power(Integer(1)) is M.tensor_module(Integer(0),Integer(1)) True - For a degree \(p\geq 2\), there is a coercion map \(\Lambda^p(M^*)\rightarrow T^{(0,p)}(M)\): - sage: T02 = M.tensor_module(0,2) ; T02 Free module of type-(0,2) tensors on the Rank-3 free module M over the Integer Ring sage: T02.has_coerce_map_from(A) True sage: A.has_coerce_map_from(T02) False - >>> from sage.all import * >>> T02 = M.tensor_module(Integer(0),Integer(2)) ; T02 Free module of type-(0,2) tensors on the Rank-3 free module M over the Integer Ring >>> T02.has_coerce_map_from(A) True >>> A.has_coerce_map_from(T02) False - The coercion map \(\Lambda^2(M^*)\rightarrow T^{(0,2)}(M)\) in action: - sage: ta = T02(a) ; ta Type-(0,2) tensor a on the Rank-3 free module M over the Integer Ring sage: ta.display(e) a = 3 e^0⊗e^1 - e^0⊗e^2 - 3 e^1⊗e^0 + 4 e^1⊗e^2 + e^2⊗e^0 - 4 e^2⊗e^1 sage: a.display(e) a = 3 e^0∧e^1 - e^0∧e^2 + 4 e^1∧e^2 sage: ta.symmetries() # the antisymmetry is of course preserved no symmetry; antisymmetry: (0, 1) - >>> from sage.all import * >>> ta = T02(a) ; ta Type-(0,2) tensor a on the Rank-3 free module M over the Integer Ring >>> ta.display(e) a = 3 e^0⊗e^1 - e^0⊗e^2 - 3 e^1⊗e^0 + 4 e^1⊗e^2 + e^2⊗e^0 - 4 e^2⊗e^1 >>> a.display(e) a = 3 e^0∧e^1 - e^0∧e^2 + 4 e^1∧e^2 >>> ta.symmetries() # the antisymmetry is of course preserved no symmetry; antisymmetry: (0, 1) - Element[source]¶
- alias of - FreeModuleAltForm
 - base_module()[source]¶
- Return the free module on which - selfis constructed.- OUTPUT: - instance of - FiniteRankFreeModulerepresenting the free module on which the exterior power is defined.
 - EXAMPLES: - sage: M = FiniteRankFreeModule(ZZ, 5, name='M') sage: A = M.dual_exterior_power(2) sage: A.base_module() Rank-5 free module M over the Integer Ring sage: A.base_module() is M True - >>> from sage.all import * >>> M = FiniteRankFreeModule(ZZ, Integer(5), name='M') >>> A = M.dual_exterior_power(Integer(2)) >>> A.base_module() Rank-5 free module M over the Integer Ring >>> A.base_module() is M True 
 - construction()[source]¶
- Return the functorial construction of - self.- This implementation just returns - None, as no functorial construction is implemented.
 - degree()[source]¶
- Return the degree of - self.- OUTPUT: - integer \(p\) such that - selfis the exterior power \(\Lambda^p(M^*)\)
 - EXAMPLES: - sage: M = FiniteRankFreeModule(ZZ, 5, name='M') sage: A = M.dual_exterior_power(2) sage: A.degree() 2 sage: M.dual_exterior_power(4).degree() 4 - >>> from sage.all import * >>> M = FiniteRankFreeModule(ZZ, Integer(5), name='M') >>> A = M.dual_exterior_power(Integer(2)) >>> A.degree() 2 >>> M.dual_exterior_power(Integer(4)).degree() 4 
 - zero()[source]¶
- Return the zero of - self.- EXAMPLES: - sage: M = FiniteRankFreeModule(ZZ, 3, name='M') sage: e = M.basis('e') sage: A = M.dual_exterior_power(2) sage: A.zero() Alternating form zero of degree 2 on the Rank-3 free module M over the Integer Ring sage: A(0) is A.zero() True - >>> from sage.all import * >>> M = FiniteRankFreeModule(ZZ, Integer(3), name='M') >>> e = M.basis('e') >>> A = M.dual_exterior_power(Integer(2)) >>> A.zero() Alternating form zero of degree 2 on the Rank-3 free module M over the Integer Ring >>> A(Integer(0)) is A.zero() True 
 
- class sage.tensor.modules.ext_pow_free_module.ExtPowerFreeModule(fmodule, degree, name=None, latex_name=None)[source]¶
- Bases: - FiniteRankFreeModule_abstract- Exterior power of a free module of finite rank over a commutative ring. - Given a free module \(M\) of finite rank over a commutative ring \(R\) and a positive integer \(p\), the \(p\)-th exterior power of \(M\) is the set \(\Lambda^p(M)\) of all alternating contravariant tensors of degree \(p\) on \(M\), i.e. of all multilinear maps \[\underbrace{M^*\times\cdots\times M^*}_{p\ \; \mbox{times}} \longrightarrow R\]- that vanish whenever any of two of their arguments are equal. Note that \(\Lambda^1(M) = M\). - \(\Lambda^p(M)\) is a free module of rank \(\binom{n}{p}\) over \(R\), where \(n\) is the rank of \(M\). Accordingly, the class - ExtPowerFreeModuleinherits from the class- FiniteRankFreeModule_abstract.- This is a Sage parent class, whose element class is - AlternatingContrTensor- INPUT: - fmodule– free module \(M\) of finite rank, as an instance of- FiniteRankFreeModule
- degree– positive integer; the degree \(p\) of the alternating elements
- name– (default:- None) string; name given to \(\Lambda^p(M)\)
- latex_name– (default:- None) string; LaTeX symbol to denote \(\Lambda^p(M)\)
 - EXAMPLES: - 2nd exterior power of the dual of a free \(\ZZ\)-module of rank 3: - sage: M = FiniteRankFreeModule(ZZ, 3, name='M') sage: e = M.basis('e') sage: from sage.tensor.modules.ext_pow_free_module import ExtPowerFreeModule sage: A = ExtPowerFreeModule(M, 2) ; A 2nd exterior power of the Rank-3 free module M over the Integer Ring - >>> from sage.all import * >>> M = FiniteRankFreeModule(ZZ, Integer(3), name='M') >>> e = M.basis('e') >>> from sage.tensor.modules.ext_pow_free_module import ExtPowerFreeModule >>> A = ExtPowerFreeModule(M, Integer(2)) ; A 2nd exterior power of the Rank-3 free module M over the Integer Ring - Instead of importing ExtPowerFreeModule in the global name space, it is recommended to use the module’s method - exterior_power():- sage: A = M.exterior_power(2) ; A 2nd exterior power of the Rank-3 free module M over the Integer Ring sage: latex(A) \Lambda^{2}\left(M\right) - >>> from sage.all import * >>> A = M.exterior_power(Integer(2)) ; A 2nd exterior power of the Rank-3 free module M over the Integer Ring >>> latex(A) \Lambda^{2}\left(M\right) - Ais a module (actually a free module) over \(\ZZ\):- sage: A.category() Category of finite dimensional modules over Integer Ring sage: A in Modules(ZZ) True sage: A.rank() 3 sage: A.base_ring() Integer Ring sage: A.base_module() Rank-3 free module M over the Integer Ring - >>> from sage.all import * >>> A.category() Category of finite dimensional modules over Integer Ring >>> A in Modules(ZZ) True >>> A.rank() 3 >>> A.base_ring() Integer Ring >>> A.base_module() Rank-3 free module M over the Integer Ring - Ais a parent object, whose elements are alternating contravariant tensors, represented by instances of the class- AlternatingContrTensor:- sage: a = A.an_element() ; a Alternating contravariant tensor of degree 2 on the Rank-3 free module M over the Integer Ring sage: a.display() # expansion with respect to M's default basis (e) e_0∧e_1 sage: from sage.tensor.modules.alternating_contr_tensor import AlternatingContrTensor sage: isinstance(a, AlternatingContrTensor) True sage: a in A True sage: A.is_parent_of(a) True - >>> from sage.all import * >>> a = A.an_element() ; a Alternating contravariant tensor of degree 2 on the Rank-3 free module M over the Integer Ring >>> a.display() # expansion with respect to M's default basis (e) e_0∧e_1 >>> from sage.tensor.modules.alternating_contr_tensor import AlternatingContrTensor >>> isinstance(a, AlternatingContrTensor) True >>> a in A True >>> A.is_parent_of(a) True - Elements can be constructed from - A. In particular, 0 yields the zero element of- A:- sage: A(0) Alternating contravariant tensor zero of degree 2 on the Rank-3 free module M over the Integer Ring sage: A(0) is A.zero() True - >>> from sage.all import * >>> A(Integer(0)) Alternating contravariant tensor zero of degree 2 on the Rank-3 free module M over the Integer Ring >>> A(Integer(0)) is A.zero() True - while nonzero elements are constructed by providing their components in a given basis: - sage: e Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer Ring sage: comp = [[0,3,-1],[-3,0,4],[1,-4,0]] sage: a = A(comp, basis=e, name='a') ; a Alternating contravariant tensor a of degree 2 on the Rank-3 free module M over the Integer Ring sage: a.display(e) a = 3 e_0∧e_1 - e_0∧e_2 + 4 e_1∧e_2 - >>> from sage.all import * >>> e Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer Ring >>> comp = [[Integer(0),Integer(3),-Integer(1)],[-Integer(3),Integer(0),Integer(4)],[Integer(1),-Integer(4),Integer(0)]] >>> a = A(comp, basis=e, name='a') ; a Alternating contravariant tensor a of degree 2 on the Rank-3 free module M over the Integer Ring >>> a.display(e) a = 3 e_0∧e_1 - e_0∧e_2 + 4 e_1∧e_2 - An alternative is to construct the alternating contravariant tensor from an empty list of components and to set the nonzero components afterwards: - sage: a = A([], name='a') sage: a.set_comp(e)[0,1] = 3 sage: a.set_comp(e)[0,2] = -1 sage: a.set_comp(e)[1,2] = 4 sage: a.display(e) a = 3 e_0∧e_1 - e_0∧e_2 + 4 e_1∧e_2 - >>> from sage.all import * >>> a = A([], name='a') >>> a.set_comp(e)[Integer(0),Integer(1)] = Integer(3) >>> a.set_comp(e)[Integer(0),Integer(2)] = -Integer(1) >>> a.set_comp(e)[Integer(1),Integer(2)] = Integer(4) >>> a.display(e) a = 3 e_0∧e_1 - e_0∧e_2 + 4 e_1∧e_2 - The exterior powers are unique: - sage: A is M.exterior_power(2) True - >>> from sage.all import * >>> A is M.exterior_power(Integer(2)) True - The exterior power \(\Lambda^1(M)\) is nothing but \(M\): - sage: M.exterior_power(1) is M True - >>> from sage.all import * >>> M.exterior_power(Integer(1)) is M True - For a degree \(p\geq 2\), there is a coercion \(\Lambda^p(M)\rightarrow T^{(p,0)}(M)\): - sage: T20 = M.tensor_module(2,0) ; T20 Free module of type-(2,0) tensors on the Rank-3 free module M over the Integer Ring sage: T20.has_coerce_map_from(A) True - >>> from sage.all import * >>> T20 = M.tensor_module(Integer(2),Integer(0)) ; T20 Free module of type-(2,0) tensors on the Rank-3 free module M over the Integer Ring >>> T20.has_coerce_map_from(A) True - Of course, there is no coercion in the reverse direction: - sage: A.has_coerce_map_from(T20) False - >>> from sage.all import * >>> A.has_coerce_map_from(T20) False - The coercion map \(\Lambda^2(M)\rightarrow T^{(2,0)}(M)\) in action: - sage: ta = T20(a) ; ta Type-(2,0) tensor a on the Rank-3 free module M over the Integer Ring sage: ta.display(e) a = 3 e_0⊗e_1 - e_0⊗e_2 - 3 e_1⊗e_0 + 4 e_1⊗e_2 + e_2⊗e_0 - 4 e_2⊗e_1 sage: a.display(e) a = 3 e_0∧e_1 - e_0∧e_2 + 4 e_1∧e_2 sage: ta.symmetries() # the antisymmetry is of course preserved no symmetry; antisymmetry: (0, 1) sage: ta == a # equality as type-(2,0) tensors True - >>> from sage.all import * >>> ta = T20(a) ; ta Type-(2,0) tensor a on the Rank-3 free module M over the Integer Ring >>> ta.display(e) a = 3 e_0⊗e_1 - e_0⊗e_2 - 3 e_1⊗e_0 + 4 e_1⊗e_2 + e_2⊗e_0 - 4 e_2⊗e_1 >>> a.display(e) a = 3 e_0∧e_1 - e_0∧e_2 + 4 e_1∧e_2 >>> ta.symmetries() # the antisymmetry is of course preserved no symmetry; antisymmetry: (0, 1) >>> ta == a # equality as type-(2,0) tensors True - Element[source]¶
- alias of - AlternatingContrTensor
 - base_module()[source]¶
- Return the free module on which - selfis constructed.- OUTPUT: - instance of - FiniteRankFreeModulerepresenting the free module on which the exterior power is defined.
 - EXAMPLES: - sage: M = FiniteRankFreeModule(ZZ, 5, name='M') sage: A = M.exterior_power(2) sage: A.base_module() Rank-5 free module M over the Integer Ring sage: A.base_module() is M True - >>> from sage.all import * >>> M = FiniteRankFreeModule(ZZ, Integer(5), name='M') >>> A = M.exterior_power(Integer(2)) >>> A.base_module() Rank-5 free module M over the Integer Ring >>> A.base_module() is M True 
 - construction()[source]¶
- Return the functorial construction of - self.- This implementation just returns - None, as no functorial construction is implemented.
 - degree()[source]¶
- Return the degree of - self.- OUTPUT: - integer \(p\) such that - selfis the exterior power \(\Lambda^p(M)\)
 - EXAMPLES: - sage: M = FiniteRankFreeModule(ZZ, 5, name='M') sage: A = M.exterior_power(2) sage: A.degree() 2 sage: M.exterior_power(4).degree() 4 - >>> from sage.all import * >>> M = FiniteRankFreeModule(ZZ, Integer(5), name='M') >>> A = M.exterior_power(Integer(2)) >>> A.degree() 2 >>> M.exterior_power(Integer(4)).degree() 4 
 - zero()[source]¶
- Return the zero of - self.- EXAMPLES: - sage: M = FiniteRankFreeModule(ZZ, 3, name='M') sage: e = M.basis('e') sage: A = M.exterior_power(2) sage: A.zero() Alternating contravariant tensor zero of degree 2 on the Rank-3 free module M over the Integer Ring sage: A(0) is A.zero() True - >>> from sage.all import * >>> M = FiniteRankFreeModule(ZZ, Integer(3), name='M') >>> e = M.basis('e') >>> A = M.exterior_power(Integer(2)) >>> A.zero() Alternating contravariant tensor zero of degree 2 on the Rank-3 free module M over the Integer Ring >>> A(Integer(0)) is A.zero() True