Affine Finite Crystals

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 Br,s are indexed first by their type (like An(1), Bn(1), …) with underlying index set I={0,1,,n} and two integers r and s. The integers s only needs to satisfy s>0, whereas r is a node of the finite Dynkin diagram rI{0}.

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 I0={1,2,,n}. Then the zero arrows are added by either exploiting a symmetry of the Dynkin diagram or by using embeddings of crystals.

Type An(1)

The Dynkin diagram for affine type A has a rotational symmetry mapping σ:ii+1 where we view the indices modulo n+1:

sage: C = CartanType(['A',3,1])
sage: C.dynkin_diagram()
0
O-------+
|       |
|       |
O---O---O
1   2   3
A3~
>>> from sage.all import *
>>> C = CartanType(['A',Integer(3),Integer(1)])
>>> C.dynkin_diagram()
0
O-------+
|       |
|       |
O---O---O
1   2   3
A3~

The classical decomposition of Br,s is the An highest weight crystal B(sωr) or equivalently the crystal of tableaux labelled by the rectangular partition (sr):

Br,sB(sωr)as a {1,2,,n}-crystal

In Sage we can see this via:

sage: K = crystals.KirillovReshetikhin(['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 = crystals.KirillovReshetikhin(['A',3,1],2,1)
sage: K.classical_decomposition()
The crystal of tableaux of type ['A', 3] and shape(s) [[1, 1]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['A',Integer(3),Integer(1)],Integer(1),Integer(1))
>>> K.classical_decomposition()
The crystal of tableaux of type ['A', 3] and shape(s) [[1]]
>>> K.list()
[[[1]], [[2]], [[3]], [[4]]]

>>> K = crystals.KirillovReshetikhin(['A',Integer(3),Integer(1)],Integer(2),Integer(1))
>>> 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 = crystals.KirillovReshetikhin(['A',3,1],2,1)
sage: b = K(rows=[[1],[3]]); type(b)
<class 'sage.combinat.crystals.kirillov_reshetikhin.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 = crystals.Tableaux(['A',3], shape = [1,1])(rows=[[1],[3]])
sage: K.retract(b)
[[1], [3]]
sage: type(K.retract(b))
<class 'sage.combinat.crystals.kirillov_reshetikhin.KR_type_A_with_category.element_class'>
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['A',Integer(3),Integer(1)],Integer(2),Integer(1))
>>> b = K(rows=[[Integer(1)],[Integer(3)]]); type(b)
<class 'sage.combinat.crystals.kirillov_reshetikhin.KR_type_A_with_category.element_class'>
>>> b.lift()
[[1], [3]]
>>> type(b.lift())
<class 'sage.combinat.crystals.tensor_product.CrystalOfTableaux_with_category.element_class'>

>>> b = crystals.Tableaux(['A',Integer(3)], shape = [Integer(1),Integer(1)])(rows=[[Integer(1)],[Integer(3)]])
>>> K.retract(b)
[[1], [3]]
>>> type(K.retract(b))
<class 'sage.combinat.crystals.kirillov_reshetikhin.KR_type_A_with_category.element_class'>

The 0-arrows are obtained using the analogue of σ, called the promotion operator pr, on the level of crystals via:

f0=pr1f1pre0=pr1e1pr

In Sage this can be achieved as follows:

sage: K = crystals.KirillovReshetikhin(['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]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['A',Integer(3),Integer(1)],Integer(2),Integer(1))
>>> b = K.module_generator(); b
[[1], [2]]
>>> b.f(Integer(0))
>>> b.e(Integer(0))
[[2], [4]]

>>> K.promotion()(b.lift())
[[2], [3]]
>>> K.promotion()(b.lift()).e(Integer(1))
[[1], [3]]
>>> K.promotion_inverse()(K.promotion()(b.lift()).e(Integer(1)))
[[2], [4]]

KR crystals are level 0 crystals, meaning that the weight of all elements in these crystals is zero:

sage: K = crystals.KirillovReshetikhin(['A',3,1],2,1)
sage: b = K.module_generator(); b.weight()
-Lambda[0] + Lambda[2]
sage: b.weight().level()
0
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['A',Integer(3),Integer(1)],Integer(2),Integer(1))
>>> b = K.module_generator(); b.weight()
-Lambda[0] + Lambda[2]
>>> b.weight().level()
0

The KR crystal B1,1 of type A2(1) looks as follows:

../_images/KR_A.png

In Sage this can be obtained via:

sage: K = crystals.KirillovReshetikhin(['A',2,1],1,1)
sage: G = K.digraph()
sage: view(G, tightpage=True) # optional - dot2tex graphviz, not tested (opens external window)
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['A',Integer(2),Integer(1)],Integer(1),Integer(1))
>>> G = K.digraph()
>>> view(G, tightpage=True) # optional - dot2tex graphviz, not tested (opens external window)

Types Dn(1), Bn(1), A2n1(2)

The Dynkin diagrams for types Dn(1), Bn(1), A2n1(2) are invariant under interchanging nodes 0 and 1:

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~*
>>> from sage.all import *
>>> n = Integer(5)
>>> C = CartanType(['D',n,Integer(1)]); C.dynkin_diagram()
  0 O   O 5
    |   |
    |   |
O---O---O---O
1   2   3   4
D5~
>>> C = CartanType(['B',n,Integer(1)]); C.dynkin_diagram()
    O 0
    |
    |
O---O---O---O=>=O
1   2   3   4   5
B5~
>>> C = CartanType(['A',Integer(2)*n-Integer(1),Integer(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 0 are type g0=Dn,Bn,Cn, respectively. The classical decomposition into a g0 crystal is a direct sum:

Br,sλB(λ)as a {1,2,,n}-crystal

where λ is obtained from sωr (or equivalently a rectangular partition of shape (sr)) by removing vertical dominoes. This in fact only holds in the ranges 1rn2 for type Dn(1), and 1rn for types Bn(1) and A2n1(2):

sage: K = crystals.KirillovReshetikhin(['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]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['D',Integer(6),Integer(1)],Integer(4),Integer(2))
>>> 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 Bn(1) and r=n, one needs to be aware that ωn is a spin weight and hence corresponds in the partition language to a column of height n and width 1/2:

sage: K = crystals.KirillovReshetikhin(['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]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['B',Integer(3),Integer(1)],Integer(3),Integer(1))
>>> K.classical_decomposition()
The crystal of tableaux of type ['B', 3] and shape(s) [[1/2, 1/2, 1/2]]

As for type An(1), 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 = crystals.KirillovReshetikhin(['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)
[]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['D',Integer(4),Integer(1)],Integer(2),Integer(1))
>>> b = K.module_generator(); b
[[1], [2]]
>>> K.automorphism(b)
[[2], [-1]]
>>> b = K(rows=[[Integer(2)],[-Integer(2)]])
>>> K.automorphism(b)
[]

This operator σ is used to define the affine crystal operators:

f0=σf1σe0=σe1σ

The KR crystals B1,1 of types D3(1), B2(1), and A5(2) are, respectively:

../_images/KR_D.png ../_images/KR_B.png ../_images/KR_Atwisted.png

Type Cn(1)

The Dynkin diagram of type Cn(1) has a symmetry σ(i)=ni:

sage: C = CartanType(['C',4,1]); C.dynkin_diagram()
O=>=O---O---O=<=O
0   1   2   3   4
C4~
>>> from sage.all import *
>>> C = CartanType(['C',Integer(4),Integer(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 Cn.

However, in this case the crystal Br,s is not constructed using σ, but rather using a virtual crystal construction. Br,s of type Cn(1) is realized inside V^r,s of type A2n+1(2) using:

e0=e^0e^1andei=e^i+1for1inf0=f^0f^1andfi=f^i+1for1in

where e^i and f^i are the crystal operator in the ambient crystal V^r,s:

sage: K = crystals.KirillovReshetikhin(['C',3,1],1,2); K.ambient_crystal()
Kirillov-Reshetikhin crystal of type ['B', 4, 1]^* with (r,s)=(1,2)
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['C',Integer(3),Integer(1)],Integer(1),Integer(2)); K.ambient_crystal()
Kirillov-Reshetikhin crystal of type ['B', 4, 1]^* with (r,s)=(1,2)

The classical decomposition for 1r<n is given by:

Br,sλB(λ)as a {1,2,,n}-crystal

where λ is obtained from sωr (or equivalently a rectangular partition of shape (sr)) by removing horizontal dominoes:

sage: K = crystals.KirillovReshetikhin(['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]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['C',Integer(3),Integer(1)],Integer(2),Integer(4))
>>> 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 B1,1 of type C2(1) looks as follows:

../_images/KR_C.png

Types Dn+1(2), A2n(2)

The Dynkin diagrams of types Dn+1(2) and A2n(2) 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~
>>> from sage.all import *
>>> C = CartanType(['D',Integer(5),Integer(2)]); C.dynkin_diagram()
O=<=O---O---O=>=O
0   1   2   3   4
C4~*

>>> C = CartanType(['A',Integer(8),Integer(2)]); C.dynkin_diagram()
O=<=O---O---O=<=O
0   1   2   3   4
BC4~

The classical subdiagram is of type Bn for type Dn+1(2) and of type Cn for type A2n(2). The classical decomposition for these KR crystals for 1r<n for type Dn+1(2) and 1rn for type A2n(2) is given by:

Br,sλB(λ)as a {1,2,,n}-crystal

where λ is obtained from sωr (or equivalently a rectangular partition of shape (sr)) by removing single boxes:

sage: K = crystals.KirillovReshetikhin(['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 = crystals.KirillovReshetikhin(['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]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['D',Integer(5),Integer(2)],Integer(2),Integer(2))
>>> K.classical_decomposition()
The crystal of tableaux of type ['B', 4] and shape(s) [[], [1], [2], [1, 1], [2, 1], [2, 2]]

>>> K = crystals.KirillovReshetikhin(['A',Integer(8),Integer(2)],Integer(2),Integer(2))
>>> 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 Cn(1)

S:Br,sBCn(1)r,2ssuch that S(eib)=eimiS(b) and S(fib)=fimiS(b)

where

(m0,,mn)=(1,2,,2,1) for type Dn+1(2)and(1,2,,2,2) for type A2n(2).
sage: K = crystals.KirillovReshetikhin(['D',5,2],1,2); K.ambient_crystal()
Kirillov-Reshetikhin crystal of type ['C', 4, 1] with (r,s)=(1,4)
sage: K = crystals.KirillovReshetikhin(['A',8,2],1,2); K.ambient_crystal()
Kirillov-Reshetikhin crystal of type ['C', 4, 1] with (r,s)=(1,4)
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['D',Integer(5),Integer(2)],Integer(1),Integer(2)); K.ambient_crystal()
Kirillov-Reshetikhin crystal of type ['C', 4, 1] with (r,s)=(1,4)
>>> K = crystals.KirillovReshetikhin(['A',Integer(8),Integer(2)],Integer(1),Integer(2)); K.ambient_crystal()
Kirillov-Reshetikhin crystal of type ['C', 4, 1] with (r,s)=(1,4)

The KR crystals B1,1 of type D3(2) and A4(2) look as follows:

../_images/KR_Dtwisted.png ../_images/KR_Atwisted1.png

As you can see from the Dynkin diagram for type A2n(2), mapping the nodes ini yields the same diagram, but with relabelled nodes. In this case the classical subdiagram is of type Bn instead of Cn. One can also construct the KR crystal Br,s of type A2n(2) based on this classical decomposition. In this case the classical decomposition is the sum over all weights obtained from sωr by removing horizontal dominoes:

sage: C = CartanType(['A',6,2]).dual()
sage: Kdual = crystals.KirillovReshetikhin(C,2,2)
sage: Kdual.classical_decomposition()
The crystal of tableaux of type ['B', 3] and shape(s) [[], [2], [2, 2]]
>>> from sage.all import *
>>> C = CartanType(['A',Integer(6),Integer(2)]).dual()
>>> Kdual = crystals.KirillovReshetikhin(C,Integer(2),Integer(2))
>>> 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 Cn decomposition up to a relabeling of the arrows:

sage: C = CartanType(['A',4,2])
sage: K = crystals.KirillovReshetikhin(C,1,1)
sage: Kdual = crystals.KirillovReshetikhin(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(sort=False):
....:     Gdual.set_edge_label(u,v,f[label])
sage: G.is_isomorphic(Gdual, edge_labels = True)
True
>>> from sage.all import *
>>> C = CartanType(['A',Integer(4),Integer(2)])
>>> K = crystals.KirillovReshetikhin(C,Integer(1),Integer(1))
>>> Kdual = crystals.KirillovReshetikhin(C.dual(),Integer(1),Integer(1))
>>> G = K.digraph()
>>> Gdual = Kdual.digraph()
>>> f = { Integer(1):Integer(1), Integer(0):Integer(2), Integer(2):Integer(0) }
>>> for u,v,label in Gdual.edges(sort=False):
...     Gdual.set_edge_label(u,v,f[label])
>>> G.is_isomorphic(Gdual, edge_labels = True)
True
../_images/KR_Atwisted_dual.png

Exceptional nodes

The KR crystals Bn,s for types Cn(1) and Dn+1(2) were excluded from the above discussion. They are associated to the exceptional node r=n and in this case the classical decomposition is irreducible:

Bn,sB(sωn).

In Sage:

sage: K = crystals.KirillovReshetikhin(['C',2,1],2,1)
sage: K.classical_decomposition()
The crystal of tableaux of type ['C', 2] and shape(s) [[1, 1]]

sage: K = crystals.KirillovReshetikhin(['D',3,2],2,1)
sage: K.classical_decomposition()
The crystal of tableaux of type ['B', 2] and shape(s) [[1/2, 1/2]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['C',Integer(2),Integer(1)],Integer(2),Integer(1))
>>> K.classical_decomposition()
The crystal of tableaux of type ['C', 2] and shape(s) [[1, 1]]

>>> K = crystals.KirillovReshetikhin(['D',Integer(3),Integer(2)],Integer(2),Integer(1))
>>> K.classical_decomposition()
The crystal of tableaux of type ['B', 2] and shape(s) [[1/2, 1/2]]
../_images/KR_C_exceptional.png ../_images/KR_Dtwisted_exceptional.png

The KR crystals Bn,s and Bn1,s of type Dn(1) are also special. They decompose as:

Bn,sB(sωn) and Bn1,sB(sωn1).
sage: K = crystals.KirillovReshetikhin(['D',4,1],4,1)
sage: K.classical_decomposition()
The crystal of tableaux of type ['D', 4] and shape(s) [[1/2, 1/2, 1/2, 1/2]]
sage: K = crystals.KirillovReshetikhin(['D',4,1],3,1)
sage: K.classical_decomposition()
The crystal of tableaux of type ['D', 4] and shape(s) [[1/2, 1/2, 1/2, -1/2]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['D',Integer(4),Integer(1)],Integer(4),Integer(1))
>>> K.classical_decomposition()
The crystal of tableaux of type ['D', 4] and shape(s) [[1/2, 1/2, 1/2, 1/2]]
>>> K = crystals.KirillovReshetikhin(['D',Integer(4),Integer(1)],Integer(3),Integer(1))
>>> K.classical_decomposition()
The crystal of tableaux of type ['D', 4] and shape(s) [[1/2, 1/2, 1/2, -1/2]]

Type E6(1)

In [JonesEtAl2010] the KR crystals Br,s for r=1,2,6 in type E6(1) were constructed exploiting again a Dynkin diagram automorphism, namely the automorphism σ of order 3 which maps 0160:

sage: C = CartanType(['E',6,1]); C.dynkin_diagram()
        O 0
        |
        |
        O 2
        |
        |
O---O---O---O---O
1   3   4   5   6
E6~
>>> from sage.all import *
>>> C = CartanType(['E',Integer(6),Integer(1)]); C.dynkin_diagram()
        O 0
        |
        |
        O 2
        |
        |
O---O---O---O---O
1   3   4   5   6
E6~

The crystals B1,s and B6,s are irreducible as classical crystals:

sage: K = crystals.KirillovReshetikhin(['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 = crystals.KirillovReshetikhin(['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],)
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['E',Integer(6),Integer(1)],Integer(1),Integer(1))
>>> K.classical_decomposition()
Direct sum of the crystals Family (Finite dimensional highest weight crystal of type ['E', 6] and highest weight Lambda[1],)
>>> K = crystals.KirillovReshetikhin(['E',Integer(6),Integer(1)],Integer(6),Integer(1))
>>> 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 r=2 we have the decomposition

B2,sk=0sB(kω2)
sage: K = crystals.KirillovReshetikhin(['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])
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['E',Integer(6),Integer(1)],Integer(2),Integer(1))
>>> 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 = crystals.KirillovReshetikhin(['E',6,1],1,1)
sage: promotion = K.promotion()
sage: u = K.module_generator(); u
[(1,)]
sage: promotion(u.lift())
[(-1, 6)]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['E',Integer(6),Integer(1)],Integer(1),Integer(1))
>>> promotion = K.promotion()
>>> u = K.module_generator(); u
[(1,)]
>>> promotion(u.lift())
[(-1, 6)]

The crystal B1,1 is already of dimension 27. The elements b of this crystal are labelled by tuples which specify their nonzero ϕi(b) and ϵi(b). For example, [6,2] indicates that ϕ2([6,2])=ϵ6([6,2])=1 and all others are equal to zero:

sage: K = crystals.KirillovReshetikhin(['E',6,1],1,1)
sage: K.cardinality()
27
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['E',Integer(6),Integer(1)],Integer(1),Integer(1))
>>> K.cardinality()
27
../_images/KR_E6.png

Single column KR crystals

A single column KR crystal is Br,1 for any rI0.

In [LNSSS14I] and [LNSSS14II], it was shown that single column KR crystals can be constructed by projecting level 0 crystals of LS paths onto the classical weight lattice. We first verify that we do get an isomorphic crystal for B1,1 in type E6(1):

sage: K = crystals.KirillovReshetikhin(['E',6,1], 1,1)
sage: K2 = crystals.kirillov_reshetikhin.LSPaths(['E',6,1], 1,1)
sage: K.digraph().is_isomorphic(K2.digraph(), edge_labels=True)
True
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['E',Integer(6),Integer(1)], Integer(1),Integer(1))
>>> K2 = crystals.kirillov_reshetikhin.LSPaths(['E',Integer(6),Integer(1)], Integer(1),Integer(1))
>>> K.digraph().is_isomorphic(K2.digraph(), edge_labels=True)
True

Here is an example in E8(1) and we calculate its classical decomposition:

sage: K = crystals.kirillov_reshetikhin.LSPaths(['E',8,1], 8,1)
sage: K.cardinality()
249
sage: L = [x for x in K if x.is_highest_weight([1,2,3,4,5,6,7,8])]
sage: [x.weight() for x in L]
[-2*Lambda[0] + Lambda[8], 0]
>>> from sage.all import *
>>> K = crystals.kirillov_reshetikhin.LSPaths(['E',Integer(8),Integer(1)], Integer(8),Integer(1))
>>> K.cardinality()
249
>>> L = [x for x in K if x.is_highest_weight([Integer(1),Integer(2),Integer(3),Integer(4),Integer(5),Integer(6),Integer(7),Integer(8)])]
>>> [x.weight() for x in L]
[-2*Lambda[0] + Lambda[8], 0]

Applications

An important notion for finite-dimensional affine crystals is perfectness. The crucial property is that a crystal B is perfect of level if there is a bijection between level dominant weights and elements in

Bmin={bBlev(φ(b))=}.

For a precise definition of perfect crystals see [HongKang2002] . In [FourierEtAl2010] it was proven that for the nonexceptional types Br,s is perfect as long as s/cr is an integer. Here cr=1 except cr=2 for 1r<n in type Cn(1) and r=n in type Bn(1).

Here we verify this using Sage for B1,1 of type C3(1):

sage: K = crystals.KirillovReshetikhin(['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]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['C',Integer(3),Integer(1)],Integer(1),Integer(1))
>>> Lambda = K.weight_lattice_realization().fundamental_weights(); Lambda
Finite family {0: Lambda[0], 1: Lambda[1], 2: Lambda[2], 3: Lambda[3]}
>>> [w.level() for w in Lambda]
[1, 1, 1, 1]
>>> Bmin = [b for b in K if b.Phi().level() == Integer(1) ]; Bmin
[[[1]], [[2]], [[3]], [[-3]], [[-2]], [[-1]]]
>>> [b.Phi() for b in Bmin]
[Lambda[1], Lambda[2], Lambda[3], Lambda[2], Lambda[1], Lambda[0]]

As you can see, both b=1 and b=2 satisfy φ(b)=Λ1. Hence there is no bijection between the minimal elements in Bmin and level 1 weights. Therefore, B1,1 of type C3(1) is not perfect. However, B1,2 of type Cn(1) is a perfect crystal:

sage: K = crystals.KirillovReshetikhin(['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]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['C',Integer(3),Integer(1)],Integer(1),Integer(2))
>>> Lambda = K.weight_lattice_realization().fundamental_weights()
>>> Bmin = [b for b in K if b.Phi().level() == Integer(1) ]
>>> [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]. We construct Example 10.6.5 in [HongKang2002]:

sage: K = crystals.KirillovReshetikhin(['A',1,1], 1,1)
sage: La = RootSystem(['A',1,1]).weight_lattice().fundamental_weights()
sage: B = crystals.KyotoPathModel(K, La[0])
sage: B.highest_weight_vector()
[[[2]]]

sage: K = crystals.KirillovReshetikhin(['A',2,1], 1,1)
sage: La = RootSystem(['A',2,1]).weight_lattice().fundamental_weights()
sage: B = crystals.KyotoPathModel(K, La[0])
sage: B.highest_weight_vector()
[[[3]]]

sage: K = crystals.KirillovReshetikhin(['C',2,1], 2,1)
sage: La = RootSystem(['C',2,1]).weight_lattice().fundamental_weights()
sage: B = crystals.KyotoPathModel(K, La[1])
sage: B.highest_weight_vector()
[[[2], [-2]]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['A',Integer(1),Integer(1)], Integer(1),Integer(1))
>>> La = RootSystem(['A',Integer(1),Integer(1)]).weight_lattice().fundamental_weights()
>>> B = crystals.KyotoPathModel(K, La[Integer(0)])
>>> B.highest_weight_vector()
[[[2]]]

>>> K = crystals.KirillovReshetikhin(['A',Integer(2),Integer(1)], Integer(1),Integer(1))
>>> La = RootSystem(['A',Integer(2),Integer(1)]).weight_lattice().fundamental_weights()
>>> B = crystals.KyotoPathModel(K, La[Integer(0)])
>>> B.highest_weight_vector()
[[[3]]]

>>> K = crystals.KirillovReshetikhin(['C',Integer(2),Integer(1)], Integer(2),Integer(1))
>>> La = RootSystem(['C',Integer(2),Integer(1)]).weight_lattice().fundamental_weights()
>>> B = crystals.KyotoPathModel(K, La[Integer(1)])
>>> B.highest_weight_vector()
[[[2], [-2]]]

Energy function and one-dimensional configuration sum

For tensor products of Kirillov-Reshehtikhin crystals, there also exists the important notion of the energy function. It can be defined as the sum of certain local energy functions and the R-matrix. In Theorem 7.5 in [SchillingTingley2011] it was shown that for perfect crystals of the same level the energy D(b) is the same as the affine grading (up to a normalization). The affine grading is defined as the minimal number of applications of e0 to b to reach a ground state path. Computationally, this algorithm is a lot more efficient than the computation involving the R-matrix and has been implemented in Sage:

sage: K = crystals.KirillovReshetikhin(['A',2,1],1,1)
sage: T = crystals.TensorProduct(K,K,K)
sage: hw = [b for b in T if all(b.epsilon(i)==0 for i in [1,2])]
sage: for b in hw:
....:     print("{} {}".format(b, b.energy_function()))
[[[1]], [[1]], [[1]]] 0
[[[1]], [[2]], [[1]]] 2
[[[2]], [[1]], [[1]]] 1
[[[3]], [[2]], [[1]]] 3
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['A',Integer(2),Integer(1)],Integer(1),Integer(1))
>>> T = crystals.TensorProduct(K,K,K)
>>> hw = [b for b in T if all(b.epsilon(i)==Integer(0) for i in [Integer(1),Integer(2)])]
>>> for b in hw:
...     print("{} {}".format(b, b.energy_function()))
[[[1]], [[1]], [[1]]] 0
[[[1]], [[2]], [[1]]] 2
[[[2]], [[1]], [[1]]] 1
[[[3]], [[2]], [[1]]] 3

The affine grading can be computed even for nonperfect crystals:

sage: K = crystals.KirillovReshetikhin(['C',4,1],1,2)
sage: K1 = crystals.KirillovReshetikhin(['C',4,1],1,1)
sage: T = crystals.TensorProduct(K,K1)
sage: hw = [b for b in T if all(b.epsilon(i)==0 for i in [1,2,3,4])]
sage: for b in hw:
....:     print("{} {}".format(b, b.affine_grading()))
[[], [[1]]] 1
[[[1, 1]], [[1]]] 2
[[[1, 2]], [[1]]] 1
[[[1, -1]], [[1]]] 0
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['C',Integer(4),Integer(1)],Integer(1),Integer(2))
>>> K1 = crystals.KirillovReshetikhin(['C',Integer(4),Integer(1)],Integer(1),Integer(1))
>>> T = crystals.TensorProduct(K,K1)
>>> hw = [b for b in T if all(b.epsilon(i)==Integer(0) for i in [Integer(1),Integer(2),Integer(3),Integer(4)])]
>>> for b in hw:
...     print("{} {}".format(b, b.affine_grading()))
[[], [[1]]] 1
[[[1, 1]], [[1]]] 2
[[[1, 2]], [[1]]] 1
[[[1, -1]], [[1]]] 0

The one-dimensional configuration sum of a crystal B is the graded sum by energy of the weight of all elements bB:

X(B)=bBxweight(b)qD(b)

Here is an example of how you can compute the one-dimensional configuration sum in Sage:

sage: K = crystals.KirillovReshetikhin(['A',2,1],1,1)
sage: T = crystals.TensorProduct(K,K)
sage: T.one_dimensional_configuration_sum()
B[-2*Lambda[1] + 2*Lambda[2]] + (q+1)*B[-Lambda[1]]
 + (q+1)*B[Lambda[1] - Lambda[2]] + B[2*Lambda[1]]
 + B[-2*Lambda[2]] + (q+1)*B[Lambda[2]]
>>> from sage.all import *
>>> K = crystals.KirillovReshetikhin(['A',Integer(2),Integer(1)],Integer(1),Integer(1))
>>> T = crystals.TensorProduct(K,K)
>>> T.one_dimensional_configuration_sum()
B[-2*Lambda[1] + 2*Lambda[2]] + (q+1)*B[-Lambda[1]]
 + (q+1)*B[Lambda[1] - Lambda[2]] + B[2*Lambda[1]]
 + B[-2*Lambda[2]] + (q+1)*B[Lambda[2]]