Group algebras and beyond: the Algebra functorial construction

Introduction: group algebras

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

sage: G = DihedralGroup(3)
sage: R = QQ
>>> 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: 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)
>>> 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: 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)
>>> 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: (s, t) = A.algebra_generators()
sage: s*t
(1,2)
sage: A.one_basis()
()
sage: A.one()
()
>>> 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: GroupAlgebra(G, R)
Algebra of Dihedral group of order 6 as a permutation group
        over Rational Field
>>> 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: GroupAlgebra(G, R) is G.algebra(R)
True
>>> 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: 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
>>> 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: 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
>>> 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: U in Algebras(QQ)
True
sage: (a,b,c,d) = S.additive_semigroup_generators()
sage: U(a) * U(b)
B[a + b]
>>> 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: 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
>>> 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: 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,
 ...]
>>> 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: 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())
>>> 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: 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
>>> 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: 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
>>> 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: s
(1,2,3)
sage: s.coproduct()
(1,2,3) # (1,2,3)
>>> 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: 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]
>>> 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: A = GroupAlgebra(DihedralGroup(3), QQ)
sage: s
(1,2,3)
sage: s.antipode()
(1,3,2)
>>> 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: 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
>>> 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: # 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
>>> 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: 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)
>>> 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: G = DihedralGroup(2)
sage: A = G.algebra(ZZ)
sage: A(2)
2*()
>>> 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: g = DihedralGroup(2).gen(0); g
(3,4)
sage: A(g)
(3,4)
sage: A(2) * g
2*(3,4)
>>> 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)[source]

Bases: CovariantFunctorialConstruction

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

EXAMPLES:

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
>>> 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()[source]

Return the base ring for this functor.

EXAMPLES:

sage: from sage.categories.algebra_functor import AlgebraFunctor
sage: AlgebraFunctor(QQ).base_ring()
Rational Field
>>> 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)[source]

Bases: CovariantConstructionCategory, Category_over_base_ring

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

INPUT:

  • base_ring – a ring

EXAMPLES:

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})
>>> 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[source]

Bases: object

coproduct_on_basis(g)[source]

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: # 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]]
>>> 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)[source]

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: 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
>>> 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()[source]

Return the group which is associated to this functor.

EXAMPLES:

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