Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/combinat/crystals/letters.py
4072 views
1
r"""
2
Crystals of letters
3
"""
4
5
#*****************************************************************************
6
# Copyright (C) 2007 Anne Schilling <anne at math.ucdavis.edu>
7
# Nicolas M. Thiery <nthiery at users.sf.net>
8
# Daniel Bump <bump at match.stanford.edu>
9
# Brant Jones <brant at math.ucdavis.edu>
10
#
11
# Distributed under the terms of the GNU General Public License (GPL)
12
#
13
# This code is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
# General Public License for more details.
17
#
18
# The full text of the GPL is available at:
19
#
20
# http://www.gnu.org/licenses/
21
#****************************************************************************
22
23
from sage.structure.unique_representation import UniqueRepresentation
24
from sage.structure.element import parent
25
from sage.structure.parent import Parent
26
from sage.structure.element_wrapper import ElementWrapper
27
from sage.categories.enumerated_sets import EnumeratedSets
28
from sage.categories.classical_crystals import ClassicalCrystals
29
from sage.combinat.root_system.cartan_type import CartanType
30
31
32
def CrystalOfLetters(cartan_type, element_print_style = None, dual = None):
33
r"""
34
Returns the crystal of letters of the given type.
35
36
For classical types, this is a combinatorial model for the crystal
37
with highest weight Lambda_1 (the first fundamental weight).
38
39
Any irreducible classical crystal appears as the irreducible
40
component of the tensor product of several copies of this crystal
41
(plus possibly one copy of the spin crystal, see CrystalOfSpins).
42
See M. Kashiwara, T. Nakashima,
43
*Crystal graphs for representations of the `q`-analogue of classical Lie algebras*,
44
J. Algebra **165** (1994), no. 2, 295-345. Elements of this
45
irreducible component have a fixed shape, and can be fit inside a
46
tableau shape. Otherwise said, any irreducible classical crystal is
47
isomorphic to a crystal of tableaux with cells filled by elements
48
of the crystal of letters (possibly tensored with the crystal of
49
spins).
50
51
INPUT:
52
53
54
- ``T`` - A CartanType
55
56
57
EXAMPLES::
58
59
sage: C = CrystalOfLetters(['A',5])
60
sage: C.list()
61
[1, 2, 3, 4, 5, 6]
62
sage: C.cartan_type()
63
['A', 5]
64
65
For type E6, one can also specify how elements are printed.
66
This option is usually set to None and the default representation is used.
67
If one chooses the option 'compact', the elements are printed in the more
68
compact convention with 27 letters +abcdefghijklmnopqrstuvwxyz and
69
the 27 letters -ABCDEFGHIJKLMNOPQRSTUVWXYZ for the dual crystal.
70
71
EXAMPLES::
72
73
sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact')
74
sage: C
75
The crystal of letters for type ['E', 6]
76
sage: C.list()
77
[+, 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]
78
sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact', dual = True)
79
sage: C
80
The crystal of letters for type ['E', 6] (dual)
81
sage: C.list()
82
[-, 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]
83
"""
84
ct = CartanType(cartan_type)
85
if ct.letter == 'A':
86
return ClassicalCrystalOfLetters(ct,
87
Crystal_of_letters_type_A_element)
88
elif ct.letter == 'B':
89
return ClassicalCrystalOfLetters(ct,
90
Crystal_of_letters_type_B_element)
91
elif ct.letter == 'C':
92
return ClassicalCrystalOfLetters(ct,
93
Crystal_of_letters_type_C_element)
94
elif ct.letter == 'D':
95
return ClassicalCrystalOfLetters(ct,
96
Crystal_of_letters_type_D_element)
97
elif ct.letter == 'E' and ct[1] == 6:
98
if dual is None:
99
return ClassicalCrystalOfLetters(ct,
100
Crystal_of_letters_type_E6_element, element_print_style)
101
else:
102
return ClassicalCrystalOfLetters(ct,
103
Crystal_of_letters_type_E6_element_dual, element_print_style, dual = True)
104
elif ct.letter == 'E' and ct[1] == 7:
105
return ClassicalCrystalOfLetters(ct,
106
Crystal_of_letters_type_E7_element)
107
elif ct.letter == 'G':
108
return ClassicalCrystalOfLetters(ct,
109
Crystal_of_letters_type_G_element)
110
else:
111
raise NotImplementedError
112
113
114
class ClassicalCrystalOfLetters(UniqueRepresentation, Parent):
115
r"""
116
A generic class for classical crystals of letters.
117
118
All classical crystals of letters should be instances of this class
119
or of subclasses. To define a new crystal of letters, one only
120
needs to implement a class for the elements (which subclasses
121
Letter), with appropriate e and f operations. If
122
the module generator is not 1, one also needs to define the
123
subclass ClassicalCrystalOfLetters for the crystal itself.
124
125
The basic assumption is that crystals of letters are small, but
126
used intensively as building blocks. Therefore, we explicitly build
127
in memory the list of all elements, the crystal graph and its
128
transitive closure, so as to make the following operations constant
129
time: list, cmp, (todo: phi, epsilon, e, f with caching)
130
"""
131
def __init__(self, cartan_type, element_class, element_print_style = None, dual = None):
132
"""
133
EXAMPLES::
134
135
sage: C = CrystalOfLetters(['A',5])
136
sage: C.category()
137
Category of classical crystals
138
sage: TestSuite(C).run()
139
"""
140
Parent.__init__(self, category = ClassicalCrystals())
141
self._cartan_type = CartanType(cartan_type)
142
self.rename("The crystal of letters for type %s"%cartan_type)
143
self.Element = element_class
144
if cartan_type == CartanType(['E',6]):
145
if dual:
146
self.module_generators = [self([6])]
147
self._ambient = CrystalOfLetters(CartanType(['E',6]))
148
self.rename("%s (dual)"%self)
149
else:
150
self.module_generators = [self([1])]
151
elif cartan_type == CartanType(['E',7]):
152
self.module_generators = [self([7])]
153
else:
154
self.module_generators = [self(1)]
155
self._list = super(ClassicalCrystalOfLetters, self).list()
156
self._element_print_style = element_print_style
157
self._digraph = super(ClassicalCrystalOfLetters, self).digraph()
158
self._digraph_closure = self.digraph().transitive_closure()
159
160
def __call__(self, value):
161
"""
162
Coerces value into self.
163
164
EXAMPLES::
165
166
sage: C = CrystalOfLetters(['A',5])
167
sage: c = C(1); c
168
1
169
sage: c.parent()
170
The crystal of letters for type ['A', 5]
171
sage: c is C(c)
172
True
173
"""
174
if value.__class__ == self.element_class and value.parent() == self:
175
return value
176
else: # Should do sanity checks!
177
return self.element_class(self, value)
178
179
def list(self):
180
"""
181
Returns a list of the elements of self.
182
183
EXAMPLES::
184
185
sage: C = CrystalOfLetters(['A',5])
186
sage: C.list()
187
[1, 2, 3, 4, 5, 6]
188
"""
189
return self._list
190
191
192
def digraph(self):
193
"""
194
Returns the directed graph associated to self.
195
196
EXAMPLES::
197
198
sage: CrystalOfLetters(['A',5]).digraph()
199
Digraph on 6 vertices
200
"""
201
return self._digraph
202
203
def __contains__(self, x):
204
"""
205
EXAMPLES::
206
207
sage: C = CrystalOfLetters(['A',5])
208
sage: 1 in C
209
False
210
sage: C(1) in C
211
True
212
"""
213
return x in self._list
214
215
def lt_elements(self, x, y):
216
r"""
217
Returns True if and only if there is a path from x to y in the
218
crystal graph, when x is not equal to y.
219
220
Because the crystal graph is classical, it is a directed acyclic
221
graph which can be interpreted as a poset. This function implements
222
the comparison function of this poset.
223
224
EXAMPLES::
225
226
sage: C = CrystalOfLetters(['A', 5])
227
sage: x = C(1)
228
sage: y = C(2)
229
sage: C.lt_elements(x,y)
230
True
231
sage: C.lt_elements(y,x)
232
False
233
sage: C.lt_elements(x,x)
234
False
235
sage: C = CrystalOfLetters(['D', 4])
236
sage: C.lt_elements(C(4),C(-4))
237
False
238
sage: C.lt_elements(C(-4),C(4))
239
False
240
"""
241
assert x.parent() == self and y.parent() == self
242
if self._digraph_closure.has_edge(x,y):
243
return True
244
return False
245
246
# temporary woraround while an_element is overriden by Parent
247
_an_element_ = EnumeratedSets.ParentMethods._an_element_
248
249
# Utility. Note: much of this class should be factored out at some point!
250
class Letter(ElementWrapper):
251
r"""
252
A class for letters
253
254
Like :class:`ElementWrapper`, plus delegates __lt__ (comparison)
255
to the parent.
256
257
EXAMPLES::
258
259
sage: from sage.combinat.crystals.letters import Letter
260
sage: a = Letter(ZZ, 1)
261
sage: Letter(ZZ, 1).parent()
262
Integer Ring
263
264
sage: Letter(ZZ, 1)._repr_()
265
'1'
266
267
sage: parent1 = ZZ # Any fake value ...
268
sage: parent2 = QQ # Any fake value ...
269
sage: l11 = Letter(parent1, 1)
270
sage: l12 = Letter(parent1, 2)
271
sage: l21 = Letter(parent2, 1)
272
sage: l22 = Letter(parent2, 2)
273
sage: l11 == l11
274
True
275
sage: l11 == l12
276
False
277
sage: l11 == l21
278
False
279
280
sage: C = CrystalOfLetters(['B', 3])
281
sage: C(0) <> C(0)
282
False
283
sage: C(1) <> C(-1)
284
True
285
"""
286
def __init__(self, parent, value):
287
"""
288
EXAMPLES::
289
290
sage: from sage.combinat.crystals.letters import Letter
291
sage: a = Letter(ZZ, 1)
292
sage: TestSuite(a).run(skip = "_test_category")
293
294
"""
295
# Will soon be unneeded once the order of the arguments in
296
# ElementWrapper will have been fixed.
297
ElementWrapper.__init__(self, value, parent)
298
299
def __lt__(self, other):
300
"""
301
EXAMPLES::
302
303
sage: C = CrystalOfLetters(['D', 4])
304
sage: C(-4) < C(4)
305
False
306
sage: C(4) < C(-3)
307
True
308
sage: C(4) < C(4)
309
False
310
sage: C(4) < 5
311
False
312
"""
313
if parent(self) is not parent(other):
314
return False
315
return self.parent().lt_elements(self, other)
316
317
def __gt__(self, other):
318
"""
319
EXAMPLES::
320
321
sage: C = CrystalOfLetters(['D', 4])
322
sage: C(-4) > C(4)
323
False
324
sage: C(4) > C(-3)
325
False
326
sage: C(4) < C(4)
327
False
328
sage: C(-1) > C(1)
329
True
330
"""
331
return other.__lt__(self)
332
333
def __le__(self, other):
334
"""
335
EXAMPLES::
336
337
sage: C = CrystalOfLetters(['D', 4])
338
sage: C(-4) <= C(4)
339
False
340
sage: C(4) <= C(-3)
341
True
342
sage: C(4) <= C(4)
343
True
344
"""
345
return self.__lt__(other) or self == other
346
347
def __ge__(self, other):
348
"""
349
EXAMPLES::
350
351
sage: C = CrystalOfLetters(['D', 4])
352
sage: C(-4) >= C(4)
353
False
354
sage: C(4) >= C(-3)
355
False
356
sage: C(4) >= C(4)
357
True
358
"""
359
return other.__le__(self)
360
361
# def __cmp__(self, other):
362
# """
363
# EXAMPLES::
364
#
365
# sage: C = CrystalOfLetters(['A', 5])
366
# sage: C(1) < C(2)
367
# True
368
# sage: C(2) < C(1)
369
# False
370
# sage: C(2) > C(1)
371
# True
372
# sage: C(1) <= C(1)
373
# True
374
# """
375
# if type(self) is not type(other):
376
# return cmp(type(self), type(other))
377
# if self.parent() != other.parent():
378
# return cmp(self.parent(), other.parent())
379
# return self.parent().cmp_elements(self, other)
380
381
#########################
382
# Type A
383
#########################
384
385
class Crystal_of_letters_type_A_element(Letter):
386
r"""
387
Type A crystal of letters elements
388
389
TESTS::
390
391
sage: C = CrystalOfLetters (['A',3])
392
sage: C.list()
393
[1, 2, 3, 4]
394
sage: [ [x < y for y in C] for x in C ]
395
[[False, True, True, True],
396
[False, False, True, True],
397
[False, False, False, True],
398
[False, False, False, False]]
399
400
::
401
402
sage: C = CrystalOfLetters(['A',5])
403
sage: C(1) < C(1), C(1) < C(2), C(1) < C(3), C(2) < C(1)
404
(False, True, True, False)
405
406
::
407
408
sage: TestSuite(C).run()
409
"""
410
411
def weight(self):
412
"""
413
Returns the weight of self.
414
415
EXAMPLES::
416
417
sage: [v.weight() for v in CrystalOfLetters(['A',3])]
418
[(1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1)]
419
"""
420
return self.parent().weight_lattice_realization().monomial(self.value-1)
421
422
def e(self, i):
423
r"""
424
Returns the action of `e_i` on self.
425
426
EXAMPLES::
427
428
sage: C = CrystalOfLetters(['A',4])
429
sage: [[c,i,c.e(i)] for i in C.index_set() for c in C if c.e(i) is not None]
430
[[2, 1, 1], [3, 2, 2], [4, 3, 3], [5, 4, 4]]
431
"""
432
assert i in self.index_set()
433
if self.value == i+1:
434
return self.parent()(self.value-1)
435
else:
436
return None
437
438
def f(self, i):
439
r"""
440
Returns the action of `f_i` on self.
441
442
EXAMPLES::
443
444
sage: C = CrystalOfLetters(['A',4])
445
sage: [[c,i,c.f(i)] for i in C.index_set() for c in C if c.f(i) is not None]
446
[[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5]]
447
"""
448
assert i in self.index_set()
449
if self.value == i:
450
return self.parent()(self.value+1)
451
else:
452
return None
453
454
#########################
455
# Type B
456
#########################
457
458
class Crystal_of_letters_type_B_element(Letter):
459
r"""
460
Type B crystal of letters elements
461
462
TESTS::
463
464
sage: C = CrystalOfLetters (['B',3])
465
sage: TestSuite(C).run()
466
"""
467
468
def weight(self):
469
"""
470
Returns the weight of self.
471
472
EXAMPLES::
473
474
sage: [v.weight() for v in CrystalOfLetters(['B',3])]
475
[(1, 0, 0),
476
(0, 1, 0),
477
(0, 0, 1),
478
(0, 0, 0),
479
(0, 0, -1),
480
(0, -1, 0),
481
(-1, 0, 0)]
482
"""
483
if self.value > 0:
484
return self.parent().weight_lattice_realization().monomial(self.value-1)
485
elif self.value < 0:
486
return -self.parent().weight_lattice_realization().monomial(-self.value-1)
487
else:
488
return self.parent().weight_lattice_realization()(0)
489
490
def e(self, i):
491
r"""
492
Returns the action of `e_i` on self.
493
494
EXAMPLES::
495
496
sage: C = CrystalOfLetters(['B',4])
497
sage: [[c,i,c.e(i)] for i in C.index_set() for c in C if c.e(i) is not None]
498
[[2, 1, 1],
499
[-1, 1, -2],
500
[3, 2, 2],
501
[-2, 2, -3],
502
[4, 3, 3],
503
[-3, 3, -4],
504
[0, 4, 4],
505
[-4, 4, 0]]
506
"""
507
assert i in self.index_set()
508
if self.value == i+1:
509
return self.parent()(i)
510
elif self.value == 0 and i == self.parent().cartan_type().n:
511
return self.parent()(self.parent().cartan_type().n)
512
elif self.value == -i:
513
if i == self.parent().cartan_type().n:
514
return self.parent()(0)
515
else:
516
return self.parent()(-i-1)
517
else:
518
return None
519
520
def f(self, i):
521
r"""
522
Returns the actions of `f_i` on self.
523
524
EXAMPLES::
525
526
sage: C = CrystalOfLetters(['B',4])
527
sage: [[c,i,c.f(i)] for i in C.index_set() for c in C if c.f(i) is not None]
528
[[1, 1, 2],
529
[-2, 1, -1],
530
[2, 2, 3],
531
[-3, 2, -2],
532
[3, 3, 4],
533
[-4, 3, -3],
534
[4, 4, 0],
535
[0, 4, -4]]
536
"""
537
assert i in self.index_set()
538
if self.value == i:
539
if i < self.parent().cartan_type().n:
540
return self.parent()(i+1)
541
else:
542
return self.parent()(0)
543
elif self.value == 0 and i == self.parent().cartan_type().n:
544
return self.parent()(-self.parent().cartan_type().n)
545
elif self.value == -i-1:
546
return(self.parent()(-i))
547
else:
548
return None
549
550
#########################
551
# Type C
552
#########################
553
554
class Crystal_of_letters_type_C_element(Letter):
555
r"""
556
Type C crystal of letters elements
557
558
TESTS::
559
560
sage: C = CrystalOfLetters (['C',3])
561
sage: C.list()
562
[1, 2, 3, -3, -2, -1]
563
sage: [ [x < y for y in C] for x in C ]
564
[[False, True, True, True, True, True],
565
[False, False, True, True, True, True],
566
[False, False, False, True, True, True],
567
[False, False, False, False, True, True],
568
[False, False, False, False, False, True],
569
[False, False, False, False, False, False]]
570
sage: TestSuite(C).run()
571
"""
572
573
def weight(self):
574
"""
575
Returns the weight of self.
576
577
EXAMPLES::
578
579
sage: [v.weight() for v in CrystalOfLetters(['C',3])]
580
[(1, 0, 0), (0, 1, 0), (0, 0, 1), (0, 0, -1), (0, -1, 0), (-1, 0, 0)]
581
"""
582
if self.value > 0:
583
return self.parent().weight_lattice_realization().monomial(self.value-1)
584
elif self.value < 0:
585
return -self.parent().weight_lattice_realization().monomial(-self.value-1)
586
else:
587
return self.parent().weight_lattice_realization()(0)
588
589
def e(self, i):
590
r"""
591
Returns the action of `e_i` on self.
592
593
EXAMPLES::
594
595
sage: C = CrystalOfLetters(['C',4])
596
sage: [[c,i,c.e(i)] for i in C.index_set() for c in C if c.e(i) is not None]
597
[[2, 1, 1],
598
[-1, 1, -2],
599
[3, 2, 2],
600
[-2, 2, -3],
601
[4, 3, 3],
602
[-3, 3, -4],
603
[-4, 4, 4]]
604
"""
605
assert i in self.index_set()
606
if self.value == -self.parent().cartan_type().n and self.value == -i:
607
return self.parent()(-self.value)
608
elif self.value == i+1 or self.value == -i:
609
return self.parent()(self.value-1)
610
else:
611
return None
612
613
def f(self, i):
614
r"""
615
Returns the action of `f_i` on self.
616
617
EXAMPLES::
618
619
sage: C = CrystalOfLetters(['C',4])
620
sage: [[c,i,c.f(i)] for i in C.index_set() for c in C if c.f(i) is not None]
621
[[1, 1, 2],
622
[-2, 1, -1],
623
[2, 2, 3],
624
[-3, 2, -2],
625
[3, 3, 4],
626
[-4, 3, -3],
627
[4, 4, -4]]
628
"""
629
assert i in self.index_set()
630
if self.value == self.parent().cartan_type().n and self.value == i:
631
return self.parent()(-self.value)
632
elif self.value == i or self.value == -i-1:
633
return self.parent()(self.value+1)
634
else:
635
return None
636
637
#########################
638
# Type D
639
#########################
640
641
class Crystal_of_letters_type_D_element(Letter):
642
r"""
643
Type D crystal of letters elements
644
645
TESTS::
646
647
sage: C = CrystalOfLetters(['D',4])
648
sage: C.list()
649
[1, 2, 3, 4, -4, -3, -2, -1]
650
sage: TestSuite(C).run()
651
"""
652
653
def weight(self):
654
"""
655
Returns the weight of self.
656
657
EXAMPLES::
658
659
sage: [v.weight() for v in CrystalOfLetters(['D',4])]
660
[(1, 0, 0, 0),
661
(0, 1, 0, 0),
662
(0, 0, 1, 0),
663
(0, 0, 0, 1),
664
(0, 0, 0, -1),
665
(0, 0, -1, 0),
666
(0, -1, 0, 0),
667
(-1, 0, 0, 0)]
668
"""
669
if self.value > 0:
670
return self.parent().weight_lattice_realization().monomial(self.value-1)
671
elif self.value < 0:
672
return -self.parent().weight_lattice_realization().monomial(-self.value-1)
673
else:
674
return self.parent().weight_lattice_realization()(0)
675
676
def e(self, i):
677
r"""
678
Returns the action of `e_i` on self.
679
680
EXAMPLES::
681
682
sage: C = CrystalOfLetters(['D',5])
683
sage: [[c,i,c.e(i)] for i in C.index_set() for c in C if c.e(i) is not None]
684
[[2, 1, 1],
685
[-1, 1, -2],
686
[3, 2, 2],
687
[-2, 2, -3],
688
[4, 3, 3],
689
[-3, 3, -4],
690
[5, 4, 4],
691
[-4, 4, -5],
692
[-5, 5, 4],
693
[-4, 5, 5]]
694
"""
695
assert i in self.index_set()
696
if i == self.parent().cartan_type().n:
697
if self.value == -i:
698
return self.parent()(i-1)
699
elif self.value == -(i-1):
700
return self.parent()(i)
701
else:
702
return None
703
elif self.value == i+1:
704
return self.parent()(i)
705
elif self.value == -i:
706
return self.parent()(-(i+1))
707
else:
708
return None
709
710
def f(self, i):
711
r"""
712
Returns the action of `f_i` on self.
713
714
EXAMPLES::
715
716
sage: C = CrystalOfLetters(['D',5])
717
sage: [[c,i,c.f(i)] for i in C.index_set() for c in C if c.f(i) is not None]
718
[[1, 1, 2],
719
[-2, 1, -1],
720
[2, 2, 3],
721
[-3, 2, -2],
722
[3, 3, 4],
723
[-4, 3, -3],
724
[4, 4, 5],
725
[-5, 4, -4],
726
[4, 5, -5],
727
[5, 5, -4]]
728
"""
729
assert i in self.index_set()
730
if i == self.value:
731
if i == self.parent().cartan_type().n:
732
return self.parent()(-(i-1))
733
else:
734
return self.parent()(i+1)
735
elif self.value == -(i+1):
736
return self.parent()(-i)
737
elif self.value == self.parent().cartan_type().n-1 and i == self.value+1:
738
return self.parent()(-i)
739
else:
740
return None
741
742
#########################
743
# Type G2
744
#########################
745
746
class Crystal_of_letters_type_G_element(Letter):
747
r"""
748
Type G2 crystal of letters elements
749
750
TESTS::
751
752
sage: C = CrystalOfLetters(['G',2])
753
sage: C.list()
754
[1, 2, 3, 0, -3, -2, -1]
755
sage: TestSuite(C).run()
756
"""
757
758
def weight(self):
759
"""
760
Returns the weight of self.
761
762
EXAMPLES::
763
764
sage: [v.weight() for v in CrystalOfLetters(['G',2])]
765
[(1, 0, -1), (1, -1, 0), (0, 1, -1), (0, 0, 0), (0, -1, 1), (-1, 1, 0), (-1, 0, 1)]
766
"""
767
if self.value == 1:
768
return self.parent().weight_lattice_realization()((1, 0, -1))
769
elif self.value == 2:
770
return self.parent().weight_lattice_realization()((1, -1, 0))
771
elif self.value == 3:
772
return self.parent().weight_lattice_realization()((0, 1, -1))
773
elif self.value == 0:
774
return self.parent().weight_lattice_realization()((0, 0, 0))
775
elif self.value == -3:
776
return self.parent().weight_lattice_realization()((0, -1, 1))
777
elif self.value == -2:
778
return self.parent().weight_lattice_realization()((-1, 1, 0))
779
elif self.value == -1:
780
return self.parent().weight_lattice_realization()((-1, 0, 1))
781
else:
782
raise RuntimeError, "G2 crystal of letters element %d not valid"%self.value
783
784
def e(self, i):
785
r"""
786
Returns the action of `e_i` on self.
787
788
EXAMPLES::
789
790
sage: C = CrystalOfLetters(['G',2])
791
sage: [[c,i,c.e(i)] for i in C.index_set() for c in C if c.e(i) is not None]
792
[[2, 1, 1],
793
[0, 1, 3],
794
[-3, 1, 0],
795
[-1, 1, -2],
796
[3, 2, 2],
797
[-2, 2, -3]]
798
"""
799
assert i in self.index_set()
800
if i == 1:
801
if self.value == 2:
802
return self.parent()(1)
803
elif self.value == 0:
804
return self.parent()(3)
805
elif self.value == -3:
806
return self.parent()(0)
807
elif self.value == -1:
808
return self.parent()(-2)
809
else:
810
return None
811
else:
812
if self.value == 3:
813
return self.parent()(2)
814
elif self.value == -2:
815
return self.parent()(-3)
816
else:
817
return None
818
819
def f(self, i):
820
r"""
821
Returns the action of `f_i` on self.
822
823
EXAMPLES::
824
825
sage: C = CrystalOfLetters(['G',2])
826
sage: [[c,i,c.f(i)] for i in C.index_set() for c in C if c.f(i) is not None]
827
[[1, 1, 2],
828
[3, 1, 0],
829
[0, 1, -3],
830
[-2, 1, -1],
831
[2, 2, 3],
832
[-3, 2, -2]]
833
"""
834
assert i in self.index_set()
835
if i == 1:
836
if self.value == 1:
837
return self.parent()(2)
838
elif self.value == 3:
839
return self.parent()(0)
840
elif self.value == 0:
841
return self.parent()(-3)
842
elif self.value == -2:
843
return self.parent()(-1)
844
else:
845
return None
846
else:
847
if self.value == 2:
848
return self.parent()(3)
849
elif self.value == -3:
850
return self.parent()(-2)
851
else:
852
return None
853
854
855
#########################
856
# Type E6
857
#########################
858
859
class Crystal_of_letters_type_E6_element(Letter):
860
r"""
861
Type `E_6` crystal of letters elements. This crystal corresponds to the highest weight
862
crystal `B(\Lambda_1)`.
863
864
TESTS::
865
866
sage: C = CrystalOfLetters(['E',6])
867
sage: C.module_generators
868
[[1]]
869
sage: C.list()
870
[[1], [-1, 3], [-3, 4], [-4, 2, 5], [-2, 5], [-5, 2, 6], [-2, -5, 4, 6],
871
[-4, 3, 6], [-3, 1, 6], [-1, 6], [-6, 2], [-2, -6, 4], [-4, -6, 3, 5],
872
[-3, -6, 1, 5], [-1, -6, 5], [-5, 3], [-3, -5, 1, 4], [-1, -5, 4], [-4, 1, 2],
873
[-1, -4, 2, 3], [-3, 2], [-2, -3, 4], [-4, 5], [-5, 6], [-6], [-2, 1], [-1, -2, 3]]
874
sage: TestSuite(C).run()
875
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)
876
True
877
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)
878
True
879
sage: G = C.digraph()
880
sage: G.show(edge_labels=true, figsize=12, vertex_size=1)
881
"""
882
883
def __hash__(self):
884
return hash(tuple(self.value))
885
886
def _repr_(self):
887
"""
888
In their full representation, the vertices of this crystal are labeled
889
by their weight. For example vertex [-5,2,6] indicates that a 5-arrow
890
is coming into this vertex, and a 2-arrow and 6-arrow is leaving the vertex.
891
Specifying element_print_style = 'compact' for a given crystal C, labels the
892
vertices of this crystal by the 27 letters +abcdefghijklmnopqrstuvwxyz.
893
894
EXAMPLES::
895
896
sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact')
897
sage: C.list()
898
[+, 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]
899
"""
900
if self.parent()._element_print_style == 'compact':
901
l=['+','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']
902
return l[self.parent().list().index(self)]
903
return "%s"%self.value
904
905
def weight(self):
906
"""
907
Returns the weight of self.
908
909
EXAMPLES::
910
911
sage: [v.weight() for v in CrystalOfLetters(['E',6])]
912
[(0, 0, 0, 0, 0, -2/3, -2/3, 2/3),
913
(-1/2, 1/2, 1/2, 1/2, 1/2, -1/6, -1/6, 1/6),
914
(1/2, -1/2, 1/2, 1/2, 1/2, -1/6, -1/6, 1/6),
915
(1/2, 1/2, -1/2, 1/2, 1/2, -1/6, -1/6, 1/6),
916
(-1/2, -1/2, -1/2, 1/2, 1/2, -1/6, -1/6, 1/6),
917
(1/2, 1/2, 1/2, -1/2, 1/2, -1/6, -1/6, 1/6),
918
(-1/2, -1/2, 1/2, -1/2, 1/2, -1/6, -1/6, 1/6),
919
(-1/2, 1/2, -1/2, -1/2, 1/2, -1/6, -1/6, 1/6),
920
(1/2, -1/2, -1/2, -1/2, 1/2, -1/6, -1/6, 1/6),
921
(0, 0, 0, 0, 1, 1/3, 1/3, -1/3),
922
(1/2, 1/2, 1/2, 1/2, -1/2, -1/6, -1/6, 1/6),
923
(-1/2, -1/2, 1/2, 1/2, -1/2, -1/6, -1/6, 1/6),
924
(-1/2, 1/2, -1/2, 1/2, -1/2, -1/6, -1/6, 1/6),
925
(1/2, -1/2, -1/2, 1/2, -1/2, -1/6, -1/6, 1/6),
926
(0, 0, 0, 1, 0, 1/3, 1/3, -1/3),
927
(-1/2, 1/2, 1/2, -1/2, -1/2, -1/6, -1/6, 1/6),
928
(1/2, -1/2, 1/2, -1/2, -1/2, -1/6, -1/6, 1/6),
929
(0, 0, 1, 0, 0, 1/3, 1/3, -1/3),
930
(1/2, 1/2, -1/2, -1/2, -1/2, -1/6, -1/6, 1/6),
931
(0, 1, 0, 0, 0, 1/3, 1/3, -1/3),
932
(1, 0, 0, 0, 0, 1/3, 1/3, -1/3),
933
(0, -1, 0, 0, 0, 1/3, 1/3, -1/3),
934
(0, 0, -1, 0, 0, 1/3, 1/3, -1/3),
935
(0, 0, 0, -1, 0, 1/3, 1/3, -1/3),
936
(0, 0, 0, 0, -1, 1/3, 1/3, -1/3),
937
(-1/2, -1/2, -1/2, -1/2, -1/2, -1/6, -1/6, 1/6),
938
(-1, 0, 0, 0, 0, 1/3, 1/3, -1/3)]
939
"""
940
R=self.parent().weight_lattice_realization().fundamental_weights()
941
return sum(cmp(i,0)*R[abs(i)] for i in self.value)
942
943
def e(self, i):
944
r"""
945
Returns the action of `e_i` on self.
946
947
EXAMPLES::
948
949
sage: C = CrystalOfLetters(['E',6])
950
sage: C([-1,3]).e(1)
951
[1]
952
sage: C([-2,-3,4]).e(2)
953
[-3, 2]
954
sage: C([1]).e(1)
955
"""
956
assert i in self.index_set()
957
958
if self.value == [-1, 3] and i == 1:
959
return self.parent()([1])
960
if self.value == [-3, 4] and i == 3:
961
return self.parent()([-1, 3])
962
if self.value == [-4, 2, 5] and i == 4:
963
return self.parent()([-3, 4])
964
if self.value == [-5, 2, 6] and i == 5:
965
return self.parent()([-4, 2, 5])
966
if self.value == [-2, 5] and i == 2:
967
return self.parent()([-4, 2, 5])
968
if self.value == [-6, 2] and i == 6:
969
return self.parent()([-5, 2, 6])
970
if self.value == [-2, -5, 4, 6] and i == 2:
971
return self.parent()([-5, 2, 6])
972
if self.value == [-2, -6, 4] and i == 2:
973
return self.parent()([-6, 2])
974
if self.value == [-2, -5, 4, 6] and i == 5:
975
return self.parent()([-2, 5])
976
if self.value == [-2, -6, 4] and i == 6:
977
return self.parent()([-2, -5, 4, 6])
978
if self.value == [-4, 3, 6] and i == 4:
979
return self.parent()([-2, -5, 4, 6])
980
if self.value == [-4, -6, 3, 5] and i == 4:
981
return self.parent()([-2, -6, 4])
982
if self.value == [-4, -6, 3, 5] and i == 6:
983
return self.parent()([-4, 3, 6])
984
if self.value == [-3, 1, 6] and i == 3:
985
return self.parent()([-4, 3, 6])
986
if self.value == [-5, 3] and i == 5:
987
return self.parent()([-4, -6, 3, 5])
988
if self.value == [-3, -6, 1, 5] and i == 3:
989
return self.parent()([-4, -6, 3, 5])
990
if self.value == [-3, -5, 1, 4] and i == 3:
991
return self.parent()([-5, 3])
992
if self.value == [-3, -6, 1, 5] and i == 6:
993
return self.parent()([-3, 1, 6])
994
if self.value == [-1, 6] and i == 1:
995
return self.parent()([-3, 1, 6])
996
if self.value == [-3, -5, 1, 4] and i == 5:
997
return self.parent()([-3, -6, 1, 5])
998
if self.value == [-1, -6, 5] and i == 1:
999
return self.parent()([-3, -6, 1, 5])
1000
if self.value == [-4, 1, 2] and i == 4:
1001
return self.parent()([-3, -5, 1, 4])
1002
if self.value == [-1, -5, 4] and i == 1:
1003
return self.parent()([-3, -5, 1, 4])
1004
if self.value == [-2, 1] and i == 2:
1005
return self.parent()([-4, 1, 2])
1006
if self.value == [-1, -4, 2, 3] and i == 1:
1007
return self.parent()([-4, 1, 2])
1008
if self.value == [-1, -2, 3] and i == 1:
1009
return self.parent()([-2, 1])
1010
if self.value == [-1, -6, 5] and i == 6:
1011
return self.parent()([-1, 6])
1012
if self.value == [-1, -5, 4] and i == 5:
1013
return self.parent()([-1, -6, 5])
1014
if self.value == [-1, -4, 2, 3] and i == 4:
1015
return self.parent()([-1, -5, 4])
1016
if self.value == [-1, -2, 3] and i == 2:
1017
return self.parent()([-1, -4, 2, 3])
1018
if self.value == [-3, 2] and i == 3:
1019
return self.parent()([-1, -4, 2, 3])
1020
if self.value == [-2, -3, 4] and i == 3:
1021
return self.parent()([-1, -2, 3])
1022
if self.value == [-2, -3, 4] and i == 2:
1023
return self.parent()([-3, 2])
1024
if self.value == [-4, 5] and i == 4:
1025
return self.parent()([-2, -3, 4])
1026
if self.value == [-5, 6] and i == 5:
1027
return self.parent()([-4, 5])
1028
if self.value == [-6] and i == 6:
1029
return self.parent()([-5, 6])
1030
1031
else:
1032
return None
1033
1034
def f(self, i):
1035
r"""
1036
Returns the action of `f_i` on self.
1037
1038
EXAMPLES::
1039
1040
sage: C = CrystalOfLetters(['E',6])
1041
sage: C([1]).f(1)
1042
[-1, 3]
1043
sage: C([-6]).f(1)
1044
"""
1045
assert i in self.index_set()
1046
1047
if self.value == [1] and i == 1:
1048
return self.parent()([-1, 3])
1049
if self.value == [-1, 3] and i == 3:
1050
return self.parent()([-3, 4])
1051
if self.value == [-3, 4] and i == 4:
1052
return self.parent()([-4, 2, 5])
1053
if self.value == [-4, 2, 5] and i == 5:
1054
return self.parent()([-5, 2, 6])
1055
if self.value == [-4, 2, 5] and i == 2:
1056
return self.parent()([-2, 5])
1057
if self.value == [-5, 2, 6] and i == 6:
1058
return self.parent()([-6, 2])
1059
if self.value == [-5, 2, 6] and i == 2:
1060
return self.parent()([-2, -5, 4, 6])
1061
if self.value == [-6, 2] and i == 2:
1062
return self.parent()([-2, -6, 4])
1063
if self.value == [-2, 5] and i == 5:
1064
return self.parent()([-2, -5, 4, 6])
1065
if self.value == [-2, -5, 4, 6] and i == 6:
1066
return self.parent()([-2, -6, 4])
1067
if self.value == [-2, -5, 4, 6] and i == 4:
1068
return self.parent()([-4, 3, 6])
1069
if self.value == [-2, -6, 4] and i == 4:
1070
return self.parent()([-4, -6, 3, 5])
1071
if self.value == [-4, 3, 6] and i == 6:
1072
return self.parent()([-4, -6, 3, 5])
1073
if self.value == [-4, 3, 6] and i == 3:
1074
return self.parent()([-3, 1, 6])
1075
if self.value == [-4, -6, 3, 5] and i == 5:
1076
return self.parent()([-5, 3])
1077
if self.value == [-4, -6, 3, 5] and i == 3:
1078
return self.parent()([-3, -6, 1, 5])
1079
if self.value == [-5, 3] and i == 3:
1080
return self.parent()([-3, -5, 1, 4])
1081
if self.value == [-3, 1, 6] and i == 6:
1082
return self.parent()([-3, -6, 1, 5])
1083
if self.value == [-3, 1, 6] and i == 1:
1084
return self.parent()([-1, 6])
1085
if self.value == [-3, -6, 1, 5] and i == 5:
1086
return self.parent()([-3, -5, 1, 4])
1087
if self.value == [-3, -6, 1, 5] and i == 1:
1088
return self.parent()([-1, -6, 5])
1089
if self.value == [-3, -5, 1, 4] and i == 4:
1090
return self.parent()([-4, 1, 2])
1091
if self.value == [-3, -5, 1, 4] and i == 1:
1092
return self.parent()([-1, -5, 4])
1093
if self.value == [-4, 1, 2] and i == 2:
1094
return self.parent()([-2, 1])
1095
if self.value == [-4, 1, 2] and i == 1:
1096
return self.parent()([-1, -4, 2, 3])
1097
if self.value == [-2, 1] and i == 1:
1098
return self.parent()([-1, -2, 3])
1099
if self.value == [-1, 6] and i == 6:
1100
return self.parent()([-1, -6, 5])
1101
if self.value == [-1, -6, 5] and i == 5:
1102
return self.parent()([-1, -5, 4])
1103
if self.value == [-1, -5, 4] and i == 4:
1104
return self.parent()([-1, -4, 2, 3])
1105
if self.value == [-1, -4, 2, 3] and i == 2:
1106
return self.parent()([-1, -2, 3])
1107
if self.value == [-1, -4, 2, 3] and i == 3:
1108
return self.parent()([-3, 2])
1109
if self.value == [-1, -2, 3] and i == 3:
1110
return self.parent()([-2, -3, 4])
1111
if self.value == [-3, 2] and i == 2:
1112
return self.parent()([-2, -3, 4])
1113
if self.value == [-2, -3, 4] and i == 4:
1114
return self.parent()([-4, 5])
1115
if self.value == [-4, 5] and i == 5:
1116
return self.parent()([-5, 6])
1117
if self.value == [-5, 6] and i == 6:
1118
return self.parent()([-6])
1119
1120
else:
1121
return None
1122
1123
class Crystal_of_letters_type_E6_element_dual(Letter):
1124
r"""
1125
Type `E_6` crystal of letters elements. This crystal corresponds to the highest weight
1126
crystal `B(\Lambda_6)`. This crystal is dual to `B(\Lambda_1)` of type `E_6`.
1127
1128
TESTS::
1129
1130
sage: C = CrystalOfLetters(['E',6], dual = True)
1131
sage: C.module_generators
1132
[[6]]
1133
sage: all(b==b.retract(b.lift()) for b in C)
1134
True
1135
sage: C.list()
1136
[[6], [5, -6], [4, -5], [2, 3, -4], [3, -2], [1, 2, -3], [2, -1], [1, 4, -2, -3],
1137
[4, -1, -2], [1, 5, -4], [3, 5, -1, -4], [5, -3], [1, 6, -5], [3, 6, -1, -5], [4, 6, -3, -5],
1138
[2, 6, -4], [6, -2], [1, -6], [3, -1, -6], [4, -3, -6], [2, 5, -4, -6], [5, -2, -6], [2, -5],
1139
[4, -2, -5], [3, -4], [1, -3], [-1]]
1140
sage: TestSuite(C).run()
1141
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)
1142
True
1143
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)
1144
True
1145
sage: G = C.digraph()
1146
sage: G.show(edge_labels=true, figsize=12, vertex_size=1)
1147
"""
1148
1149
def _repr_(self):
1150
"""
1151
In their full representation, the vertices of this crystal are labeled
1152
by their weight. For example vertex [-2,1] indicates that a 2-arrow
1153
is coming into this vertex, and a 1-arrow is leaving the vertex.
1154
Specifying the option element_print_style = 'compact' for a given crystal C,
1155
labels the vertices of this crystal by the 27 letters -ABCDEFGHIJKLMNOPQRSTUVWXYZ
1156
1157
EXAMPLES::
1158
1159
sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact', dual = True)
1160
sage: C.list()
1161
[-, 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]
1162
"""
1163
if self.parent()._element_print_style == 'compact':
1164
l=['-','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']
1165
return l[self.parent().list().index(self)]
1166
return "%s"%self.value
1167
1168
def __hash__(self):
1169
return hash(tuple(self.value))
1170
1171
def lift(self):
1172
"""
1173
Lifts an element of self to the crystal of letters CrystalOfLetters(['E',6])
1174
by taking its inverse weight.
1175
1176
EXAMPLES::
1177
1178
sage: C = CrystalOfLetters(['E',6], dual = True)
1179
sage: b=C.module_generators[0]
1180
sage: b.lift()
1181
[-6]
1182
"""
1183
return self.parent()._ambient([-i for i in self.value])
1184
1185
def retract(self, p):
1186
"""
1187
Retracts element p, which is an element in CrystalOfLetters(['E',6]) to
1188
an element in CrystalOfLetters(['E',6], dual = True) by taking its inverse weight.
1189
1190
EXAMPLES::
1191
1192
sage: C = CrystalOfLetters(['E',6])
1193
sage: Cd = CrystalOfLetters(['E',6], dual = True)
1194
sage: b = Cd.module_generators[0]
1195
sage: p = C([-1,3])
1196
sage: b.retract(p)
1197
[1, -3]
1198
sage: b.retract(None)
1199
"""
1200
if p is None:
1201
return None
1202
return self.parent()([-i for i in p.value])
1203
1204
def e(self, i):
1205
r"""
1206
Returns the action of `e_i` on self.
1207
1208
EXAMPLES::
1209
1210
sage: C = CrystalOfLetters(['E',6], dual = True)
1211
sage: C([-1]).e(1)
1212
[1, -3]
1213
"""
1214
return self.retract(self.lift().f(i))
1215
1216
def f(self, i):
1217
r"""
1218
Returns the action of `f_i` on self.
1219
1220
EXAMPLES::
1221
1222
sage: C = CrystalOfLetters(['E',6], dual = True)
1223
sage: C([6]).f(6)
1224
[5, -6]
1225
sage: C([6]).f(1)
1226
"""
1227
return self.retract(self.lift().e(i))
1228
1229
def weight(self):
1230
"""
1231
Returns the weight of self.
1232
1233
EXAMPLES::
1234
1235
sage: C = CrystalOfLetters(['E',6], dual = True)
1236
sage: b=C.module_generators[0]
1237
sage: b.weight()
1238
(0, 0, 0, 0, 1, -1/3, -1/3, 1/3)
1239
sage: [v.weight() for v in C]
1240
[(0, 0, 0, 0, 1, -1/3, -1/3, 1/3),
1241
(0, 0, 0, 1, 0, -1/3, -1/3, 1/3),
1242
(0, 0, 1, 0, 0, -1/3, -1/3, 1/3),
1243
(0, 1, 0, 0, 0, -1/3, -1/3, 1/3),
1244
(-1, 0, 0, 0, 0, -1/3, -1/3, 1/3),
1245
(1, 0, 0, 0, 0, -1/3, -1/3, 1/3),
1246
(1/2, 1/2, 1/2, 1/2, 1/2, 1/6, 1/6, -1/6),
1247
(0, -1, 0, 0, 0, -1/3, -1/3, 1/3),
1248
(-1/2, -1/2, 1/2, 1/2, 1/2, 1/6, 1/6, -1/6),
1249
(0, 0, -1, 0, 0, -1/3, -1/3, 1/3),
1250
(-1/2, 1/2, -1/2, 1/2, 1/2, 1/6, 1/6, -1/6),
1251
(1/2, -1/2, -1/2, 1/2, 1/2, 1/6, 1/6, -1/6),
1252
(0, 0, 0, -1, 0, -1/3, -1/3, 1/3),
1253
(-1/2, 1/2, 1/2, -1/2, 1/2, 1/6, 1/6, -1/6),
1254
(1/2, -1/2, 1/2, -1/2, 1/2, 1/6, 1/6, -1/6),
1255
(1/2, 1/2, -1/2, -1/2, 1/2, 1/6, 1/6, -1/6),
1256
(-1/2, -1/2, -1/2, -1/2, 1/2, 1/6, 1/6, -1/6),
1257
(0, 0, 0, 0, -1, -1/3, -1/3, 1/3),
1258
(-1/2, 1/2, 1/2, 1/2, -1/2, 1/6, 1/6, -1/6),
1259
(1/2, -1/2, 1/2, 1/2, -1/2, 1/6, 1/6, -1/6),
1260
(1/2, 1/2, -1/2, 1/2, -1/2, 1/6, 1/6, -1/6),
1261
(-1/2, -1/2, -1/2, 1/2, -1/2, 1/6, 1/6, -1/6),
1262
(1/2, 1/2, 1/2, -1/2, -1/2, 1/6, 1/6, -1/6),
1263
(-1/2, -1/2, 1/2, -1/2, -1/2, 1/6, 1/6, -1/6),
1264
(-1/2, 1/2, -1/2, -1/2, -1/2, 1/6, 1/6, -1/6),
1265
(1/2, -1/2, -1/2, -1/2, -1/2, 1/6, 1/6, -1/6),
1266
(0, 0, 0, 0, 0, 2/3, 2/3, -2/3)]
1267
"""
1268
return -self.lift().weight()
1269
1270
1271
#########################
1272
# Type E7
1273
#########################
1274
1275
class Crystal_of_letters_type_E7_element(Letter):
1276
r"""
1277
Type `E_7` crystal of letters elements. This crystal corresponds to the highest weight
1278
crystal `B(\Lambda_7)`.
1279
1280
TESTS::
1281
1282
sage: C = CrystalOfLetters(['E',7])
1283
sage: C.module_generators
1284
[[7]]
1285
sage: C.list()
1286
[[7], [-7, 6], [-6, 5], [-5, 4], [-4, 2, 3], [-2, 3], [-3, 1, 2], [-1,
1287
2], [-3, -2, 1, 4], [-1, -2, 4], [-4, 1, 5], [-4, -1, 3, 5], [-3, 5],
1288
[-5, 6, 1], [-5, -1, 3, 6], [-5, -3, 4, 6], [-4, 2, 6], [-2, 6], [-6, 7,
1289
1], [-1, -6, 3, 7], [-6, -3, 7, 4], [-6, -4, 2, 7, 5], [-6, -2, 7, 5],
1290
[-5, 7, 2], [-5, -2, 4, 7], [-4, 7, 3], [-3, 1, 7], [-1, 7], [-7, 1],
1291
[-1, -7, 3], [-7, -3, 4], [-4, -7, 2, 5], [-7, -2, 5], [-5, -7, 6, 2],
1292
[-5, -2, -7, 4, 6], [-7, -4, 6, 3], [-3, -7, 1, 6], [-7, -1, 6], [-6,
1293
2], [-2, -6, 4], [-6, -4, 5, 3], [-3, -6, 1, 5], [-6, -1, 5], [-5, 3],
1294
[-3, -5, 4, 1], [-5, -1, 4], [-4, 1, 2], [-1, -4, 3, 2], [-3, 2], [-2,
1295
-3, 4], [-4, 5], [-5, 6], [-6, 7], [-7], [-2, 1], [-2, -1, 3]]
1296
sage: TestSuite(C).run()
1297
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)
1298
True
1299
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)
1300
True
1301
sage: G = C.digraph()
1302
sage: G.show(edge_labels=true, figsize=12, vertex_size=1)
1303
"""
1304
1305
def __hash__(self):
1306
return hash(tuple(self.value))
1307
1308
def weight(self):
1309
"""
1310
Returns the weight of self.
1311
1312
EXAMPLES::
1313
1314
sage: [v.weight() for v in CrystalOfLetters(['E',7])]
1315
[(0, 0, 0, 0, 0, 1, -1/2, 1/2), (0, 0, 0, 0, 1, 0, -1/2, 1/2), (0, 0, 0,
1316
1, 0, 0, -1/2, 1/2), (0, 0, 1, 0, 0, 0, -1/2, 1/2), (0, 1, 0, 0, 0, 0,
1317
-1/2, 1/2), (-1, 0, 0, 0, 0, 0, -1/2, 1/2), (1, 0, 0, 0, 0, 0, -1/2,
1318
1/2), (1/2, 1/2, 1/2, 1/2, 1/2, 1/2, 0, 0), (0, -1, 0, 0, 0, 0, -1/2,
1319
1/2), (-1/2, -1/2, 1/2, 1/2, 1/2, 1/2, 0, 0), (0, 0, -1, 0, 0, 0, -1/2,
1320
1/2), (-1/2, 1/2, -1/2, 1/2, 1/2, 1/2, 0, 0), (1/2, -1/2, -1/2, 1/2,
1321
1/2, 1/2, 0, 0), (0, 0, 0, -1, 0, 0, -1/2, 1/2), (-1/2, 1/2, 1/2, -1/2,
1322
1/2, 1/2, 0, 0), (1/2, -1/2, 1/2, -1/2, 1/2, 1/2, 0, 0), (1/2, 1/2,
1323
-1/2, -1/2, 1/2, 1/2, 0, 0), (-1/2, -1/2, -1/2, -1/2, 1/2, 1/2, 0, 0),
1324
(0, 0, 0, 0, -1, 0, -1/2, 1/2), (-1/2, 1/2, 1/2, 1/2, -1/2, 1/2, 0, 0),
1325
(1/2, -1/2, 1/2, 1/2, -1/2, 1/2, 0, 0), (1/2, 1/2, -1/2, 1/2, -1/2, 1/2,
1326
0, 0), (-1/2, -1/2, -1/2, 1/2, -1/2, 1/2, 0, 0), (1/2, 1/2, 1/2, -1/2,
1327
-1/2, 1/2, 0, 0), (-1/2, -1/2, 1/2, -1/2, -1/2, 1/2, 0, 0), (-1/2, 1/2,
1328
-1/2, -1/2, -1/2, 1/2, 0, 0), (1/2, -1/2, -1/2, -1/2, -1/2, 1/2, 0, 0),
1329
(0, 0, 0, 0, 0, 1, 1/2, -1/2), (0, 0, 0, 0, 0, -1, -1/2, 1/2), (-1/2,
1330
1/2, 1/2, 1/2, 1/2, -1/2, 0, 0), (1/2, -1/2, 1/2, 1/2, 1/2, -1/2, 0, 0),
1331
(1/2, 1/2, -1/2, 1/2, 1/2, -1/2, 0, 0), (-1/2, -1/2, -1/2, 1/2, 1/2,
1332
-1/2, 0, 0), (1/2, 1/2, 1/2, -1/2, 1/2, -1/2, 0, 0), (-1/2, -1/2, 1/2,
1333
-1/2, 1/2, -1/2, 0, 0), (-1/2, 1/2, -1/2, -1/2, 1/2, -1/2, 0, 0), (1/2,
1334
-1/2, -1/2, -1/2, 1/2, -1/2, 0, 0), (0, 0, 0, 0, 1, 0, 1/2, -1/2), (1/2,
1335
1/2, 1/2, 1/2, -1/2, -1/2, 0, 0), (-1/2, -1/2, 1/2, 1/2, -1/2, -1/2, 0,
1336
0), (-1/2, 1/2, -1/2, 1/2, -1/2, -1/2, 0, 0), (1/2, -1/2, -1/2, 1/2,
1337
-1/2, -1/2, 0, 0), (0, 0, 0, 1, 0, 0, 1/2, -1/2), (-1/2, 1/2, 1/2, -1/2,
1338
-1/2, -1/2, 0, 0), (1/2, -1/2, 1/2, -1/2, -1/2, -1/2, 0, 0), (0, 0, 1,
1339
0, 0, 0, 1/2, -1/2), (1/2, 1/2, -1/2, -1/2, -1/2, -1/2, 0, 0), (0, 1, 0,
1340
0, 0, 0, 1/2, -1/2), (1, 0, 0, 0, 0, 0, 1/2, -1/2), (0, -1, 0, 0, 0, 0,
1341
1/2, -1/2), (0, 0, -1, 0, 0, 0, 1/2, -1/2), (0, 0, 0, -1, 0, 0, 1/2,
1342
-1/2), (0, 0, 0, 0, -1, 0, 1/2, -1/2), (0, 0, 0, 0, 0, -1, 1/2, -1/2),
1343
(-1/2, -1/2, -1/2, -1/2, -1/2, -1/2, 0, 0), (-1, 0, 0, 0, 0, 0, 1/2,
1344
-1/2)]
1345
"""
1346
R=self.parent().weight_lattice_realization().fundamental_weights()
1347
return sum(cmp(i,0)*R[abs(i)] for i in self.value)
1348
1349
def e(self, i):
1350
r"""
1351
Returns the action of `e_i` on self.
1352
1353
EXAMPLES::
1354
1355
sage: C = CrystalOfLetters(['E',7])
1356
sage: C([7]).e(7)
1357
sage: C([-7,6]).e(7)
1358
[7]
1359
"""
1360
assert i in self.index_set()
1361
1362
if self.value == [-7, 6] and i == 7 :
1363
return self.parent()( [7] )
1364
if self.value == [-6, 5] and i == 6 :
1365
return self.parent()( [-7, 6] )
1366
if self.value == [-5, 4] and i == 5 :
1367
return self.parent()( [-6, 5] )
1368
if self.value == [-4, 2, 3] and i == 4 :
1369
return self.parent()( [-5, 4] )
1370
if self.value == [-2, 3] and i == 2 :
1371
return self.parent()( [-4, 2, 3] )
1372
if self.value == [-3, 1, 2] and i == 3 :
1373
return self.parent()( [-4, 2, 3] )
1374
if self.value == [-3, -2, 1, 4] and i == 3 :
1375
return self.parent()( [-2, 3] )
1376
if self.value == [-1, 2] and i == 1 :
1377
return self.parent()( [-3, 1, 2] )
1378
if self.value == [-3, -2, 1, 4] and i == 2 :
1379
return self.parent()( [-3, 1, 2] )
1380
if self.value == [-1, -2, 4] and i == 1 :
1381
return self.parent()( [-3, -2, 1, 4] )
1382
if self.value == [-4, 1, 5] and i == 4 :
1383
return self.parent()( [-3, -2, 1, 4] )
1384
if self.value == [-7, 1] and i == 7 :
1385
return self.parent()( [-6, 7, 1] )
1386
if self.value == [-1, -6, 3, 7] and i == 1 :
1387
return self.parent()( [-6, 7, 1] )
1388
if self.value == [-1, -2, 4] and i == 2 :
1389
return self.parent()( [-1, 2] )
1390
if self.value == [-4, -1, 3, 5] and i == 4 :
1391
return self.parent()( [-1, -2, 4] )
1392
if self.value == [-4, -1, 3, 5] and i == 1 :
1393
return self.parent()( [-4, 1, 5] )
1394
if self.value == [-5, 6, 1] and i == 5 :
1395
return self.parent()( [-4, 1, 5] )
1396
if self.value == [-3, 5] and i == 3 :
1397
return self.parent()( [-4, -1, 3, 5] )
1398
if self.value == [-5, -1, 3, 6] and i == 5 :
1399
return self.parent()( [-4, -1, 3, 5] )
1400
if self.value == [-5, -3, 4, 6] and i == 5 :
1401
return self.parent()( [-3, 5] )
1402
if self.value == [-6, 7, 1] and i == 6 :
1403
return self.parent()( [-5, 6, 1] )
1404
if self.value == [-5, -1, 3, 6] and i == 1 :
1405
return self.parent()( [-5, 6, 1] )
1406
if self.value == [-5, -3, 4, 6] and i == 3 :
1407
return self.parent()( [-5, -1, 3, 6] )
1408
if self.value == [-1, -6, 3, 7] and i == 6 :
1409
return self.parent()( [-5, -1, 3, 6] )
1410
if self.value == [-4, 2, 6] and i == 4 :
1411
return self.parent()( [-5, -3, 4, 6] )
1412
if self.value == [-6, -3, 7, 4] and i == 6 :
1413
return self.parent()( [-5, -3, 4, 6] )
1414
if self.value == [-6, -2, 7, 5] and i == 6 :
1415
return self.parent()( [-2, 6] )
1416
if self.value == [-6, -3, 7, 4] and i == 3 :
1417
return self.parent()( [-1, -6, 3, 7] )
1418
if self.value == [-1, -7, 3] and i == 7 :
1419
return self.parent()( [-1, -6, 3, 7] )
1420
if self.value == [-7, -3, 4] and i == 7 :
1421
return self.parent()( [-6, -3, 7, 4] )
1422
if self.value == [-6, -4, 2, 7, 5] and i == 4 :
1423
return self.parent()( [-6, -3, 7, 4] )
1424
if self.value == [-2, 6] and i == 2 :
1425
return self.parent()( [-4, 2, 6] )
1426
if self.value == [-6, -4, 2, 7, 5] and i == 6 :
1427
return self.parent()( [-4, 2, 6] )
1428
if self.value == [-6, -2, 7, 5] and i == 2 :
1429
return self.parent()( [-6, -4, 2, 7, 5] )
1430
if self.value == [-4, -7, 2, 5] and i == 7 :
1431
return self.parent()( [-6, -4, 2, 7, 5] )
1432
if self.value == [-7, -4, 6, 3] and i == 7 :
1433
return self.parent()( [-4, 7, 3] )
1434
if self.value == [-3, 1, 7] and i == 3 :
1435
return self.parent()( [-4, 7, 3] )
1436
if self.value == [-1, 7] and i == 1 :
1437
return self.parent()( [-3, 1, 7] )
1438
if self.value == [-3, -7, 1, 6] and i == 7 :
1439
return self.parent()( [-3, 1, 7] )
1440
if self.value == [-1, -7, 3] and i == 1 :
1441
return self.parent()( [-7, 1] )
1442
if self.value == [-7, -2, 5] and i == 2 :
1443
return self.parent()( [-4, -7, 2, 5] )
1444
if self.value == [-5, -7, 6, 2] and i == 5 :
1445
return self.parent()( [-4, -7, 2, 5] )
1446
if self.value == [-5, -2, -7, 4, 6] and i == 5 :
1447
return self.parent()( [-7, -2, 5] )
1448
if self.value == [-5, -7, 6, 2] and i == 7 :
1449
return self.parent()( [-5, 7, 2] )
1450
if self.value == [-5, -2, 4, 7] and i == 2 :
1451
return self.parent()( [-5, 7, 2] )
1452
if self.value == [-7, -3, 4] and i == 3 :
1453
return self.parent()( [-1, -7, 3] )
1454
if self.value == [-5, 7, 2] and i == 5 :
1455
return self.parent()( [-6, -4, 2, 7, 5] )
1456
if self.value == [-6, 2] and i == 6 :
1457
return self.parent()( [-5, -7, 6, 2] )
1458
if self.value == [-5, -2, -7, 4, 6] and i == 2 :
1459
return self.parent()( [-5, -7, 6, 2] )
1460
if self.value == [-7, -2, 5] and i == 7 :
1461
return self.parent()( [-6, -2, 7, 5] )
1462
if self.value == [-5, -2, 4, 7] and i == 5 :
1463
return self.parent()( [-6, -2, 7, 5] )
1464
if self.value == [-4, 7, 3] and i == 4 :
1465
return self.parent()( [-5, -2, 4, 7] )
1466
if self.value == [-5, -2, -7, 4, 6] and i == 7 :
1467
return self.parent()( [-5, -2, 4, 7] )
1468
if self.value == [-4, -7, 2, 5] and i == 4 :
1469
return self.parent()( [-7, -3, 4] )
1470
if self.value == [-7, -4, 6, 3] and i == 4 :
1471
return self.parent()( [-5, -2, -7, 4, 6] )
1472
if self.value == [-2, -6, 4] and i == 6 :
1473
return self.parent()( [-5, -2, -7, 4, 6] )
1474
if self.value == [-6, -4, 5, 3] and i == 6 :
1475
return self.parent()( [-7, -4, 6, 3] )
1476
if self.value == [-3, -7, 1, 6] and i == 3 :
1477
return self.parent()( [-7, -4, 6, 3] )
1478
if self.value == [-3, -6, 1, 5] and i == 6 :
1479
return self.parent()( [-3, -7, 1, 6] )
1480
if self.value == [-6, -1, 5] and i == 6 :
1481
return self.parent()( [-7, -1, 6] )
1482
if self.value == [-2, -6, 4] and i == 2 :
1483
return self.parent()( [-6, 2] )
1484
if self.value == [-6, -4, 5, 3] and i == 4 :
1485
return self.parent()( [-2, -6, 4] )
1486
if self.value == [-7, -1, 6] and i == 1 :
1487
return self.parent()( [-3, -7, 1, 6] )
1488
if self.value == [-5, 3] and i == 5 :
1489
return self.parent()( [-6, -4, 5, 3] )
1490
if self.value == [-3, -6, 1, 5] and i == 3 :
1491
return self.parent()( [-6, -4, 5, 3] )
1492
if self.value == [-6, -1, 5] and i == 1 :
1493
return self.parent()( [-3, -6, 1, 5] )
1494
if self.value == [-3, -5, 4, 1] and i == 5 :
1495
return self.parent()( [-3, -6, 1, 5] )
1496
if self.value == [-5, -1, 4] and i == 5 :
1497
return self.parent()( [-6, -1, 5] )
1498
if self.value == [-3, -5, 4, 1] and i == 3 :
1499
return self.parent()( [-5, 3] )
1500
if self.value == [-4, 1, 2] and i == 4 :
1501
return self.parent()( [-3, -5, 4, 1] )
1502
if self.value == [-5, -1, 4] and i == 1 :
1503
return self.parent()( [-3, -5, 4, 1] )
1504
if self.value == [-1, -4, 3, 2] and i == 4 :
1505
return self.parent()( [-5, -1, 4] )
1506
if self.value == [-1, -4, 3, 2] and i == 1 :
1507
return self.parent()( [-4, 1, 2] )
1508
if self.value == [-2, 1] and i == 2 :
1509
return self.parent()( [-4, 1, 2] )
1510
if self.value == [-3, 2] and i == 3 :
1511
return self.parent()( [-1, -4, 3, 2] )
1512
if self.value == [-2, -1, 3] and i == 2 :
1513
return self.parent()( [-1, -4, 3, 2] )
1514
if self.value == [-2, -1, 3] and i == 1 :
1515
return self.parent()( [-2, 1] )
1516
if self.value == [-7, -1, 6] and i == 7 :
1517
return self.parent()( [-1, 7] )
1518
if self.value == [-2, -3, 4] and i == 3 :
1519
return self.parent()( [-2, -1, 3] )
1520
if self.value == [-2, -3, 4] and i == 2 :
1521
return self.parent()( [-3, 2] )
1522
if self.value == [-4, 5] and i == 4 :
1523
return self.parent()( [-2, -3, 4] )
1524
if self.value == [-5, 6] and i == 5 :
1525
return self.parent()( [-4, 5] )
1526
if self.value == [-6, 7] and i == 6 :
1527
return self.parent()( [-5, 6] )
1528
if self.value == [-7] and i == 7 :
1529
return self.parent()( [-6, 7] )
1530
1531
else:
1532
return None
1533
1534
def f(self, i):
1535
r"""
1536
Returns the action of `f_i` on self.
1537
1538
EXAMPLES::
1539
1540
sage: C = CrystalOfLetters(['E',7])
1541
sage: C([-7]).f(7)
1542
sage: C([7]).f(7)
1543
[-7, 6]
1544
"""
1545
assert i in self.index_set()
1546
1547
if self.value == [7] and i == 7 :
1548
return self.parent()( [-7, 6] )
1549
if self.value == [-7, 6] and i == 6 :
1550
return self.parent()( [-6, 5] )
1551
if self.value == [-6, 5] and i == 5 :
1552
return self.parent()( [-5, 4] )
1553
if self.value == [-5, 4] and i == 4 :
1554
return self.parent()( [-4, 2, 3] )
1555
if self.value == [-4, 2, 3] and i == 2 :
1556
return self.parent()( [-2, 3] )
1557
if self.value == [-4, 2, 3] and i == 3 :
1558
return self.parent()( [-3, 1, 2] )
1559
if self.value == [-2, 3] and i == 3 :
1560
return self.parent()( [-3, -2, 1, 4] )
1561
if self.value == [-3, 1, 2] and i == 1 :
1562
return self.parent()( [-1, 2] )
1563
if self.value == [-3, 1, 2] and i == 2 :
1564
return self.parent()( [-3, -2, 1, 4] )
1565
if self.value == [-3, -2, 1, 4] and i == 1 :
1566
return self.parent()( [-1, -2, 4] )
1567
if self.value == [-3, -2, 1, 4] and i == 4 :
1568
return self.parent()( [-4, 1, 5] )
1569
if self.value == [-6, 7, 1] and i == 7 :
1570
return self.parent()( [-7, 1] )
1571
if self.value == [-6, 7, 1] and i == 1 :
1572
return self.parent()( [-1, -6, 3, 7] )
1573
if self.value == [-1, 2] and i == 2 :
1574
return self.parent()( [-1, -2, 4] )
1575
if self.value == [-1, -2, 4] and i == 4 :
1576
return self.parent()( [-4, -1, 3, 5] )
1577
if self.value == [-4, 1, 5] and i == 1 :
1578
return self.parent()( [-4, -1, 3, 5] )
1579
if self.value == [-4, 1, 5] and i == 5 :
1580
return self.parent()( [-5, 6, 1] )
1581
if self.value == [-4, -1, 3, 5] and i == 3 :
1582
return self.parent()( [-3, 5] )
1583
if self.value == [-4, -1, 3, 5] and i == 5 :
1584
return self.parent()( [-5, -1, 3, 6] )
1585
if self.value == [-3, 5] and i == 5 :
1586
return self.parent()( [-5, -3, 4, 6] )
1587
if self.value == [-5, 6, 1] and i == 6 :
1588
return self.parent()( [-6, 7, 1] )
1589
if self.value == [-5, 6, 1] and i == 1 :
1590
return self.parent()( [-5, -1, 3, 6] )
1591
if self.value == [-5, -1, 3, 6] and i == 3 :
1592
return self.parent()( [-5, -3, 4, 6] )
1593
if self.value == [-5, -1, 3, 6] and i == 6 :
1594
return self.parent()( [-1, -6, 3, 7] )
1595
if self.value == [-5, -3, 4, 6] and i == 4 :
1596
return self.parent()( [-4, 2, 6] )
1597
if self.value == [-5, -3, 4, 6] and i == 6 :
1598
return self.parent()( [-6, -3, 7, 4] )
1599
if self.value == [-2, 6] and i == 6 :
1600
return self.parent()( [-6, -2, 7, 5] )
1601
if self.value == [-1, -6, 3, 7] and i == 3 :
1602
return self.parent()( [-6, -3, 7, 4] )
1603
if self.value == [-1, -6, 3, 7] and i == 7 :
1604
return self.parent()( [-1, -7, 3] )
1605
if self.value == [-6, -3, 7, 4] and i == 7 :
1606
return self.parent()( [-7, -3, 4] )
1607
if self.value == [-6, -3, 7, 4] and i == 4 :
1608
return self.parent()( [-6, -4, 2, 7, 5] )
1609
if self.value == [-4, 2, 6] and i == 2 :
1610
return self.parent()( [-2, 6] )
1611
if self.value == [-4, 2, 6] and i == 6 :
1612
return self.parent()( [-6, -4, 2, 7, 5] )
1613
if self.value == [-6, -4, 2, 7, 5] and i == 2 :
1614
return self.parent()( [-6, -2, 7, 5] )
1615
if self.value == [-6, -4, 2, 7, 5] and i == 7 :
1616
return self.parent()( [-4, -7, 2, 5] )
1617
if self.value == [-4, 7, 3] and i == 7 :
1618
return self.parent()( [-7, -4, 6, 3] )
1619
if self.value == [-4, 7, 3] and i == 3 :
1620
return self.parent()( [-3, 1, 7] )
1621
if self.value == [-3, 1, 7] and i == 1 :
1622
return self.parent()( [-1, 7] )
1623
if self.value == [-3, 1, 7] and i == 7 :
1624
return self.parent()( [-3, -7, 1, 6] )
1625
if self.value == [-7, 1] and i == 1 :
1626
return self.parent()( [-1, -7, 3] )
1627
if self.value == [-4, -7, 2, 5] and i == 2 :
1628
return self.parent()( [-7, -2, 5] )
1629
if self.value == [-4, -7, 2, 5] and i == 5 :
1630
return self.parent()( [-5, -7, 6, 2] )
1631
if self.value == [-7, -2, 5] and i == 5 :
1632
return self.parent()( [-5, -2, -7, 4, 6] )
1633
if self.value == [-5, 7, 2] and i == 7 :
1634
return self.parent()( [-5, -7, 6, 2] )
1635
if self.value == [-5, 7, 2] and i == 2 :
1636
return self.parent()( [-5, -2, 4, 7] )
1637
if self.value == [-1, -7, 3] and i == 3 :
1638
return self.parent()( [-7, -3, 4] )
1639
if self.value == [-6, -4, 2, 7, 5] and i == 5 :
1640
return self.parent()( [-5, 7, 2] )
1641
if self.value == [-5, -7, 6, 2] and i == 6 :
1642
return self.parent()( [-6, 2] )
1643
if self.value == [-5, -7, 6, 2] and i == 2 :
1644
return self.parent()( [-5, -2, -7, 4, 6] )
1645
if self.value == [-6, -2, 7, 5] and i == 7 :
1646
return self.parent()( [-7, -2, 5] )
1647
if self.value == [-6, -2, 7, 5] and i == 5 :
1648
return self.parent()( [-5, -2, 4, 7] )
1649
if self.value == [-5, -2, 4, 7] and i == 4 :
1650
return self.parent()( [-4, 7, 3] )
1651
if self.value == [-5, -2, 4, 7] and i == 7 :
1652
return self.parent()( [-5, -2, -7, 4, 6] )
1653
if self.value == [-7, -3, 4] and i == 4 :
1654
return self.parent()( [-4, -7, 2, 5] )
1655
if self.value == [-5, -2, -7, 4, 6] and i == 4 :
1656
return self.parent()( [-7, -4, 6, 3] )
1657
if self.value == [-5, -2, -7, 4, 6] and i == 6 :
1658
return self.parent()( [-2, -6, 4] )
1659
if self.value == [-7, -4, 6, 3] and i == 6 :
1660
return self.parent()( [-6, -4, 5, 3] )
1661
if self.value == [-7, -4, 6, 3] and i == 3 :
1662
return self.parent()( [-3, -7, 1, 6] )
1663
if self.value == [-3, -7, 1, 6] and i == 6 :
1664
return self.parent()( [-3, -6, 1, 5] )
1665
if self.value == [-7, -1, 6] and i == 6 :
1666
return self.parent()( [-6, -1, 5] )
1667
if self.value == [-6, 2] and i == 2 :
1668
return self.parent()( [-2, -6, 4] )
1669
if self.value == [-2, -6, 4] and i == 4 :
1670
return self.parent()( [-6, -4, 5, 3] )
1671
if self.value == [-3, -7, 1, 6] and i == 1 :
1672
return self.parent()( [-7, -1, 6] )
1673
if self.value == [-6, -4, 5, 3] and i == 5 :
1674
return self.parent()( [-5, 3] )
1675
if self.value == [-6, -4, 5, 3] and i == 3 :
1676
return self.parent()( [-3, -6, 1, 5] )
1677
if self.value == [-3, -6, 1, 5] and i == 1 :
1678
return self.parent()( [-6, -1, 5] )
1679
if self.value == [-3, -6, 1, 5] and i == 5 :
1680
return self.parent()( [-3, -5, 4, 1] )
1681
if self.value == [-6, -1, 5] and i == 5 :
1682
return self.parent()( [-5, -1, 4] )
1683
if self.value == [-5, 3] and i == 3 :
1684
return self.parent()( [-3, -5, 4, 1] )
1685
if self.value == [-3, -5, 4, 1] and i == 4 :
1686
return self.parent()( [-4, 1, 2] )
1687
if self.value == [-3, -5, 4, 1] and i == 1 :
1688
return self.parent()( [-5, -1, 4] )
1689
if self.value == [-5, -1, 4] and i == 4 :
1690
return self.parent()( [-1, -4, 3, 2] )
1691
if self.value == [-4, 1, 2] and i == 1 :
1692
return self.parent()( [-1, -4, 3, 2] )
1693
if self.value == [-4, 1, 2] and i == 2 :
1694
return self.parent()( [-2, 1] )
1695
if self.value == [-1, -4, 3, 2] and i == 3 :
1696
return self.parent()( [-3, 2] )
1697
if self.value == [-1, -4, 3, 2] and i == 2 :
1698
return self.parent()( [-2, -1, 3] )
1699
if self.value == [-2, 1] and i == 1 :
1700
return self.parent()( [-2, -1, 3] )
1701
if self.value == [-1, 7] and i == 7 :
1702
return self.parent()( [-7, -1, 6] )
1703
if self.value == [-2, -1, 3] and i == 3 :
1704
return self.parent()( [-2, -3, 4] )
1705
if self.value == [-3, 2] and i == 2 :
1706
return self.parent()( [-2, -3, 4] )
1707
if self.value == [-2, -3, 4] and i == 4 :
1708
return self.parent()( [-4, 5] )
1709
if self.value == [-4, 5] and i == 5 :
1710
return self.parent()( [-5, 6] )
1711
if self.value == [-5, 6] and i == 6 :
1712
return self.parent()( [-6, 7] )
1713
if self.value == [-6, 7] and i == 7 :
1714
return self.parent()( [-7] )
1715
1716
else:
1717
return None
1718
1719
1720