Skip to content
The Lumenary
Research pathwaysResearch orientation (representation theory, abelian and higher categories assumed) 130 min

Categorical representation theory

Groups act on vector spaces; what acts on categories? Replace numbers by vector spaces and equations by isomorphisms, and invariants such as the Jones polynomial turn into homology theories that see more.

Formally verified · 11 LeanComputationally tested · 2 PythonAI-drafted · awaiting human reviewMathematically reviewed: Awaiting human review
MotivationH

Why replace numbers by objects?

Four stories, from four corners of mathematics, share one move.

  • Combinatorics. To prove (nk)=(nn−k)\binom{n}{k} = \binom{n}{n-k} you can compute, or you can exhibit a bijection between kk-subsets and their complements. The bijection says more: it is a reason, and it can be compatible with symmetries that the numbers do not see.
  • Topology. Betti numbers count holes. Around 1925, Emmy Noether, with Heinz Hopf and Leopold Vietoris, emphasised that they are the ranks of homology groups — and groups, unlike numbers, have maps between them, so a continuous map induces a homomorphism. The Euler characteristic χ=∑(−1)ibi\chi = \sum (-1)^i b_i became the shadow of a richer object.
  • Representation theory. The Kazhdan–Lusztig polynomials (1979) were conjectured to have non-negative coefficients. Elias and Williamson (2014) proved it for every Coxeter group by showing that the coefficients are dimensions of spaces of maps between Soergel bimodules — and dimensions cannot be negative.
  • Knot theory. The Jones polynomial (1984) is a powerful knot invariant, but whether it detects the unknot is still unknown. Khovanov (1999–2000) found bigraded homology groups whose graded Euler characteristic is the Jones polynomial; Kronheimer and Mrowka (2011) proved that Khovanov homology does detect the unknot.

In each story a number (or polynomial) is recognised as the shadow — the decategorification — of an object (a set, a group, a vector space, a complex), and an equation between numbers as the shadow of an isomorphism. Going back up is categorification. Categorical representation theory applies this to representation theory itself: instead of a group or algebra acting on a vector space, it studies actions on categories, and representation-theoretic structures on categories such as tensor and fusion categories.

IntuitionH

A ladder, and its shadow map

Picture a ladder:

numbers  ⇝  sets, vector spaces  ⇝  categories  ⇝  2-categories  ⇝  ⋯\text{numbers} \;\rightsquigarrow\; \text{sets, vector spaces} \;\rightsquigarrow\; \text{categories} \;\rightsquigarrow\; \text{2-categories} \;\rightsquigarrow\; \cdots

Going down a rung forgets: a finite set to its cardinality, a vector space to its dimension, a category to its Grothendieck group K0K_0, the group of isomorphism classes with sums. Going up is not a functor or an algorithm; it is a search, and a structure may have many categorifications or none known.

A representation of a group GG on a vector space VV is a homomorphism G→GL(V)G \to GL(V). One rung up, a categorical action of GG on a category C\mathcal{C} is a family of autoequivalences Fg:C→CF_g : \mathcal{C} \to \mathcal{C} with coherent isomorphisms FgFh≅FghF_g F_h \cong F_{gh}; passing to K0(C)K_0(\mathcal{C}) gives an ordinary representation. Likewise the representation ring of GG is the shadow of the representation category Rep⁡(G)\operatorname{Rep}(G), with ⊗\otimes as the categorified multiplication.

Analogy, not a formal construction

Decategorification is like reading a musical score by counting how many notes are written on each page. The counts are honest information — they add up correctly when pages are combined — but two very different pieces can have the same counts, and you cannot hear the music from them. The analogy is informal: the precise statements are about Grothendieck groups below.

DefinitionsH

Definitions

Throughout, kk is a field, algebraically closed of characteristic 00 when we speak of fusion categories.

Definition— Grothendieck group

The Grothendieck group K0(A)K_0(\mathcal{A}) of an essentially small abelian category A\mathcal{A} is the abelian group generated by symbols [X][X], one for each isomorphism class of objects, with a relation [B]=[A]+[C][B] = [A] + [C] for every short exact sequence 0→A→B→C→00 \to A \to B \to C \to 0. For an additive category one uses only split sequences ([A⊕C]=[A]+[C][A \oplus C] = [A] + [C]); for a triangulated category, one relation per distinguished triangle. If A\mathcal{A} has a biexact tensor product, [X][Y]=[X⊗Y][X][Y] = [X \otimes Y] makes K0(A)K_0(\mathcal{A}) a ring.

Definition— tensor category

A tensor category over kk (in the sense of Etingof–Gelaki–Nikshych–Ostrik) is a locally finite kk-linear abelian category with a bilinear monoidal structure ⊗\otimes (see monoidal categories), such that every object has left and right duals (it is rigid) and End⁡(1)=k\operatorname{End}(\mathbf{1}) = k.

Definition— fusion category and Frobenius–Perron dimension

A fusion category is a semisimple tensor category with finitely many isomorphism classes of simple objects X0=1,X1,…,XrX_0 = \mathbf{1}, X_1, \dots, X_r. Its Grothendieck ring is a fusion ring: a ring free on the [Xi][X_i] with [Xi][Xj]=∑kNijk[Xk][X_i][X_j] = \sum_k N_{ij}^k [X_k], Nijk∈NN_{ij}^k \in \N. The Frobenius–Perron dimension FPdim⁡(Xi)\operatorname{FPdim}(X_i) is the largest real eigenvalue of the non-negative matrix of multiplication by [Xi][X_i]; FPdim⁡\operatorname{FPdim} is the unique ring homomorphism K0→RK_0 \to \R that is positive on every [Xi][X_i], and FPdim⁡(C)=∑iFPdim⁡(Xi)2\operatorname{FPdim}(\mathcal{C}) = \sum_i \operatorname{FPdim}(X_i)^2.

Definition— module category

A (left) module category over a monoidal category C\mathcal{C} is a category M\mathcal{M} with an action bifunctor ⊗:C×M→M\otimes : \mathcal{C} \times \mathcal{M} \to \mathcal{M} and natural isomorphisms (X⊗Y)⊗M≅X⊗(Y⊗M)(X \otimes Y) \otimes M \cong X \otimes (Y \otimes M) and 1⊗M≅M\mathbf{1} \otimes M \cong M satisfying the pentagon and triangle axioms. It is the categorified notion of a module over a ring: K0(M)K_0(\mathcal{M}) is a module over K0(C)K_0(\mathcal{C}).

Definition— sl₂-categorification (Chuang–Rouquier)

An sl2\mathfrak{sl}_2-categorification on a kk-linear abelian category A\mathcal{A} (with suitable finiteness) consists of exact functors E,F:A→AE, F : \mathcal{A} \to \mathcal{A} that are left and right adjoint to each other, such that [E][E] and [F][F] make K0(A)⊗QK_0(\mathcal{A}) \otimes \mathbb{Q} a locally finite representation of sl2\mathfrak{sl}_2 in which the classes of simple objects are weight vectors, together with natural transformations X∈End⁡(E)X \in \operatorname{End}(E) and T∈End⁡(E2)T \in \operatorname{End}(E^2) satisfying the relations of the degenerate affine Hecke algebra.

The extra natural transformations XX and TT are the essential, genuinely categorical part: an action of sl2\mathfrak{sl}_2 on K0K_0 alone would not suffice for the theorems below.

Worked examplesH

Examples

Example— Finite sets categorify the natural numbers

The category FinSet\mathbf{FinSet} has ⊔\sqcup and ×\times; taking cardinalities gives N\N with ++ and ⋅\cdot. Commutativity, associativity and distributivity of arithmetic are shadows of specified bijections such as A×(B⊔C)≅(A×B)⊔(A×C)A \times (B \sqcup C) \cong (A \times B) \sqcup (A \times C), and these bijections satisfy coherence conditions of their own (they form a symmetric bimonoidal category). The numbers forget which bijection; the category remembers. For vector spaces, dim⁡\dim identifies K0(vectk)K_0(\mathrm{vect}_k) with Z\Z.

Example— Rep(S₃)

Over C\mathbb{C}, S3S_3 has three irreducible representations: trivial 1\mathbf{1}, sign ε\varepsilon, and the 22-dimensional reflection representation VV. The fusion rules are

ε⊗ε≅1,ε⊗V≅V,V⊗V≅1⊕ε⊕V,\varepsilon \otimes \varepsilon \cong \mathbf{1}, \qquad \varepsilon \otimes V \cong V, \qquad V \otimes V \cong \mathbf{1} \oplus \varepsilon \oplus V,

as the characters (1,1,1)(1, 1, 1), (1,−1,1)(1, -1, 1), (2,0,−1)(2, 0, -1) on the classes of ee, transpositions and 33-cycles confirm: χV2=(4,0,1)=χ1+χε+χV\chi_V^2 = (4, 0, 1) = \chi_{\mathbf 1} + \chi_\varepsilon + \chi_V. Frobenius–Perron dimensions are ordinary dimensions, and FPdim⁡(Rep⁡(S3))=1+1+4=6=∣S3∣\operatorname{FPdim}(\operatorname{Rep}(S_3)) = 1 + 1 + 4 = 6 = |S_3|.

Example— One fusion ring, several fusion categories

  • Pointed categories. For a finite group AA and a 33-cocycle ω∈Z3(A,k×)\omega \in Z^3(A, k^\times), the category VecAω\mathrm{Vec}_A^\omega of AA-graded vector spaces with associativity twisted by ω\omega has Grothendieck ring Z[A]\Z[A] for every ω\omega; and VecAω≃VecAω′\mathrm{Vec}_A^\omega \simeq \mathrm{Vec}_A^{\omega'} only if ω′\omega' is cohomologous to the pull-back of ω\omega by an automorphism of AA. For A=Z/2A = \Z/2, H3(Z/2,C×)≅Z/2H^3(\Z/2, \mathbb{C}^\times) \cong \Z/2 gives two inequivalent fusion categories with the same fusion ring.
  • D4D_4 and Q8Q_8. The dihedral group of order 88 and the quaternion group have the same character table, hence isomorphic fusion rings; Tambara and Yamagami (1998) showed that Rep⁡(D4)\operatorname{Rep}(D_4) and Rep⁡(Q8)\operatorname{Rep}(Q_8) are nevertheless inequivalent tensor categories.

Example— Fibonacci and Ising

The Fibonacci fusion ring has basis 1,τ\mathbf{1}, \tau with τ⊗τ=1⊕τ\tau \otimes \tau = \mathbf{1} \oplus \tau; it is the Grothendieck ring of fusion categories built from quantum groups at roots of unity (for instance the even part of SU(2)SU(2) at level 33). The matrix of multiplication by τ\tau is (0111)\left(\begin{smallmatrix} 0 & 1 \\ 1 & 1 \end{smallmatrix}\right), so FPdim⁡(τ)=φ=1+52\operatorname{FPdim}(\tau) = \varphi = \tfrac{1 + \sqrt 5}{2}, the golden ratio. The Ising ring has σ⊗σ=1⊕ψ\sigma \otimes \sigma = \mathbf{1} \oplus \psi, ψ⊗ψ=1\psi \otimes \psi = \mathbf{1}, σ⊗ψ=σ\sigma \otimes \psi = \sigma, and FPdim⁡(σ)=2\operatorname{FPdim}(\sigma) = \sqrt{2}.

Example— Module categories over Vec_G

For a subgroup H≤GH \le G, the category of vector spaces graded by the cosets G/HG/H is a module category over VecG\mathrm{Vec}_G (with gg acting by left translation of the grading), and twisting by a 22-cocycle ψ∈Z2(H,k×)\psi \in Z^2(H, k^\times) gives more. Ostrik (2003) proved that every indecomposable semisimple module category over VecG\mathrm{Vec}_G is of this form M(H,ψ)\mathcal{M}(H, \psi), with (H,ψ)(H, \psi) determined up to conjugation and coboundaries — the categorified version of "a transitive GG-set is G/HG/H".

Example— Categorifying a Hecke-type relation with symmetric groups

Let A=⨁n≥0Rep⁡C(Sn)\mathcal{A} = \bigoplus_{n \ge 0} \operatorname{Rep}_{\mathbb{C}}(S_n), with F=Ind⁡SnSn+1F = \operatorname{Ind}_{S_n}^{S_{n+1}} and E=Res⁡SnSn+1E = \operatorname{Res}^{S_{n+1}}_{S_n}, which are biadjoint. Mackey's formula gives an isomorphism of functors EF≅FE⊕idE F \cong F E \oplus \mathrm{id} on each Rep⁡(Sn)\operatorname{Rep}(S_n). On K0(A)=⨁nR(Sn)K_0(\mathcal{A}) = \bigoplus_n R(S_n), which is identified with the ring of symmetric functions, this is the Heisenberg-type relation [E][F]−[F][E]=1[E][F] - [F][E] = 1 — a categorified commutation relation (Khovanov, 2014, studied the full Heisenberg categorification). In characteristic pp, splitting EE and FF according to eigenvalues of the Jucys–Murphy elements gives ii-restriction and ii-induction functors Ei,FiE_i, F_i and a categorical action of sl^p\widehat{\mathfrak{sl}}_p whose K0K_0 is the basic representation. For the Hecke algebras Hn(q)H_n(q) over C\mathbb{C} at a primitive ee-th root of unity the same construction gives an action of sl^e\widehat{\mathfrak{sl}}_e, and Ariki's theorem (1996, the Lascoux–Leclerc–Thibon conjecture) identifies their decomposition numbers with coefficients of Lusztig's canonical basis of the Fock space.

Example— The Khovanov cube of the Hopf link

Each crossing of a link diagram can be smoothed in two ways, 00 and 11. Khovanov assigns to a smoothing with cc circles the graded vector space V⊗cV^{\otimes c}, with V=Q[x]/(x2)V = \mathbb{Q}[x]/(x^2), and to each edge of the cube of smoothings the multiplication m:V⊗V→Vm : V \otimes V \to V (two circles merge) or the comultiplication Δ:V→V⊗V\Delta : V \to V \otimes V (a circle splits). For the Hopf link the smoothings 00,01,10,1100, 01, 10, 11 have 2,1,1,22, 1, 1, 2 circles:

V⊗2V^{\otimes 2}
VV
VV
V⊗2V^{\otimes 2}
mm
mm
Δ\Delta
−Δ-\Delta
The cube of smoothings of the Hopf link. Collapsing the columns gives a chain complex V⊗V → V ⊕ V → V⊗V (with degree shifts); the sign makes the square anticommute, so d∘d = 0.

The graded Euler characteristic of this complex, with the standard normalisation shifts, is the unnormalised Jones polynomial; its homology is the Khovanov homology. The computation section does this for the trefoil and the figure-eight knot.

ProofH

Central results

Theorem— Proposition 1 — dimension decategorifies vect

If 0→A→fB→gC→00 \to A \xrightarrow{f} B \xrightarrow{g} C \to 0 is a short exact sequence of finite-dimensional vector spaces, then dim⁡B=dim⁡A+dim⁡C\dim B = \dim A + \dim C. Hence [V]↦dim⁡V[V] \mapsto \dim V is a well-defined isomorphism K0(vectk)≅ZK_0(\mathrm{vect}_k) \cong \Z.

Proof

Rank–nullity for gg gives dim⁡B=dim⁡im⁡g+dim⁡ker⁡g\dim B = \dim \operatorname{im} g + \dim \ker g. Exactness says im⁡g=C\operatorname{im} g = C and ker⁡g=im⁡f≅A\ker g = \operatorname{im} f \cong A (ff injective). So dim⁡\dim respects the defining relations and induces a homomorphism K0→ZK_0 \to \Z. It is surjective ([k]↦1[k] \mapsto 1) and injective, since V≅kdim⁡VV \cong k^{\dim V} gives [V]=dim⁡V⋅[k][V] = \dim V \cdot [k].

∎

Theorem— Proposition 2 — homology categorifies the Euler characteristic

For a bounded complex CC of finite-dimensional vector spaces, ∑i(−1)idim⁡Ci=∑i(−1)idim⁡Hi(C)\sum_i (-1)^i \dim C^i = \sum_i (-1)^i \dim H^i(C).

Proof

Write Zi=ker⁡diZ^i = \ker d^i and Bi=im⁡di−1B^i = \operatorname{im} d^{i-1}. Rank–nullity gives dim⁡Ci=dim⁡Zi+dim⁡Bi+1\dim C^i = \dim Z^i + \dim B^{i+1}, and dim⁡Hi=dim⁡Zi−dim⁡Bi\dim H^i = \dim Z^i - \dim B^i. Hence ∑i(−1)idim⁡Ci=∑i(−1)i(dim⁡Hi+dim⁡Bi+dim⁡Bi+1)\sum_i (-1)^i \dim C^i = \sum_i (-1)^i (\dim H^i + \dim B^i + \dim B^{i+1}), and the boundary terms cancel in pairs. In the language of Grothendieck groups: [C]:=∑(−1)i[Ci]=∑(−1)i[Hi][C] := \sum (-1)^i [C^i] = \sum (-1)^i [H^i] in K0(vectk)K_0(\mathrm{vect}_k), which is the statement that K0K_0 of the derived category Db(vectk)D^b(\mathrm{vect}_k) is again Z\Z.

∎

Theorem— Proposition 3 — the Grothendieck ring of Rep(G)

Let GG be a finite group and k=Ck = \mathbb{C}. Then K0(Rep⁡(G))K_0(\operatorname{Rep}(G)) is the free abelian group on the classes of the irreducible representations; with [V][W]=[V⊗W][V][W] = [V \otimes W] it is the representation ring R(G)R(G), and the character map [V]↦χV[V] \mapsto \chi_V is an injective ring homomorphism into class functions. Moreover Rep⁡(G)\operatorname{Rep}(G) is a fusion category with FPdim⁡(V)=dim⁡V\operatorname{FPdim}(V) = \dim V and FPdim⁡(Rep⁡(G))=∣G∣\operatorname{FPdim}(\operatorname{Rep}(G)) = |G|.

Proof

By Maschke's theorem every short exact sequence splits and every representation is a direct sum of irreducibles V1,…,VrV_1, \dots, V_r, uniquely up to multiplicities, so K0=⨁iZ[Vi]K_0 = \bigoplus_i \Z [V_i]. The character is additive on direct sums, multiplicative on tensor products (χV⊗W(g)=tr⁡(ρV(g)⊗ρW(g))=χV(g)χW(g)\chi_{V \otimes W}(g) = \operatorname{tr}(\rho_V(g) \otimes \rho_W(g)) = \chi_V(g)\chi_W(g)), constant on isomorphism classes, and sends 1\mathbf{1} to the constant function 11: a ring homomorphism. It is injective because the irreducible characters are orthonormal for ⟨χ,ψ⟩=1∣G∣∑gχ(g)ψ(g)‾\langle \chi, \psi \rangle = \frac{1}{|G|} \sum_g \chi(g) \overline{\psi(g)}, hence linearly independent (see representation theory of finite groups). Duals exist (V∗V^* with gg acting by the inverse transpose), End⁡(1)=C\operatorname{End}(\mathbf{1}) = \mathbb{C}, and there are finitely many simples: Rep⁡(G)\operatorname{Rep}(G) is fusion. Finally dim⁡=χ(e)\dim = \chi(e) is a ring homomorphism K0→Z⊂RK_0 \to \Z \subset \R, positive on each [Vi][V_i], so by uniqueness it is FPdim⁡\operatorname{FPdim}, and ∑i(dim⁡Vi)2=∣G∣\sum_i (\dim V_i)^2 = |G|.

∎

Theorem— Theorem 4 — the Fibonacci rule is not Rep(G)

There is no finite group GG (and no semisimple Hopf algebra HH) whose representation category has Grothendieck ring isomorphic, as a ring with basis, to the Fibonacci fusion ring. In fact the Fibonacci ring has no ring homomorphism to Z\Z at all.

Proof

A ring homomorphism dd from the Fibonacci ring to Z\Z sends τ\tau to an integer nn with n2=d(τ2)=d(1+τ)=1+nn^2 = d(\tau^2) = d(1 + \tau) = 1 + n, i.e. n(n−1)=1n(n - 1) = 1. But a product of two consecutive integers is never 11: it is 00 for n∈{0,1}n \in \{0, 1\} and at least 22 otherwise. So there is no such nn. But for Rep⁡(G)\operatorname{Rep}(G) (or Rep⁡(H)\operatorname{Rep}(H)), taking the dimension of the underlying vector space is a ring homomorphism K0→ZK_0 \to \Z, because the forgetful functor to vector spaces preserves ⊕\oplus and ⊗\otimes.

∎

The same argument shows that a fusion category with a non-integer Frobenius–Perron dimension admits no fibre functor (no monoidal functor to vector spaces), so it cannot be reconstructed as the representations of a group or Hopf algebra. Fusion categories are strictly more general than Rep⁡(G)\operatorname{Rep}(G).

Theorem— Theorem 5 — Khovanov (2000)

For an oriented link LL there are bigraded homology groups Khi,j(L)\mathit{Kh}^{i,j}(L), computed from any diagram by the cube of smoothings, which are invariant under Reidemeister moves, and whose graded Euler characteristic is the unnormalised Jones polynomial: ∑i,j(−1)iqjdim⁡Khi,j(L)=(q+q−1)JL\sum_{i,j} (-1)^i q^j \dim \mathit{Kh}^{i,j}(L) = (q + q^{-1}) J_L (with Bar-Natan's normalisation of JLJ_L).

Khovanov's proof of invariance is a direct verification for the three Reidemeister moves (see Bar-Natan, 2002, for an accessible account). Khovanov homology is functorial for link cobordisms up to sign (Jacobsson 2004; Khovanov 2006; Bar-Natan 2005), with the sign ambiguity resolved by Clark, Morrison and Walker (2009). It is strictly stronger than the Jones polynomial: the figure-eight knot has J^=q−5+q5\hat J = q^{-5} + q^{5} but Kh\mathit{Kh} of total rank 66 (computed below).

Theorem— Theorem 6 — Chuang–Rouquier (2008)

An sl2\mathfrak{sl}_2-categorification on A\mathcal{A} lifts the action of the simple reflection of the Weyl group on K0(A)K_0(\mathcal{A}) to a derived self-equivalence: the weight spaces Aλ\mathcal{A}_\lambda and A−λ\mathcal{A}_{-\lambda} are derived equivalent. Applied to blocks of symmetric groups in characteristic pp with the ii-induction and ii-restriction functors, this shows that blocks with the same weight are derived equivalent; together with the work of Chuang and Kessar (2002), it proves Broué's abelian defect group conjecture for symmetric groups.

We do not prove Theorems 5 and 6 here; see the reading list.

ExplanationH

The landscape: what is known, what is open

Established results. Beyond the theorems above:

  • Positivity by categorification. Kazhdan–Lusztig positivity for all Coxeter groups (Elias–Williamson, 2014, via the Hodge theory of Soergel bimodules); positivity of Lusztig's canonical bases (via perverse sheaves on quiver representation spaces, see quiver representations).
  • Categorified quantum groups. Khovanov–Lauda and Rouquier (2008–2011) defined 2-categories whose Grothendieck groups are quantum groups, with KLR (quiver Hecke) algebras categorifying their positive parts.
  • Knot homology. Khovanov homology detects the unknot (Kronheimer–Mrowka, 2011). Rasmussen's ss-invariant (2010) gives a combinatorial proof of the Milnor conjecture on the slice genus of torus knots, first proved by Kronheimer–Mrowka with gauge theory; Piccirillo (2020) used it to show that the Conway knot is not slice.
  • Structure of fusion categories. Etingof, Nikshych and Ostrik (2005): fusion categories over C\mathbb{C} admit no non-trivial deformations ("Ocneanu rigidity"), so a fusion ring has only finitely many categorifications up to equivalence; FP dimensions are algebraic integers; FPdim⁡(C)\operatorname{FPdim}(\mathcal{C}) is divisible, in the ring of algebraic integers, by FPdim⁡\operatorname{FPdim} of any fusion subcategory. Ostrik (2003) showed that rank-22 fusion categories have the fusion rings of Z/2\Z/2 or Fibonacci.
  • Topology from fusion categories. Spherical fusion categories give the Turaev–Viro invariants of 33-manifolds (1992), and modular tensor categories give Reshetikhin–Turaev invariants (1991) and 33-dimensional topological quantum field theories.

Open problems (well documented; consult recent surveys for progress):

  • Does the Jones polynomial detect the unknot? Open, although Khovanov homology does.
  • Etingof–Nikshych–Ostrik (2011) asked whether every fusion category of integer Frobenius–Perron dimension is weakly group-theoretical. Open.
  • The Broué abelian defect group conjecture for finite groups in general (proved for symmetric groups by Theorem 6, and in other families). Open.
  • Do the "exotic" Haagerup fusion categories (from Haagerup's 1994 subfactor) arise from a conformal field theory? Open; there is numerical and structural evidence (Evans–Gannon, 2011).
Formal mathematicsF

Categorification in Lean and Mathlib

Mathlib has finite types and their cardinalities, finite-dimensional linear algebra, and the category FDRep k G of finite-dimensional representations with its symmetric monoidal and rigid structures and characters. It does not yet have fusion categories, module categories or categorical actions. We formalise the decategorification statements of the lesson.

Finite sets categorify N\N: cardinality turns ⊔\sqcup and ×\times into ++ and ⋅\cdot, and the distributive law is the shadow of a bijection.

card_sumLean 4Applies a library theoremFormally verified
/-- Decategorifying the disjoint union: `|A ⊔ B| = |A| + |B|`. This applies Mathlib's
`Fintype.card_sum`. -/
theorem card_sum (A B : Type*) [Fintype A] [Fintype B] :
    Fintype.card (A ⊕ B) = Fintype.card A + Fintype.card B :=
  Fintype.card_sum
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor
card_prodLean 4Applies a library theoremFormally verified
/-- Decategorifying the product: `|A × B| = |A| · |B|`. This applies Mathlib's
`Fintype.card_prod`. -/
theorem card_prod (A B : Type*) [Fintype A] [Fintype B] :
    Fintype.card (A × B) = Fintype.card A * Fintype.card B :=
  Fintype.card_prod A B
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor
card_distribLean 4Proved here from basic factsFormally verified
/-- The distributive law `a(b + c) = ab + ac` is the shadow of a *bijection*
`A × (B ⊔ C) ≃ (A × B) ⊔ (A × C)` (Mathlib's `Equiv.prodSumDistrib`). Categorified, an equation
between numbers becomes an isomorphism between sets — extra information that the numbers forget
(which bijection?). -/
theorem card_distrib (A B C : Type*) [Fintype A] [Fintype B] [Fintype C] :
    Fintype.card (A × (B ⊕ C)) = Fintype.card (A × B) + Fintype.card (A × C) := by
  rw [Fintype.card_congr (Equiv.prodSumDistrib A B C), Fintype.card_sum]
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor

Propositions 1 and 2, proved from rank–nullity (Proposition 2 for a two-term complex):

finrank_additiveLean 4Proved here from basic factsFormally verified
/-- Dimension is additive on short exact sequences `0 → A --f--> B --g--> C → 0`:
`dim B = dim A + dim C`. Proof by rank–nullity for `g`: `dim B = dim im g + dim ker g`, where
`im g = C` (surjectivity) and `ker g = im f ≅ A` (exactness and injectivity). This is exactly
the relation `[B] = [A] + [C]` defining the Grothendieck group, so `dim` induces a homomorphism
`K₀(vect_k) → ℤ` (in fact an isomorphism). -/
theorem finrank_additive [FiniteDimensional k B] (f : A →ₗ[k] B) (g : B →ₗ[k] C)
    (hf : Function.Injective f) (hg : Function.Surjective g)
    (hexact : LinearMap.range f = LinearMap.ker g) :
    Module.finrank k B = Module.finrank k A + Module.finrank k C := by
  have hrn := LinearMap.finrank_range_add_finrank_ker g
  have hA : Module.finrank k (LinearMap.range f) = Module.finrank k A :=
    LinearMap.finrank_range_of_inj hf
  have hC : Module.finrank k (LinearMap.range g) = Module.finrank k C := by
    rw [LinearMap.range_eq_top.mpr hg, finrank_top]
  rw [← hexact, hA, hC] at hrn
  omega
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor
euler_characteristic_two_termLean 4Proved here from basic factsFormally verified
/-- For a two-term complex `V₁ --d--> V₀` of finite-dimensional spaces, the Euler
characteristic of the complex equals that of its homology:
`dim V₀ - dim V₁ = dim H₀ - dim H₁`, where `H₀ = coker d = V₀ / im d` and `H₁ = ker d`.
Homology *categorifies* the Euler characteristic: it replaces a number by graded vector spaces
whose alternating dimension recovers it. Proof: rank–nullity for `d`, and
`dim (V₀ / im d) + dim im d = dim V₀`. -/
theorem euler_characteristic_two_term [FiniteDimensional k V₁] [FiniteDimensional k V₀]
    (d : V₁ →ₗ[k] V₀) :
    (Module.finrank k V₀ : ℤ) - Module.finrank k V₁ =
      (Module.finrank k (V₀ ⧸ LinearMap.range d) : ℤ) - Module.finrank k (LinearMap.ker d) := by
  have h₁ := LinearMap.finrank_range_add_finrank_ker d
  have h₀ := Submodule.finrank_quotient_add_finrank (LinearMap.range d)
  omega
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor

The tensor category Rep⁡(G)\operatorname{Rep}(G), and the character as decategorification (Proposition 3):

fdrep_symmetricLean 4Applies a library theoremFormally verified
/-- Finite-dimensional representations form a symmetric monoidal category under `⊗` (with `g`
acting diagonally): the swap `β : V ⊗ W ≅ W ⊗ V` squares to the identity. This applies
Mathlib's instance `SymmetricCategory (FDRep k G)` and the axiom `SymmetricCategory.symmetry`.
(In a merely *braided* category, such as the representations of a quantum group, this fails.) -/
theorem fdrep_symmetric (V W : FDRep k G) : (β_ V W).hom ≫ (β_ W V).hom = 𝟙 (V ⊗ W) :=
  SymmetricCategory.symmetry V W
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor
fdrep_zigzagLean 4Applies a library theoremFormally verified
/-- Every finite-dimensional representation `V` has a dual `Vᘁ` with coevaluation
`η : 𝟙 → V ⊗ Vᘁ` and evaluation `ε : Vᘁ ⊗ V → 𝟙` satisfying the zig-zag identity
`(V ◁ ε) ∘ α ∘ (η ▷ V) = ρ⁻¹ ∘ λ`: `FDRep k G` is rigid. This applies Mathlib's instance
`RightRigidCategory (FDRep k G)` (inherited from `FGModuleCat k`) and
`ExactPairing.evaluation_coevaluation`. -/
theorem fdrep_zigzag (V : FDRep k G) :
    η_ V Vᘁ ▷ V ≫ (α_ _ _ _).hom ≫ V ◁ ε_ V Vᘁ = (λ_ V).hom ≫ (ρ_ V).inv :=
  ExactPairing.evaluation_coevaluation V Vᘁ
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor
char_tensorLean 4Applies a library theoremFormally verified
/-- Decategorifying `⊗`: the character of `V ⊗ W` is the product of the characters. Since
characters are additive on direct sums and depend only on the isomorphism class (`char_iso`),
the character is a ring homomorphism from the Grothendieck ring of `Rep(G)` to class
functions. This applies Mathlib's `FDRep.char_tensor`. -/
theorem char_tensor (V W : FDRep k G) : (V ⊗ W).character = V.character * W.character :=
  FDRep.char_tensor V W
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor
char_isoLean 4Applies a library theoremFormally verified
/-- Isomorphic representations have equal characters, so the character only sees the class
`[V]` in the Grothendieck group. This applies Mathlib's `FDRep.char_iso`. -/
theorem char_iso {V W : FDRep k G} (i : V ≅ W) : V.character = W.character :=
  FDRep.char_iso i
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor
char_oneLean 4Applies a library theoremFormally verified
/-- Evaluating the character at the identity gives the dimension: `χ_V(1) = dim V`. So
`dim : K₀(Rep G) → ℤ` is a ring homomorphism with positive values on non-zero
representations. This applies Mathlib's `FDRep.char_one`. -/
theorem char_one (V : FDRep k G) : V.character 1 = Module.finrank k V :=
  FDRep.char_one V
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor

The arithmetic core of Theorem 4:

fibonacci_no_integer_dimensionLean 4Proved here from basic factsFormally verified
/-- The Fibonacci fusion ring has basis `1, τ` with `τ ⊗ τ = 1 ⊕ τ`. A ring homomorphism to `ℤ`
would send `τ` to an integer `n` with `n² = 1 + n`, and there is none. Since `dim` is a ring
homomorphism `K₀(Rep G) → ℤ` (`char_one`, `char_tensor`), the Fibonacci fusion category is
not `Rep(G)` for any finite group `G`. (Its Frobenius–Perron dimension is the golden ratio.) -/
theorem fibonacci_no_integer_dimension : ¬ ∃ n : ℤ, n ^ 2 = 1 + n := by
  rintro ⟨n, hn⟩
  have h₁ : n ≤ 2 := by nlinarith
  have h₂ : -1 ≤ n := by nlinarith
  interval_cases n <;> omega
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/CategoricalRepresentationTheory.leanTry it in the Lean web editor

What is and is not formalised. Formalised: the cardinality and dimension statements, the two-term Euler characteristic identity, the symmetric, rigid structure of FDRep k G and the multiplicativity and isomorphism-invariance of characters (from Mathlib), and the integrality obstruction for the Fibonacci rule. Not formalised: Grothendieck groups as objects (Mathlib has no K0K_0 of an abelian category at this version), fusion categories, Frobenius–Perron dimension, module categories, Khovanov homology and the theorems of Chuang–Rouquier and Elias–Williamson.

ComputationC

Computing shadows, and what they miss

The first experiment builds S3S_3, D4D_4 and Q8Q_8 as matrix groups, finds their one-dimensional characters by brute force, adds the trace of a two-dimensional representation, and computes the fusion rings exactly. D4D_4 and Q8Q_8 are visibly different groups (five involutions against one) with isomorphic fusion rings. It then approximates the Frobenius–Perron dimensions of the Fibonacci and Ising rings.

Fusion rings from groups, and the Fibonacci ringPythonExact computationExhaustive finite checkNumerical approximationComputationally tested
"""Fusion rings: decategorifying Rep(G), and a fusion ring that is not Rep(G).

The Grothendieck ring of Rep(G) has a basis of irreducible representations,
with V_i (x) V_j = sum_k N_ij^k V_k, and N_ij^k = <chi_i chi_j, chi_k>. We
build S3, D4 and Q8 as groups of matrices, find their one-dimensional
characters by brute force, take traces of a faithful two-dimensional
representation, check that these characters are orthonormal and exhaust the
group (sum of squares of dimensions = |G|), and compute the fusion rings
exactly. D4 and Q8 are not isomorphic (they have 5 and 1 elements of order 2)
but their fusion rings are isomorphic - and Rep(D4), Rep(Q8) are not even
equivalent as tensor categories (Tambara and Yamagami, 1998): the
Grothendieck ring forgets. Finally the Fibonacci fusion ring,
tau (x) tau = 1 + tau, has Frobenius-Perron dimension the golden ratio, so it
is not the Grothendieck ring of any Rep(G); the Ising ring has FPdim sqrt 2.
Exact for the groups; the FP dimensions are floating-point approximations.
"""

from fractions import Fraction
from itertools import permutations, product
import math

# Matrices have Gaussian-integer entries (re, im), so all arithmetic is exact.
ONE = ((1, 0), (0, 0)), ((0, 0), (1, 0))

def g_mul(a, b):
    """Product of Gaussian integers a = (re, im), b = (re, im)."""
    return (a[0] * b[0] - a[1] * b[1], a[0] * b[1] + a[1] * b[0])

def m_mul(x, y):
    """Product of 2 x 2 matrices of Gaussian integers."""
    def entry(i, j):
        p, q = g_mul(x[i][0], y[0][j]), g_mul(x[i][1], y[1][j])
        return (p[0] + q[0], p[1] + q[1])
    return ((entry(0, 0), entry(0, 1)), (entry(1, 0), entry(1, 1)))

def generate(gens):
    """The finite group generated by some invertible 2 x 2 matrices."""
    group, frontier = {ONE}, [ONE]
    while frontier:
        new = []
        for g in frontier:
            for s in gens:
                h = m_mul(g, s)
                if h not in group:
                    group.add(h)
                    new.append(h)
        frontier = new
    return [ONE] + sorted(group - {ONE})  # identity first

def trace(m):
    """Trace, as a Gaussian integer."""
    return (m[0][0][0] + m[1][1][0], m[0][0][1] + m[1][1][1])

def element_order(m):
    """Order of a group element."""
    k, x = 1, m
    while x != ONE:
        x, k = m_mul(x, m), k + 1
    return k

def linear_characters(group):
    """All homomorphisms group -> {1, -1}, by checking every function."""
    index = {g: i for i, g in enumerate(group)}
    table = [[index[m_mul(a, b)] for b in group] for a in group]
    found = []
    for signs in product((1, -1), repeat=len(group)):
        if all(signs[table[i][j]] == signs[i] * signs[j]
               for i in range(len(group)) for j in range(len(group))):
            found.append(list(signs))
    return found

def character_table(gens):
    """Linear characters plus the trace of the defining 2-dim representation.

    For S3, D4 and Q8 the characters here are real integers.
    """
    group = generate(gens)
    chars = linear_characters(group)
    two = [trace(g) for g in group]
    assert all(t[1] == 0 for t in two), "real-valued for these examples"
    chars.append([t[0] for t in two])
    return group, chars

def inner(f, g):
    """<f, g> = average of f * g over the group (real characters)."""
    return Fraction(sum(a * b for a, b in zip(f, g)), len(f))

def fusion(chars):
    """N[i][j][k] = <chi_i chi_j, chi_k>."""
    r = range(len(chars))
    return [[[inner([x * y for x, y in zip(chars[i], chars[j])], chars[k])
              for k in r] for j in r] for i in r]

def check_fusion_ring(n):
    """Non-negative integers, unit = basis element 0, commutative, associative."""
    r = range(len(n))
    integral = all(v.denominator == 1 and v >= 0
                   for a in n for b in a for v in b)
    unit = all(n[0][j][k] == (j == k) for j in r for k in r)
    comm = all(n[i][j][k] == n[j][i][k] for i in r for j in r for k in r)
    assoc = all(sum(n[i][j][m] * n[m][k][l] for m in r)
                == sum(n[j][k][m] * n[i][m][l] for m in r)
                for i, j, k, l in product(r, repeat=4))
    return integral and unit and comm and assoc

def isomorphic_fusion(n1, n2):
    """Is there a relabelling of basis elements (fixing the unit) with n1 = n2?"""
    size = len(n1)
    if size != len(n2):
        return False
    r = range(size)
    for perm in permutations(range(1, size)):
        s = (0,) + perm
        if all(n1[i][j][k] == n2[s[i]][s[j]][s[k]]
               for i in r for j in r for k in r):
            return True
    return False

def fp_dimension(matrix, steps=200):
    """Perron-Frobenius eigenvalue of a non-negative irreducible matrix.

    Power iteration on M + I (whose dominant eigenvalue is strictly largest in
    absolute value, so the iteration converges even when M is periodic, as
    for Ising), then subtract 1.
    """
    size = len(matrix)
    shifted = [[matrix[i][j] + (i == j) for j in range(size)]
               for i in range(size)]
    v = [1.0] * size
    lam = 0.0
    for _ in range(steps):
        w = [sum(a * b for a, b in zip(row, v)) for row in shifted]
        lam = max(w) / max(v)
        v = [x / max(w) for x in w]
    return lam - 1

Z, P, M, I, J = (0, 0), (1, 0), (-1, 0), (0, 1), (0, -1)
GROUPS = {
    # S3 = Weyl group of A2: the two simple reflections, in a basis of roots.
    "S3": [((M, P), (Z, P)), ((P, Z), (P, M))],
    # D4: rotation by 90 degrees and a reflection.
    "D4": [((Z, M), (P, Z)), ((P, Z), (Z, M))],
    # Q8: the quaternions i and j as 2 x 2 complex matrices.
    "Q8": [((I, Z), (Z, J)), ((Z, P), (M, Z))],
}

def main():
    rings = {}
    for name, gens in GROUPS.items():
        group, chars = character_table(gens)
        n = fusion(chars)
        rings[name] = n
        dims = [c[0] for c in chars]
        orth = all(inner(a, b) == (i == j) for i, a in enumerate(chars)
                   for j, b in enumerate(chars))
        invol = sum(1 for g in group if element_order(g) == 2)
        squares = sum(d * d for d in dims)
        ok = orth and check_fusion_ring(n) and squares == len(group)
        print(f"Rep({name}): |G| = {len(group)}, dims {dims}, elements of "
              f"order 2: {invol}; checks {'pass' if ok else 'FAIL'}")
    last = len(rings["S3"]) - 1
    print("  in Rep(S3): V (x) V has multiplicities",
          [int(v) for v in rings["S3"][last][last]], "(triv, sign, V)")
    print("  in Rep(D4): E (x) E has multiplicities",
          [int(v) for v in rings["D4"][4][4]], "(four lines, E)")
    print("  fusion rings of D4 and Q8 isomorphic:",
          isomorphic_fusion(rings["D4"], rings["Q8"]))
    print()
    fib = [[0, 1], [1, 1]]  # multiplication by tau in the basis (1, tau)
    lam = fp_dimension(fib)
    print("Fibonacci ring: tau (x) tau = 1 + tau")
    print(f"  FPdim(tau) by power iteration = {lam:.12f}")
    print(f"  golden ratio (1 + sqrt 5)/2    = {(1 + math.sqrt(5)) / 2:.12f}")
    ising = [[0, 1, 0], [1, 0, 1], [0, 1, 0]]  # sigma on (1, sigma, psi)
    print("Ising ring: sigma (x) sigma = 1 + psi, sigma (x) psi = sigma")
    print(f"  FPdim(sigma) = {fp_dimension(ising):.12f}"
          f" (sqrt 2 = {math.sqrt(2):.12f})")
    print()
    print("Epistemic status: the groups, characters, fusion coefficients and")
    print("ring axioms are computed exactly and exhaustively for these three")
    print("groups. The FP dimension is a floating-point approximation; that")
    print("d^2 = 1 + d has no integer root is proved in the lesson, and that")
    print("Rep(D4), Rep(Q8) differ as tensor categories is a theorem not")
    print("checked here.")

if __name__ == "__main__":
    main()
Runs entirely in your browser, in an isolated worker. Nothing is sent to a server.

The second experiment builds Khovanov's complex for the trefoil and figure-eight knots from their PD codes, checks d∘d=0d \circ d = 0, and computes both the graded Euler characteristic (the Jones polynomial) and the homology over Q\mathbb{Q}. For the figure-eight knot the Euler characteristic has two terms while the homology has six: categorification has added information.

Khovanov homology of the trefoil and figure-eight knotsPythonExact computationExhaustive finite checkComputationally tested
"""Khovanov homology of small knots: a categorification you can compute.

Khovanov replaced the Kauffman state sum for the Jones polynomial by a chain
complex: each of the 2^n smoothings of an n-crossing diagram with k circles
contributes V^(x)k, where V = Q[x]/(x^2) has basis v+ (q-degree +1) and v-
(q-degree -1), and the edges of the cube of smoothings carry the
multiplication and comultiplication of V. The graded Euler characteristic of
the complex is the unnormalised Jones polynomial J^(q); its homology Kh is a
finer invariant. We build the complex exactly (rational arithmetic) from a PD
code, check d o d = 0, compute J^ and Kh over Q for the trefoil and the
figure-eight knot, and see that Kh has more terms than J^: for the
figure-eight knot J^ = q^-5 + q^5 but Kh has total rank 6. Exact computation
for these diagrams only; that Kh is a knot invariant is Khovanov's theorem.
"""

from fractions import Fraction
from itertools import product

# PD codes (Knot Atlas conventions): X[i, j, k, l] lists the edges at a
# crossing counterclockwise, starting from the incoming under-strand.
KNOTS = {
    "trefoil 3_1": [(1, 4, 2, 5), (3, 6, 4, 1), (5, 2, 6, 3)],
    "figure-eight 4_1": [(4, 2, 5, 1), (8, 6, 1, 5), (6, 3, 7, 4),
                         (2, 7, 3, 8)],
}

def crossing_sign(x):
    """+1 for a positive crossing: the over-strand runs from l to j."""
    _, j, _, l = x
    return 1 if j - l == 1 or l - j > 1 else -1

def circles(pd, state):
    """Circles of a smoothing, as sorted tuple of frozensets of edge labels.

    0-smoothing joins (i, j) and (k, l); 1-smoothing joins (j, k) and (l, i).
    """
    parent = {}

    def find(a):
        parent.setdefault(a, a)
        while parent[a] != a:
            parent[a] = parent[parent[a]]
            a = parent[a]
        return a

    for (i, j, k, l), s in zip(pd, state):
        pairs = [(i, j), (k, l)] if s == 0 else [(j, k), (l, i)]
        for a, b in pairs:
            parent[find(a)] = find(b)
    groups = {}
    for a in list(parent):
        groups.setdefault(find(a), set()).add(a)
    return tuple(sorted((frozenset(g) for g in groups.values()), key=min))

def generators(pd):
    """All (state, circles, labels) with labels in {+1, -1} per circle."""
    out = []
    for state in product((0, 1), repeat=len(pd)):
        circ = circles(pd, state)
        for labels in product((1, -1), repeat=len(circ)):
            out.append((state, circ, labels))
    return out

def degrees(pd, gen):
    """(homological degree t, quantum degree q) of a generator."""
    n_minus = sum(1 for x in pd if crossing_sign(x) < 0)
    n_plus = len(pd) - n_minus
    state, _, labels = gen
    r = sum(state)
    return r - n_minus, sum(labels) + r + n_plus - 2 * n_minus

def differential(pd, gen):
    """d(gen) as a dict {(state, labels): coefficient}."""
    state, circ, labels = gen
    lab = dict(zip(circ, labels))
    out = {}
    for c, s in enumerate(state):
        if s == 1:
            continue
        sign = (-1) ** sum(state[:c])
        new_state = state[:c] + (1,) + state[c + 1:]
        new_circ = circles(pd, new_state)
        i, j, k, l = pd[c]
        touched = [z for z in circ if z & {i, j, k, l}]
        fixed = {z: lab[z] for z in circ if z not in touched}
        new_touched = [z for z in new_circ if z not in fixed]
        results = []  # list of (labels for new_touched circles, coefficient)
        if len(touched) == 2:  # merge two circles into one
            a, b = lab[touched[0]], lab[touched[1]]
            if a == 1 and b == 1:
                results = [((1,), 1)]
            elif a + b == 0:
                results = [((-1,), 1)]
        else:  # split one circle into two
            if lab[touched[0]] == 1:
                results = [((1, -1), 1), ((-1, 1), 1)]
            else:
                results = [((-1, -1), 1)]
        for vals, coef in results:
            full = dict(fixed)
            full.update(zip(new_touched, vals))
            key = (new_state, tuple(full[z] for z in new_circ))
            out[key] = out.get(key, 0) + sign * coef
    return {k: v for k, v in out.items() if v}

def rank(rows):
    """Rank of a rational matrix (list of rows) by Gaussian elimination."""
    m = [[Fraction(v) for v in r] for r in rows]
    rk, cols = 0, len(m[0]) if m else 0
    for c in range(cols):
        piv = next((i for i in range(rk, len(m)) if m[i][c]), None)
        if piv is None:
            continue
        m[rk], m[piv] = m[piv], m[rk]
        for i in range(len(m)):
            if i != rk and m[i][c]:
                t = m[i][c] / m[rk][c]
                m[i] = [a - t * b for a, b in zip(m[i], m[rk])]
        rk += 1
    return rk

def khovanov(pd):
    """Return (chain dims, homology dims), both dicts {(t, q): dimension}."""
    gens = generators(pd)
    key = {(g[0], g[2]): g for g in gens}
    by_deg = {}
    for g in gens:
        by_deg.setdefault(degrees(pd, g), []).append(g)
    chain = {d: len(v) for d, v in by_deg.items()}

    def d_rank(t, q):
        src, dst = by_deg.get((t, q), []), by_deg.get((t + 1, q), [])
        if not src or not dst:
            return 0
        index = {(g[0], g[2]): n for n, g in enumerate(dst)}
        rows = [[0] * len(src) for _ in dst]
        for col, g in enumerate(src):
            for target, coef in differential(pd, g).items():
                assert target in key and degrees(pd, key[target]) == (t + 1, q)
                rows[index[target]][col] += coef
        return rank(rows)

    homology = {}
    for (t, q), dim in chain.items():
        h = dim - d_rank(t, q) - d_rank(t - 1, q)
        if h:
            homology[(t, q)] = h
    return chain, homology

def d_squared_is_zero(pd):
    """Check d(d(g)) = 0 for every generator."""
    gens = generators(pd)
    key = {(g[0], g[2]): g for g in gens}
    for g in gens:
        total = {}
        for target, c in differential(pd, g).items():
            for t2, c2 in differential(pd, key[target]).items():
                total[t2] = total.get(t2, 0) + c * c2
        if any(total.values()):
            return False
    return True

def euler(dims):
    """Graded Euler characteristic: {q-power: coefficient}."""
    poly = {}
    for (t, q), d in dims.items():
        poly[q] = poly.get(q, 0) + (-1) ** t * d
    return {q: c for q, c in sorted(poly.items()) if c}

def show_poly(poly):
    """Format {power: coefficient} as a Laurent polynomial in q."""
    out = ""
    for q, c in poly.items():
        mag = "" if abs(c) == 1 else str(abs(c))
        if not out:
            out = ("-" if c < 0 else "") + f"{mag}q^{q}"
        else:
            out += (" - " if c < 0 else " + ") + f"{mag}q^{q}"
    return out

def show_kh(dims):
    """Format {(t, q): dim} as a Poincare polynomial in t and q."""
    parts = []
    for (t, q), d in sorted(dims.items()):
        mag = "" if d == 1 else str(d)
        parts.append(f"{mag}t^{t}q^{q}")
    return " + ".join(parts)

def main():
    for name, pd in KNOTS.items():
        chain, kh = khovanov(pd)
        writhe = sum(crossing_sign(x) for x in pd)
        print(f"{name}: {len(pd)} crossings, writhe {writhe}, "
              f"{2 ** len(pd)} smoothings, chain rank {sum(chain.values())}")
        print("  d o d = 0:", d_squared_is_zero(pd))
        print("  Euler char of chain complex J^ =", show_poly(euler(chain)))
        print("  Kh over Q =", show_kh(kh))
        print(f"  total rank of Kh = {sum(kh.values())};"
              f" Euler char of Kh = J^: {euler(kh) == euler(chain)}")
    print()
    print("Epistemic status: exact rational linear algebra on the full cube")
    print("of smoothings for these two diagrams (generators, d o d = 0, ranks).")
    print("It shows homology carrying more information than its Euler")
    print("characteristic here; it does not prove that Kh is a knot invariant")
    print("(Khovanov 2000; Bar-Natan 2002), nor say anything about other knots.")

if __name__ == "__main__":
    main()
Runs entirely in your browser, in an isolated worker. Nothing is sent to a server.

Both computations are exact (rational arithmetic) and exhaustive for the examples shown, and they match the published values (Bar-Natan, 2002). They prove nothing about other groups or knots; invariance of Khovanov homology is Theorem 5.

Exercises

Exercises

1. Categorical representation theory

Warm-upHuman

In Rep⁡(S3)\operatorname{Rep}(S_3) over C\mathbb{C}, with VV the 22-dimensional irreducible representation, how many copies of VV occur in V⊗V⊗VV \otimes V \otimes V?

2. Categorical representation theory

Warm-upHuman

What is FPdim⁡(Rep⁡(D4))=∑iFPdim⁡(Xi)2\operatorname{FPdim}(\operatorname{Rep}(D_4)) = \sum_i \operatorname{FPdim}(X_i)^2, the sum over the simple objects of the representation category of the dihedral group of order 88?

3. Categorical representation theory

CoreHuman

Which of these statements are true? (Choose all that apply.)

Choose all that apply

4. Categorical representation theory

CoreHuman

How many fusion categories over C\mathbb{C}, up to monoidal equivalence, have Grothendieck ring Z[Z/2]\Z[\Z/2] (two simple objects 1,g\mathbf{1}, g with g⊗g≅1g \otimes g \cong \mathbf{1})?

5. Categorical representation theory

CoreHuman

The proof that the Fibonacci fusion ring is not K0(Rep⁡(G))K_0(\operatorname{Rep}(G)) uses one property of Rep⁡(G)\operatorname{Rep}(G). Which?

Choose one

6. Categorical representation theory

CoreComputational

The lesson's experiment finds, for the figure-eight knot, J^=q−5+q5\hat J = q^{-5} + q^{5}, while Kh\mathit{Kh} has six one-dimensional summands in bidegrees (t,q)=(−2,−5),(−1,−1),(0,−1),(0,1),(1,1),(2,5)(t, q) = (-2, -5), (-1, -1), (0, -1), (0, 1), (1, 1), (2, 5). What does this show?

Choose one

7. Categorical representation theory

StretchHuman

Which information about a fusion category C\mathcal{C} is lost when passing to its Grothendieck ring (as a ring with its basis of simple objects)? (Choose all that apply.)

Choose all that apply

8. Categorical representation theory

CoreFormal

Which Lean statement formalises “dimension is additive on short exact sequences 0→A→B→C→00 \to A \to B \to C \to 0”? (Here f : A →ₗ[k] B, g : B →ₗ[k] C, and B is finite-dimensional.)

Choose one

9. Categorical representation theory

StretchComputational

Write fusion_coefficients(sizes, chars) that takes the class sizes of a finite group and a list of its (real-valued) irreducible characters, each a list of values on the classes, and returns the nested list N[i][j][k] =⟨χiχj,χk⟩=1∣G∣∑c∣c∣ χi(c)χj(c)χk(c)= \langle \chi_i \chi_j, \chi_k \rangle = \frac{1}{|G|} \sum_c |c|\, \chi_i(c) \chi_j(c) \chi_k(c) as integers.

Runs entirely in your browser, in an isolated worker. Nothing is sent to a server.
Common misconceptionsH

Common misconceptions

Misconception

"Categorification is a single construction." It is a family of methods, and there is no functor that categorifies. A structure may have many categorifications (the ring Z[A]\Z[A] is categorified by every VecAω\mathrm{Vec}_A^\omega), or none known. Even the Jones polynomial has more than one categorification: Khovanov homology and the odd Khovanov homology of Ozsváth, Rasmussen and Szabó (2013) have the same graded Euler characteristic but are different theories; and its relatives have their own (sln\mathfrak{sl}_n link homologies for the sln\mathfrak{sl}_n polynomials, knot Floer homology for the Alexander polynomial).

Misconception

"The Grothendieck group remembers everything about a category." Much is lost: the associativity constraint (VecAω\mathrm{Vec}_A^\omega), the group itself (Rep⁡(D4)\operatorname{Rep}(D_4) and Rep⁡(Q8)\operatorname{Rep}(Q_8)), all morphisms and extensions (the module category of a finite-dimensional algebra has the same K0K_0 as the semisimple category with the same simple objects), and the differentials of a complex (Khovanov homology versus the Jones polynomial).

Misconception

"Rep⁡(G)\operatorname{Rep}(G) as a tensor category determines GG." Not quite. As a symmetric tensor category it does (Tannaka–Krein duality, and Deligne's theorem in general), but there are non-isomorphic "isocategorical" groups with equivalent representation categories as tensor categories, forgetting the symmetry (Etingof–Gelaki, 2001).

Misconception

"Every fusion category is Rep⁡\operatorname{Rep} of something." Fusion categories with non-integer Frobenius–Perron dimensions, such as Fibonacci, admit no fibre functor to vector spaces (Theorem 4), so they are not representation categories of groups or Hopf algebras.

Misconception

"Khovanov homology is just the Jones polynomial written differently." It is strictly finer (figure-eight knot), it is functorial for cobordisms, and it detects the unknot — a property still unknown for the Jones polynomial.

ViewpointsH

Viewpoints

Topology— Knot homologies and quantum invariants

Khovanov homology is a functor from links and cobordisms to bigraded vector spaces, and its success (unknot detection, the ss-invariant, the Conway knot) made categorification a working tool of low-dimensional topology (see low-dimensional topology). In the other direction, fusion and modular categories produce topological invariants: a spherical fusion category C\mathcal{C} yields the Turaev–Viro invariant of a 33-manifold by a state sum over triangulations, which equals the Reshetikhin–Turaev invariant of the Drinfeld centre Z(C)Z(\mathcal{C}) (Turaev–Virelizier, Balsam–Kirillov). Noether's passage from Betti numbers to homology groups is the archetype of the whole subject.

Physics— Anyons and topological quantum computation

In 2+12+1 dimensions, quasi-particles called anyons are described (in the standard mathematical model) by a modular tensor category: simple objects are particle types, fusion rules say which particles two can fuse into, and the braiding gives their exchange statistics. Freedman, Larsen and Wang (2002) proved that braiding Fibonacci anyons is universal for quantum computation, while Ising anyons are not. Moore and Seiberg (1989) found the axioms of modular categories in rational conformal field theory. The physical existence and controllability of such anyons is an experimental question; the mathematical theorems are about the categories.

Algebra— Hecke algebras, Soergel bimodules and blocks

The Hecke algebra of a Coxeter group is categorified by Soergel bimodules: indecomposable bimodules correspond to the Kazhdan–Lusztig basis, and graded ranks of morphism spaces give the KL polynomials. In modular representation theory, categorical actions organise the blocks of symmetric groups and of Hecke algebras: Ariki's theorem computes decomposition numbers via canonical bases, and Chuang–Rouquier derived equivalences prove Broué's conjecture for symmetric groups (see derived categories).

Geometry— Geometric representation theory

Many categorifications come from geometry. Perverse sheaves on the flag variety G/BG/B categorify the Hecke algebra, and the Beilinson–Bernstein localisation theorem (1981) identifies representations of a semisimple Lie algebra with DD-modules on G/BG/B; the Kazhdan–Lusztig conjecture became a statement about intersection cohomology. Lusztig's canonical bases arise from perverse sheaves on spaces of quiver representations, and Nakajima quiver varieties carry geometric categorical actions. Here the categories are categories of sheaves on spaces, and functors are given by correspondences.

Combinatorics— Positivity as a shadow of dimension

A combinatorialist's favourite question — "what do these non-negative integers count?" — is often answered by categorification. Littlewood–Richardson coefficients are multiplicities in tensor products of representations of GLnGL_n; Kazhdan–Lusztig coefficients are dimensions of Hom spaces between Soergel bimodules; the coefficients of Kac polynomials have been interpreted through the cohomology of quiver varieties (Hausel, Letellier and Rodriguez-Villegas). A bijective proof of an identity is a categorification of it in FinSet\mathbf{FinSet}.

Category theory— 2-representations and Tannakian duality

The natural home of categorical actions is 22-representation theory: actions of a monoidal category or 22-category C\mathfrak{C} on categories, with morphisms and 22-morphisms between them (see higher categories). Module categories over a fusion category C\mathcal{C} form a 22-category, and Morita theory for fusion categories says that C\mathcal{C} and D\mathcal{D} have equivalent 22-categories of module categories iff their Drinfeld centres are equivalent as braided categories. Tannakian duality runs the other way: a symmetric tensor category with a fibre functor is Rep⁡(G)\operatorname{Rep}(G) of a recovered group (Deligne, 1990, 2002).

History & global context

History and global context

  • 1925–30. Emmy Noether, with Heinz Hopf and Leopold Vietoris, recasts Betti numbers as ranks of homology groups.
  • 1957. Alexander Grothendieck introduces K0K_0 in his proof of the Grothendieck–Riemann–Roch theorem.
  • 1979–81. Kazhdan and Lusztig formulate their conjectures; Beilinson–Bernstein and Brylinski–Kashiwara prove them via DD-modules and perverse sheaves.
  • 1989–92. Moore and Seiberg axiomatise modular categories from conformal field theory; Reshetikhin–Turaev and Turaev–Viro construct 33-manifold invariants. Lusztig and, independently, Masaki Kashiwara (Kyoto) construct canonical and crystal bases (1990–91).
  • 1994. Louis Crane and Igor Frenkel coin the word categorification.
  • 1996–98. Susumu Ariki proves the LLT conjecture; Daisuke Tambara and Shigeru Yamagami classify the fusion categories now named after them.
  • 1999–2000. Mikhail Khovanov categorifies the Jones polynomial.
  • 2002–08. Pavel Etingof, Dmitri Nikshych and Viktor Ostrik develop the structure theory of fusion categories; Joseph Chuang and Raphaël Rouquier introduce sl2\mathfrak{sl}_2-categorification; Khovanov–Lauda and Rouquier categorify quantum groups.
  • 2011–20. Kronheimer–Mrowka (unknot detection), Elias–Williamson (Soergel's conjecture), Piccirillo (the Conway knot).
Further reading

Further reading

  • Pavel Etingof, Shlomo Gelaki, Dmitri Nikshych and Victor Ostrik, Tensor Categories (AMS Mathematical Surveys and Monographs 205, 2015) — the standard reference for tensor, fusion and module categories.
  • Volodymyr Mazorchuk, Lectures on Algebraic Categorification (EMS QGM Master Class Series, 2012) — a short course on categorification in representation theory.
  • John C. Baez and James Dolan, "Categorification", in Higher Category Theory (Contemporary Mathematics 230, 1998) — the programme, with many examples.
  • Dror Bar-Natan, "On Khovanov's categorification of the Jones polynomial", Algebraic & Geometric Topology 2 (2002) — the accessible account, with computations.
  • Joseph Chuang and Raphaël Rouquier, "Derived equivalences for symmetric groups and sl2\mathfrak{sl}_2-categorification", Annals of Mathematics 167 (2008).
  • Ben Elias, Shotaro Makisumi, Ulrich Thiel and Geordie Williamson, Introduction to Soergel Bimodules (2020).
  • Vladimir Turaev, Quantum Invariants of Knots and 3-Manifolds (1994).

A reading path: Baez–Dolan for the idea → EGNO Ch. 1–4 for tensor and fusion categories (with Rep⁡(G)\operatorname{Rep}(G) always in mind) → Bar-Natan for Khovanov homology, or Mazorchuk then Chuang–Rouquier for categorical actions.