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
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
Type ¶
The Dynkin diagram for affine type
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
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
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
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

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 , , ¶
The Dynkin diagrams for types
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
where
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
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
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
The KR crystals



Type ¶
The Dynkin diagram of type
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
However, in this case the crystal
where
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
where
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

Types , ¶
The Dynkin diagrams of types
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
where
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
where
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


As you can see from the Dynkin diagram for type
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
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

Exceptional nodes¶
The KR crystals
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]]


The KR crystals
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 ¶
In [JonesEtAl2010] the KR crystals
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
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
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
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
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

Single column KR crystals¶
A single column KR crystal is
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
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
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
For a precise definition of perfect crystals see [HongKang2002] .
In [FourierEtAl2010] it was proven that for the nonexceptional types
Here we verify this using Sage for
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
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
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
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]]