A generic class for classical crystals of letters.
All classical crystals of letters should be instances of this class or of subclasses. To define a new crystal of letters, one only needs to implement a class for the elements (which subclasses Letter and CrystalElement), with appropriate e and f operations. If the module generator is not 1, one also needs to define the subclass ClassicalCrystalOfLetters for the crystal itself.
The basic assumption is that crystals of letters are small, but used intensively as building blocks. Therefore, we explicitly build in memory the list of all elements, the crystal graph and its transitive closure, so as to make the following operations constant time: list, cmp, (todo: phi, epsilon, e, f with caching)
Coerces value into self.
EXAMPLES:
sage: C = CrystalOfLetters(['A',5])
sage: c = C(1); c
1
sage: c.parent()
The crystal of letters for type ['A', 5]
sage: c is C(c)
True
EXAMPLES:
sage: C = CrystalOfLetters(['A',5])
sage: 1 in C
False
sage: C(1) in C
True
EXAMPLES:
sage: C = CrystalOfLetters(['A',5])
sage: C == loads(dumps(C))
True
Returns the directed graph associated to self.
EXAMPLES:
sage: CrystalOfLetters(['A',5]).digraph()
Digraph on 6 vertices
Returns a list of the elements of self.
EXAMPLES:
sage: C = CrystalOfLetters(['A',5])
sage: C.list()
[1, 2, 3, 4, 5, 6]
Returns True if and only if there is a path from x to y in the crystal graph, when x is not equal to y.
Because the crystal graph is classical, it is a directed acyclic graph which can be interpreted as a poset. This function implements the comparison function of this poset.
EXAMPLES:
sage: C = CrystalOfLetters(['A', 5])
sage: x = C(1)
sage: y = C(2)
sage: C.lt_elements(x,y)
True
sage: C.lt_elements(y,x)
False
sage: C.lt_elements(x,x)
False
sage: C = CrystalOfLetters(['D', 4])
sage: C.lt_elements(C(4),C(-4))
False
sage: C.lt_elements(C(-4),C(4))
False
Returns the crystal of letters of the given type.
For classical types, this is a combinatorial model for the crystal with highest weight Lambda_1 (the first fundamental weight).
Any irreducible classical crystal appears as the irreducible component of the tensor product of several copies of this crystal (plus possibly one copy of the spin crystal, see CrystalOfSpins). See M. Kashiwara, T. Nakashima, Crystal graphs for representations of the `q`-analogue of classical Lie algebras, J. Algebra 165 (1994), no. 2, 295-345. Elements of this irreducible component have a fixed shape, and can be fit inside a tableau shape. Otherwise said, any irreducible classical crystal is isomorphic to a crystal of tableaux with cells filled by elements of the crystal of letters (possibly tensored with the crystal of spins).
INPUT:
EXAMPLES:
sage: C = CrystalOfLetters(['A',5])
sage: C.list()
[1, 2, 3, 4, 5, 6]
sage: C.cartan_type()
['A', 5]
For type E6, one can also specify how elements are printed. This option is usually set to None and the default representation is used. If one chooses the option ‘compact’, the elements are printed in the more compact convention with 27 letters +abcdefghijklmnopqrstuvwxyz and the 27 letters -ABCDEFGHIJKLMNOPQRSTUVWXYZ for the dual crystal.
EXAMPLES:
sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact')
sage: C.list()
[+, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z]
sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact', dual = True)
sage: C.list()
[-, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]
Type A crystal of letters elements
TESTS:
sage: C = CrystalOfLetters (['A',3])
sage: C.list()
[1, 2, 3, 4]
sage: [ [x < y for y in C] for x in C ]
[[False, True, True, True],
[False, False, True, True],
[False, False, False, True],
[False, False, False, False]]
sage: C = CrystalOfLetters(['A',5])
sage: C(1) < C(1), C(1) < C(2), C(1) < C(3), C(2) < C(1)
(False, True, True, False)
sage: C.check()
True
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['A',4])
sage: [[c,i,c.e(i)] for i in C.index_set() for c in C if c.e(i) is not None]
[[2, 1, 1], [3, 2, 2], [4, 3, 3], [5, 4, 4]]
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['A',4])
sage: [[c,i,c.f(i)] for i in C.index_set() for c in C if c.f(i) is not None]
[[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5]]
Returns the weight of self.
EXAMPLES:
sage: [v.weight() for v in CrystalOfLetters(['A',3])]
[(1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1)]
Type B crystal of letters elements
TESTS:
sage: C = CrystalOfLetters (['B',3])
sage: C.check()
True
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['B',4])
sage: [[c,i,c.e(i)] for i in C.index_set() for c in C if c.e(i) is not None]
[[2, 1, 1],
[-1, 1, -2],
[3, 2, 2],
[-2, 2, -3],
[4, 3, 3],
[-3, 3, -4],
[0, 4, 4],
[-4, 4, 0]]
Returns the actions of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['B',4])
sage: [[c,i,c.f(i)] for i in C.index_set() for c in C if c.f(i) is not None]
[[1, 1, 2],
[-2, 1, -1],
[2, 2, 3],
[-3, 2, -2],
[3, 3, 4],
[-4, 3, -3],
[4, 4, 0],
[0, 4, -4]]
Returns the weight of self.
EXAMPLES:
sage: [v.weight() for v in CrystalOfLetters(['B',3])]
[(1, 0, 0),
(0, 1, 0),
(0, 0, 1),
(0, 0, 0),
(0, 0, -1),
(0, -1, 0),
(-1, 0, 0)]
Type C crystal of letters elements
TESTS:
sage: C = CrystalOfLetters (['C',3])
sage: C.list()
[1, 2, 3, -3, -2, -1]
sage: [ [x < y for y in C] for x in C ]
[[False, True, True, True, True, True],
[False, False, True, True, True, True],
[False, False, False, True, True, True],
[False, False, False, False, True, True],
[False, False, False, False, False, True],
[False, False, False, False, False, False]]
sage: C.check()
True
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['C',4])
sage: [[c,i,c.e(i)] for i in C.index_set() for c in C if c.e(i) is not None]
[[2, 1, 1],
[-1, 1, -2],
[3, 2, 2],
[-2, 2, -3],
[4, 3, 3],
[-3, 3, -4],
[-4, 4, 4]]
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['C',4])
sage: [[c,i,c.f(i)] for i in C.index_set() for c in C if c.f(i) is not None]
[[1, 1, 2],
[-2, 1, -1],
[2, 2, 3],
[-3, 2, -2],
[3, 3, 4],
[-4, 3, -3],
[4, 4, -4]]
Returns the weight of self.
EXAMPLES:
sage: [v.weight() for v in CrystalOfLetters(['C',3])]
[(1, 0, 0), (0, 1, 0), (0, 0, 1), (0, 0, -1), (0, -1, 0), (-1, 0, 0)]
Type D crystal of letters elements
TESTS:
sage: C = CrystalOfLetters(['D',4])
sage: C.list()
[1, 2, 3, 4, -4, -3, -2, -1]
sage: C.check()
True
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['D',5])
sage: [[c,i,c.e(i)] for i in C.index_set() for c in C if c.e(i) is not None]
[[2, 1, 1],
[-1, 1, -2],
[3, 2, 2],
[-2, 2, -3],
[4, 3, 3],
[-3, 3, -4],
[5, 4, 4],
[-4, 4, -5],
[-5, 5, 4],
[-4, 5, 5]]
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['D',5])
sage: [[c,i,c.f(i)] for i in C.index_set() for c in C if c.f(i) is not None]
[[1, 1, 2],
[-2, 1, -1],
[2, 2, 3],
[-3, 2, -2],
[3, 3, 4],
[-4, 3, -3],
[4, 4, 5],
[-5, 4, -4],
[4, 5, -5],
[5, 5, -4]]
Returns the weight of self.
EXAMPLES:
sage: [v.weight() for v in CrystalOfLetters(['D',4])]
[(1, 0, 0, 0),
(0, 1, 0, 0),
(0, 0, 1, 0),
(0, 0, 0, 1),
(0, 0, 0, -1),
(0, 0, -1, 0),
(0, -1, 0, 0),
(-1, 0, 0, 0)]
Type crystal of letters elements. This crystal corresponds to the highest weight
crystal
.
TESTS:
sage: C = CrystalOfLetters(['E',6])
sage: C.module_generators
[[1]]
sage: C.list()
[[1], [-1, 3], [-3, 4], [-4, 2, 5], [-2, 5], [-5, 2, 6], [-2, -5, 4, 6],
[-4, 3, 6], [-3, 1, 6], [-1, 6], [-6, 2], [-2, -6, 4], [-4, -6, 3, 5],
[-3, -6, 1, 5], [-1, -6, 5], [-5, 3], [-3, -5, 1, 4], [-1, -5, 4], [-4, 1, 2],
[-1, -4, 2, 3], [-3, 2], [-2, -3, 4], [-4, 5], [-5, 6], [-6], [-2, 1], [-1, -2, 3]]
sage: C.check()
True
sage: all(b.f(i).e(i) == b for i in C.index_set() for b in C if b.f(i) is not None)
True
sage: all(b.e(i).f(i) == b for i in C.index_set() for b in C if b.e(i) is not None)
True
sage: G = C.digraph()
sage: G.show(edge_labels=true, figsize=12, vertex_size=1)
In their full representation, the vertices of this crystal are labeled by their weight. For example vertex [-5,2,6] indicates that a 5-arrow is coming into this vertex, and a 2-arrow and 6-arrow is leaving the vertex. Specifying element_print_style = ‘compact’ for a given crystal C, labels the vertices of this crystal by the 27 letters +abcdefghijklmnopqrstuvwxyz.
EXAMPLES:
sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact')
sage: C.list()
[+, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z]
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['E',6])
sage: C([-1,3]).e(1)
[1]
sage: C([-2,-3,4]).e(2)
[-3, 2]
sage: C([1]).e(1)
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['E',6])
sage: C([1]).f(1)
[-1, 3]
sage: C([-6]).f(1)
Returns the weight of self.
EXAMPLES:
sage: [v.weight() for v in CrystalOfLetters(['E',6])]
[(0, 0, 0, 0, 0, -2/3, -2/3, 2/3),
(-1/2, 1/2, 1/2, 1/2, 1/2, -1/6, -1/6, 1/6),
(1/2, -1/2, 1/2, 1/2, 1/2, -1/6, -1/6, 1/6),
(1/2, 1/2, -1/2, 1/2, 1/2, -1/6, -1/6, 1/6),
(-1/2, -1/2, -1/2, 1/2, 1/2, -1/6, -1/6, 1/6),
(1/2, 1/2, 1/2, -1/2, 1/2, -1/6, -1/6, 1/6),
(-1/2, -1/2, 1/2, -1/2, 1/2, -1/6, -1/6, 1/6),
(-1/2, 1/2, -1/2, -1/2, 1/2, -1/6, -1/6, 1/6),
(1/2, -1/2, -1/2, -1/2, 1/2, -1/6, -1/6, 1/6),
(0, 0, 0, 0, 1, 1/3, 1/3, -1/3),
(1/2, 1/2, 1/2, 1/2, -1/2, -1/6, -1/6, 1/6),
(-1/2, -1/2, 1/2, 1/2, -1/2, -1/6, -1/6, 1/6),
(-1/2, 1/2, -1/2, 1/2, -1/2, -1/6, -1/6, 1/6),
(1/2, -1/2, -1/2, 1/2, -1/2, -1/6, -1/6, 1/6),
(0, 0, 0, 1, 0, 1/3, 1/3, -1/3),
(-1/2, 1/2, 1/2, -1/2, -1/2, -1/6, -1/6, 1/6),
(1/2, -1/2, 1/2, -1/2, -1/2, -1/6, -1/6, 1/6),
(0, 0, 1, 0, 0, 1/3, 1/3, -1/3),
(1/2, 1/2, -1/2, -1/2, -1/2, -1/6, -1/6, 1/6),
(0, 1, 0, 0, 0, 1/3, 1/3, -1/3),
(1, 0, 0, 0, 0, 1/3, 1/3, -1/3),
(0, -1, 0, 0, 0, 1/3, 1/3, -1/3),
(0, 0, -1, 0, 0, 1/3, 1/3, -1/3),
(0, 0, 0, -1, 0, 1/3, 1/3, -1/3),
(0, 0, 0, 0, -1, 1/3, 1/3, -1/3),
(-1/2, -1/2, -1/2, -1/2, -1/2, -1/6, -1/6, 1/6),
(-1, 0, 0, 0, 0, 1/3, 1/3, -1/3)]
Type crystal of letters elements. This crystal corresponds to the highest weight
crystal
. This crystal is dual to
of type
.
TESTS:
sage: C = CrystalOfLetters(['E',6], dual = True)
sage: C.module_generators
[[6]]
sage: all(b==b.retract(b.lift()) for b in C)
True
sage: C.list()
[[6], [5, -6], [4, -5], [2, 3, -4], [3, -2], [1, 2, -3], [2, -1], [1, 4, -2, -3],
[4, -1, -2], [1, 5, -4], [3, 5, -1, -4], [5, -3], [1, 6, -5], [3, 6, -1, -5], [4, 6, -3, -5],
[2, 6, -4], [6, -2], [1, -6], [3, -1, -6], [4, -3, -6], [2, 5, -4, -6], [5, -2, -6], [2, -5],
[4, -2, -5], [3, -4], [1, -3], [-1]]
sage: C.check()
True
sage: all(b.f(i).e(i) == b for i in C.index_set() for b in C if b.f(i) is not None)
True
sage: all(b.e(i).f(i) == b for i in C.index_set() for b in C if b.e(i) is not None)
True
sage: G = C.digraph()
sage: G.show(edge_labels=true, figsize=12, vertex_size=1)
In their full representation, the vertices of this crystal are labeled by their weight. For example vertex [-2,1] indicates that a 2-arrow is coming into this vertex, and a 1-arrow is leaving the vertex. Specifying the option element_print_style = ‘compact’ for a given crystal C, labels the vertices of this crystal by the 27 letters -ABCDEFGHIJKLMNOPQRSTUVWXYZ
EXAMPLES:
sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact', dual = True)
sage: C.list()
[-, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['E',6], dual = True)
sage: C([-1]).e(1)
[1, -3]
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['E',6], dual = True)
sage: C([6]).f(6)
[5, -6]
sage: C([6]).f(1)
Lifts an element of self to the crystal of letters CrystalOfLetters([‘E’,6]) by taking its inverse weight.
EXAMPLES:
sage: C = CrystalOfLetters(['E',6], dual = True)
sage: b=C.module_generators[0]
sage: b.lift()
[-6]
Retracts element p, which is an element in CrystalOfLetters([‘E’,6]) to an element in CrystalOfLetters([‘E’,6], dual = True) by taking its inverse weight.
EXAMPLES:
sage: C = CrystalOfLetters(['E',6])
sage: Cd = CrystalOfLetters(['E',6], dual = True)
sage: b = Cd.module_generators[0]
sage: p = C([-1,3])
sage: b.retract(p)
[1, -3]
sage: b.retract(None)
Returns the weight of self.
EXAMPLES:
sage: C = CrystalOfLetters(['E',6], dual = True)
sage: b=C.module_generators[0]
sage: b.weight()
(0, 0, 0, 0, 1, -1/3, -1/3, 1/3)
sage: [v.weight() for v in C]
[(0, 0, 0, 0, 1, -1/3, -1/3, 1/3),
(0, 0, 0, 1, 0, -1/3, -1/3, 1/3),
(0, 0, 1, 0, 0, -1/3, -1/3, 1/3),
(0, 1, 0, 0, 0, -1/3, -1/3, 1/3),
(-1, 0, 0, 0, 0, -1/3, -1/3, 1/3),
(1, 0, 0, 0, 0, -1/3, -1/3, 1/3),
(1/2, 1/2, 1/2, 1/2, 1/2, 1/6, 1/6, -1/6),
(0, -1, 0, 0, 0, -1/3, -1/3, 1/3),
(-1/2, -1/2, 1/2, 1/2, 1/2, 1/6, 1/6, -1/6),
(0, 0, -1, 0, 0, -1/3, -1/3, 1/3),
(-1/2, 1/2, -1/2, 1/2, 1/2, 1/6, 1/6, -1/6),
(1/2, -1/2, -1/2, 1/2, 1/2, 1/6, 1/6, -1/6),
(0, 0, 0, -1, 0, -1/3, -1/3, 1/3),
(-1/2, 1/2, 1/2, -1/2, 1/2, 1/6, 1/6, -1/6),
(1/2, -1/2, 1/2, -1/2, 1/2, 1/6, 1/6, -1/6),
(1/2, 1/2, -1/2, -1/2, 1/2, 1/6, 1/6, -1/6),
(-1/2, -1/2, -1/2, -1/2, 1/2, 1/6, 1/6, -1/6),
(0, 0, 0, 0, -1, -1/3, -1/3, 1/3),
(-1/2, 1/2, 1/2, 1/2, -1/2, 1/6, 1/6, -1/6),
(1/2, -1/2, 1/2, 1/2, -1/2, 1/6, 1/6, -1/6),
(1/2, 1/2, -1/2, 1/2, -1/2, 1/6, 1/6, -1/6),
(-1/2, -1/2, -1/2, 1/2, -1/2, 1/6, 1/6, -1/6),
(1/2, 1/2, 1/2, -1/2, -1/2, 1/6, 1/6, -1/6),
(-1/2, -1/2, 1/2, -1/2, -1/2, 1/6, 1/6, -1/6),
(-1/2, 1/2, -1/2, -1/2, -1/2, 1/6, 1/6, -1/6),
(1/2, -1/2, -1/2, -1/2, -1/2, 1/6, 1/6, -1/6),
(0, 0, 0, 0, 0, 2/3, 2/3, -2/3)]
Type G2 crystal of letters elements
TESTS:
sage: C = CrystalOfLetters(['G',2])
sage: C.list()
[1, 2, 3, 0, -3, -2, -1]
sage: C.check()
True
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['G',2])
sage: [[c,i,c.e(i)] for i in C.index_set() for c in C if c.e(i) is not None]
[[2, 1, 1],
[0, 1, 3],
[-3, 1, 0],
[-1, 1, -2],
[3, 2, 2],
[-2, 2, -3]]
Returns the action of on self.
EXAMPLES:
sage: C = CrystalOfLetters(['G',2])
sage: [[c,i,c.f(i)] for i in C.index_set() for c in C if c.f(i) is not None]
[[1, 1, 2],
[3, 1, 0],
[0, 1, -3],
[-2, 1, -1],
[2, 2, 3],
[-3, 2, -2]]
Returns the weight of self.
EXAMPLES:
sage: [v.weight() for v in CrystalOfLetters(['G',2])]
[(1, 0, -1), (1, -1, 0), (0, 1, -1), (0, 0, 0), (0, -1, 1), (-1, 1, 0), (-1, 0, 1)]
A class for letters
EXAMPLES:
sage: from sage.combinat.crystals.letters import Letter
sage: parent1 = 1 # Any fake value ...
sage: parent2 = 2 # Any fake value ...
sage: l11 = Letter(parent1, 1)
sage: l12 = Letter(parent1, 2)
sage: l21 = Letter(parent2, 1)
sage: l22 = Letter(parent2, 2)
sage: l11 == l11
True
sage: l11 == l12
False
sage: l11 == l21
False
EXAMPLES:
sage: C = CrystalOfLetters(['D', 4])
sage: C(-4) >= C(4)
False
sage: C(4) >= C(-3)
False
sage: C(4) >= C(4)
True
EXAMPLES:
sage: C = CrystalOfLetters(['D', 4])
sage: C(-4) > C(4)
False
sage: C(4) > C(-3)
False
sage: C(4) < C(4)
False
sage: C(-1) > C(1)
True
EXAMPLES:
sage: from sage.combinat.crystals.letters import Letter
sage: a = Letter(ZZ, 1)
sage: a == loads(dumps(a))
True
EXAMPLES:
sage: C = CrystalOfLetters(['D', 4])
sage: C(-4) <= C(4)
False
sage: C(4) <= C(-3)
True
sage: C(4) <= C(4)
True
EXAMPLES:
sage: C = CrystalOfLetters(['D', 4])
sage: C(-4) < C(4)
False
sage: C(4) < C(-3)
True
sage: C(4) < C(4)
False
EXAMPLES:
sage: C = CrystalOfLetters(['B', 3])
sage: C(0) <> C(0)
False
sage: C(1) <> C(-1)
True
EXAMPLES:
sage: from sage.combinat.crystals.letters import Letter
sage: Letter(ZZ, 1).__repr__()
'1'
Returns the parent of self.
EXAMPLES:
sage: from sage.combinat.crystals.letters import Letter
sage: Letter(ZZ, 1).parent()
Integer Ring