$SU(2)$ Representations: SU2Irrep

SU2Irrep represents irreducible representations (irreps) of the compact group $SU(2)$ as a Sector. This page documents how the type behaves in code (construction, iteration, fusion, and access to topological data).

Sector type

The irreps of $SU(2)$ are labeled by non-negative integers or half-integers (e.g. $0$, $\frac{1}{2}$, $1$, $\frac{3}{2}$, …).

TensorKitSectors.SU2Irrep — Type
struct SU2Irrep <: AbstractIrrep{SU₂}
SU2Irrep(j::Real)
Irrep[SU₂](j::Real)

Represents irreps of the group $SU₂$. The irrep is labeled by a half integer j which can be entered as an arbitrary Real, but is stored as a HalfInt from the HalfIntegers.jl package.

Fields

  • j::HalfInt: the label of the irrep, which can be any non-negative half integer.
source

Fusing two irreps together leads to a direct sum of irreps:

\[a ⊗ b = \bigoplus_{c_j = |j_a - j_b|}^{j_a + j_b} c\]

Since each output appears only once, we have FusionStyle(SU2Irrep) = SimpleFusion(). The Nsymbol returns a Bool that checks the triangle inequality:

\[N_c^{ab} = |j_a - j_b| ≤ j_c ≤ j_a + j_b ∧ j_a + j_b + j_c ∈ ℕ\]

Each irrep has dimension $d = 2j + 1$.

The Fsymbol is computed from Wigner $6j$ (Racah-$W$) symbols as

\[\left(F_{abc}^d\right)_e^f = (-1)^{j_a + j_b + j_c + j_d} \sqrt{d_e d_f} \begin{Bmatrix} j_a & j_b & j_e \\ j_c & j_d & j_f \end{Bmatrix}\]

The BraidingStyle is Bosonic, and Rsymbol is $± 1$ for allowed fusion channels based on the parity of $j_a + j_b - j_c$.

Fusion Tensor and Basis Conventions

fusiontensor(a, b, c) returns Clebsch–Gordan coefficients as a rank‑4 array of size $d_a × d_b × d_c × 1$. We can label the basis by using $\ket{j, m}$, where the magnetic quantum number takes on values $m ∈ \{j, j-1, …, -j\}$ (in that order).

Each irrep acts on the standard basis $\lvert j, m \rangle$ where $m = j, j-1, …, -j$. In that basis, the generators of $\mathfrak{su}(2)$ are represented by the usual angular momentum operators:

\[J_z \lvert j, m \rangle = m \lvert j, m \rangle, \quad J_± \lvert j, m \rangle = \sqrt{(j ∓ m)(j ± m + 1)}\, \lvert j, m ± 1 \rangle.\]

using TensorKitSectors

function generators(a::SU2Irrep)
    Jp = zeros(dim(a), dim(a))
    Jm = zeros(dim(a), dim(a))
    Jz = zeros(dim(a), dim(a))
    
    for row in axes(Jp, 1), col in axes(Jp, 2)
        m = a.j - col + 1
        if row == col
            Jz[row, col] = m
        elseif row + 1 == col
            Jp[row, col] = sqrt((a.j - m) * (a.j + m + 1))
        elseif row == col + 1
            Jm[row, col] = sqrt((a.j + m) * (a.j - m + 1))
        end
    end

    return Jp, Jm, Jz
end

a = SU2Irrep(1)
Jp, Jm, Jz = generators(a)

The tensor product representation for $a ⊗ b$ is given in terms of the representations $a$ and $b$ as:

\[\mathbf{J}^{(a ⊗ b)} = \mathbf{J}^{(a)} ⊗ \mathbf{1}^{(b)} + \mathbf{1}^{(a)} ⊗ \mathbf{J}^{(b)}\]

The fusiontensor supplies the change‑of‑basis coefficients $C^{J M}_{j_a m_a, j_b m_b}$ that map the uncoupled product basis to the coupled basis:

\[\lvert J, M \rangle = \sum_{m_a, m_b} C^{J M}_{j_a m_a, j_b m_b} \lvert j_a, m_a \rangle ⊗ \lvert j_b, m_b \rangle.\]

In particular, this block-diagonalizes the generators, and we must have that for every $\mathbf{J}$, the following holds:

\[\left(\mathbf{J}^{(a)} ⊗ \mathbf{1}^{(b)} + \mathbf{1}^{(a)} ⊗ \mathbf{J}^{(b)}\right) ⋅ C^c_{ab} = C^c_{ab} ⋅ \mathbf{J}^{(c)}\]

using TensorOperations: @tensor
using Test: @test

a = SU2Irrep(1)
b = SU2Irrep(1)

for c in a ⊗ b
    CGC = dropdims(fusiontensor(a, b, c); dims = 4) # drop trivial multiplicity dimension
    for (Ja, Jb, Jc) in zip(generators(a), generators(b), generators(c))
        @tensor lhs[a b; c] := Ja[a; a'] * CGC[a' b; c] + Jb[b; b'] * CGC[a b'; c]
        @tensor rhs[a b; c] := CGC[a b; c'] * Jc[c'; c]
        @test isapprox(lhs, rhs)
    end
end

References

For a quick refresher on the group structure and representation theory (without turning this page into a math course), the following references are useful: