### Navigation

- index
- modules |
- next |
- previous |
- Algebras »

# Clifford Algebras

AUTHORS:

- Travis Scrimshaw (2013-09-06): Initial version

class `sage.algebras.clifford_algebra.``CliffordAlgebra`(Q, names, category=None)

  Bases: `sage.combinat.free_module.CombinatorialFreeModule`

  The Clifford algebra of a quadratic form.

  Let \(Q : V \to \mathbf{k}\) denote a quadratic form on a vector space \(V\) over a field \(\mathbf{k}\). The Clifford algebra \(Cl(V, Q)\) is defined as \(T(V) / I_Q\) where \(T(V)\) is the tensor algebra of \(V\) and \(I_Q\) is the two-sided ideal generated by all elements of the form \(v \otimes v - Q(v)\) for all \(v \in V\).

  We abuse notation to denote the projection of a pure tensor \(x_1 \otimes x_2 \otimes \cdots \otimes x_m \in T(V)\) onto \(T(V) / I_Q = Cl(V, Q)\) by \(x_1 \wedge x_2 \wedge \cdots \wedge x_m\). This is motivated by the fact that \(Cl(V, Q)\) is the exterior algebra \(\wedge V\) when \(Q = 0\) (one can also think of a Clifford algebra as a quantization of the exterior algebra). See `ExteriorAlgebra` for the concept of an exterior algebra.

  From the definition, a basis of \(Cl(V, Q)\) is given by monomials of the form

  \[\begin{split}\{ e_{i_1} \wedge \cdots \wedge e_{i_k} \mid 1 \leq i_1 < \cdots < i_k \leq n \},\end{split}\]

  where \(n = \dim(V)\) and where \(\{ e_1, e_2, \cdots, e_n \}\) is any fixed basis of \(V\). Hence

  \[\dim(Cl(V, Q)) = \sum_{k=0}^n \binom{n}{k} = 2^n.\]

  Note

  The algebra \(Cl(V, Q)\) is a \(\ZZ / 2\ZZ\)-graded algebra, but not (in general) \(\ZZ\)-graded (in a reasonable way).

  This construction satisfies the following universal property. Let \(i : V \to Cl(V, Q)\) denote the natural inclusion (which is an embedding). Then for every associative \(\mathbf{k}\)-algebra \(A\) and any \(\mathbf{k}\)-linear map \(j : V \to A\) satisfying

  \[j(v)^2 = Q(v) \cdot 1_A\]

  for all \(v \in V\), there exists a unique \(\mathbf{k}\)-algebra homomorphism \(f : Cl(V, Q) \to A\) such that \(f \circ i = j\). This property determines the Clifford algebra uniquely up to canonical isomorphism. The inclusion \(i\) is commonly used to identify \(V\) with a vector subspace of \(Cl(V)\).

  The Clifford algebra also can be considered as a covariant functor from the category of vector spaces equipped with quadratic forms to the category of algebras. In fact, if \((V, Q)\) and \((W, R)\) are two vector spaces endowed with quadratic forms, and if \(g : W \to V\) is a linear map preserving the quadratic form, then we can define an algebra morphism \(Cl(g) : Cl(W, R) \to Cl(V, Q)\) by requiring that it send every \(w \in W\) to \(g(w) \in V\). Since the quadratic form \(R\) on \(W\) is uniquely determined by the quadratic form \(Q\) on \(V\) (due to the assumption that \(g\) preserves the quadratic form), this fact can be rewritten as follows: If \((V, Q)\) is a vector space with a quadratic form, and \(W\) is another vector space, and \(\phi : W \to V\) is any linear map, then we obtain an algebra morphism \(Cl(\phi) : Cl(W, \phi(Q)) \to Cl(V, Q)\) where \(\phi(Q) = \phi^T \cdot Q \cdot \phi\) (we consider \(\phi\) as a matrix) is the quadratic form \(Q\) pulled back to \(W\). In fact, the map \(\phi\) preserves the quadratic form because of

  \[\phi(Q)(x) = x^T \cdot \phi^T \cdot Q \cdot \phi \cdot x = (\phi \cdot x)^T \cdot Q \cdot (\phi \cdot x) = Q(\phi(x)).\]

  Hence we have \(\phi(w)^2 = Q(\phi(w)) = \phi(Q)(w)\) for all \(w \in W\).

  REFERENCES:

  - Wikipedia article Clifford_algebra

  INPUT:

  - `Q` – a quadratic form
  - `names` – (default: `'e'`) the generator names

  EXAMPLES:

  To create a Clifford algebra, all one needs to do is specify a quadratic form:

      sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
      sage: Cl = CliffordAlgebra(Q)
      sage: Cl
      The Clifford algebra of the Quadratic form in 3 variables over Integer Ring with coefficients:
      [ 1 2 3 ]
      [ * 4 5 ]
      [ * * 6 ]

  We can also explicitly name the generators. In this example, the Clifford algebra we construct is an exterior algebra (since we choose the quadratic form to be zero):

      sage: Q = QuadraticForm(ZZ, 4, [0]*10)
      sage: Cl.<a,b,c,d> = CliffordAlgebra(Q)
      sage: a*d
      a*d
      sage: d*c*b*a + a + 4*b*c
      a*b*c*d + 4*b*c + a

  Warning

  The Clifford algebra is not graded, but instead filtered. This will be changed once trac ticket #17096 is finished.

  `Element`

    alias of `CliffordAlgebraElement`

  `algebra_generators`()

    Return the algebra generators of `self`.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.algebra_generators()
        Finite family {'y': y, 'x': x, 'z': z}

  `center_basis`()

    Return a list of elements which correspond to a basis for the center of `self`.

    This assumes that the ground ring can be used to compute the kernel of a matrix.

    See also

    `supercenter_basis()`, http://math.stackexchange.com/questions/129183/center-of-clifford-algebra-depending-on-the-parity-of-dim-v

    Todo

    Deprecate this in favor of a method called \(center()\) once subalgebras are properly implemented in Sage.

    EXAMPLES:

        sage: Q = QuadraticForm(QQ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Z = Cl.center_basis(); Z
        (1, -2/5*x*y*z + x - 3/5*y + 2/5*z)
        sage: all(z*b - b*z == 0 for z in Z for b in Cl.basis())
        True

        sage: Q = QuadraticForm(QQ, 3, [1,-2,-3, 4, 2, 1])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Z = Cl.center_basis(); Z
        (1, -x*y*z + x + 3/2*y - z)
        sage: all(z*b - b*z == 0 for z in Z for b in Cl.basis())
        True

        sage: Q = QuadraticForm(QQ, 2, [1,-2,-3])
        sage: Cl.<x,y> = CliffordAlgebra(Q)
        sage: Cl.center_basis()
        (1,)

        sage: Q = QuadraticForm(QQ, 2, [-1,1,-3])
        sage: Cl.<x,y> = CliffordAlgebra(Q)
        sage: Cl.center_basis()
        (1,)

    A degenerate case:

        sage: Q = QuadraticForm(QQ, 3, [4,4,-4,1,-2,1])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.center_basis()
        (1, x*y*z + x - 2*y - 2*z, x*y + x*z - 2*y*z)

    The most degenerate case (the exterior algebra):

        sage: Q = QuadraticForm(QQ, 3)
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.center_basis()
        (1, x*y, x*z, y*z, x*y*z)

  `degree_on_basis`(m)

    Return the degree of the monomial indexed by `m`.

    This degree is a nonnegative integer, and should be interpreted as a residue class modulo \(2\), since we consider `self` to be \(\ZZ_2\)-graded (not \(\ZZ\)-graded, although there is a natural filtration by the length of `m`). The degree of the monomial `m` in this \(\ZZ_2\)-grading is defined to be the length of `m` taken mod \(2\).

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.degree_on_basis((0,))
        1
        sage: Cl.degree_on_basis((0,1))
        0

  `dimension`()

    Return the rank of `self` as a free module.

    Let \(V\) be a free \(R\)-module of rank \(n\); then, \(Cl(V, Q)\) is a free \(R\)-module of rank \(2^n\).

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.dimension()
        8

  `free_module`()

    Return the underlying free module \(V\) of `self`.

    This is the free module on which the quadratic form that was used to construct `self` is defined.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.free_module()
        Ambient free module of rank 3 over the principal ideal domain Integer Ring

  `gen`(i)

    Return the `i`-th standard generator of the algebra `self`.

    This is the `i`-th basis vector of the vector space on which the quadratic form defining `self` is defined, regarded as an element of `self`.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: [Cl.gen(i) for i in range(3)]
        [x, y, z]

  `gens`()

    Return the generators of `self` (as an algebra).

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.gens()
        (x, y, z)

  `is_commutative`()

    Check if `self` is a commutative algebra.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.is_commutative()
        False

  `lift_isometry`(m, names=None)

    Lift an invertible isometry `m` of the quadratric form of `self` to a Clifford algebra morphism.

    Given an invertible linear map \(m : V \to W\) (here represented by a matrix acting on column vectors), this method returns the algebra morphism \(Cl(m)\) from \(Cl(V, Q)\) to \(Cl(W, m^{-1}(Q))\), where \(Cl(V, Q)\) is the Clifford algebra `self` and where \(m^{-1}(Q)\) is the pullback of the quadratic form \(Q\) to \(W\) along the inverse map \(m^{-1} : W \to V\). See the documentation of `CliffordAlgebra` for how this pullback and the morphism \(Cl(m)\) are defined.

    INPUT:

    - `m` – an isometry of the quadratic form of `self`
    - `names` – (default: `'e'`) the names of the generators of the Clifford algebra of the codomain of (the map represented by) `m`

    OUTPUT:

    The algebra morphism \(Cl(m)\) from `self` to \(Cl(W, m^{-1}(Q))\).

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: m = matrix([[1,1,2],[0,1,1],[0,0,1]])
        sage: phi = Cl.lift_isometry(m, 'abc')
        sage: phi(x)
        a
        sage: phi(y)
        a + b
        sage: phi(x*y)
        a*b + 1
        sage: phi(x) * phi(y)
        a*b + 1
        sage: phi(z*y)
        a*b - a*c - b*c
        sage: phi(z) * phi(y)
        a*b - a*c - b*c
        sage: phi(x + z) * phi(y + z) == phi((x + z) * (y + z))
        True

  `lift_module_morphism`(m, names=None)

    Lift the matrix `m` to an algebra morphism of Clifford algebras.

    Given a linear map \(m : W \to V\) (here represented by a matrix acting on column vectors), this method returns the algebra morphism \(Cl(m) : Cl(W, m(Q)) \to Cl(V, Q)\), where \(Cl(V, Q)\) is the Clifford algebra `self` and where \(m(Q)\) is the pullback of the quadratic form \(Q\) to \(W\). See the documentation of `CliffordAlgebra` for how this pullback and the morphism \(Cl(m)\) are defined.

    Note

    This is a map into `self`.

    INPUT:

    - `m` – a matrix
    - `names` – (default: `'e'`) the names of the generators of the Clifford algebra of the domain of (the map represented by) `m`

    OUTPUT:

    The algebra morphism \(Cl(m)\) from \(Cl(W, m(Q))\) to `self`.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: m = matrix([[1,-1,-1],[0,1,-1],[1,1,1]])
        sage: phi = Cl.lift_module_morphism(m, 'abc')
        sage: phi
        Generic morphism:
          From: The Clifford algebra of the Quadratic form in 3 variables over Integer Ring with coefficients:
        [ 10 17 3 ]
        [ * 11 0 ]
        [ * * 5 ]
          To:   The Clifford algebra of the Quadratic form in 3 variables over Integer Ring with coefficients:
        [ 1 2 3 ]
        [ * 4 5 ]
        [ * * 6 ]
        sage: a,b,c = phi.domain().gens()
        sage: phi(a)
        x + z
        sage: phi(b)
        -x + y + z
        sage: phi(c)
        -x - y + z
        sage: phi(a + 3*b)
        -2*x + 3*y + 4*z
        sage: phi(a) + 3*phi(b)
        -2*x + 3*y + 4*z
        sage: phi(a*b)
        x*y + 2*x*z - y*z + 7
        sage: phi(b*a)
        -x*y - 2*x*z + y*z + 10
        sage: phi(a*b + c)
        x*y + 2*x*z - y*z - x - y + z + 7
        sage: phi(a*b) + phi(c)
        x*y + 2*x*z - y*z - x - y + z + 7

    We check that the map is an algebra morphism:

        sage: phi(a)*phi(b)
        x*y + 2*x*z - y*z + 7
        sage: phi(a*b)
        x*y + 2*x*z - y*z + 7
        sage: phi(a*a)
        10
        sage: phi(a)*phi(a)
        10
        sage: phi(b*a)
        -x*y - 2*x*z + y*z + 10
        sage: phi(b) * phi(a)
        -x*y - 2*x*z + y*z + 10
        sage: phi((a + b)*(a + c)) == phi(a + b) * phi(a + c)
        True

    We can also lift arbitrary linear maps:

        sage: m = matrix([[1,1],[0,1],[1,1]])
        sage: phi = Cl.lift_module_morphism(m, 'ab')
        sage: a,b = phi.domain().gens()
        sage: phi(a)
        x + z
        sage: phi(b)
        x + y + z
        sage: phi(a*b)
        x*y - y*z + 15
        sage: phi(a)*phi(b)
        x*y - y*z + 15
        sage: phi(b*a)
        -x*y + y*z + 12
        sage: phi(b)*phi(a)
        -x*y + y*z + 12

        sage: m = matrix([[1,1,1,2], [0,1,1,1], [0,1,1,1]])
        sage: phi = Cl.lift_module_morphism(m, 'abcd')
        sage: a,b,c,d = phi.domain().gens()
        sage: phi(a)
        x
        sage: phi(b)
        x + y + z
        sage: phi(c)
        x + y + z
        sage: phi(d)
        2*x + y + z
        sage: phi(a*b*c + d*a)
        -x*y - x*z + 21*x + 7
        sage: phi(a*b*c*d)
        21*x*y + 21*x*z + 42

  `ngens`()

    Return the number of algebra generators of `self`.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.ngens()
        3

  `one_basis`()

    Return the basis index of the element \(1\).

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.one_basis()
        ()

  `pseudoscalar`()

    Return the unit pseudoscalar of `self`.

    Given the basis \(e_1, e_2, \ldots, e_n\) of the underlying \(R\)-module, the unit pseudoscalar is defined as \(e_1 \cdot e_2 \cdots e_n\).

    This depends on the choice of basis.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.pseudoscalar()
        x*y*z

        sage: Q = QuadraticForm(ZZ, 0, [])
        sage: Cl = CliffordAlgebra(Q)
        sage: Cl.pseudoscalar()
        1

    REFERENCES:

    - Wikipedia article Classification_of_Clifford_algebras#Unit_pseudoscalar
  `quadratic_form`()

    Return the quadratic form of `self`.

    This is the quadratic form used to define `self`. The quadratic form on `self` is yet to be implemented.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.quadratic_form()
        Quadratic form in 3 variables over Integer Ring with coefficients:
        [ 1 2 3 ]
        [ * 4 5 ]
        [ * * 6 ]

  `supercenter_basis`()

    Return a list of elements which correspond to a basis for the supercenter of `self`.

    This assumes that the ground ring can be used to compute the kernel of a matrix.

    See also

    `center_basis()`, http://math.stackexchange.com/questions/129183/center-of-clifford-algebra-depending-on-the-parity-of-dim-v

    Todo

    Deprecate this in favor of a method called \(supercenter()\) once subalgebras are properly implemented in Sage.

    EXAMPLES:

        sage: Q = QuadraticForm(QQ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: SZ = Cl.supercenter_basis(); SZ
        (1,)
        sage: all(z.supercommutator(b) == 0 for z in SZ for b in Cl.basis())
        True

        sage: Q = QuadraticForm(QQ, 3, [1,-2,-3, 4, 2, 1])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.supercenter_basis()
        (1,)

        sage: Q = QuadraticForm(QQ, 2, [1,-2,-3])
        sage: Cl.<x,y> = CliffordAlgebra(Q)
        sage: Cl.supercenter_basis()
        (1,)

        sage: Q = QuadraticForm(QQ, 2, [-1,1,-3])
        sage: Cl.<x,y> = CliffordAlgebra(Q)
        sage: Cl.supercenter_basis()
        (1,)

    Singular vectors of a quadratic form generate in the supercenter:

        sage: Q = QuadraticForm(QQ, 3, [1/2,-2,4,256/249,3,-185/8])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.supercenter_basis()
        (1, x + 249/322*y + 22/161*z)

        sage: Q = QuadraticForm(QQ, 3, [4,4,-4,1,-2,1])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.supercenter_basis()
        (1, x + 2*z, y + z, x*y + x*z - 2*y*z)

    The most degenerate case:

        sage: Q = QuadraticForm(QQ, 3)
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: Cl.supercenter_basis()
        (1, x, y, z, x*y, x*z, y*z, x*y*z)

class `sage.algebras.clifford_algebra.``CliffordAlgebraElement`(M, x)

  Bases: `sage.combinat.free_module.CombinatorialFreeModuleElement`

  An element in a Clifford algebra.

  TESTS:

      sage: Q = QuadraticForm(ZZ, 3, [1, 2, 3, 4, 5, 6])
      sage: Cl.<x,y,z> = CliffordAlgebra(Q)
      sage: elt = ((x^3-z)*x + y)^2
      sage: TestSuite(elt).run()

  `clifford_conjugate`()

    Return the Clifford conjugate of `self`.

    The Clifford conjugate of an element \(x\) of a Clifford algebra is defined as

    \[\bar{x} := \alpha(x^t) = \alpha(x)^t\]

    where \(\alpha\) denotes the `reflection` automorphism and \(t\) the `transposition`.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: elt = 5*x + y + x*z
        sage: c = elt.conjugate(); c
        -x*z - 5*x - y + 3
        sage: c.conjugate() == elt
        True

    TESTS:

    We check that the conjugate is an involution:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: all(x.conjugate().conjugate() == x for x in Cl.basis())
        True

  `conjugate`()

    Return the Clifford conjugate of `self`.

    The Clifford conjugate of an element \(x\) of a Clifford algebra is defined as

    \[\bar{x} := \alpha(x^t) = \alpha(x)^t\]

    where \(\alpha\) denotes the `reflection` automorphism and \(t\) the `transposition`.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: elt = 5*x + y + x*z
        sage: c = elt.conjugate(); c
        -x*z - 5*x - y + 3
        sage: c.conjugate() == elt
        True

    TESTS:

    We check that the conjugate is an involution:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: all(x.conjugate().conjugate() == x for x in Cl.basis())
        True

  `degree_negation`()

    Return the image of the reflection automorphism on `self`.

    The reflection automorphism of a Clifford algebra is defined as the linear endomorphism of this algebra which maps

    \[x_1 \wedge x_2 \wedge \cdots \wedge x_m \mapsto (-1)^m x_1 \wedge x_2 \wedge \cdots \wedge x_m.\]

    It is an algebra automorphism of the Clifford algebra.

    `degree_negation()` is an alias for `reflection()`.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: elt = 5*x + y + x*z
        sage: r = elt.reflection(); r
        x*z - 5*x - y
        sage: r.reflection() == elt
        True

    TESTS:

    We check that the reflection is an involution:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: all(x.reflection().reflection() == x for x in Cl.basis())
        True

  `list`()

    Return the list of monomials and their coefficients in `self` (as a list of \(2\)-tuples, each of which has the form `(monomial, coefficient)`).

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: elt = 5*x + y
        sage: elt.list()
        [((0,), 5), ((1,), 1)]

  `reflection`()

    Return the image of the reflection automorphism on `self`.

    The reflection automorphism of a Clifford algebra is defined as the linear endomorphism of this algebra which maps

    \[x_1 \wedge x_2 \wedge \cdots \wedge x_m \mapsto (-1)^m x_1 \wedge x_2 \wedge \cdots \wedge x_m.\]

    It is an algebra automorphism of the Clifford algebra.

    `degree_negation()` is an alias for `reflection()`.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: elt = 5*x + y + x*z
        sage: r = elt.reflection(); r
        x*z - 5*x - y
        sage: r.reflection() == elt
        True

    TESTS:

    We check that the reflection is an involution:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: all(x.reflection().reflection() == x for x in Cl.basis())
        True

  `supercommutator`(x)

    Return the supercommutator of `self` and `x`.

    Let \(A\) be a superalgebra. The supercommutator of homogeneous elements \(x, y \in A\) is defined by

    \[[x, y\} = x y - (-1)^{|x| |y|} y x\]

    and extended to all elements by linearity.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: a = x*y - z
        sage: b = x - y + y*z
        sage: a.supercommutator(b)
        -5*x*y + 8*x*z - 2*y*z - 6*x + 12*y - 5*z
        sage: a.supercommutator(Cl.one())
        0
        sage: Cl.one().supercommutator(a)
        0
        sage: Cl.zero().supercommutator(a)
        0
        sage: a.supercommutator(Cl.zero())
        0

        sage: Q = QuadraticForm(ZZ, 2, [-1,1,-3])
        sage: Cl.<x,y> = CliffordAlgebra(Q)
        sage: [a.supercommutator(b) for a in Cl.basis() for b in Cl.basis()]
        [0, 0, 0, 0, 0, -2, 1, -x - 2*y, 0, 1,
         -6, 6*x + y, 0, x + 2*y, -6*x - y, 0]
        sage: [a*b-b*a for a in Cl.basis() for b in Cl.basis()]
        [0, 0, 0, 0, 0, 0, 2*x*y - 1, -x - 2*y, 0,
         -2*x*y + 1, 0, 6*x + y, 0, x + 2*y, -6*x - y, 0]

    Exterior algebras inherit from Clifford algebras, so supercommutators work as well. We verify the exterior algebra is supercommutative:

        sage: E.<x,y,z,w> = ExteriorAlgebra(QQ)
        sage: all(b1.supercommutator(b2) == 0
        ....:     for b1 in E.basis() for b2 in E.basis())
        True

  `support`()

    Return the support of `self`.

    This is the list of all monomials which appear with nonzero coefficient in `self`.

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: elt = 5*x + y
        sage: elt.support()
        [(0,), (1,)]

  `transpose`()

    Return the transpose of `self`.

    The transpose is an anti-algebra involution of a Clifford algebra and is defined (using linearity) by

    \[x_1 \wedge x_2 \wedge \cdots \wedge x_m \mapsto x_m \wedge \cdots \wedge x_2 \wedge x_1.\]

    EXAMPLES:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: elt = 5*x + y + x*z
        sage: t = elt.transpose(); t
        -x*z + 5*x + y + 3
        sage: t.transpose() == elt
        True
        sage: Cl.one().transpose()
        1

    TESTS:

    We check that the transpose is an involution:

        sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
        sage: Cl.<x,y,z> = CliffordAlgebra(Q)
        sage: all(x.transpose().transpose() == x for x in Cl.basis())
        True

    Zero is sent to zero:

        sage: Cl.zero().transpose() == Cl.zero()
        True

class `sage.algebras.clifford_algebra.``ExteriorAlgebra`(R, names)

  Bases: `sage.algebras.clifford_algebra.CliffordAlgebra`

  An exterior algebra of a free module over a commutative ring.

  Let \(V\) be a module over a commutative ring \(R\). The exterior algebra (or Grassmann algebra) \(\Lambda(V)\) of \(V\) is defined as the quotient of the tensor algebra \(T(V)\) of \(V\) modulo the two-sided ideal generated by all tensors of the form \(x \otimes x\) with \(x \in V\). The multiplication on \(\Lambda(V)\) is denoted by \(\wedge\) (so \(v_1 \wedge v_2 \wedge \cdots \wedge v_n\) is the projection of \(v_1 \otimes v_2 \otimes \cdots \otimes v_n\) onto \(\Lambda(V)\)) and called the “exterior product” or “wedge product”.

  If \(V\) is a rank-\(n\) free \(R\)-module with a basis \(\{e_1, \ldots, e_n\}\), then \(\Lambda(V)\) is the \(R\)-algebra noncommutatively generated by the \(n\) generators \(e_1, \ldots, e_n\) subject to the relations \(e_i^2 = 0\) for all \(i\), and \(e_i e_j = - e_j e_i\) for all \(i < j\). As an \(R\)-module, \(\Lambda(V)\) then has a basis \((\bigwedge_{i \in I} e_i)\) with \(I\) ranging over the subsets of \(\{1, 2, \ldots, n\}\) (where \(\bigwedge_{i \in I} e_i\) is the wedge product of \(e_i\) for \(i\) running through all elements of \(I\) from smallest to largest), and hence is free of rank \(2^n\).

  The exterior algebra of an \(R\)-module \(V\) can also be realized as the Clifford algebra of \(V\) for the quadratic form \(Q\) given by \(Q(v) = 0\) for all vectors \(v \in V\). See `CliffordAlgebra` for the notion of a Clifford algebra.

  The exterior algebra of an \(R\)-module \(V\) is a \(\ZZ\)-graded connected Hopf superalgebra. It is commutative in the super sense (i.e., the odd elements anticommute and square to \(0\)).

  This class implements the exterior algebra \(\Lambda(R^n)\) for \(n\) a nonnegative integer.

  Warning

  We initialize the exterior algebra as an object of the category of Hopf algebras, but this is not really correct, since it is a Hopf superalgebra with the odd-degree components forming the odd part. So use Hopf-algebraic methods with care!

  Todo

  Add a category for Hopf superalgebras (perhaps part of trac ticket #16513).

  INPUT:

  - `R` – the base ring, or the free module whose exterior algebra is to be computed
  - `names` – a list of strings to name the generators of the exterior algebra; this list can either have one entry only (in which case the generators will be called `e + '0'`, `e + '1'`, ..., `e + 'n-1'`, with `e` being said entry), or have `n` entries (in which case these entries will be used directly as names for the generators)
  - `n` – the number of generators, i.e., the rank of the free module whose exterior algebra is to be computed (this doesn’t have to be provided if it can be inferred from the rest of the input)

  REFERENCES:

  - Wikipedia article Exterior_algebra
  class `Element`(M, x)

    Bases: `sage.algebras.clifford_algebra.CliffordAlgebraElement`

    An element of an exterior algebra.

    `antiderivation`(x)

      Return the interior product (also known as antiderivation) of `self` with respect to `x` (that is, the element \(\iota_{x}(\text{self})\) of the exterior algebra).

      If \(V\) is an \(R\)-module, and if \(\alpha\) is a fixed element of \(V^*\), then the interior product with respect to \(\alpha\) is an \(R\)-linear map \(i_{\alpha} \colon \Lambda(V) \to \Lambda(V)\), determined by the following requirements:

      - \(i_{\alpha}(v) = \alpha(v)\) for all \(v \in V = \Lambda^1(V)\),
      - it is a graded derivation of degree \(-1\): all \(x\) and \(y\) in \(\Lambda(V)\) satisfy
      \[i_{\alpha}(x \wedge y) = (i_{\alpha} x) \wedge y + (-1)^{\deg x} x \wedge (i_{\alpha} y).\]

      It can be shown that this map \(i_{\alpha}\) is graded of degree \(-1\) (that is, sends \(\Lambda^k(V)\) into \(\Lambda^{k-1}(V)\) for every \(k\)).

      When \(V\) is a finite free \(R\)-module, the interior product can also be defined by

      \[(i_{\alpha} \omega)(u_1, \ldots, u_k) = \omega(\alpha, u_1, \ldots, u_k),\]

      where \(\omega \in \Lambda^k(V)\) is thought of as an alternating multilinear mapping from \(V^* \times \cdots \times V^*\) to \(R\).

      Since Sage is only dealing with exterior powers of modules of the form \(R^d\) for some nonnegative integer \(d\), the element \(\alpha \in V^*\) can be thought of as an element of \(V\) (by identifying the standard basis of \(V = R^d\) with its dual basis). This is how \(\alpha\) should be passed to this method.

      We then extend the interior product to all \(\alpha \in \Lambda (V^*)\) by

      \[i_{\beta \wedge \gamma} = i_{\gamma} \circ i_{\beta}.\]

      INPUT:

      - `x` – element of (or coercing into) \(\Lambda^1(V)\) (for example, an element of \(V\)); this plays the role of \(\alpha\) in the above definition

      EXAMPLES:

          sage: E.<x,y,z> = ExteriorAlgebra(QQ)
          sage: x.interior_product(x)
          1
          sage: (x + x*y).interior_product(2*y)
          -2*x
          sage: (x*z + x*y*z).interior_product(2*y - x)
          -2*x^z - y^z - z
          sage: x.interior_product(E.one())
          x
          sage: E.one().interior_product(x)
          0
          sage: x.interior_product(E.zero())
          0
          sage: E.zero().interior_product(x)
          0

      REFERENCES:

      - Wikipedia article Exterior_algebra#Interior_product
    `constant_coefficient`()

      Return the constant coefficient of `self`.

      Todo

      Define a similar method for general Clifford algebras once the morphism to exterior algebras is implemented.

      EXAMPLES:

          sage: E.<x,y,z> = ExteriorAlgebra(QQ)
          sage: elt = 5*x + y + x*z + 10
          sage: elt.constant_coefficient()
          10
          sage: x.constant_coefficient()
          0

    `hodge_dual`()

      Return the Hodge dual of `self`.

      The Hodge dual of an element \(\alpha\) of the exterior algebra is defined as \(i_{\alpha} \sigma\), where \(\sigma\) is the volume form (`volume_form()`) and \(i_{\alpha}\) denotes the antiderivation function with respect to \(\alpha\) (see `interior_product()` for the definition of this).

      Note

      The Hodge dual of the Hodge dual of a homogeneous element \(p\) of \(\Lambda(V)\) equals \((-1)^{k(n-k)} p\), where \(n = \dim V\) and \(k = \deg(p) = |p|\).

      EXAMPLES:

          sage: E.<x,y,z> = ExteriorAlgebra(QQ)
          sage: x.hodge_dual()
          y^z
          sage: (x*z).hodge_dual()
          -y
          sage: (x*y*z).hodge_dual()
          1
          sage: [a.hodge_dual().hodge_dual() for a in E.basis()]
          [1, x, y, z, x^y, x^z, y^z, x^y^z]
          sage: (x + x*y).hodge_dual()
          y^z + z
          sage: (x*z + x*y*z).hodge_dual()
          -y + 1
          sage: E = ExteriorAlgebra(QQ, 'wxyz')
          sage: [a.hodge_dual().hodge_dual() for a in E.basis()]
          [1, -w, -x, -y, -z, w^x, w^y, w^z, x^y, x^z, y^z,
           -w^x^y, -w^x^z, -w^y^z, -x^y^z, w^x^y^z]

    `interior_product`(x)

      Return the interior product (also known as antiderivation) of `self` with respect to `x` (that is, the element \(\iota_{x}(\text{self})\) of the exterior algebra).

      If \(V\) is an \(R\)-module, and if \(\alpha\) is a fixed element of \(V^*\), then the interior product with respect to \(\alpha\) is an \(R\)-linear map \(i_{\alpha} \colon \Lambda(V) \to \Lambda(V)\), determined by the following requirements:

      - \(i_{\alpha}(v) = \alpha(v)\) for all \(v \in V = \Lambda^1(V)\),
      - it is a graded derivation of degree \(-1\): all \(x\) and \(y\) in \(\Lambda(V)\) satisfy
      \[i_{\alpha}(x \wedge y) = (i_{\alpha} x) \wedge y + (-1)^{\deg x} x \wedge (i_{\alpha} y).\]

      It can be shown that this map \(i_{\alpha}\) is graded of degree \(-1\) (that is, sends \(\Lambda^k(V)\) into \(\Lambda^{k-1}(V)\) for every \(k\)).

      When \(V\) is a finite free \(R\)-module, the interior product can also be defined by

      \[(i_{\alpha} \omega)(u_1, \ldots, u_k) = \omega(\alpha, u_1, \ldots, u_k),\]

      where \(\omega \in \Lambda^k(V)\) is thought of as an alternating multilinear mapping from \(V^* \times \cdots \times V^*\) to \(R\).

      Since Sage is only dealing with exterior powers of modules of the form \(R^d\) for some nonnegative integer \(d\), the element \(\alpha \in V^*\) can be thought of as an element of \(V\) (by identifying the standard basis of \(V = R^d\) with its dual basis). This is how \(\alpha\) should be passed to this method.

      We then extend the interior product to all \(\alpha \in \Lambda (V^*)\) by

      \[i_{\beta \wedge \gamma} = i_{\gamma} \circ i_{\beta}.\]

      INPUT:

      - `x` – element of (or coercing into) \(\Lambda^1(V)\) (for example, an element of \(V\)); this plays the role of \(\alpha\) in the above definition

      EXAMPLES:

          sage: E.<x,y,z> = ExteriorAlgebra(QQ)
          sage: x.interior_product(x)
          1
          sage: (x + x*y).interior_product(2*y)
          -2*x
          sage: (x*z + x*y*z).interior_product(2*y - x)
          -2*x^z - y^z - z
          sage: x.interior_product(E.one())
          x
          sage: E.one().interior_product(x)
          0
          sage: x.interior_product(E.zero())
          0
          sage: E.zero().interior_product(x)
          0

      REFERENCES:

      - Wikipedia article Exterior_algebra#Interior_product
    `scalar`(other)

      Return the standard scalar product of `self` with `other`.

      The standard scalar product of \(x, y \in \Lambda(V)\) is defined by \(\langle x, y \rangle = \langle x^t y \rangle\), where \(\langle a \rangle\) denotes the degree-0 term of \(a\), and where \(x^t\) denotes the transpose (`transpose()`) of \(x\).

      Todo

      Define a similar method for general Clifford algebras once the morphism to exterior algebras is implemented.

      EXAMPLES:

          sage: E.<x,y,z> = ExteriorAlgebra(QQ)
          sage: elt = 5*x + y + x*z
          sage: elt.scalar(z + 2*x)
          0
          sage: elt.transpose() * (z + 2*x)
          -2*x^y + 5*x^z + y^z

  `ExteriorAlgebra.``antipode_on_basis`(m)

    Return the antipode on the basis element indexed by `m`.

    Given a basis element \(\omega\), the antipode is defined by \(S(\omega) = (-1)^{\deg(\omega)} \omega\).

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: E.antipode_on_basis(())
        1
        sage: E.antipode_on_basis((1,))
        -y
        sage: E.antipode_on_basis((1,2))
        y^z

  `ExteriorAlgebra.``boundary`(s_coeff)

    Return the boundary operator \(\partial\) defined by the structure coefficients `s_coeff` of a Lie algebra.

    For more on the boundary operator, see `ExteriorAlgebraBoundary`.

    INPUT:

    - `s_coeff` – a dictionary whose keys are in \(I \times I\), where \(I\) is the index set of the underlying vector space \(V\), and whose values can be coerced into 1-forms (degree 1 elements) in `E` (usually, these values will just be elements of \(V\))

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: E.boundary({(0,1): z, (1,2): x, (2,0): y})
        Boundary endomorphism of The exterior algebra of rank 3 over Rational Field

  `ExteriorAlgebra.``coboundary`(s_coeff)

    Return the coboundary operator \(d\) defined by the structure coefficients `s_coeff` of a Lie algebra.

    For more on the coboundary operator, see `ExteriorAlgebraCoboundary`.

    INPUT:

    - `s_coeff` – a dictionary whose keys are in \(I \times I\), where \(I\) is the index set of the underlying vector space \(V\), and whose values can be coerced into 1-forms (degree 1 elements) in `E` (usually, these values will just be elements of \(V\))

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: E.coboundary({(0,1): z, (1,2): x, (2,0): y})
        Coboundary endomorphism of The exterior algebra of rank 3 over Rational Field

  `ExteriorAlgebra.``coproduct_on_basis`(a)

    Return the coproduct on the basis element indexed by `a`.

    The coproduct is defined by

    \[\Delta(e_{i_1} \wedge \cdots \wedge e_{i_m}) = \sum_{k=0}^m \sum_{\sigma \in Ush_{k,m-k}} (-1)^{\sigma} (e_{i_{\sigma(1)}} \wedge \cdots \wedge e_{i_{\sigma(k)}}) \otimes (e_{i_{\sigma(k+1)}} \wedge \cdots \wedge e_{i_{\sigma(m)}}),\]

    where \(Ush_{k,m-k}\) denotes the set of all \((k,m-k)\)-unshuffles (i.e., permutations in \(S_m\) which are increasing on the interval \(\{1, 2, \ldots, k\}\) and on the interval \(\{k+1, k+2, \ldots, k+m\}\)).

    Warning

    This coproduct is a homomorphism of superalgebras, not a homomorphism of algebras!

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: E.coproduct_on_basis((0,))
        1 # x + x # 1
        sage: E.coproduct_on_basis((0,1))
        1 # x^y + x # y + x^y # 1 - y # x
        sage: E.coproduct_on_basis((0,1,2))
        1 # x^y^z + x # y^z + x^y # z + x^y^z # 1
         - x^z # y - y # x^z + y^z # x + z # x^y

  `ExteriorAlgebra.``counit`(x)

    Return the counit of `x`.

    The counit of an element \(\omega\) of the exterior algebra is its constant coefficient.

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: elt = x*y - 2*x + 3
        sage: E.counit(elt)
        3

  `ExteriorAlgebra.``degree_on_basis`(m)

    Return the degree of the monomial indexed by `m`.

    The degree of `m` in the \(\ZZ\)-grading of `self` is defined to be the length of `m`.

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: E.degree_on_basis(())
        0
        sage: E.degree_on_basis((0,))
        1
        sage: E.degree_on_basis((0,1))
        2

  `ExteriorAlgebra.``interior_product_on_basis`(a, b)

    Return the interior product \(\iota_b a\) of `a` with respect to `b`.

    See `interior_product()` for more information.

    In this method, `a` and `b` are supposed to be basis elements (see `interior_product()` for a method that computes interior product of arbitrary elements), and to be input as their keys.

    This depends on the choice of basis of the vector space whose exterior algebra is `self`.

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: E.interior_product_on_basis((0,), (0,))
        1
        sage: E.interior_product_on_basis((0,2), (0,))
        z
        sage: E.interior_product_on_basis((1,), (0,2))
        0
        sage: E.interior_product_on_basis((0,2), (1,))
        0
        sage: E.interior_product_on_basis((0,1,2), (0,2))
        -y

  `ExteriorAlgebra.``lift_morphism`(phi, names=None)

    Lift the matrix `m` to an algebra morphism of exterior algebras.

    Given a linear map \(\phi : V \to W\) (here represented by a matrix acting on column vectors over the base ring of \(V\)), this method returns the algebra morphism \(\Lambda(\phi) : \Lambda(V) \to \Lambda(W)\). This morphism is defined on generators \(v_i \in \Lambda(V)\) by \(v_i \mapsto \phi(v_i)\).

    Note

    This is the map going out of `self` as opposed to `lift_module_morphism()` for general Clifford algebras.

    INPUT:

    - `phi` – a linear map \(\phi\) from \(V\) to \(W\), encoded as a matrix
    - `names` – (default: `'e'`) the names of the generators of the Clifford algebra of the domain of (the map represented by) `phi`

    OUTPUT:

    The algebra morphism \(\Lambda(\phi)\) from `self` to \(\Lambda(W)\).

    EXAMPLES:

        sage: E.<x,y> = ExteriorAlgebra(QQ)
        sage: phi = matrix([[0,1],[1,1],[1,2]]); phi
        [0 1]
        [1 1]
        [1 2]
        sage: L = E.lift_morphism(phi, ['a','b','c']); L
        Generic morphism:
          From: The exterior algebra of rank 2 over Rational Field
          To:   The exterior algebra of rank 3 over Rational Field
        sage: L(x)
        b + c
        sage: L(y)
        a + b + 2*c
        sage: L.on_basis()((1,))
        a + b + 2*c
        sage: p = L(E.one()); p
        1
        sage: p.parent()
        The exterior algebra of rank 3 over Rational Field
        sage: L(x*y)
        -a^b - a^c + b^c
        sage: L(x)*L(y)
        -a^b - a^c + b^c
        sage: L(x + y)
        a + 2*b + 3*c
        sage: L(x) + L(y)
        a + 2*b + 3*c
        sage: L(1/2*x + 2)
        1/2*b + 1/2*c + 2
        sage: L(E(3))
        3

        sage: psi = matrix([[1, -3/2]]); psi
        [   1 -3/2]
        sage: Lp = E.lift_morphism(psi, ['a']); Lp
        Generic morphism:
          From: The exterior algebra of rank 2 over Rational Field
          To:   The exterior algebra of rank 1 over Rational Field
        sage: Lp(x)
        a
        sage: Lp(y)
        -3/2*a
        sage: Lp(x + 2*y + 3)
        -2*a + 3

  `ExteriorAlgebra.``lifted_bilinear_form`(M)

    Return the bilinear form on the exterior algebra `self` \(= \Lambda(V)\) which is obtained by lifting the bilinear form \(f\) on \(V\) given by the matrix `M`.

    Let \(V\) be a module over a commutative ring \(R\), and let \(f : V \times V \to R\) be a bilinear form on \(V\). Then, a bilinear form \(\Lambda(f) : \Lambda(V) \times \Lambda(V) \to R\) on \(\Lambda(V)\) can be canonically defined as follows: For every \(n \in \NN\), \(m \in \NN\), \(v_1, v_2, \ldots, v_n, w_1, w_2, \ldots, w_m \in V\), we define

    \[\begin{split}\Lambda(f) ( v_1 \wedge v_2 \wedge \cdots \wedge v_n , w_1 \wedge w_2 \wedge \cdots \wedge w_m ) := \begin{cases} 0, &\mbox{if } n \neq m ; \\ \det G, & \mbox{if } n = m \end{cases} ,\end{split}\]

    where \(G\) is the \(n \times m\)-matrix whose \((i, j)\)-th entry is \(f(v_i, w_j)\). This bilinear form \(\Lambda(f)\) is known as the bilinear form on \(\Lambda(V)\) obtained by lifting the bilinear form \(f\). Its restriction to the \(1\)-st homogeneous component \(V\) of \(\Lambda(V)\) is \(f\).

    The bilinear form \(\Lambda(f)\) is symmetric if \(f\) is.

    INPUT:

    - `M` – a matrix over the same base ring as `self`, whose \((i, j)\)-th entry is \(f(e_i, e_j)\), where \((e_1, e_2, \ldots, e_N)\) is the standard basis of the module \(V\) for which `self` \(= \Lambda(V)\) (so that \(N = \dim(V)\)), and where \(f\) is the bilinear form which is to be lifted.

    OUTPUT:

    A bivariate function which takes two elements \(p\) and \(q\) of `self` to \(\Lambda(f)(p, q)\).

    Note

    This takes a bilinear form on \(V\) as matrix, and returns a bilinear form on `self` as a function in two arguments. We do not return the bilinear form as a matrix since this matrix can be huge and one often needs just a particular value.

    Todo

    Implement a class for bilinear forms and rewrite this method to use that class.

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: M = Matrix(QQ, [[1, 2, 3], [2, 3, 4], [3, 4, 5]])
        sage: Eform = E.lifted_bilinear_form(M)
        sage: Eform
        Bilinear Form from Cartesian product of The exterior algebra of rank 3 over
         Rational Field, The exterior algebra of rank 3 over Rational Field to
         Rational Field
        sage: Eform(x*y, y*z)
        -1
        sage: Eform(x*y, y)
        0
        sage: Eform(x*(y+z), y*z)
        -3
        sage: Eform(x*(y+z), y*(z+x))
        0
        sage: N = Matrix(QQ, [[3, 1, 7], [2, 0, 4], [-1, -3, -1]])
        sage: N.determinant()
        -8
        sage: Eform = E.lifted_bilinear_form(N)
        sage: Eform(x, E.one())
        0
        sage: Eform(x, x*z*y)
        0
        sage: Eform(E.one(), E.one())
        1
        sage: Eform(E.zero(), E.one())
        0
        sage: Eform(x, y)
        1
        sage: Eform(z, y)
        -3
        sage: Eform(x*z, y*z)
        20
        sage: Eform(x+x*y+x*y*z, z+z*y+z*y*x)
        11

    TESTS:

    Exterior algebra over a zero space (a border case):

        sage: E = ExteriorAlgebra(QQ, 0)
        sage: M = Matrix(QQ, [])
        sage: Eform = E.lifted_bilinear_form(M)
        sage: Eform(E.one(), E.one())
        1
        sage: Eform(E.zero(), E.one())
        0

    Todo

    Another way to compute this bilinear form seems to be to map \(x\) and \(y\) to the appropriate Clifford algebra and there compute \(x^t y\), then send the result back to the exterior algebra and return its constant coefficient. Or something like this. Once the maps to the Clifford and back are implemented, check if this is faster.

  `ExteriorAlgebra.``volume_form`()

    Return the volume form of `self`.

    Given the basis \(e_1, e_2, \ldots, e_n\) of the underlying \(R\)-module, the volume form is defined as \(e_1 \wedge e_2 \wedge \cdots \wedge e_n\).

    This depends on the choice of basis.

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: E.volume_form()
        x^y^z

class `sage.algebras.clifford_algebra.``ExteriorAlgebraBoundary`(E, s_coeff)

  Bases: `sage.algebras.clifford_algebra.ExteriorAlgebraDifferential`

  The boundary \(\partial\) of an exterior algebra \(\Lambda(L)\) defined by the structure coefficients of \(L\).

  Let \(L\) be a Lie algebra. We give the exterior algebra \(E = \Lambda(L)\) a chain complex structure by considering a differential \(\partial : \Lambda^{k+1}(L) \to \Lambda^k(L)\) defined by

  \[\begin{split}\partial(x_1 \wedge x_2 \wedge \cdots \wedge x_{k+1}) = \sum_{i < j} (-1)^{i+j+1} [x_i, x_j] \wedge x_1 \wedge \cdots \wedge \hat{x}_i \wedge \cdots \wedge \hat{x}_j \wedge \cdots \wedge x_{k+1}\end{split}\]

  where \(\hat{x}_i\) denotes a missing index. The corresponding homology is the Lie algebra homology.

  INPUT:

  - `E` – an exterior algebra of a vector space \(L\)
  - `s_coeff` – a dictionary whose keys are in \(I \times I\), where \(I\) is the index set of the basis of the vector space \(L\), and whose values can be coerced into 1-forms (degree 1 elements) in `E`; this dictionary will be used to define the Lie algebra structure on \(L\) (indeed, the \(i\)-th coordinate of the Lie bracket of the \(j\)-th and \(k\)-th basis vectors of \(L\) for \(j < k\) is set to be the value at the key \((j, k)\) if this key appears in `s_coeff`, or otherwise the negated of the value at the key \((k, j)\))

  Warning

  The values of `s_coeff` are supposed to be coercible into 1-forms in `E`; but they can also be dictionaries themselves (in which case they are interpreted as giving the coordinates of vectors in `L`). In the interest of speed, these dictionaries are not sanitized or checked.

  Warning

  For any two distinct elements \(i\) and \(j\) of \(I\), the dictionary `s_coeff` must have only one of the pairs \((i, j)\) and \((j, i)\) as a key. This is not checked.

  EXAMPLES:

  We consider the differential given by Lie algebra given by the cross product \(\times\) of \(\RR^3\):

      sage: E.<x,y,z> = ExteriorAlgebra(QQ)
      sage: par = E.boundary({(0,1): z, (1,2): x, (2,0): y})
      sage: par(x)
      0
      sage: par(x*y)
      z
      sage: par(x*y*z)
      0
      sage: par(x+y-y*z+x*y)
      -x + z
      sage: par(E.zero())
      0

  We check that \(\partial \circ \partial = 0\):

      sage: p2 = par * par
      sage: all(p2(b) == 0 for b in E.basis())
      True

  Another example: the Lie algebra \(\mathfrak{sl}_2\), which has a basis \(e,f,h\) satisfying \([h,e] = 2e\), \([h,f] = -2f\), and \([e,f] = h\):

      sage: E.<e,f,h> = ExteriorAlgebra(QQ)
      sage: par = E.boundary({(0,1): h, (2,1): -2*f, (2,0): 2*e})
      sage: par(E.zero())
      0
      sage: par(e)
      0
      sage: par(e*f)
      h
      sage: par(f*h)
      2*f
      sage: par(h*f)
      -2*f
      sage: C = par.chain_complex(); C
      Chain complex with at most 4 nonzero terms over Rational Field
      sage: ascii_art(C)
                                [ 0 -2  0]       [0]
                                [ 0  0  2]       [0]
                  [0 0 0]       [ 1  0  0]       [0]
       0 <-- C_0 <-------- C_1 <----------- C_2 <---- C_3 <-- 0
      sage: C.homology()
      {0: Vector space of dimension 1 over Rational Field,
       1: Vector space of dimension 0 over Rational Field,
       2: Vector space of dimension 0 over Rational Field,
       3: Vector space of dimension 1 over Rational Field}

  Over the integers:

      sage: C = par.chain_complex(R=ZZ); C
      Chain complex with at most 4 nonzero terms over Integer Ring
      sage: ascii_art(C)
                                [ 0 -2  0]       [0]
                                [ 0  0  2]       [0]
                  [0 0 0]       [ 1  0  0]       [0]
       0 <-- C_0 <-------- C_1 <----------- C_2 <---- C_3 <-- 0
      sage: C.homology()
      {0: Z, 1: C2 x C2, 2: 0, 3: Z}

  REFERENCES:

  - Wikipedia article Exterior_algebra#Lie_algebra_homology
  `chain_complex`(R=None)

    Return the chain complex over `R` determined by `self`.

    INPUT:

    - `R` – the base ring; the default is the base ring of the exterior algebra

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: par = E.boundary({(0,1): z, (1,2): x, (2,0): y})
        sage: C = par.chain_complex(); C
        Chain complex with at most 4 nonzero terms over Rational Field
        sage: ascii_art(C)
                                  [ 0  0  1]       [0]
                                  [ 0 -1  0]       [0]
                    [0 0 0]       [ 1  0  0]       [0]
         0 <-- C_0 <-------- C_1 <----------- C_2 <---- C_3 <-- 0

    TESTS:

    This still works in degree \(1\):

        sage: E.<x> = ExteriorAlgebra(QQ)
        sage: par = E.boundary({})
        sage: C = par.chain_complex(); C
        Chain complex with at most 2 nonzero terms over Rational Field
        sage: ascii_art(C)
                    [0]
         0 <-- C_0 <---- C_1 <-- 0

    Also in degree \(0\):

        sage: E = ExteriorAlgebra(QQ, 0)
        sage: par = E.boundary({})
        sage: C = par.chain_complex(); C
        Chain complex with at most 1 nonzero terms over Rational Field
        sage: ascii_art(C)
         0 <-- C_0 <-- 0

class `sage.algebras.clifford_algebra.``ExteriorAlgebraCoboundary`(E, s_coeff)

  Bases: `sage.algebras.clifford_algebra.ExteriorAlgebraDifferential`

  The coboundary \(d\) of an exterior algebra \(\Lambda(L)\) defined by the structure coefficients of a Lie algebra \(L\).

  Let \(L\) be a Lie algebra. We endow its exterior algebra \(E = \Lambda(L)\) with a cochain complex structure by considering a differential \(d : \Lambda^k(L) \to \Lambda^{k+1}(L)\) defined by

  \[\begin{split}d x_i = \sum_{j < k} s_{jk}^i x_j x_k,\end{split}\]

  where \((x_1, x_2, \ldots, x_n)\) is a basis of \(L\), and where \(s_{jk}^i\) is the \(x_i\)-coordinate of the Lie bracket \([x_j, x_k]\).

  The corresponding cohomology is the Lie algebra cohomology of \(L\).

  This can also be thought of as the exterior derivative, in which case the resulting cohomology is the de Rham cohomology of a manifold whose exterior algebra of differential forms is `E`.

  INPUT:

  - `E` – an exterior algebra of a vector space \(L\)
  - `s_coeff` – a dictionary whose keys are in \(I \times I\), where \(I\) is the index set of the basis of the vector space \(L\), and whose values can be coerced into 1-forms (degree 1 elements) in `E`; this dictionary will be used to define the Lie algebra structure on \(L\) (indeed, the \(i\)-th coordinate of the Lie bracket of the \(j\)-th and \(k\)-th basis vectors of \(L\) for \(j < k\) is set to be the value at the key \((j, k)\) if this key appears in `s_coeff`, or otherwise the negated of the value at the key \((k, j)\))

  Warning

  For any two distinct elements \(i\) and \(j\) of \(I\), the dictionary `s_coeff` must have only one of the pairs \((i, j)\) and \((j, i)\) as a key. This is not checked.

  EXAMPLES:

  We consider the differential coming from the Lie algebra given by the cross product \(\times\) of \(\RR^3\):

      sage: E.<x,y,z> = ExteriorAlgebra(QQ)
      sage: d = E.coboundary({(0,1): z, (1,2): x, (2,0): y})
      sage: d(x)
      y^z
      sage: d(y)
      -x^z
      sage: d(x+y-y*z)
      -x^z + y^z
      sage: d(x*y)
      0
      sage: d(E.one())
      0
      sage: d(E.zero())
      0

  We check that \(d \circ d = 0\):

      sage: d2 = d * d
      sage: all(d2(b) == 0 for b in E.basis())
      True

  Another example: the Lie algebra \(\mathfrak{sl}_2\), which has a basis \(e,f,h\) satisfying \([h,e] = 2e\), \([h,f] = -2f\), and \([e,f] = h\):

      sage: E.<e,f,h> = ExteriorAlgebra(QQ)
      sage: d = E.coboundary({(0,1): h, (2,1): -2*f, (2,0): 2*e})
      sage: d(E.zero())
      0
      sage: d(e)
      -2*e^h
      sage: d(f)
      2*f^h
      sage: d(h)
      e^f
      sage: d(e*f)
      0
      sage: d(f*h)
      0
      sage: d(e*h)
      0
      sage: C = d.chain_complex(); C
      Chain complex with at most 4 nonzero terms over Rational Field
      sage: ascii_art(C)
                                [ 0  0  1]       [0]
                                [-2  0  0]       [0]
                  [0 0 0]       [ 0  2  0]       [0]
       0 <-- C_3 <-------- C_2 <----------- C_1 <---- C_0 <-- 0
      sage: C.homology()
      {0: Vector space of dimension 1 over Rational Field,
       1: Vector space of dimension 0 over Rational Field,
       2: Vector space of dimension 0 over Rational Field,
       3: Vector space of dimension 1 over Rational Field}

  Over the integers:

      sage: C = d.chain_complex(R=ZZ); C
      Chain complex with at most 4 nonzero terms over Integer Ring
      sage: ascii_art(C)
                                [ 0  0  1]       [0]
                                [-2  0  0]       [0]
                  [0 0 0]       [ 0  2  0]       [0]
       0 <-- C_3 <-------- C_2 <----------- C_1 <---- C_0 <-- 0
      sage: C.homology()
      {0: Z, 1: 0, 2: C2 x C2, 3: Z}

  REFERENCES:

  - Wikipedia article Exterior_algebra#Differential_geometry
  `chain_complex`(R=None)

    Return the chain complex over `R` determined by `self`.

    INPUT:

    - `R` – the base ring; the default is the base ring of the exterior algebra

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: d = E.coboundary({(0,1): z, (1,2): x, (2,0): y})
        sage: C = d.chain_complex(); C
        Chain complex with at most 4 nonzero terms over Rational Field
        sage: ascii_art(C)
                                  [ 0  0  1]       [0]
                                  [ 0 -1  0]       [0]
                    [0 0 0]       [ 1  0  0]       [0]
         0 <-- C_3 <-------- C_2 <----------- C_1 <---- C_0 <-- 0

    TESTS:

    This still works in degree \(1\):

        sage: E.<x> = ExteriorAlgebra(QQ)
        sage: d = E.coboundary({})
        sage: C = d.chain_complex(); C
        Chain complex with at most 2 nonzero terms over Rational Field
        sage: ascii_art(C)
                    [0]
         0 <-- C_1 <---- C_0 <-- 0

    Also in degree \(0\):

        sage: E = ExteriorAlgebra(QQ, 0)
        sage: d = E.coboundary({})
        sage: C = d.chain_complex(); C
        Chain complex with at most 1 nonzero terms over Rational Field
        sage: ascii_art(C)
         0 <-- C_0 <-- 0

class `sage.algebras.clifford_algebra.``ExteriorAlgebraDifferential`(E, s_coeff)

  Bases: `sage.categories.modules_with_basis.ModuleMorphismByLinearity`, `sage.structure.unique_representation.UniqueRepresentation`

  Internal class to store the data of a boundary or coboundary of an exterior algebra \(\Lambda(L)\) defined by the structure coefficients of a Lie algebra \(L\).

  See `ExteriorAlgebraBoundary` and `ExteriorAlgebraCoboundary` for the actual classes, which inherit from this.

  Warning

  This is not a general class for differentials on the exterior algebra.

  `homology`(deg=None, **kwds)

    Return the homology determined by `self`.

    EXAMPLES:

        sage: E.<x,y,z> = ExteriorAlgebra(QQ)
        sage: par = E.boundary({(0,1): z, (1,2): x, (2,0): y})
        sage: par.homology()
        {0: Vector space of dimension 1 over Rational Field,
         1: Vector space of dimension 0 over Rational Field,
         2: Vector space of dimension 0 over Rational Field,
         3: Vector space of dimension 1 over Rational Field}
        sage: d = E.coboundary({(0,1): z, (1,2): x, (2,0): y})
        sage: d.homology()
        {0: Vector space of dimension 1 over Rational Field,
         1: Vector space of dimension 0 over Rational Field,
         2: Vector space of dimension 0 over Rational Field,
         3: Vector space of dimension 1 over Rational Field}

### Navigation

- index
- modules |
- next |
- previous |
- Algebras »