Symmetric Verlinde categories in characteristic $p$
Two related families carry the name Verlinde category. The categories called Verlinde modular categories in Etingof et al. (2015), Example 8.18.5 arise from quantum groups at roots of unity in characteristic zero; their $\mathfrak{sl}_2$ models are constructed by verlinde_category. This page concerns the symmetric fusion category $\operatorname{Ver}_p$ in characteristic $p$. Except in trivial rank, a symmetric braided category is not modular. The constructor is therefore named symmetric_verlinde_category.
Let $k$ be a field of characteristic $p>0$, and let $J_i$ be the $i$-dimensional indecomposable representation of $C_p$ on which a generator acts by one unipotent Jordan block. The semisimplification of $\operatorname{Rep}_k(C_p)$ kills $J_p$ and has simple objects
\[L_i=[J_i],\qquad 1\leq i\leq p-1.\]
This is $\operatorname{Ver}_p$ (Etingof et al., 2015; Exercise 8.18.9(v)). Its tensor product is the truncated $\mathfrak{sl}_2$ rule
\[\label{eq:symmetric-verlinde-fusion} L_a\otimes L_b =\bigoplus_{\substack{c=|a-b|+1\\c\equiv a+b+1\pmod 2}}^{ \min(a+b-1,\,2p-a-b-1)}L_c.\]
The quotient inherits the ordinary flip, rigidity, and spherical structure from representations. The full construction and its fusion rules are described by Etingof et al. (2017), §2 and Etingof and Ostrik (2022), Example 2.7.
For $p>2$ there is a factorization
\[\operatorname{Ver}_p\simeq \operatorname{Ver}_p^+\boxtimes\operatorname{sVect},\]
where $\operatorname{Ver}_p^+$ has the odd-labelled simples $L_1,L_3,\ldots,L_{p-2}$ (Gelaki and Ostrik, 2026; §2.3).
The constructor
The integer call uses the prime field $\mathbf F_p$:
using TensorCategories, Oscar
V = symmetric_verlinde_category(7; plus=true)
simples_names(V)3-element Vector{String}:
"L1"
"L3"
"L5"The result is a split skeletal fusion category with associator, symmetric braiding, and spherical structure transported from the representation quotient. The categorical dimension of $L_i$ is the image of $i$ in the coefficient field.
dim.(simples(V))3-element Vector{FqFieldElem}:
1
3
5Pass a finite field instead of an integer to choose a larger coefficient field of characteristic $p$. The value of $p$ is the characteristic, not the order of the field. Set skeletal=false to retain the semisimplified quotient of the generated representation category. Set check=true to verify pentagon, hexagon, pivotal, and spherical identities while constructing the skeleton.
The mathematical literature normally takes $k$ algebraically closed. The constructor currently uses a finite field, but the Jordan-block model and all simple endomorphism rings defining $\operatorname{Ver}_p$ and $\operatorname{Ver}_p^+$ are already split over the prime field. Subsequent constructions can introduce new nonsplit objects; apply the splitting tests of scalar extension and splitting when needed.
TensorCategories.symmetric_verlinde_category — Function
symmetric_verlinde_category(p::Integer; plus=false, skeletal=true, check=false)
symmetric_verlinde_category(F::Field; plus=false, skeletal=true, check=false)Construct the symmetric Verlinde category $\operatorname{Ver}_p$ in characteristic $p$ as the semisimplification of $\operatorname{Rep}_F(C_p)$. The integer method uses GF(p). The field method currently supports finite fields of positive characteristic.
Set plus=true to construct the fusion subcategory $\operatorname{Ver}_p^+$ generated by $L_3$; its simple objects have odd labels. By default the result is a SixJCategory whose simple objects are named L1, L2, and so on. Set skeletal=false to retain the quotient model and its representation-theoretic objects. With check=true, verify the transported skeletal structure.
This construction is distinct from the characteristic-zero quantum-group constructor verlinde_category.
Drinfeld centers
For a braided category $\mathcal C$, center_embedding(C) constructs the canonical functor
\[\mathcal C\longrightarrow\mathcal Z(\mathcal C),\qquad X\longmapsto (X,c_{X,-}).\]
This formula uses the package convention $\gamma_Y:X\otimes Y\to Y\otimes X$ for half-braidings. The keyword reverse=true instead uses $c_{Y,X}^{-1}$. See Drinfeld centers and half-braidings for the convention and the general center algorithm.
For $p>3$, $\mathcal Z(\operatorname{Ver}_p^+)$ is not semisimple. Its simple objects are precisely the canonical images of the simple objects of $\operatorname{Ver}_p^+$, and induction of $L_i$ is the projective cover of that simple object (Gelaki and Ostrik, 2026; Lemma 3.1 and Theorem 3.2). The Cartan matrix is
\[\label{eq:verlinde-center-cartan} C_{ij}=C_{ji}=\frac{j(p-i)}2, \qquad 1\leq j\leq i\leq p-2,\quad i,j\text{ odd}.\]
The following uses only the general center interface:
V = symmetric_verlinde_category(7; plus=true)
Z = center(V)
E = center_embedding(V; parent_category=Z)
S = simples(Z; sort=false)
P = [induction(X; parent_category=Z) for X in simples(V)]
[int_dim(End(X)) for X in S]
# [1, 1, 1]
[int_dim(Hom(X,Y)) for X in P, Y in P]
# [3 2 1; 2 6 3; 1 3 5]The paper works over an algebraic closure. The displayed computation over $\mathbf F_7$ also checks directly that the three central simple objects have one-dimensional endomorphism rings, so this particular list is already split.
TensorCategories.center_embedding — Function
center_embedding(C::Category; reverse=false, parent_category=center(C))Return the canonical functor from a braided category C to its Drinfeld center. With the package's half-braiding convention, an object X receives the components braiding(X,Y). If reverse=true, use inv(braiding(Y,X)) instead.
Finite pieces of a semisimplified center
For $p\geq7$, the center $\mathcal Z(\operatorname{Ver}_p^+)$ has wild representation type (Gelaki and Ostrik, 2026; Theorem 3.8). A request for all indecomposable objects is therefore not a finite computation. One can instead choose finitely many objects, enumerate summands of tensor words to a specified depth, and inspect their images modulo negligible morphisms:
T = tensor_power_category(seeds)
Q = semisimplification(T)
piece = semisimplified_piece(T, 3; quotient=Q)
piece.representativesThe result distinguishes all enumerated upstairs indecomposables, their nonzero quotient images, and one representative of each quotient isomorphism class. It does not claim that a bounded piece exhausts the ambient center. tensor_closure_complete becomes true only if the generated tensor subcategory upstairs has actually stopped producing new indecomposables. all_images_split_simple tests whether the enumerated quotient images have one-dimensional endomorphism spaces.
If a calculation supplies a finite list S of quotient simples and the matrix N for multiplication by a simple generator E, then
D = fusion_subcategory(E; simples=S, products=N, names=names)constructs the generated fusion subcategory. Here N[k,j] is the multiplicity of S[k] in E ⊗ S[j]. The default checks the proposed decompositions by constructing explicit isomorphisms, checks dual closure, and verifies that all objects in S are reached from the tensor unit. The result retains the concrete quotient objects and morphisms; pass skeletal=true to extract a SixJCategory.
When a theoretical calculation predicts a decomposition, use decomposition_isomorphism(X, proposed) over a finite field. It searches the complete categorical Hom spaces and returns an explicit isomorphism, its inverse, and all summand inclusions and projections. Failure of the bounded search is not a proof that the proposed decomposition is false.
An endomorphism can be studied on a quotient multiplicity space with the ordinary Hom functor. If $f:X\to X$ and $Y$ are first mapped into a semisimplification Q, then matrix(Hom(Y,:)(f)) is the matrix induced by postcomposition on $\operatorname{Hom}_Q(Y,X)$. In particular, taking $f$ to be a self-braiding reads its action on a chosen fusion channel without introducing a center-specific matrix convention.
TensorCategories.semisimplified_piece — Function
semisimplified_piece(T::TensorPowerCategory, depth::Integer;
quotient=Semisimplification(T))
semisimplified_piece(generators::Vector{<:Object}, depth::Integer)Enumerate the indecomposable summands of tensor words of length at most depth, including the unit at depth zero, and inspect their images in the quotient by negligible morphisms. The returned named tuple contains the upstairs indecomposables, the nonzero survivors, all corresponding quotient images, one object from each quotient isomorphism class in representatives, and the dimensions of the quotient endomorphism spaces in endomorphism_dimensions.
all_images_split_simple records whether every surviving image has one-dimensional endomorphism space. tensor_closure_complete is true only when enumeration of the tensor subcategory generated upstairs has terminated; it never asserts completeness of the ambient category. No call to simples(quotient) is made.
TensorCategories.decomposition_isomorphism — Function
decomposition_isomorphism(X, decomposition=decompose(X);
max_attempts=64, rng=nothing)Find and verify an isomorphism from the proposed direct sum decomposition to X over a finite field. A decomposition is a vector of pairs (Y,m). The result contains the direct sum, the isomorphism and its inverse, and an inclusion/projection retract for every copy of every summand.
The search samples morphisms from the complete Hom spaces. Exhausting the bounded search raises an error; it does not prove that the proposed decomposition is false. Pass an RNG for reproducible sampling.
TensorCategories.fusion_subcategory — Function
fusion_subcategory(generators::Vector{<:Object}; simples, products=nothing,
names=["X1", ...], skeletal=false, check=true, rng=nothing)
fusion_subcategory(generator::Object; kwargs...)Construct the fusion subcategory generated by the supplied split simple objects generators inside a semisimple tensor category. The keyword simples gives the proposed complete list of simple objects of that subcategory.
If products is supplied, it is one nonnegative integer matrix for every generator. Entry (k,j) is the proposed multiplicity of simples[k] in generators[a] ⊗ simples[j]. For one generator, a single matrix may be passed directly. Otherwise these multiplicities are computed from Hom spaces.
With check=true, the function verifies that the proposed objects are pairwise distinct split simples, contain the tensor unit and the generators, are closed under duality, and are all reached from the unit by the generator products. Every proposed generator product is checked by constructing an explicit direct-sum isomorphism with decomposition_isomorphism. The current isomorphism search requires a finite coefficient field. With check=false, these potentially expensive Hom-space and decomposition checks are omitted; the tensor unit and generators must then occur literally in simples.
The result is a concrete FusionSubcategory whose operations are inherited from the ambient category. Set skeletal=true to transport its associator, braiding when present, and pivotal structure to a SixJCategory. In either case, the simple ordering is the ordering of simples.