# 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

$\underbrace{M^*\times\cdots\times M^*}_{p\ \; \mbox{times}} \longrightarrow R$

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

$\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$$). 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)

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 ExtPowerDualFreeModule inherits from the class FiniteRankFreeModule.

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


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)


A is 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


A is 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


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


while non-zero 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


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


The exterior powers are unique:

sage: A is M.dual_exterior_power(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^*


Since any tensor of type (0,1) is a linear form, there is a coercion map from the set $$T^{(0,1)}(M)$$ of such tensors to $$M^*$$:

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


There is also a coercion map in the reverse direction:

sage: T01.has_coerce_map_from(M.dual())
True


For a degree $$p\geq 2$$, the coercion holds only in the direction $$\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


The coercion map $$T^{(0,1)}(M) \rightarrow M^*$$ in action:

sage: b = T01([-2,1,4], basis=e, name='b') ; b
Type-(0,1) tensor b on the Rank-3 free module M over the Integer Ring
sage: b.display(e)
b = -2 e^0 + e^1 + 4 e^2
sage: lb = M.dual()(b) ; lb
Linear form b on the Rank-3 free module M over the Integer Ring
sage: lb.display(e)
b = -2 e^0 + e^1 + 4 e^2


The coercion map $$M^* \rightarrow T^{(0,1)}(M)$$ in action:

sage: tlb = T01(lb) ; tlb
Type-(0,1) tensor b on the Rank-3 free module M over the Integer Ring
sage: tlb == b
True


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)

Element
base_module()

Return the free module on which self is constructed.

OUTPUT:

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

degree()

Return the degree of self.

OUTPUT:

• integer $$p$$ such that self is 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

class sage.tensor.modules.ext_pow_free_module.ExtPowerFreeModule(fmodule, degree, name=None, latex_name=None)

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 ExtPowerFreeModule inherits from the class FiniteRankFreeModule.

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


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)


A is 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


A is 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


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


while non-zero 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

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


The exterior powers are unique:

sage: A is M.exterior_power(2)
True


The exterior power $$\Lambda^1(M)$$ is nothing but $$M$$:

sage: M.exterior_power(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


Of course, there is no coercion in the reverse direction:

sage: 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

Element
base_module()

Return the free module on which self is constructed.

OUTPUT:

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

degree()

Return the degree of self.

OUTPUT:

• integer $$p$$ such that self is 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