In this document we briefly explain the construction and implementation of the Kirillov–Reshetikhin crystals of [FourierEtAl2009].
Kirillov–Reshetikhin (KR) crystals are finite-dimensional affine crystals corresponding to Kirillov–Reshektikhin
modules. They were first conjectured to exist in [HatayamaEtAl2001]. The proof of their existence for nonexceptional
types was given in [OkadoSchilling2008] and their combinatorial models were constructed in [FourierEtAl2009].
Kirillov-Reshetikhin crystals
are indexed first by their type (like
,
, ...)
with underlying index set
and two integers
and
. The integers
only needs to satisfy
, whereas
is a node of the finite Dynkin diagram
.
Their construction relies on several cases which we discuss separately. In all cases when removing the zero arrows,
the crystal decomposes as a (direct sum of) classical crystals which gives the crystal structure for
the index set
. Then the zero arrows are added by either exploiting a symmetry of the
Dynkin diagram or by using embeddings of crystals.
¶The Dynkin diagram for affine type
has a rotational symmetry mapping
where we view the indices modulo
:
sage: C = CartanType(['A',3,1])
sage: C.dynkin_diagram()
0
O-------+
| |
| |
O---O---O
1 2 3
A3~
The classical decomposition of
is the
highest weight crystal
or equivalently
the crystal of tableaux labelled by the rectangular partition
:

In Sage we can see this via:
sage: K = KirillovReshetikhinCrystal(['A',3,1],1,1)
sage: K.classical_decomposition()
The crystal of tableaux of type ['A', 3] and shape(s) [[1]]
sage: K.list()
[[[1]], [[2]], [[3]], [[4]]]
sage: K = KirillovReshetikhinCrystal(['A',3,1],2,1)
sage: K.classical_decomposition()
The crystal of tableaux of type ['A', 3] and shape(s) [[1, 1]]
One can change between the classical and affine crystal using the methods lift and retract:
sage: K = KirillovReshetikhinCrystal(['A',3,1],2,1)
sage: b = K(rows=[[1],[3]]); type(b)
<class 'sage.combinat.crystals.affine.KR_type_A_with_category.element_class'>
sage: b.lift()
[[1], [3]]
sage: type(b.lift())
<class 'sage.combinat.crystals.tensor_product.CrystalOfTableaux_with_category.element_class'>
sage: b = CrystalOfTableaux(['A',3], shape = [1,1])(rows=[[1],[3]])
sage: K.retract(b)
[[1], [3]]
sage: type(K.retract(b))
<class 'sage.combinat.crystals.affine.KR_type_A_with_category.element_class'>
The
-arrows are obtained using the analogue of
, called the promotion operator
, on the
level of crystals via:

In Sage this can be achieved as follows:
sage: K = KirillovReshetikhinCrystal(['A',3,1],2,1)
sage: b = K.module_generator(); b
[[1], [2]]
sage: b.f(0)
sage: b.e(0)
[[2], [4]]
sage: K.promotion()(b.lift())
[[2], [3]]
sage: K.promotion()(b.lift()).e(1)
[[1], [3]]
sage: K.promotion_inverse()(K.promotion()(b.lift()).e(1))
[[2], [4]]
KR crystals are level
crystals, meaning that the weight of all elements in these crystals is zero:
sage: K = KirillovReshetikhinCrystal(['A',3,1],2,1)
sage: b = K.module_generator(); b.weight()
-Lambda[0] + Lambda[2]
sage: b.weight().level()
0
The KR crystal
of type
looks as follows:
In Sage this can be obtained via:
sage: K = KirillovReshetikhinCrystal(['A',2,1],1,1)
sage: G = K.digraph()
sage: view(G, pdflatex=True, tightpage=True) # optional - dot2tex graphviz
,
,
¶The Dynkin diagrams for types
,
,
are invariant under interchanging nodes
and
:
sage: n = 5
sage: C = CartanType(['D',n,1]); C.dynkin_diagram()
0 O O 5
| |
| |
O---O---O---O
1 2 3 4
D5~
sage: C = CartanType(['B',n,1]); C.dynkin_diagram()
O 0
|
|
O---O---O---O=>=O
1 2 3 4 5
B5~
sage: C = CartanType(['A',2*n-1,2]); C.dynkin_diagram()
O 0
|
|
O---O---O---O=<=O
1 2 3 4 5
B5~*
The underlying classical algebras obtained when removing node
are type
,
respectively. The classical decomposition into a
crystal is a direct sum:

where
is obtained from
(or equivalently a rectangular partition of shape
)
by removing vertical dominoes. This in fact only holds in the ranges
for type
,
and
for types
and
:
sage: K = KirillovReshetikhinCrystal(['D',6,1],4,2)
sage: K.classical_decomposition()
The crystal of tableaux of type ['D', 6] and shape(s) [[], [1, 1], [1, 1, 1, 1], [2, 2], [2, 2, 1, 1], [2, 2, 2, 2]]
For type
and
, one needs to be aware that
is a spin weight and hence
corresponds in the partition language to a column of height
and width
:
sage: K = KirillovReshetikhinCrystal(['B',3,1],3,1)
sage: K.classical_decomposition()
The crystal of tableaux of type ['B', 3] and shape(s) [[1/2, 1/2, 1/2]]
As for type
, the Dynkin automorphism induces a promotion-type operator
on the level of crystals. In this case in can however happen that the automorphism changes
between classical components:
sage: K = KirillovReshetikhinCrystal(['D',4,1],2,1)
sage: b = K.module_generator(); b
[[1], [2]]
sage: K.automorphism(b)
[[2], [-1]]
sage: b = K(rows=[[2],[-2]])
sage: K.automorphism(b)
[]
This operator
is used to define the affine crystal operators:

The KR crystals
of types
,
, and
are, respectively:
¶The Dynkin diagram of type
has a symmetry
:
sage: C = CartanType(['C',4,1]); C.dynkin_diagram()
O=>=O---O---O=<=O
0 1 2 3 4
C4~
The classical subalgebra when removing the 0 node is of type
.
However, in this case the crystal
is not constructed using
, but rather
using a virtual crystal construction.
of type
is realized inside
of type
using:

where
and
are the crystal operator in the ambient crystal
:
sage: K = KirillovReshetikhinCrystal(['C',3,1],1,2); K.ambient_crystal()
Kirillov-Reshetikhin crystal of type ['B', 4, 1]^* with (r,s)=(1,2)
The classical decomposition for
is given by:

where
is obtained from
(or equivalently a rectangular partition of shape
)
by removing horizontal dominoes:
sage: K = KirillovReshetikhinCrystal(['C',3,1],2,4)
sage: K.classical_decomposition()
The crystal of tableaux of type ['C', 3] and shape(s) [[], [2], [4], [2, 2], [4, 2], [4, 4]]
The KR crystal
of type
looks as follows:
,
¶The Dynkin diagrams of types
and
look as follows:
sage: C = CartanType(['D',5,2]); C.dynkin_diagram()
O=<=O---O---O=>=O
0 1 2 3 4
C4~*
sage: C = CartanType(['A',8,2]); C.dynkin_diagram()
O=<=O---O---O=<=O
0 1 2 3 4
BC4~
The classical subdiagram is of type
for type
and of type
for type
. The classical decomposition for these KR crystals for
for type
and
for type
is given by:

where
is obtained from
(or equivalently a rectangular partition of shape
)
by removing single boxes:
sage: K = KirillovReshetikhinCrystal(['D',5,2],2,2)
sage: K.classical_decomposition()
The crystal of tableaux of type ['B', 4] and shape(s) [[], [1], [2], [1, 1], [2, 1], [2, 2]]
sage: K = KirillovReshetikhinCrystal(['A',8,2],2,2)
sage: K.classical_decomposition()
The crystal of tableaux of type ['C', 4] and shape(s) [[], [1], [2], [1, 1], [2, 1], [2, 2]]
The KR crystals are constructed using an injective map into a KR crystal of type 

where

sage: K = KirillovReshetikhinCrystal(['D',5,2],1,2); K.ambient_crystal()
Kirillov-Reshetikhin crystal of type ['C', 4, 1] with (r,s)=(1,4)
sage: K = KirillovReshetikhinCrystal(['A',8,2],1,2); K.ambient_crystal()
Kirillov-Reshetikhin crystal of type ['C', 4, 1] with (r,s)=(1,4)
The KR crystals
of type
and
look as follows:
As you can see from the Dynkin diagram for type
, mapping the nodes
yields
the same diagram, but with relabelled nodes. In this case the classical subdiagram is of type
instead of
. One can also construct the KR crystal
of type
based
on this classical decomposition. In this case the classical decomposition is the sum over all weights
obtained from
by removing horizontal dominoes:
sage: C = CartanType(['A',6,2]).dual()
sage: Kdual = KirillovReshetikhinCrystal(C,2,2)
sage: Kdual.classical_decomposition()
The crystal of tableaux of type ['B', 3] and shape(s) [[], [2], [2, 2]]
Looking at the picture, one can see that this implementation is isomorphic to the other implementation based
on the
decomposition up to a relabeling of the arrows
sage: C = CartanType(['A',4,2])
sage: K = KirillovReshetikhinCrystal(C,1,1)
sage: Kdual = KirillovReshetikhinCrystal(C.dual(),1,1)
sage: G = K.digraph()
sage: Gdual = Kdual.digraph()
sage: f = { 1:1, 0:2, 2:0 }
sage: for u,v,label in Gdual.edges():
... Gdual.set_edge_label(u,v,f[label])
sage: G.is_isomorphic(Gdual, edge_labels = True, certify = True) #todo not implemented (see #10904 and #10549)
(True, {[[-2]]: [[1]], [[-1]]: [[2]], [[1]]: [[-2]], []: [[0]], [[2]]: [[-1]]})
The KR crystals
for types
and
were excluded from the above
discussion. They are associated to the exceptional node
and in this case the classical decomposition
is irreducible

In Sage:
sage: K = KirillovReshetikhinCrystal(['C',2,1],2,1)
sage: K.classical_decomposition()
The crystal of tableaux of type ['C', 2] and shape(s) [[1, 1]]
sage: K = KirillovReshetikhinCrystal(['D',3,2],2,1)
sage: K.classical_decomposition()
The crystal of tableaux of type ['B', 2] and shape(s) [[1/2, 1/2]]
The KR crystals
and
of type
are also special. They decompose as:

These crystals are not yet implemented in Sage.
¶In [JonesEtAl2010] the KR crystals
for
in type
were
constructed exploiting again a Dynkin diagram automorphism, namely the
automorphism
of order 3 which maps
:
sage: C = CartanType(['E',6,1]); C.dynkin_diagram()
O 0
|
|
O 2
|
|
O---O---O---O---O
1 3 4 5 6
E6~
The crystals
and
are irreducible as classical crystals:
sage: K = KirillovReshetikhinCrystal(['E',6,1],1,1)
sage: K.classical_decomposition()
Direct sum of the crystals Family (Finite dimensional highest weight crystal of type ['E', 6] and highest weight Lambda[1],)
sage: K = KirillovReshetikhinCrystal(['E',6,1],6,1)
sage: K.classical_decomposition()
Direct sum of the crystals Family (Finite dimensional highest weight crystal of type ['E', 6] and highest weight Lambda[6],)
whereas for the adjoint node
we have the decomposition

sage: K = KirillovReshetikhinCrystal(['E',6,1],2,1)
sage: K.classical_decomposition()
Direct sum of the crystals Family (Finite dimensional highest weight crystal of type ['E', 6] and highest weight 0,
Finite dimensional highest weight crystal of type ['E', 6] and highest weight Lambda[2])
The promotion operator on the crystal corresponding to
can be calculated explicitly:
sage: K = KirillovReshetikhinCrystal(['E',6,1],1,1)
sage: promotion = K.promotion()
sage: u = K.module_generator(); u
[[1]]
sage: promotion(u.lift())
[[-1, 6]]
The crystal
is already of dimension 27. The elements
of this crystal are labelled by tuples which
specify their nonzero
and
. For example,
indicates that
and all others are equal to zero:
sage: K = KirillovReshetikhinCrystal(['E',6,1],1,1)
sage: K.cardinality()
27
An important notion for finite-dimensional affine crystals is perfectness.
The crucial property is that a crystal
is perfect of level
if there
is a bijection between level
dominant weights and elements in

For a precise definition of perfect crystals see [HongKang2002] .
In [FourierEtAl2010] it was proven that for the nonexceptional types
is
perfect as long as
is an integer. Here
except
for
in type
and
in type
.
Here we verify this using Sage for
of type
:
sage: K = KirillovReshetikhinCrystal(['C',3,1],1,1)
sage: Lambda = K.weight_lattice_realization().fundamental_weights(); Lambda
Finite family {0: Lambda[0], 1: Lambda[1], 2: Lambda[2], 3: Lambda[3]}
sage: [w.level() for w in Lambda]
[1, 1, 1, 1]
sage: Bmin = [b for b in K if b.Phi().level() == 1 ]; Bmin
[[[1]], [[2]], [[3]], [[-3]], [[-2]], [[-1]]]
sage: [b.Phi() for b in Bmin]
[Lambda[1], Lambda[2], Lambda[3], Lambda[2], Lambda[1], Lambda[0]]
As you can see, both
and
satisfy
. Hence there is
no bijection between the minimal elements in
and level 1 weights. Therefore,
of type
is not perfect. However,
of type
is a perfect crystal:
sage: K = KirillovReshetikhinCrystal(['C',3,1],1,2)
sage: Lambda = K.weight_lattice_realization().fundamental_weights()
sage: Bmin = [b for b in K if b.Phi().level() == 1 ]
sage: [b.Phi() for b in Bmin]
[Lambda[0], Lambda[3], Lambda[2], Lambda[1]]
Perfect crystals can be used to construct infinite-dimensional highest weight crystals and Demazure crystals using the Kyoto path model [KKMMNN1992].