Group algebras and beyond: the Algebra functorial construction - Category Framework

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

# Group algebras and beyond: the Algebra functorial construction

## Introduction: group algebras

Let \(G\) be a group and \(R\) be a ring. For example:

Sage

    sage: G = DihedralGroup(3)
    sage: R = QQ

Python

    >>> from sage.all import *
    >>> G = DihedralGroup(Integer(3))
    >>> R = QQ

The group algebra \(A = RG\) of \(G\) over \(R\) is the space of formal linear combinations of elements of \(group\) with coefficients in \(R\):

Sage

    sage: A = G.algebra(R); A
    Algebra of Dihedral group of order 6 as a permutation group
            over Rational Field
    sage: a = A.an_element(); a
    () + (1,2) + 3*(1,2,3) + 2*(1,3,2)

[Python]

    >>> from sage.all import *
    >>> A = G.algebra(R); A
    Algebra of Dihedral group of order 6 as a permutation group
            over Rational Field
    >>> a = A.an_element(); a
    () + (1,2) + 3*(1,2,3) + 2*(1,3,2)

This space is endowed with an algebra structure, obtained by extending by bilinearity the multiplication of \(G\) to a multiplication on \(RG\):

Sage

    sage: A in Algebras
    True
    sage: a * a
    14*() + 5*(2,3) + 2*(1,2) + 10*(1,2,3) + 13*(1,3,2) + 5*(1,3)

Python

    >>> from sage.all import *
    >>> A in Algebras
    True
    >>> a * a
    14*() + 5*(2,3) + 2*(1,2) + 10*(1,2,3) + 13*(1,3,2) + 5*(1,3)

In particular, the product of two basis elements is induced by the product of the corresponding elements of the group, and the unit of the group algebra is indexed by the unit of the group:

Sage

    sage: s, t = A.algebra_generators()
    sage: s*t
    (1,2)
    sage: A.one_basis()
    ()
    sage: A.one()
    ()

[Python]

    >>> from sage.all import *
    >>> s, t = A.algebra_generators()
    >>> s*t
    (1,2)
    >>> A.one_basis()
    ()
    >>> A.one()
    ()

For the user convenience and backward compatibility, the group algebra can also be constructed with:

Sage

    sage: GroupAlgebra(G, R)
    Algebra of Dihedral group of order 6 as a permutation group
            over Rational Field

Python

    >>> from sage.all import *
    >>> GroupAlgebra(G, R)
    Algebra of Dihedral group of order 6 as a permutation group
            over Rational Field

Since Issue #18700, both constructions are strictly equivalent:

Sage

    sage: GroupAlgebra(G, R) is G.algebra(R)
    True

[Python]

    >>> from sage.all import *
    >>> GroupAlgebra(G, R) is G.algebra(R)
    True

Group algebras are further endowed with a Hopf algebra structure; see below.

## Generalizations

The above construction extends to weaker multiplicative structures than groups: magmas, semigroups, monoids. For a monoid \(S\), we obtain the monoid algebra \(RS\), which is defined exactly as above:

Sage

    sage: S = Monoids().example(); S
    An example of a monoid: the free monoid generated by ('a', 'b', 'c', 'd')
    sage: A = S.algebra(QQ); A
    Algebra of An example of a monoid: the free monoid generated by ('a', 'b', 'c', 'd')
            over Rational Field
    sage: A.category()
    Category of monoid algebras over Rational Field

Python

    >>> from sage.all import *
    >>> S = Monoids().example(); S
    An example of a monoid: the free monoid generated by ('a', 'b', 'c', 'd')
    >>> A = S.algebra(QQ); A
    Algebra of An example of a monoid: the free monoid generated by ('a', 'b', 'c', 'd')
            over Rational Field
    >>> A.category()
    Category of monoid algebras over Rational Field

This construction also extends to additive structures: magmas, semigroups, monoids, or groups:

Sage

    sage: S = CommutativeAdditiveMonoids().example(); S
    An example of a commutative monoid:
     the free commutative monoid generated by ('a', 'b', 'c', 'd')
    sage: U = S.algebra(QQ); U
    Algebra of An example of a commutative monoid:
               the free commutative monoid generated by ('a', 'b', 'c', 'd')
            over Rational Field

[Python]

    >>> from sage.all import *
    >>> S = CommutativeAdditiveMonoids().example(); S
    An example of a commutative monoid:
     the free commutative monoid generated by ('a', 'b', 'c', 'd')
    >>> U = S.algebra(QQ); U
    Algebra of An example of a commutative monoid:
               the free commutative monoid generated by ('a', 'b', 'c', 'd')
            over Rational Field

Despite saying “free module”, this is really an algebra, whose multiplication is induced by the addition of elements of \(S\):

Sage

    sage: U in Algebras(QQ)
    True
    sage: (a,b,c,d) = S.additive_semigroup_generators()
    sage: U(a) * U(b)
    B[a + b]

Python

    >>> from sage.all import *
    >>> U in Algebras(QQ)
    True
    >>> (a,b,c,d) = S.additive_semigroup_generators()
    >>> U(a) * U(b)
    B[a + b]

To catter uniformly for the use cases above and some others, for \(S\) a set and \(K\) a ring, we define in Sage the algebra of `S` as the \(K\)-free module with basis indexed by \(S\), endowed with whatever algebraic structure can be induced from that of \(S\).

Warning

In most use cases, the result is actually an algebra, hence the name of this construction. In other cases this name is misleading:

Sage

    sage: A = Sets().example().algebra(QQ); A
    Algebra of Set of prime numbers (basic implementation)
            over Rational Field
    sage: A.category()
    Category of set algebras over Rational Field
    sage: A in Algebras(QQ)
    False

Python

    >>> from sage.all import *
    >>> A = Sets().example().algebra(QQ); A
    Algebra of Set of prime numbers (basic implementation)
            over Rational Field
    >>> A.category()
    Category of set algebras over Rational Field
    >>> A in Algebras(QQ)
    False

Suggestions for a uniform, meaningful, and non misleading name are welcome!

To achieve this flexibility, the features are implemented as a Covariant Functorial Constructions that is essentially a hierarchy of categories each providing the relevant additional features:

Sage

    sage: A = DihedralGroup(3).algebra(QQ)
    sage: A.categories()
    [Category of finite group algebras over Rational Field,
     ...
     Category of group algebras over Rational Field,
     ...
     Category of monoid algebras over Rational Field,
     ...
     Category of semigroup algebras over Rational Field,
     ...
     Category of unital magma algebras over Rational Field,
     Category of magma algebras over Rational Field,
     ...
     Category of set algebras over Rational Field,
     ...]

Python

    >>> from sage.all import *
    >>> A = DihedralGroup(Integer(3)).algebra(QQ)
    >>> A.categories()
    [Category of finite group algebras over Rational Field,
     ...
     Category of group algebras over Rational Field,
     ...
     Category of monoid algebras over Rational Field,
     ...
     Category of semigroup algebras over Rational Field,
     ...
     Category of unital magma algebras over Rational Field,
     Category of magma algebras over Rational Field,
     ...
     Category of set algebras over Rational Field,
     ...]

## Specifying the algebraic structure

Constructing the algebra of a set endowed with both an additive and a multiplicative structure is ambiguous:

Sage

    sage: Z3 = IntegerModRing(3)
    sage: A = Z3.algebra(QQ)
    Traceback (most recent call last):
    ...
    TypeError:  `S = Ring of integers modulo 3` is both
     an additive and a multiplicative semigroup.
     Constructing its algebra is ambiguous.
     Please use, e.g., S.algebra(QQ, category=Semigroups())

Python

    >>> from sage.all import *
    >>> Z3 = IntegerModRing(Integer(3))
    >>> A = Z3.algebra(QQ)
    Traceback (most recent call last):
    ...
    TypeError:  `S = Ring of integers modulo 3` is both
     an additive and a multiplicative semigroup.
     Constructing its algebra is ambiguous.
     Please use, e.g., S.algebra(QQ, category=Semigroups())

This ambiguity can be resolved using the `category` argument of the construction:

Sage

    sage: A = Z3.algebra(QQ, category=Monoids()); A
    Algebra of Ring of integers modulo 3 over Rational Field
    sage: A.category()
    Category of finite dimensional monoid algebras over Rational Field

    sage: A = Z3.algebra(QQ, category=CommutativeAdditiveGroups()); A
    Algebra of Ring of integers modulo 3 over Rational Field
    sage: A.category()
    Category of finite dimensional commutative additive group algebras
     over Rational Field

[Python]

    >>> from sage.all import *
    >>> A = Z3.algebra(QQ, category=Monoids()); A
    Algebra of Ring of integers modulo 3 over Rational Field
    >>> A.category()
    Category of finite dimensional monoid algebras over Rational Field

    >>> A = Z3.algebra(QQ, category=CommutativeAdditiveGroups()); A
    Algebra of Ring of integers modulo 3 over Rational Field
    >>> A.category()
    Category of finite dimensional commutative additive group algebras
     over Rational Field

In general, the `category` argument can be used to specify which structure of \(S\) shall be extended to \(KS\).

## Group algebras, continued

Let us come back to the case of a group algebra \(A=RG\). It is endowed with more structure and in particular that of a Hopf algebra:

Sage

    sage: G = DihedralGroup(3)
    sage: A = G.algebra(R); A
    Algebra of Dihedral group of order 6 as a permutation group
            over Rational Field
    sage: A in HopfAlgebras(R).FiniteDimensional().WithBasis()
    True

Python

    >>> from sage.all import *
    >>> G = DihedralGroup(Integer(3))
    >>> A = G.algebra(R); A
    Algebra of Dihedral group of order 6 as a permutation group
            over Rational Field
    >>> A in HopfAlgebras(R).FiniteDimensional().WithBasis()
    True

The basis elements are group-like for the coproduct: \(\Delta(g) = g \otimes g\):

Sage

    sage: s
    (1,2,3)
    sage: s.coproduct()
    (1,2,3) # (1,2,3)

[Python]

    >>> from sage.all import *
    >>> s
    (1,2,3)
    >>> s.coproduct()
    (1,2,3) # (1,2,3)

The counit is the constant function \(1\) on the basis elements:

Sage

    sage: A = GroupAlgebra(DihedralGroup(6), QQ)
    sage: [A.counit(g) for g in A.basis()]
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

Python

    >>> from sage.all import *
    >>> A = GroupAlgebra(DihedralGroup(Integer(6)), QQ)
    >>> [A.counit(g) for g in A.basis()]
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

The antipode is given on basis elements by \(\chi(g) = g^{-1}\):

Sage

    sage: A = GroupAlgebra(DihedralGroup(3), QQ)
    sage: s
    (1,2,3)
    sage: s.antipode()
    (1,3,2)

[Python]

    >>> from sage.all import *
    >>> A = GroupAlgebra(DihedralGroup(Integer(3)), QQ)
    >>> s
    (1,2,3)
    >>> s.antipode()
    (1,3,2)

By Maschke’s theorem, for a finite group whose cardinality does not divide the characteristic of the base field, the algebra is semisimple:

Sage

    sage: SymmetricGroup(5).algebra(QQ) in Algebras(QQ).Semisimple()                    # needs sage.combinat
    True
    sage: CyclicPermutationGroup(10).algebra(FiniteField(7)) in Algebras.Semisimple
    True
    sage: CyclicPermutationGroup(10).algebra(FiniteField(5)) in Algebras.Semisimple
    False

Python

    >>> from sage.all import *
    >>> SymmetricGroup(Integer(5)).algebra(QQ) in Algebras(QQ).Semisimple()                    # needs sage.combinat
    True
    >>> CyclicPermutationGroup(Integer(10)).algebra(FiniteField(Integer(7))) in Algebras.Semisimple
    True
    >>> CyclicPermutationGroup(Integer(10)).algebra(FiniteField(Integer(5))) in Algebras.Semisimple
    False

## Coercions

Let \(RS\) be the algebra of some structure \(S\). Then \(RS\) admits the natural coercion from any other algebra \(R'S'\) of some structure \(S'\), as long as \(R'\) coerces into \(R\) and \(S'\) coerces into \(S\).

For example, since there is a natural inclusion from the dihedral group \(D_2\) of order 4 into the symmetric group \(S_4\) of order 4!, and since there is a natural map from the integers to the rationals, there is a natural map from \(\ZZ[D_2]\) to \(\QQ[S_4]\):

Sage

    sage: # needs sage.combinat
    sage: A = DihedralGroup(2).algebra(ZZ)
    sage: B = SymmetricGroup(4).algebra(QQ)
    sage: a = A.an_element(); a
    () + 2*(3,4) + 3*(1,2) + (1,2)(3,4)
    sage: b = B.an_element(); b
    () + (2,3,4) + 2*(1,3)(2,4) + 3*(1,4)(2,3)
    sage: B(a)
    () + 2*(3,4) + 3*(1,2) + (1,2)(3,4)
    sage: a * b  # a is automatically converted to an element of B
    () + 2*(3,4) + 2*(2,3) + (2,3,4) + 3*(1,2) + (1,2)(3,4) + (1,3,2)
     + 3*(1,3,4,2) + 5*(1,3)(2,4) + 13*(1,3,2,4) + 12*(1,4,2,3) + 5*(1,4)(2,3)
    sage: parent(a * b)
    Symmetric group algebra of order 4 over Rational Field

Python

    >>> from sage.all import *
    >>> # needs sage.combinat
    >>> A = DihedralGroup(Integer(2)).algebra(ZZ)
    >>> B = SymmetricGroup(Integer(4)).algebra(QQ)
    >>> a = A.an_element(); a
    () + 2*(3,4) + 3*(1,2) + (1,2)(3,4)
    >>> b = B.an_element(); b
    () + (2,3,4) + 2*(1,3)(2,4) + 3*(1,4)(2,3)
    >>> B(a)
    () + 2*(3,4) + 3*(1,2) + (1,2)(3,4)
    >>> a * b  # a is automatically converted to an element of B
    () + 2*(3,4) + 2*(2,3) + (2,3,4) + 3*(1,2) + (1,2)(3,4) + (1,3,2)
     + 3*(1,3,4,2) + 5*(1,3)(2,4) + 13*(1,3,2,4) + 12*(1,4,2,3) + 5*(1,4)(2,3)
    >>> parent(a * b)
    Symmetric group algebra of order 4 over Rational Field

There is no obvious map in the other direction, though:

Sage

    sage: A(b)
    Traceback (most recent call last):
    ...
    TypeError: do not know how to make x (= () + (2,3,4) + 2*(1,3)(2,4) + 3*(1,4)(2,3))
     an element of self
     (=Algebra of Dihedral group of order 4 as a permutation group over Integer Ring)

[Python]

    >>> from sage.all import *
    >>> A(b)
    Traceback (most recent call last):
    ...
    TypeError: do not know how to make x (= () + (2,3,4) + 2*(1,3)(2,4) + 3*(1,4)(2,3))
     an element of self
     (=Algebra of Dihedral group of order 4 as a permutation group over Integer Ring)

If \(S\) is a unital (additive) magma, then \(RS\) is a unital algebra, and thus admits a coercion from its base ring \(R\) and any ring that coerces into \(R\).

Sage

    sage: G = DihedralGroup(2)
    sage: A = G.algebra(ZZ)
    sage: A(2)
    2*()

Python

    >>> from sage.all import *
    >>> G = DihedralGroup(Integer(2))
    >>> A = G.algebra(ZZ)
    >>> A(Integer(2))
    2*()

If \(S\) is a multiplicative group, then \(RS\) admits a coercion from \(S\) and from any group which coerce into \(S\):

Sage

    sage: g = DihedralGroup(2).gen(0); g
    (3,4)
    sage: A(g)
    (3,4)
    sage: A(2) * g
    2*(3,4)

[Python]

    >>> from sage.all import *
    >>> g = DihedralGroup(Integer(2)).gen(Integer(0)); g
    (3,4)
    >>> A(g)
    (3,4)
    >>> A(Integer(2)) * g
    2*(3,4)

Note that there is an ambiguity if \(S'\) is a group which coerces into both \(R\) and \(S\). For example) if \(S\) is the additive group \((\ZZ,+)\), and \(A = RS\) is its group algebra, then the integer \(2\) can be coerced into \(A\) in two ways – via \(S\), or via the base ring \(R\) – and the answers are different. It that case the coercion to \(R\) takes precedence. In particular, if \(\ZZ\) is the ring (or group) of integers, then \(\ZZ\) will coerce to any \(RS\), by sending \(\ZZ\) to \(R\). In generic code, it is therefore recommended to always explicitly use `A.monomial(g)` to convert an element of the group into \(A\).

AUTHORS:

- David Loeffler (2008-08-24): initial version

- Martin Raum (2009-08): update to use new coercion model – see Issue #6670.

- John Palmieri (2011-07): more updates to coercion, categories, etc., group algebras constructed using CombinatorialFreeModule – see Issue #6670.

- Nicolas M. Thiéry (2010-2017), Travis Scrimshaw (2017): generalization to a covariant functorial construction for monoid algebras, and beyond – see e.g. Issue #18700.

class sage.categories.algebra_functor.AlgebraFunctor(base_ring)

  Bases: `CovariantFunctorialConstruction`

  For a fixed ring, a functor sending a group/… to the corresponding group/… algebra.

  EXAMPLES:

  Sage

      sage: from sage.categories.algebra_functor import AlgebraFunctor
      sage: F = AlgebraFunctor(QQ); F
      The algebra functorial construction
      sage: F(DihedralGroup(3))
      Algebra of Dihedral group of order 6 as a permutation group
              over Rational Field

  Python

      >>> from sage.all import *
      >>> from sage.categories.algebra_functor import AlgebraFunctor
      >>> F = AlgebraFunctor(QQ); F
      The algebra functorial construction
      >>> F(DihedralGroup(Integer(3)))
      Algebra of Dihedral group of order 6 as a permutation group
              over Rational Field

  base_ring()

    Return the base ring for this functor.

    EXAMPLES:

    Sage

        sage: from sage.categories.algebra_functor import AlgebraFunctor
        sage: AlgebraFunctor(QQ).base_ring()
        Rational Field

    Python

        >>> from sage.all import *
        >>> from sage.categories.algebra_functor import AlgebraFunctor
        >>> AlgebraFunctor(QQ).base_ring()
        Rational Field

class sage.categories.algebra_functor.AlgebrasCategory(category, *args)

  Bases: `CovariantConstructionCategory`, `Category_over_base_ring`

  An abstract base class for categories of monoid algebras, groups algebras, and the like.

  See also

  - `Sets.ParentMethods.algebra()`

  - `Sets.SubcategoryMethods.Algebras()`

  - `CovariantFunctorialConstruction`

  INPUT:

  - `base_ring` – a ring

  EXAMPLES:

  Sage

      sage: C = Groups().Algebras(QQ); C
      Category of group algebras over Rational Field
      sage: C = Monoids().Algebras(QQ); C
      Category of monoid algebras over Rational Field

      sage: C._short_name()
      'Algebras'
      sage: latex(C) # todo: improve that
      \mathbf{Algebras}(\mathbf{Monoids})

  Python

      >>> from sage.all import *
      >>> C = Groups().Algebras(QQ); C
      Category of group algebras over Rational Field
      >>> C = Monoids().Algebras(QQ); C
      Category of monoid algebras over Rational Field

      >>> C._short_name()
      'Algebras'
      >>> latex(C) # todo: improve that
      \mathbf{Algebras}(\mathbf{Monoids})

  class ParentMethods

    Bases: `object`

    coproduct_on_basis(g)

      Return the coproduct of the element `g` of the basis.

      Each basis element `g` is group-like. This method is used to compute the coproduct of any element.

      EXAMPLES:

      Sage

          sage: # needs sage.combinat
          sage: PF = NonDecreasingParkingFunctions(4)
          sage: A = PF.algebra(ZZ); A
          Algebra of Non-decreasing parking functions of size 4 over Integer Ring
          sage: g = PF.an_element(); g
          [1, 1, 1, 1]
          sage: A.coproduct_on_basis(g)
          B[[1, 1, 1, 1]] # B[[1, 1, 1, 1]]
          sage: a = A.an_element(); a
          2*B[[1, 1, 1, 1]] + 2*B[[1, 1, 1, 2]] + 3*B[[1, 1, 1, 3]]
          sage: a.coproduct()
          2*B[[1, 1, 1, 1]] # B[[1, 1, 1, 1]] +
          2*B[[1, 1, 1, 2]] # B[[1, 1, 1, 2]] +
          3*B[[1, 1, 1, 3]] # B[[1, 1, 1, 3]]

      Python

          >>> from sage.all import *
          >>> # needs sage.combinat
          >>> PF = NonDecreasingParkingFunctions(Integer(4))
          >>> A = PF.algebra(ZZ); A
          Algebra of Non-decreasing parking functions of size 4 over Integer Ring
          >>> g = PF.an_element(); g
          [1, 1, 1, 1]
          >>> A.coproduct_on_basis(g)
          B[[1, 1, 1, 1]] # B[[1, 1, 1, 1]]
          >>> a = A.an_element(); a
          2*B[[1, 1, 1, 1]] + 2*B[[1, 1, 1, 2]] + 3*B[[1, 1, 1, 3]]
          >>> a.coproduct()
          2*B[[1, 1, 1, 1]] # B[[1, 1, 1, 1]] +
          2*B[[1, 1, 1, 2]] # B[[1, 1, 1, 2]] +
          3*B[[1, 1, 1, 3]] # B[[1, 1, 1, 3]]

class sage.categories.algebra_functor.GroupAlgebraFunctor(group)

  Bases: `ConstructionFunctor`

  For a fixed group, a functor sending a commutative ring to the corresponding group algebra.

  INPUT:

  - `group` – the group associated to each group algebra under consideration

  EXAMPLES:

  Sage

      sage: from sage.categories.algebra_functor import GroupAlgebraFunctor
      sage: F = GroupAlgebraFunctor(KleinFourGroup()); F
      GroupAlgebraFunctor
      sage: A = F(QQ); A
      Algebra of The Klein 4 group of order 4, as a permutation group over Rational Field

  Python

      >>> from sage.all import *
      >>> from sage.categories.algebra_functor import GroupAlgebraFunctor
      >>> F = GroupAlgebraFunctor(KleinFourGroup()); F
      GroupAlgebraFunctor
      >>> A = F(QQ); A
      Algebra of The Klein 4 group of order 4, as a permutation group over Rational Field

  group()

    Return the group which is associated to this functor.

    EXAMPLES:

    Sage

        sage: from sage.categories.algebra_functor import GroupAlgebraFunctor
        sage: GroupAlgebraFunctor(CyclicPermutationGroup(17)).group() == CyclicPermutationGroup(17)
        True

    Python

        >>> from sage.all import *
        >>> from sage.categories.algebra_functor import GroupAlgebraFunctor
        >>> GroupAlgebraFunctor(CyclicPermutationGroup(Integer(17))).group() == CyclicPermutationGroup(Integer(17))
        True