Symmetry, made linear
Groups are abstract, but they usually come to us acting on something: the symmetries of a molecule act on the displacements of its atoms, the rotations of a sphere act on functions on the sphere, the permutations of objects act on polynomials in variables. In each case the group acts by linear maps on a vector space, and the most useful thing one can do is to split the space into pieces that the group preserves and cannot split further. For a vibrating molecule the pieces are the normal modes; for functions on a circle under rotations they are the Fourier modes ; for the sphere, the spherical harmonics.
Representation theory studies these linear actions. For finite groups over the theory is complete and beautiful. Every representation splits into irreducible ones (Maschke); there are finitely many irreducible ones, as many as conjugacy classes; and each representation is determined by a single function on the group, its character , so that the whole theory of a group is compressed into a square character table. The theory grew out of a question of Dedekind about factoring a determinant, answered by Frobenius in 1896, and it now runs through number theory, combinatorics, physics and chemistry.
This lesson assumes groups (conjugacy classes, cosets) and advanced linear algebra (eigenvalues, traces, tensor products, duals). Unless stated otherwise, is a finite group and representations are finite-dimensional over .
Splitting the permutation action of S₃
Let permute the coordinates of . Two subspaces are obviously preserved: the line spanned by , on which every permutation acts trivially, and the plane . So . The plane cannot be split further: a line in preserved by all of would have to be an eigenline of the -cycle, which acts on as a rotation by with eigenvalues () — and the transpositions swap those two eigenlines. Geometrically, is the plane of an equilateral triangle, with acting as its symmetry group.
Now take traces. The trace of a permutation matrix counts fixed points: for the identity, for a transposition, for a -cycle. On the trace is always ; so on it is . These numbers turn out to determine everything: the decomposition of any representation of can be read off from its traces by taking inner products with the rows
of the character table of (values on the identity, transpositions and -cycles). Why this works is the main theorem of the lesson.
Definitions
Definition— representation; intertwiner
A representation of on a vector space over a field is a homomorphism ; we often write for . Its degree is . An intertwiner (or -map) between representations and is a linear map with for all ; they form a vector space . An invertible intertwiner is an isomorphism of representations.
Definition— subrepresentation; irreducible; completely reducible
A subspace with for all is a subrepresentation (an invariant subspace). is irreducible if and its only subrepresentations are and . It is completely reducible if it is a direct sum of irreducible subrepresentations.
Definition— group algebra
The group algebra has basis and multiplication . A representation of on is the same as a -module structure on (extend linearly), and intertwiners are -module homomorphisms. So the language of modules applies: irreducible representations are simple modules. The regular representation is acting on itself by left multiplication.
Definition— character; class function; inner product
The character of a representation is , . A class function is a function constant on conjugacy classes. For class functions , define the Hermitian inner product
Definition— restriction and induction
For a subgroup , every representation of restricts to a representation of . Conversely, for a representation of , the induced representation is . Choosing coset representatives of , it is , of dimension , where sends to when with .
Examples
Example— One-dimensional representations
A one-dimensional representation is a homomorphism , and it equals its character. The trivial representation sends everything to ; the sign of is another. For the cyclic group there are exactly of them, with , — the characters of the discrete Fourier transform. One-dimensional characters factor through the abelianisation , so there are of them.
Example— Permutation and regular representations
If acts on a finite set , it acts on by permuting basis vectors, and the character is , the number of fixed points. The regular representation is the case , with character and for .
Example— The two-dimensional representations of S₃, D₄ and Q₈
- acts on the plane of an equilateral triangle: the -cycle as a rotation by , a transposition as a reflection. Character .
- The dihedral group of order (symmetries of a square, generated by a rotation by and a reflection ) acts on : , .
- The quaternion group acts on by , .
Each is irreducible: two non-commuting matrices cannot both be diagonal in one basis, and a two-dimensional representation is reducible exactly when it has an invariant line, after which (by Maschke) it splits into two one-dimensional pieces with commuting images. Both order- representations have character at the identity, at the central element (, respectively ), and elsewhere.
Example— Representations that are not completely reducible
- Infinite groups. acting on by : the line is invariant, and it is the only invariant line, so it has no invariant complement.
- Characteristic dividing . Over , the same matrix with gives a representation of the cyclic group of order with a single invariant line (formalised below for ; computed for in the second experiment).
The main theorems
Theorem— Theorem 1 (Maschke, 1898)
Let be a finite group and a field whose characteristic does not divide . Then every subrepresentation of a representation has an invariant complement. Consequently every finite-dimensional representation is completely reducible.
Proof
Choose any linear projection (a linear map with for ), for instance by extending a basis of . Average it over :
This makes sense because is invertible in . Each term maps into (as is invariant), and for , , so is again a projection onto . It is an intertwiner: for ,
reindexing . Hence is invariant, and . Complete reducibility follows by induction on .
∎
Theorem— Theorem 2 (Schur's lemma, 1905)
Let be irreducible representations of over a field .
- Every non-zero intertwiner is an isomorphism; so if .
- If is algebraically closed and is finite-dimensional, every intertwiner is a scalar: .
Proof
(1) For an intertwiner , and are subrepresentations. If , then , so ; and , so .
(2) has an eigenvalue ( algebraically closed, finite-dimensional). Then is an intertwiner with non-zero kernel, hence zero by (1).
∎
A first consequence: every irreducible complex representation of an abelian group is one-dimensional, since each commutes with the action and is therefore a scalar, so every line is invariant.
From now on . Two facts about characters are immediate: , and is a class function, since . Moreover , so is diagonalisable with roots of unity as eigenvalues, and . Characters add over direct sums and multiply over tensor products, and the dual representation has character .
Theorem— Theorem 3 (orthogonality of characters)
For representations of ,
In particular, the characters of irreducible representations are orthonormal: if and otherwise.
Proof
Invariants. For any representation , the average satisfies for all , so it maps into the invariants , and it is the identity on . So is a projection onto , and its trace is its rank:
Apply it to , with acting by . Its invariants are exactly the intertwiners, and since , its character is . So . For irreducible , Schur's lemma gives or .
∎
Theorem— Corollary 4 (decomposing with characters)
Let be the distinct irreducible representations, with characters and degrees .
- In any decomposition , the multiplicities are ; so a representation is determined up to isomorphism by its character.
- is irreducible if and only if .
- The regular representation contains each exactly times, , and hence . In particular there are finitely many irreducibles.
Proof
(1) By orthonormality, . (2) , which is exactly when one is and the rest vanish. (3) ; every irreducible occurs, since ; and comparing dimensions gives .
∎
Theorem— Theorem 5 (the character table is square)
The irreducible characters form an orthonormal basis of the space of class functions on . Hence the number of irreducible representations equals the number of conjugacy classes. Moreover the columns are orthogonal: for ,
Proof
Orthonormal vectors are independent, so it remains to show that the span. Let be a class function with for all . For a representation put . Since is a class function, , so is an intertwiner. On it is a scalar by Schur's lemma, and taking traces, . So on every irreducible, hence on every representation (Maschke), in particular on the regular one, where forces .
For the columns: let be the square matrix with entries over irreducibles and classes . Row orthonormality says ; for a square matrix this implies , which is the column relation, using (orbit–stabiliser).
∎
Theorem— Theorem 6 (Frobenius reciprocity, 1898)
For , a class function on and a class function on , define the induced class function
It is the character of when , and
Equivalently : induction is left adjoint to restriction.
Proof
The character. In , the element maps to with . Only blocks with contribute to the trace, that is , and there the block acts as on . So ; replacing by any gives the same term, hence the formula with .
Reciprocity. Using that is a class function and substituting (for each a bijection between the with and ),
The adjunction form follows from Theorem 3 and complete reducibility, or directly from and the tensor–hom adjunction.
∎
Theorem— Theorem 7 (four character tables)
With classes listed as indicated, the character tables of , , and are:
— classes , , of sizes : rows , , .
and — classes of sizes , namely for and for : rows
— classes , , , , of sizes : rows
In particular and have the same character table, although they are not isomorphic.
Proof
: three classes, so three irreducibles; trivial and sign; the third has degree with , so , and its character is from the intuition section (or from column orthogonality).
and : five classes. In both groups the commutator subgroup is the centre (, respectively ), and , which has four one-dimensional characters; they give the first four rows (they are on ). The fifth irreducible has degree with , so ; its character is the one computed in the examples, and column orthogonality confirms its values.
: five classes. Trivial and sign. The permutation representation on has character and , so it is the trivial representation plus an irreducible with character . Then has character , a different irreducible. The last has degree with , so ; it is pulled back from through the surjection (the action on the three ways of splitting into two pairs, with kernel ), giving .
: has five elements of order ( and four reflections), only one ().
∎
The character table does not see the power map : the Frobenius–Schur indicator of the two-dimensional character is for (it is realisable over ) and for (it is quaternionic, not realisable over ), as the first experiment computes.
Explore: the two-dimensional representation of S₃
Below, is the rotation by (a -cycle in ) and the reflection in the -axis (a transposition), the images of two generators in the two-dimensional representation of . Compare "first , then " with "first , then ": they differ, so the representation is not a sum of one-dimensional ones (whose images would commute). Look also at the invariant lines: the reflection has two, the rotation none over — there is no line preserved by both, which is irreducibility seen geometrically. Over the rotation has two eigenlines, but the reflection swaps them. Check the traces: and , the character values and .
Two generators of S₃ acting on the plane
Rotation by 120° and a reflection do not commute: the representation is irreducible.
- image of the grid
- image of the unit square
- image of the flag
- before the transformation
- after the first step
AB ≠ BA: the order matters.
BA means “apply A first, then B”: products of transformations are read from right to left.
det(AB) = det(BA) = det A · det B = 1 · −1 = −1 The area scale factor is the same in either order.
Every representation in this lesson can be seen as symmetries of a shape: for the triangle, for the square. Turn on the lines of symmetry and the rotation to see the elements of each group; the class sizes of () appear as the identity, the half-turn, the two quarter-turns, and the two pairs of mirror lines (through vertices, and through edge midpoints).
Symmetry groups of polygons
D₃ ≅ S₃ for the triangle, D₄ for the square.
Equilateral triangleTriangle
- Lines of symmetry
- 3
- Rotational symmetry
- Order 3
All three sides are equal and all three angles are 60°.
Each dashed line is a line of symmetry: fold along it and the two halves match exactly.
Representation theory in Lean and Mathlib
Mathlib's Representation k G V is a monoid homomorphism G →* (V →ₗ[k] V), and FDRep k G is the category of finite-dimensional representations. Schur's lemma, proved here as in the text from the simplicity of kernels and images (stated for simple modules over any ring, which covers -modules), with Mathlib's versions:
/-- **Schur's lemma.** A non-zero homomorphism between simple modules is bijective. (For
representations of `G` over `k`, take modules over the group algebra `k[G]`.) Human proof: the
kernel of `f` is a submodule of the simple module `M`, so it is `0` or `M`; it is not `M` because
`f ≠ 0`; so `f` is injective. The image is a submodule of the simple module `N`, so it is `0` or
`N`; it is not `0`; so `f` is surjective. -/
theorem schur {R M N : Type*} [Ring R] [AddCommGroup M] [Module R M] [AddCommGroup N]
[Module R N] [IsSimpleModule R M] [IsSimpleModule R N] (f : M →ₗ[R] N) (hf : f ≠ 0) :
Function.Bijective f := by
constructor
· rcases IsSimpleOrder.eq_bot_or_eq_top (LinearMap.ker f) with h | h
· exact LinearMap.ker_eq_bot.mp h
· exact absurd (LinearMap.ker_eq_top.mp h) hf
· rcases IsSimpleOrder.eq_bot_or_eq_top (LinearMap.range f) with h | h
· exact absurd (LinearMap.range_eq_bot.mp h) hf
· exact LinearMap.range_eq_top.mp h/-- Schur's lemma in Mathlib: `LinearMap.bijective_of_ne_zero`. -/
theorem schur_library {R M N : Type*} [Ring R] [AddCommGroup M] [Module R M] [AddCommGroup N]
[Module R N] [IsSimpleModule R M] [IsSimpleModule R N] {f : M →ₗ[R] N} (hf : f ≠ 0) :
Function.Bijective f :=
LinearMap.bijective_of_ne_zero hf/-- **Schur's lemma over an algebraically closed field**: between irreducible finite-dimensional
representations, `dim Hom(V, W)` is `1` if `V ≅ W` and `0` otherwise; in particular every
endomorphism of an irreducible representation is a scalar. Mathlib:
`FDRep.finrank_hom_simple_simple`. -/
theorem schur_dimension {k G : Type} [Field k] [IsAlgClosed k] [Monoid G] (V W : FDRep k G)
[Simple V] [Simple W] [Decidable (Nonempty (V ≅ W))] :
Module.finrank k (V ⟶ W) = if Nonempty (V ≅ W) then 1 else 0 := by
classical
convert FDRep.finrank_hom_simple_simple V WMaschke's theorem from Mathlib, proved there by the same averaging argument; and its failure when the characteristic divides , proved here for the shear over , following the human argument:
/-- **Maschke's theorem**: if `G` is finite and `|G|` is non-zero in the field `k`, every
subrepresentation of a representation of `G` (a `k[G]`-submodule) has an invariant complement.
Mathlib: `MonoidAlgebra.Submodule.exists_isCompl`, proved by averaging a projection over `G`, as
in the lesson. -/
theorem maschke {k G V : Type*} [Field k] [Group G] [Finite G] [NeZero (Nat.card G : k)]
[AddCommGroup V] [Module (MonoidAlgebra k G) V] (p : Submodule (MonoidAlgebra k G) V) :
∃ q : Submodule (MonoidAlgebra k G) V, IsCompl p q :=
MonoidAlgebra.Submodule.exists_isCompl p/-- The shear `(x, y) ↦ (x + y, y)` on `𝔽₂²`. -/
def shear : (ZMod 2 × ZMod 2) →ₗ[ZMod 2] (ZMod 2 × ZMod 2) :=
(LinearMap.fst (ZMod 2) (ZMod 2) (ZMod 2) + LinearMap.snd (ZMod 2) (ZMod 2) (ZMod 2)).prod
(LinearMap.snd (ZMod 2) (ZMod 2) (ZMod 2))/-- Over `𝔽₂` the shear has order `2`: `(x + y + y, y) = (x, y)`. So `1 ↦ id`, `g ↦ shear` is a
representation of the cyclic group of order `2` on `𝔽₂²`. -/
theorem shear_sq : shear ∘ₗ shear = LinearMap.id := by
apply LinearMap.ext
rintro ⟨x, y⟩
simp only [shear, LinearMap.comp_apply, LinearMap.prod_apply, LinearMap.id_apply]
revert x y
decide/-- **Maschke fails when the characteristic divides `|G|`.** For the representation of the group
of order `2` by the shear on `𝔽₂²`, the invariant line `L = 𝔽₂ · (1, 0)` has no invariant
complement. Human proof: a complement `Q` contains a vector `b = (c, 1)` (since `L + Q` contains
`(0, 1)`); if `Q` were invariant, it would contain `shear b - b = (1, 0)`, which lies in `L`,
contradicting `L ∩ Q = 0`. -/
theorem maschke_fails :
¬ ∃ q : Submodule (ZMod 2) (ZMod 2 × ZMod 2),
IsCompl (Submodule.span (ZMod 2) {((1 : ZMod 2), (0 : ZMod 2))}) q ∧
∀ x ∈ q, shear x ∈ q := by
rintro ⟨q, hc, hq⟩
have htop : ((0 : ZMod 2), (1 : ZMod 2)) ∈
Submodule.span (ZMod 2) {((1 : ZMod 2), (0 : ZMod 2))} ⊔ q := by
rw [hc.sup_eq_top]; trivial
obtain ⟨a, ha, b, hb, hab⟩ := Submodule.mem_sup.mp htop
obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.mp ha
have hb2 : b.2 = 1 := by
have := congrArg Prod.snd hab
simpa using this
have hdiff : shear b - b ∈ q := q.sub_mem (hq b hb) hb
have hval : shear b - b = ((1 : ZMod 2), (0 : ZMod 2)) := by
ext
· simp [shear, hb2]
· simp [shear]
have hmem : ((1 : ZMod 2), (0 : ZMod 2)) ∈
Submodule.span (ZMod 2) {((1 : ZMod 2), (0 : ZMod 2))} ⊓ q :=
⟨Submodule.subset_span rfl, hval ▸ hdiff⟩
rw [hc.inf_eq_bot, Submodule.mem_bot] at hmem
have := congrArg Prod.fst hmem
simp at thisCharacters are class functions, and irreducible characters are orthonormal (Mathlib, over any algebraically closed field in which is invertible):
/-- **Characters are class functions**: `χ(h g h⁻¹) = χ(g)`, because the trace is invariant under
conjugation. Mathlib: `Representation.char_conj`. -/
theorem char_class_function {k G V : Type*} [Field k] [Group G] [AddCommGroup V] [Module k V]
[FiniteDimensional k V] (ρ : Representation k G V) (g h : G) :
ρ.character (h * g * h⁻¹) = ρ.character g :=
ρ.char_conj g h/-- **Orthogonality of irreducible characters**: for irreducible representations `ρ, σ` of a
finite group over an algebraically closed field in which `|G|` is invertible,
`(1/|G|) ∑_g χ_ρ(g) χ_σ(g⁻¹)` is `1` if `σ ≅ ρ` and `0` otherwise. Mathlib:
`Representation.char_orthonormal`, proved from Schur's lemma and averaging, as in the lesson. -/
theorem char_orthonormal {k G V W : Type*} [Field k] [IsAlgClosed k] [Group G] [Fintype G]
[Invertible (Nat.card G : k)] [AddCommGroup V] [Module k V] [FiniteDimensional k V]
[AddCommGroup W] [Module k W] [FiniteDimensional k W] (ρ : Representation k G V)
(σ : Representation k G W) [ρ.IsIrreducible] [σ.IsIrreducible]
[Decidable (Nonempty (σ.Equiv ρ))] :
(Nat.card G : k)⁻¹ * ∑ g : G, ρ.character g * σ.character g⁻¹ =
if Nonempty (σ.Equiv ρ) then 1 else 0 := by
classical
convert Representation.char_orthonormal ρ σThe character tables of and of the groups of order , with their orthogonality relations checked by evaluation, and the non-isomorphism of and (Mathlib's DihedralGroup 4 and QuaternionGroup 2) by counting solutions of :
/-- The character table of `S₃`. Rows: the trivial, sign and 2-dimensional (standard)
characters; columns: the classes of the identity (size `1`), the transpositions (size `3`) and
the 3-cycles (size `2`). -/
def s3Table : Fin 3 → Fin 3 → ℤ := ![![1, 1, 1], ![1, -1, 1], ![2, 0, -1]]/-- **Row orthogonality for `S₃`**: `∑_C |C| χᵢ(C) χⱼ(C) = 6 δᵢⱼ` (the characters are real, so no
complex conjugation is needed), and **column orthogonality**: `∑ᵢ χᵢ(C) χᵢ(C') = δ_{CC'} |G|/|C|`.
Checked by evaluation. -/
theorem s3_orthogonality :
(∀ i j : Fin 3, ∑ c : Fin 3, ![1, 3, 2] c * s3Table i c * s3Table j c =
if i = j then 6 else 0) ∧
(∀ c c' : Fin 3, ∑ i : Fin 3, s3Table i c * s3Table i c' =
if c = c' then 6 / ![1, 3, 2] c else 0) := by
decide/-- The common character table of `D₄` and `Q₈`. Columns: classes of sizes `1, 1, 2, 2, 2`
(for `D₄`: `1`, `r²`, `{r, r³}`, `{s, sr²}`, `{sr, sr³}`; for `Q₈`: `1`, `-1`, `±i`, `±j`, `±k`).
Rows: four 1-dimensional characters and one of degree `2`. -/
def order8Table : Fin 5 → Fin 5 → ℤ :=
![![1, 1, 1, 1, 1], ![1, 1, 1, -1, -1], ![1, 1, -1, 1, -1], ![1, 1, -1, -1, 1],
![2, -2, 0, 0, 0]]/-- **Row orthogonality for the order-8 table**: `∑_C |C| χᵢ(C) χⱼ(C) = 8 δᵢⱼ`. With
`1 + 1 + 1 + 1 + 2² = 8 = |G|`. Checked by evaluation. -/
theorem order8_orthogonality :
(∀ i j : Fin 5, ∑ c : Fin 5, ![1, 1, 2, 2, 2] c * order8Table i c * order8Table j c =
if i = j then 8 else 0) ∧ ∑ i : Fin 5, order8Table i 0 ^ 2 = 8 := by
decide/-- **…but `D₄` and `Q₈` are not isomorphic.** In `D₄` (Mathlib's `DihedralGroup 4`) six elements
satisfy `g² = 1` (the identity, `r²` and four reflections); in `Q₈` (`QuaternionGroup 2`) only
two do (`±1`). An isomorphism would carry one set bijectively onto the other. So the character
table does not determine the group. -/
theorem d4_not_q8 : IsEmpty (DihedralGroup 4 ≃* QuaternionGroup 2) := by
constructor
intro e
have hcard : Fintype.card {g : DihedralGroup 4 // g * g = 1} =
Fintype.card {h : QuaternionGroup 2 // h * h = 1} :=
Fintype.card_congr (e.toEquiv.subtypeEquiv fun g => by
change g * g = 1 ↔ e g * e g = 1
rw [← map_mul, ← map_one e, e.injective.eq_iff])
have h1 : Fintype.card {g : DihedralGroup 4 // g * g = 1} = 6 := by decide
have h2 : Fintype.card {h : QuaternionGroup 2 // h * h = 1} = 2 := by decide
omegaFrobenius reciprocity in its categorical form:
/-- **Frobenius reciprocity**: induction along a group homomorphism `φ : G →* H` is left adjoint to
restriction, so `Hom_H(Ind A, B) ≅ Hom_G(A, Res B)` naturally. Mathlib: `Rep.indResAdjunction`. -/
theorem frobenius_reciprocity (k : Type) {G H : Type} [CommRing k] [Group G] [Group H]
(φ : G →* H) : Nonempty (Rep.indFunctor k φ ⊣ Rep.resFunctor φ) :=
⟨Rep.indResAdjunction k φ⟩What is and is not formalised. Proved here: Schur's lemma, the counterexample to Maschke in characteristic , the orthogonality relations of the two tables as integer identities, and . From Mathlib: Maschke's theorem, Schur's lemma over algebraically closed fields, characters as class functions, orthonormality of irreducible characters, and induction as left adjoint to restriction. Not formalised: Theorem 5 (characters span the class functions; number of irreducibles = number of classes), , and the fact that the listed rows are the irreducible characters of these groups — our tables are definitions whose orthogonality we check, and the first experiment derives them from the groups.
Character tables, computed
The first experiment builds , , and explicitly, finds their conjugacy classes, and extracts the irreducible characters from permutation characters (on cosets of cyclic subgroups) and natural characters: it repeatedly subtracts known irreducible components and keeps any remainder with — irreducible by Corollary 4. It then checks Theorem 5 and , compares the tables of and , and computes the Frobenius–Schur indicators that tell them apart.
"""Character tables of S3, S4, D4 and Q8 found from permutation characters.
Each group is built concretely (permutations, or 2 x 2 complex matrices for
the quaternion group Q8). We compute conjugacy classes by brute force and the
permutation characters of G acting on the cosets of each cyclic subgroup,
plus the trace of a natural matrix representation. Using the inner product
<a, b> = (1/|G|) sum_g a(g) b(g)^*, we strip off known irreducible components
and keep any remainder with <chi, chi> = 1 (an irreducible character, by the
orthogonality relations), also trying products of characters, until there are
as many irreducibles as classes. We then check sum of squares of degrees = |G|
and compare the tables of D4 and Q8. Exact rational arithmetic.
"""
from fractions import Fraction
from itertools import permutations
def compose(p, q):
"""Permutation composite p after q (tuples)."""
return tuple(p[i] for i in q)
def perm_group(gens):
"""Closure of a list of permutations under composition."""
elems = {tuple(range(len(gens[0])))}
frontier = list(elems)
while frontier:
new = []
for x in frontier:
for g in gens:
y = compose(g, x)
if y not in elems:
elems.add(y)
new.append(y)
frontier = new
return sorted(elems)
def matmul2(a, b):
"""Product of 2 x 2 complex matrices stored as 4-tuples."""
return (a[0] * b[0] + a[1] * b[2], a[0] * b[1] + a[1] * b[3],
a[2] * b[0] + a[3] * b[2], a[2] * b[1] + a[3] * b[3])
def quaternion_group():
"""Q8 as matrices generated by i = diag(i, -i) and j = [[0, 1], [-1, 0]]."""
gens = [(1j, 0, 0, -1j), (0, 1, -1, 0)]
elems = {(1, 0, 0, 1)}
frontier = list(elems)
while frontier:
new = [matmul2(g, x) for x in frontier for g in gens]
new = [y for y in new if y not in elems]
elems.update(new)
frontier = new
return sorted(elems, key=str)
class Group:
"""A finite group given by its elements and multiplication."""
def __init__(self, elems, mul):
self.elems, self.mul = list(elems), mul
self.one = next(e for e in self.elems
if all(mul(e, x) == x for x in self.elems))
self.inv = {x: next(y for y in self.elems if mul(x, y) == self.one)
for x in self.elems}
self.classes = []
seen = set()
for x in self.elems:
if x not in seen:
cls = {mul(mul(g, x), self.inv[g]) for g in self.elems}
seen |= cls
self.classes.append(sorted(cls, key=str))
self.classes.sort(key=lambda c: (self.order(c[0]), len(c)))
self.class_of = {x: i for i, c in enumerate(self.classes) for x in c}
def order(self, x):
"""Order of an element."""
k, y = 1, x
while y != self.one:
y, k = self.mul(y, x), k + 1
return k
def cyclic_subgroup(self, x):
"""The subgroup generated by x."""
out, y = [self.one], x
while y != self.one:
out.append(y)
y = self.mul(y, x)
return out
def coset_character(self, sub):
"""Permutation character of G acting on the left cosets of sub."""
cosets = {frozenset(self.mul(x, h) for h in sub) for x in self.elems}
return tuple(sum(1 for c in cosets
if frozenset(self.mul(cls[0], y) for y in c) == c)
for cls in self.classes)
def inner(self, a, b):
"""<a, b> = (1/|G|) sum over classes |C| a(C) b(C) (real characters)."""
total = sum(len(c) * a[i] * b[i] for i, c in enumerate(self.classes))
return Fraction(total, len(self.elems))
def irreducibles(group, candidates):
"""Irreducible characters extracted from candidates and their products."""
irr, pool = [], list(candidates)
while len(irr) < len(group.classes) and pool:
progress = False
for chi in pool + [tuple(a * b for a, b in zip(x, y))
for x in irr for y in pool]:
rest = list(chi)
for psi in irr:
m = group.inner(chi, psi)
rest = [r - m * p for r, p in zip(rest, psi)]
rest = tuple(int(r) for r in rest)
if any(rest) and group.inner(rest, rest) == 1:
if rest[0] < 0:
rest = tuple(-r for r in rest)
if rest not in irr:
irr.append(rest)
progress = True
if not progress:
break
return sorted(irr, key=lambda c: (c[0], [-v for v in c]))
def fs_indicator(group, chi):
"""Frobenius-Schur indicator (1/|G|) sum_g chi(g^2): +1 real,
-1 quaternionic, 0 not real-valued."""
total = sum(chi[group.class_of[group.mul(x, x)]] for x in group.elems)
return Fraction(total, len(group.elems))
def same_table(g, h, tg, th):
"""Equal character tables up to reordering rows and same-size columns."""
if sorted(len(c) for c in g.classes) != sorted(len(c) for c in h.classes):
return False
n = len(g.classes)
for perm in permutations(range(n)):
if all(len(g.classes[i]) == len(h.classes[perm[i]]) for i in range(n)):
rows = {tuple(row[perm[i]] for i in range(n)) for row in th}
if rows == set(tg):
return True
return False
def sign(p):
"""Sign of a permutation, by counting inversions."""
inv = sum(1 for i in range(len(p)) for j in range(i + 1, len(p))
if p[i] > p[j])
return -1 if inv % 2 else 1
def natural_characters(group, kind):
"""Sign and fixed-point characters of a permutation group, or the trace
of the defining 2 x 2 matrices of Q8."""
reps = [c[0] for c in group.classes]
if kind == "perm":
return [tuple(sign(x) for x in reps),
tuple(sum(1 for i, v in enumerate(x) if i == v) for x in reps)]
return [tuple(int((x[0] + x[3]).real) for x in reps)]
def build_groups():
"""The four groups, with the kind of their natural representation."""
return {"S3": (Group(perm_group([(1, 0, 2), (1, 2, 0)]), compose), "perm"),
"S4": (Group(perm_group([(1, 0, 2, 3), (1, 2, 3, 0)]), compose),
"perm"),
"D4": (Group(perm_group([(1, 2, 3, 0), (0, 3, 2, 1)]), compose),
"perm"),
"Q8": (Group(quaternion_group(), matmul2), "matrix")}
def character_table(group, kind):
"""Irreducible characters of the group, from coset and natural
characters."""
cands = [group.coset_character(group.elems)] # trivial character
cands += [group.coset_character(group.cyclic_subgroup(x))
for x in group.elems]
cands += natural_characters(group, kind)
return irreducibles(group, list(dict.fromkeys(cands)))
def main():
groups = {name: g for name, (g, _) in build_groups().items()}
kinds = {name: kind for name, (_, kind) in build_groups().items()}
tables = {}
for name, g in groups.items():
t = character_table(g, kinds[name])
tables[name] = t
sizes = [len(c) for c in g.classes]
degrees = [row[0] for row in t]
print(f"{name}: |G| = {len(g.elems)}, class sizes {sizes}, "
f"degrees {degrees}")
print(f" irreducibles = classes: {len(t) == len(sizes)}; "
f"sum of squares = |G|: {sum(d * d for d in degrees) == len(g.elems)}")
if name in ("S3", "S4", "Q8"):
for row in t:
print(" ", row)
d4, q8 = groups["D4"], groups["Q8"]
print("D4 and Q8 have the same character table:",
same_table(d4, q8, tables["D4"], tables["Q8"]))
inv_d4 = sum(1 for x in d4.elems if d4.order(x) == 2)
inv_q8 = sum(1 for x in q8.elems if q8.order(x) == 2)
print(f" but elements of order 2: D4 has {inv_d4}, Q8 has {inv_q8}")
two = {name: next(r for r in tables[name] if r[0] == 2) for name in tables
if name in ("D4", "Q8")}
print(" Frobenius-Schur indicator (1/|G|) sum chi(g^2) of the 2-dim "
"character:")
print(f" D4: {fs_indicator(d4, two['D4'])} (real), "
f"Q8: {fs_indicator(q8, two['Q8'])} (quaternionic)")
print()
print("Epistemic status: exact computations for four specific groups; "
"the extraction\nuses the orthogonality relations (proved in the "
"lesson) to certify each\ncharacter as irreducible. It does not "
"prove anything about other groups.")
if __name__ == "__main__":
main()The second experiment lists all lines of for and finds those invariant under the shear (order ) and the swap (order ), then runs Maschke's averaging, which needs to divide by .
"""Maschke's theorem and its failure when the characteristic divides |G|.
Over F_p, the shear J = [[1, 1], [0, 1]] has order p, so g -> J^g is a
representation of the cyclic group of order p on F_p^2. We list all p + 1
lines of F_p^2 and find the invariant ones: there is exactly one, so it has
no invariant complement and the representation is not completely reducible.
For contrast, the swap S = [[0, 1], [1, 0]] (a representation of the group of
order 2) has two complementary invariant lines when p is odd but only one
when p = 2. Finally we run Maschke's averaging on a projection: for p odd,
(pi + S pi S) / 2 is an equivariant projection; for p = 2 the division by
|G| = 2 is impossible, and the sum pi + S pi S is not a projection.
"""
def lines(p):
"""One spanning vector for each of the p + 1 lines of F_p^2."""
return [(1, a) for a in range(p)] + [(0, 1)]
def apply(m, v, p):
"""Matrix times vector mod p."""
return ((m[0][0] * v[0] + m[0][1] * v[1]) % p,
(m[1][0] * v[0] + m[1][1] * v[1]) % p)
def on_line(w, v, p):
"""Is w a multiple of v mod p?"""
return (w[0] * v[1] - w[1] * v[0]) % p == 0
def invariant_lines(m, p):
"""Lines of F_p^2 mapped into themselves by m."""
return [v for v in lines(p) if on_line(apply(m, v, p), v, p)]
def matmul(a, b, p):
"""2 x 2 matrix product mod p."""
return [[sum(a[i][k] * b[k][j] for k in range(2)) % p for j in range(2)]
for i in range(2)]
def order(m, p):
"""Multiplicative order of an invertible 2 x 2 matrix mod p."""
k, x = 1, m
while x != [[1, 0], [0, 1]]:
x, k = matmul(x, m, p), k + 1
return k
SHEAR = [[1, 1], [0, 1]]
SWAP = [[0, 1], [1, 0]]
# projection onto the line spanned by (1, 1) along the line spanned by (1, 0)
PI = [[0, 1], [0, 1]]
def averaged(p):
"""sum over G = {1, S} of g pi g^-1, divided by |G| = 2 if possible."""
total = [[(PI[i][j] + matmul(matmul(SWAP, PI, p), SWAP, p)[i][j]) % p
for j in range(2)] for i in range(2)]
if p == 2:
return total
half = pow(2, p - 2, p)
return [[x * half % p for x in row] for row in total]
def main():
print(" p order of shear invariant lines (shear) invariant lines (swap)")
for p in (2, 3, 5, 7):
print(f"{p:2} {order(SHEAR, p):14} {str(invariant_lines(SHEAR, p)):23}"
f" {invariant_lines(SWAP, p)}")
for p in (3, 5, 2):
e = averaged(p)
proj = matmul(e, e, p) == e
equiv = matmul(e, SWAP, p) == matmul(SWAP, e, p)
label = "(pi + S pi S)/2" if p != 2 else "pi + S pi S (no 1/2)"
print(f"p = {p}: {label} = {e}")
print(f" idempotent: {proj}; commutes with S: {equiv}")
print()
print("Epistemic status: exhaustive over all lines of F_p^2 for the four "
"primes shown,\nwith exact modular arithmetic: genuine "
"counterexamples to complete reducibility\nwhen p divides |G|. "
"Maschke's theorem itself is proved in the lesson.")
if __name__ == "__main__":
main()Exercises
1. Representation theory of finite groups
Warm-upHumanThe alternating group (order ) has conjugacy classes and exactly one-dimensional complex representations. What is the degree of its remaining irreducible representation?
2. Representation theory of finite groups
Warm-upHumanWhich statements are true for complex representations of a finite group ? (Choose all that apply.)
3. Representation theory of finite groups
CoreHumanA representation of has character on the classes of the identity, the transpositions and the -cycles (sizes ). Decompose it into irreducibles ( trivial, sign, two-dimensional).
4. Representation theory of finite groups
CoreHumanpermutes the two-element subsets of . The character of this permutation representation on the classes (sizes ) is . Compute , the number of irreducible constituents counted with squared multiplicity.
5. Representation theory of finite groups
CoreHumanIn the proof of Maschke's theorem we replace a projection by . Which step uses that the characteristic of does not divide ?
6. Representation theory of finite groups
StretchHumanWhich of these representations are not completely reducible? (Choose all that apply.)
7. Representation theory of finite groups
CoreHumanLet be a non-trivial one-dimensional character of . What is ?
8. Representation theory of finite groups
CoreFormalWhich Lean statement says that the shear representation over is not completely reducible, as in maschke_fails? (Here L abbreviates Submodule.span (ZMod 2) {((1 : ZMod 2), (0 : ZMod 2))}.)
9. Representation theory of finite groups
StretchComputationalWrite multiplicities(chi, table, sizes): given a real character chi (values on the conjugacy classes), the character table (a list of rows of real irreducible characters, same class order) and the class sizes, return the list of multiplicities as integers, where .
Common misconceptions
Misconception
"Every representation of a finite group is completely reducible." Only when the characteristic of the field does not divide . Over , the cyclic group of order acting by has exactly one invariant line, with no invariant complement; the averaging in Maschke's proof needs . The theory of representations in characteristic dividing — modular representation theory, founded by Richard Brauer — is much harder and still full of open problems.
Misconception
"The character table determines the group." and have the same table but are not isomorphic. The table determines a lot — the order, the class sizes, the normal subgroups, whether the group is abelian, simple or solvable — but not the power maps or the Frobenius–Schur indicators, and not the group itself.
Misconception
"Irreducible over means irreducible over ." The rotation by gives an irreducible two-dimensional real representation of (no real eigenvector), but over it splits into the two eigenlines with eigenvalues . Schur's lemma in the form "intertwiners are scalars" needs an algebraically closed field: here .
Misconception
"The tensor product of irreducible representations is irreducible." For the two-dimensional representation of , and : . Decomposing tensor products (Clebsch–Gordan problems) is one of the central computations of the subject.
Viewpoints
Geometry— Groups as symmetries; the cube
Every finite group is a symmetry group, and its representations are the ways it can act by linear symmetries. The rotation group of the cube is isomorphic to , acting on the four long diagonals. Its action on is a three-dimensional representation: the identity has trace ; the three half-turns about face axes, forming the class of , have trace ; the eight rotations by about long diagonals (-cycles) have trace ; the six quarter-turns about face axes (-cycles) have trace ; and the six half-turns about edge axes (transpositions) have trace . This is the row of the table of , the standard representation twisted by the sign — which proves at once that the cube's rotations act irreducibly on space. Klein's Erlangen programme reads geometry through such groups; crystallographic point groups and their character tables organise the symmetries of crystals (see transformation geometry).
Analysis— Fourier analysis on groups
For an abelian group the irreducible characters are homomorphisms , and expanding a function in characters is Fourier analysis: on it is the discrete Fourier transform, , computed by the fast Fourier transform. For non-abelian , Corollary 4(3) says (Wedderburn), and the Fourier transform of is the family of matrices . For compact groups, averaging over becomes integration against Haar measure, and the Peter–Weyl theorem (1927) decomposes in the same way; for the circle it is classical Fourier series, and for acting on the sphere it gives spherical harmonics, with , (see Lie groups).
Physics— Degeneracy and selection rules
If a symmetry group acts on the state space of a quantum system and commutes with the Hamiltonian , then each eigenspace of is a representation of ; Schur's lemma says acts as a scalar on each isotypic piece. So, generically, the degeneracies of energy levels are the dimensions of irreducible representations — for a molecule with symmetry group one sees levels of multiplicity and — and a level of dimension that is not irreducible signals hidden symmetry or accident. Characters give selection rules: a transition between states in representations and , driven by an operator transforming like , can occur only if appears in . Wigner and Weyl introduced these methods around 1927–31; they are theorems about the symmetric model, and the physical predictions are only as good as the model (see quantum mechanics).
Number theory— Dirichlet characters and Artin L-functions
The characters of the abelian group — Dirichlet characters — were the first characters in mathematics. Dirichlet (1837) used their orthogonality to isolate the primes : the indicator of the class is , and the non-vanishing of for gives infinitely many such primes. For a Galois extension with group , each representation of has an Artin -function, and Artin's conjecture that these are entire for non-trivial irreducibles remains open in general. The Langlands programme proposes a vast correspondence between such Galois representations and automorphic representations (see algebraic number theory and the Langlands programme).
Category theory— Representations as functors; Tannaka duality
A group is a one-object category , and a representation is a functor ; intertwiners are natural transformations, so (see functors). Restriction along is precomposition, and induction is its left adjoint (Theorem 6) — a left Kan extension. Over , is semisimple with finitely many simple objects, and the character table records its Grothendieck ring only additively; the tensor product adds the fusion rules, which coincide for and . Tannaka–Krein duality (in Deligne's form for symmetric tensor categories) says that is recovered from as a symmetric monoidal category with its forgetful functor to vector spaces — structure that does distinguish from . This is the starting point of categorical representation theory.
History and global context
- Peter Gustav Lejeune Dirichlet (1837) used characters of to prove his theorem on primes in arithmetic progressions; characters of finite abelian groups were developed by Dedekind and Weber.
- Richard Dedekind asked Ferdinand Georg Frobenius about the factorisation of the "group determinant" ; in answering (1896) Frobenius created the characters of non-abelian groups, and soon after induced representations and reciprocity (1898). Heinrich Maschke proved complete reducibility (1898–99); William Burnside used characters to prove his theorem (1904); Issai Schur gave a new foundation of the theory based on his lemma (1905); Alfred Young and Frobenius found the representations of , indexed by partitions.
- Emmy Noether recast the subject as the theory of modules over the group algebra (1929). Hermann Weyl and Eugene Wigner brought representations into quantum mechanics (1927–31), and Fritz Peter and Weyl extended the theory to compact groups (1927). Richard Brauer founded modular representation theory from the 1930s.
- Infinite-dimensional representations of Lie groups were developed by Harish-Chandra, Israel Gelfand and many others from the 1940s; Robert Langlands's conjectures (from 1967) link representation theory with number theory, and research in the field is now pursued worldwide.
Further reading
- Jean-Pierre Serre, Linear Representations of Finite Groups (1977) — Part I is the classic concise course on characters over .
- William Fulton and Joe Harris, Representation Theory: A First Course (1991) — Lectures 1–3 for finite groups, then on to Lie groups and algebras.
- Gordon James and Martin Liebeck, Representations and Characters of Groups (2nd ed., 2001) — a gentle, example-rich undergraduate text.
- I. Martin Isaacs, Character Theory of Finite Groups (1976) — the standard advanced text.
- Pavel Etingof et al., Introduction to Representation Theory (2011) — finite groups, quivers and categories in one short book.
- Shlomo Sternberg, Group Theory and Physics (1994) — representations in quantum mechanics and chemistry.