Exterior powers of free modules - Tensors on free modules of finite rank

Skip to content
Back to top
View this page
Edit this page

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

- K. Conrad: Exterior powers [Con2013]

- Chap. 19 of S. Lang: Algebra [Lan2002]

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

  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 `ExtPowerDualFreeModule` inherits 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

      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

  Python

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

      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)

  [Python]

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

  `A` is a module (actually a free module) over \(\ZZ\):

  Sage

      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

  Python

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

  `A` is a parent object, whose elements are alternating forms, represented by instances of the class `FreeModuleAltForm`:

  Sage

      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

  [Python]

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

      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

  Python

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

      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

  [Python]

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

      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

  Python

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

      sage: A is M.dual_exterior_power(2)
      True

  [Python]

      >>> from sage.all import *
      >>> A is M.dual_exterior_power(Integer(2))
      True

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

  Sage

      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^*

  Python

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

      sage: M.dual_exterior_power(1) is M.tensor_module(0,1)
      True

  [Python]

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

      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

  Python

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

      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)

  [Python]

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

    alias of `FreeModuleAltForm`

  base_module()

    Return the free module on which `self` is constructed.

    OUTPUT:

    - instance of `FiniteRankFreeModule` representing the free module on which the exterior power is defined.

    EXAMPLES:

    Sage

        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

    Python

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

    Return the functorial construction of `self`.

    This implementation just returns `None`, as no functorial construction is implemented.

  degree()

    Return the degree of `self`.

    OUTPUT:

    - integer \(p\) such that `self` is the exterior power \(\Lambda^p(M^*)\)

    EXAMPLES:

    Sage

        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

    Python

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

    Return the zero of `self`.

    EXAMPLES:

    Sage

        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

    Python

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

  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 `ExtPowerFreeModule` inherits 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

      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

  Python

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

      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)

  [Python]

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

  `A` is a module (actually a free module) over \(\ZZ\):

  Sage

      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

  Python

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

  `A` is a parent object, whose elements are alternating contravariant tensors, represented by instances of the class `AlternatingContrTensor`:

  Sage

      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

  [Python]

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

      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

  Python

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

      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

  [Python]

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

      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

  Python

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

      sage: A is M.exterior_power(2)
      True

  [Python]

      >>> from sage.all import *
      >>> A is M.exterior_power(Integer(2))
      True

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

  Sage

      sage: M.exterior_power(1) is M
      True

  Python

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

      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

  [Python]

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

      sage: A.has_coerce_map_from(T20)
      False

  Python

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

      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

  [Python]

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

    alias of `AlternatingContrTensor`

  base_module()

    Return the free module on which `self` is constructed.

    OUTPUT:

    - instance of `FiniteRankFreeModule` representing the free module on which the exterior power is defined.

    EXAMPLES:

    Sage

        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

    Python

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

    Return the functorial construction of `self`.

    This implementation just returns `None`, as no functorial construction is implemented.

  degree()

    Return the degree of `self`.

    OUTPUT:

    - integer \(p\) such that `self` is the exterior power \(\Lambda^p(M)\)

    EXAMPLES:

    Sage

        sage: M = FiniteRankFreeModule(ZZ, 5, name='M')
        sage: A = M.exterior_power(2)
        sage: A.degree()
        2
        sage: M.exterior_power(4).degree()
        4

    Python

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

    Return the zero of `self`.

    EXAMPLES:

    Sage

        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

    Python

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