Hochschild Complexes - Chain complexes and homology

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

# Hochschild Complexes

class sage.homology.hochschild_complex.HochschildComplex(A, M)

  Bases: `UniqueRepresentation`, `Parent`

  The Hochschild complex.

  Let \(A\) be an algebra over a commutative ring \(R\) such that \(A\) a projective \(R\)-module, and \(M\) an \(A\)-bimodule. The Hochschild complex is the chain complex given by

  \[C_n(A, M) := M \otimes A^{\otimes n}\]

  with the boundary operators given as follows. For fixed \(n\), define the face maps

  \[\begin{split}f_{n,i}(m \otimes a_1 \otimes \cdots \otimes a_n) = \begin{cases} m a_1 \otimes \cdots \otimes a_n & \text{if } i = 0, \\ a_n m \otimes a_1 \otimes \cdots \otimes a_{n-1} & \text{if } i = n, \\ m \otimes a_1 \otimes \cdots \otimes a_i a_{i+1} \otimes \cdots \otimes a_n & \text{otherwise.} \end{cases}\end{split}\]

  We define the boundary operators as

  \[d_n = \sum_{i=0}^n (-1)^i f_{n,i}.\]

  The Hochschild homology of \(A\) is the homology of this complex. Alternatively, the Hochschild homology can be described by \(HH_n(A, M) = \operatorname{Tor}_n^{A^e}(A, M)\), where \(A^e = A \otimes A^o\) (\(A^o\) is the opposite algebra of \(A\)) is the enveloping algebra of \(A\).

  Hochschild cohomology is the homology of the dual complex and can be described by \(HH^n(A, M) = \operatorname{Ext}^n_{A^e}(A, M)\).

  Another perspective on Hochschild homology is that \(f_{n,i}\) make the family \(C_n(A, M)\) a simplicial object in the category of \(R\)-modules, and the degeneracy maps are

  \[s_i(a_0 \otimes \cdots \otimes a_n) = a_0 \otimes \cdots \otimes a_i \otimes 1 \otimes a_{i+1} \otimes \cdots \otimes a_n\]

  The Hochschild homology can also be constructed as the homology of this simplicial module.

  REFERENCES:

  - Wikipedia article Hochschild_homology

  - https://ncatlab.org/nlab/show/Hochschild+cohomology

  - [Red2001]

  class Element(parent, vectors)

    Bases: `ModuleElement`

    A chain of the Hochschild complex.

    INPUT:

    Can be one of the following:

    - A dictionary whose keys are the degree and whose \(d\)-th value is an element in the degree \(d\) module.

    - An element in the coefficient module \(M\).

    EXAMPLES:

    Sage

        sage: SGA = SymmetricGroupAlgebra(QQ, 3)
        sage: T = SGA.trivial_representation()
        sage: H = SGA.hochschild_complex(T)
        sage: H(T.an_element())
        Chain(0: 2*B['v'])
        sage: H({0: T.an_element()})
        Chain(0: 2*B['v'])
        sage: H({1: H.module(1).an_element()})
        Chain(1: 2*B['v'] # [1, 2, 3] + 2*B['v'] # [1, 3, 2] + 3*B['v'] # [2, 1, 3])
        sage: H({0: H.module(0).an_element(), 3: H.module(3).an_element()})
        Chain with 2 nonzero terms over Rational Field

        sage: F.<x,y> = FreeAlgebra(ZZ)
        sage: H = F.hochschild_complex(F)
        sage: H(x + 2*y^2)
        Chain(0: F[x] + 2*F[y^2])
        sage: H({0: x*y - x})
        Chain(0: -F[x] + F[x*y])
        sage: H(2)
        Chain(0: 2*F[1])
        sage: H({0: x-y, 2: H.module(2).basis().an_element()})
        Chain with 2 nonzero terms over Integer Ring

    Python

        >>> from sage.all import *
        >>> SGA = SymmetricGroupAlgebra(QQ, Integer(3))
        >>> T = SGA.trivial_representation()
        >>> H = SGA.hochschild_complex(T)
        >>> H(T.an_element())
        Chain(0: 2*B['v'])
        >>> H({Integer(0): T.an_element()})
        Chain(0: 2*B['v'])
        >>> H({Integer(1): H.module(Integer(1)).an_element()})
        Chain(1: 2*B['v'] # [1, 2, 3] + 2*B['v'] # [1, 3, 2] + 3*B['v'] # [2, 1, 3])
        >>> H({Integer(0): H.module(Integer(0)).an_element(), Integer(3): H.module(Integer(3)).an_element()})
        Chain with 2 nonzero terms over Rational Field

        >>> F = FreeAlgebra(ZZ, names=('x', 'y',)); (x, y,) = F._first_ngens(2)
        >>> H = F.hochschild_complex(F)
        >>> H(x + Integer(2)*y**Integer(2))
        Chain(0: F[x] + 2*F[y^2])
        >>> H({Integer(0): x*y - x})
        Chain(0: -F[x] + F[x*y])
        >>> H(Integer(2))
        Chain(0: 2*F[1])
        >>> H({Integer(0): x-y, Integer(2): H.module(Integer(2)).basis().an_element()})
        Chain with 2 nonzero terms over Integer Ring

    vector(degree)

      Return the free module element in `degree`.

      EXAMPLES:

      Sage

          sage: F.<x,y> = FreeAlgebra(ZZ)
          sage: H = F.hochschild_complex(F)
          sage: a = H({0: x-y, 2: H.module(2).basis().an_element()})
          sage: [a.vector(i) for i in range(3)]
          [F[x] - F[y], 0, F[1] # F[1] # F[1]]

      Python

          >>> from sage.all import *
          >>> F = FreeAlgebra(ZZ, names=('x', 'y',)); (x, y,) = F._first_ngens(2)
          >>> H = F.hochschild_complex(F)
          >>> a = H({Integer(0): x-y, Integer(2): H.module(Integer(2)).basis().an_element()})
          >>> [a.vector(i) for i in range(Integer(3))]
          [F[x] - F[y], 0, F[1] # F[1] # F[1]]

  algebra()

    Return the defining algebra of `self`.

    EXAMPLES:

    Sage

        sage: SGA = SymmetricGroupAlgebra(QQ, 3)
        sage: T = SGA.trivial_representation()
        sage: H = SGA.hochschild_complex(T)
        sage: H.algebra()
        Symmetric group algebra of order 3 over Rational Field

    Python

        >>> from sage.all import *
        >>> SGA = SymmetricGroupAlgebra(QQ, Integer(3))
        >>> T = SGA.trivial_representation()
        >>> H = SGA.hochschild_complex(T)
        >>> H.algebra()
        Symmetric group algebra of order 3 over Rational Field

  boundary(d)

    Return the boundary operator in degree `d`.

    EXAMPLES:

    Sage

        sage: E.<x,y> = ExteriorAlgebra(QQ)
        sage: H = E.hochschild_complex(E)
        sage: d1 = H.boundary(1)
        sage: z = d1.domain().an_element(); z
        2*1 # 1 + 2*1 # x + 3*1 # y
        sage: d1(z)
        0
        sage: d1.matrix()
        [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
        [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
        [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
        [ 0  0  0  0  0  0  2  0  0 -2  0  0  0  0  0  0]

        sage: s = SymmetricFunctions(QQ).s()
        sage: H = s.hochschild_complex(s)
        sage: d1 = H.boundary(1)
        sage: x = d1.domain().an_element(); x
        2*s[] # s[] + 2*s[] # s[1] + 3*s[] # s[2]
        sage: d1(x)
        0
        sage: y = tensor([s.an_element(), s.an_element()])
        sage: d1(y)
        0
        sage: z = tensor([s[2,1] + s[3], s.an_element()])
        sage: d1(z)
        0

    Python

        >>> from sage.all import *
        >>> E = ExteriorAlgebra(QQ, names=('x', 'y',)); (x, y,) = E._first_ngens(2)
        >>> H = E.hochschild_complex(E)
        >>> d1 = H.boundary(Integer(1))
        >>> z = d1.domain().an_element(); z
        2*1 # 1 + 2*1 # x + 3*1 # y
        >>> d1(z)
        0
        >>> d1.matrix()
        [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
        [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
        [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
        [ 0  0  0  0  0  0  2  0  0 -2  0  0  0  0  0  0]

        >>> s = SymmetricFunctions(QQ).s()
        >>> H = s.hochschild_complex(s)
        >>> d1 = H.boundary(Integer(1))
        >>> x = d1.domain().an_element(); x
        2*s[] # s[] + 2*s[] # s[1] + 3*s[] # s[2]
        >>> d1(x)
        0
        >>> y = tensor([s.an_element(), s.an_element()])
        >>> d1(y)
        0
        >>> z = tensor([s[Integer(2),Integer(1)] + s[Integer(3)], s.an_element()])
        >>> d1(z)
        0

  coboundary(d)

    Return the coboundary morphism of degree `d`.

    EXAMPLES:

    Sage

        sage: E.<x,y> = ExteriorAlgebra(QQ)
        sage: H = E.hochschild_complex(E)
        sage: del1 = H.coboundary(1)
        sage: z = del1.domain().an_element(); z
        2 + 2*x + 3*y
        sage: del1(z)
        0
        sage: del1.matrix()
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  2]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0 -2]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]

    Python

        >>> from sage.all import *
        >>> E = ExteriorAlgebra(QQ, names=('x', 'y',)); (x, y,) = E._first_ngens(2)
        >>> H = E.hochschild_complex(E)
        >>> del1 = H.coboundary(Integer(1))
        >>> z = del1.domain().an_element(); z
        2 + 2*x + 3*y
        >>> del1(z)
        0
        >>> del1.matrix()
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  2]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0 -2]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]
        [ 0  0  0  0]

  coefficients()

    Return the coefficients of `self`.

    EXAMPLES:

    Sage

        sage: SGA = SymmetricGroupAlgebra(QQ, 3)
        sage: T = SGA.trivial_representation()
        sage: H = SGA.hochschild_complex(T)
        sage: H.coefficients()
        Trivial representation of Standard permutations of 3 over Rational Field

    Python

        >>> from sage.all import *
        >>> SGA = SymmetricGroupAlgebra(QQ, Integer(3))
        >>> T = SGA.trivial_representation()
        >>> H = SGA.hochschild_complex(T)
        >>> H.coefficients()
        Trivial representation of Standard permutations of 3 over Rational Field

  cohomology(d)

    Return the `d`-th cohomology group.

    EXAMPLES:

    Sage

        sage: E.<x,y> = ExteriorAlgebra(QQ)
        sage: H = E.hochschild_complex(E)
        sage: H.cohomology(0)
        Vector space of dimension 3 over Rational Field
        sage: H.cohomology(1)
        Vector space of dimension 4 over Rational Field
        sage: H.cohomology(2)
        Vector space of dimension 6 over Rational Field

        sage: SGA = SymmetricGroupAlgebra(QQ, 3)
        sage: T = SGA.trivial_representation()
        sage: H = SGA.hochschild_complex(T)
        sage: H.cohomology(0)
        Vector space of dimension 1 over Rational Field
        sage: H.cohomology(1)
        Vector space of dimension 0 over Rational Field
        sage: H.cohomology(2)
        Vector space of dimension 0 over Rational Field

    Python

        >>> from sage.all import *
        >>> E = ExteriorAlgebra(QQ, names=('x', 'y',)); (x, y,) = E._first_ngens(2)
        >>> H = E.hochschild_complex(E)
        >>> H.cohomology(Integer(0))
        Vector space of dimension 3 over Rational Field
        >>> H.cohomology(Integer(1))
        Vector space of dimension 4 over Rational Field
        >>> H.cohomology(Integer(2))
        Vector space of dimension 6 over Rational Field

        >>> SGA = SymmetricGroupAlgebra(QQ, Integer(3))
        >>> T = SGA.trivial_representation()
        >>> H = SGA.hochschild_complex(T)
        >>> H.cohomology(Integer(0))
        Vector space of dimension 1 over Rational Field
        >>> H.cohomology(Integer(1))
        Vector space of dimension 0 over Rational Field
        >>> H.cohomology(Integer(2))
        Vector space of dimension 0 over Rational Field

    When working over general rings (except \(\ZZ\)) and we can construct a unitriangular basis for the image quotient, we fallback to a slower implementation using (combinatorial) free modules:

    Sage

        sage: R.<x,y> = QQ[]
        sage: SGA = SymmetricGroupAlgebra(R, 2)
        sage: T = SGA.trivial_representation()
        sage: H = SGA.hochschild_complex(T)
        sage: H.cohomology(1)
        Free module generated by {} over Multivariate Polynomial Ring in x, y over Rational Field

    [Python]

        >>> from sage.all import *
        >>> R = QQ['x, y']; (x, y,) = R._first_ngens(2)
        >>> SGA = SymmetricGroupAlgebra(R, Integer(2))
        >>> T = SGA.trivial_representation()
        >>> H = SGA.hochschild_complex(T)
        >>> H.cohomology(Integer(1))
        Free module generated by {} over Multivariate Polynomial Ring in x, y over Rational Field

  differential(d)

    alias of `boundary()`.

  homology(d)

    Return the `d`-th homology group.

    EXAMPLES:

    Sage

        sage: E.<x,y> = ExteriorAlgebra(QQ)
        sage: H = E.hochschild_complex(E)
        sage: H.homology(0)
        Vector space of dimension 3 over Rational Field
        sage: H.homology(1)
        Vector space of dimension 4 over Rational Field
        sage: H.homology(2)
        Vector space of dimension 6 over Rational Field

        sage: SGA = SymmetricGroupAlgebra(QQ, 3)
        sage: T = SGA.trivial_representation()
        sage: H = SGA.hochschild_complex(T)
        sage: H.homology(0)
        Vector space of dimension 1 over Rational Field
        sage: H.homology(1)
        Vector space of dimension 0 over Rational Field
        sage: H.homology(2)
        Vector space of dimension 0 over Rational Field

    Python

        >>> from sage.all import *
        >>> E = ExteriorAlgebra(QQ, names=('x', 'y',)); (x, y,) = E._first_ngens(2)
        >>> H = E.hochschild_complex(E)
        >>> H.homology(Integer(0))
        Vector space of dimension 3 over Rational Field
        >>> H.homology(Integer(1))
        Vector space of dimension 4 over Rational Field
        >>> H.homology(Integer(2))
        Vector space of dimension 6 over Rational Field

        >>> SGA = SymmetricGroupAlgebra(QQ, Integer(3))
        >>> T = SGA.trivial_representation()
        >>> H = SGA.hochschild_complex(T)
        >>> H.homology(Integer(0))
        Vector space of dimension 1 over Rational Field
        >>> H.homology(Integer(1))
        Vector space of dimension 0 over Rational Field
        >>> H.homology(Integer(2))
        Vector space of dimension 0 over Rational Field

    When working over general rings (except \(\ZZ\)) and we can construct a unitriangular basis for the image quotient, we fallback to a slower implementation using (combinatorial) free modules:

    Sage

        sage: R.<x,y> = QQ[]
        sage: SGA = SymmetricGroupAlgebra(R, 2)
        sage: T = SGA.trivial_representation()
        sage: H = SGA.hochschild_complex(T)
        sage: H.homology(1)
        Free module generated by {} over Multivariate Polynomial Ring in x, y over Rational Field

    [Python]

        >>> from sage.all import *
        >>> R = QQ['x, y']; (x, y,) = R._first_ngens(2)
        >>> SGA = SymmetricGroupAlgebra(R, Integer(2))
        >>> T = SGA.trivial_representation()
        >>> H = SGA.hochschild_complex(T)
        >>> H.homology(Integer(1))
        Free module generated by {} over Multivariate Polynomial Ring in x, y over Rational Field

  module(d)

    Return the module in degree `d`.

    EXAMPLES:

    Sage

        sage: SGA = SymmetricGroupAlgebra(QQ, 3)
        sage: T = SGA.trivial_representation()
        sage: H = SGA.hochschild_complex(T)
        sage: H.module(0)
        Trivial representation of Standard permutations of 3 over Rational Field
        sage: H.module(1)
        Trivial representation of Standard permutations of 3 over Rational Field
         # Symmetric group algebra of order 3 over Rational Field
        sage: H.module(2)
        Trivial representation of Standard permutations of 3 over Rational Field
         # Symmetric group algebra of order 3 over Rational Field
         # Symmetric group algebra of order 3 over Rational Field

    Python

        >>> from sage.all import *
        >>> SGA = SymmetricGroupAlgebra(QQ, Integer(3))
        >>> T = SGA.trivial_representation()
        >>> H = SGA.hochschild_complex(T)
        >>> H.module(Integer(0))
        Trivial representation of Standard permutations of 3 over Rational Field
        >>> H.module(Integer(1))
        Trivial representation of Standard permutations of 3 over Rational Field
         # Symmetric group algebra of order 3 over Rational Field
        >>> H.module(Integer(2))
        Trivial representation of Standard permutations of 3 over Rational Field
         # Symmetric group algebra of order 3 over Rational Field
         # Symmetric group algebra of order 3 over Rational Field

  trivial_module()

    Return the trivial module of `self`.

    EXAMPLES:

    Sage

        sage: E.<x,y> = ExteriorAlgebra(QQ)
        sage: H = E.hochschild_complex(E)
        sage: H.trivial_module()
        Free module generated by {} over Rational Field

    Python

        >>> from sage.all import *
        >>> E = ExteriorAlgebra(QQ, names=('x', 'y',)); (x, y,) = E._first_ngens(2)
        >>> H = E.hochschild_complex(E)
        >>> H.trivial_module()
        Free module generated by {} over Rational Field