Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagesmc
Path: blob/master/src/sage/combinat/crystals/affine.py
8817 views
1
r"""
2
Affine Crystals
3
"""
4
#*****************************************************************************
5
# Copyright (C) 2008 Brant Jones <brant at math.ucdavis.edu>
6
# Anne Schilling <anne at math.ucdavis.edu>
7
#
8
# Distributed under the terms of the GNU General Public License (GPL)
9
# http://www.gnu.org/licenses/
10
#****************************************************************************
11
# Acknowledgment: most of the design and implementation of this
12
# library is heavily inspired from MuPAD-Combinat.
13
#****************************************************************************
14
15
from sage.misc.abstract_method import abstract_method
16
from sage.categories.regular_crystals import RegularCrystals
17
from sage.categories.finite_crystals import FiniteCrystals
18
from sage.structure.parent import Parent
19
from sage.structure.unique_representation import UniqueRepresentation
20
from sage.structure.element_wrapper import ElementWrapper
21
from sage.combinat.root_system.cartan_type import CartanType
22
23
class AffineCrystalFromClassical(UniqueRepresentation, Parent):
24
r"""
25
This abstract class can be used for affine crystals that are constructed from a classical crystal.
26
The zero arrows can be implemented using different methods (for example using a Dynkin diagram
27
automorphisms or virtual crystals).
28
29
This is a helper class, mostly used to implement Kirillov-Reshetikhin crystals
30
(see: :func:`sage.combinat.crystals.kirillov_reshetikhin.KirillovReshetikhin`).
31
32
For general information about crystals see :mod:`sage.combinat.crystals`.
33
34
INPUT:
35
36
- ``cartan_type`` - The Cartan type of the resulting affine crystal
37
38
- ``classical_crystal`` - instance of a classical crystal.
39
40
EXAMPLES::
41
42
sage: n=2
43
sage: C=CrystalOfTableaux(['A',n],shape=[1])
44
sage: pr = attrcall("promotion")
45
sage: pr_inverse = attrcall("promotion_inverse")
46
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
47
sage: A.list()
48
[[[1]], [[2]], [[3]]]
49
sage: A.cartan_type()
50
['A', 2, 1]
51
sage: A.index_set()
52
(0, 1, 2)
53
sage: b=A(rows=[[1]])
54
sage: b.weight()
55
-Lambda[0] + Lambda[1]
56
sage: b.classical_weight()
57
(1, 0, 0)
58
sage: [x.s(0) for x in A.list()]
59
[[[3]], [[2]], [[1]]]
60
sage: [x.s(1) for x in A.list()]
61
[[[2]], [[1]], [[3]]]
62
"""
63
64
@staticmethod
65
def __classcall__(cls, cartan_type, *args, **options):
66
"""
67
TESTS::
68
69
sage: n = 1
70
sage: C = CrystalOfTableaux(['A',n],shape=[1])
71
sage: pr = attrcall("promotion")
72
sage: pr_inverse = attrcall("promotion_inverse")
73
sage: A = AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) # indirect doctest
74
sage: B = AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) # indirect doctest
75
sage: A is B
76
True
77
"""
78
ct = CartanType(cartan_type)
79
return super(AffineCrystalFromClassical, cls).__classcall__(cls, ct, *args, **options)
80
81
def __init__(self, cartan_type, classical_crystal, category = None):
82
"""
83
Input is an affine Cartan type 'cartan_type', a classical crystal 'classical_crystal', and automorphism and its
84
inverse 'automorphism' and 'inverse_automorphism', and the Dynkin node 'dynkin_node'
85
86
EXAMPLES::
87
88
sage: n = 1
89
sage: C = CrystalOfTableaux(['A',n],shape=[1])
90
sage: pr = attrcall("promotion")
91
sage: pr_inverse = attrcall("promotion_inverse")
92
sage: A = AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) # indirect doctest
93
sage: A.list()
94
[[[1]], [[2]]]
95
sage: A.cartan_type()
96
['A', 1, 1]
97
sage: A.index_set()
98
(0, 1)
99
100
Note: AffineCrystalFromClassical is an abstract class, so we
101
can't test it directly.
102
103
TESTS::
104
105
sage: TestSuite(A).run()
106
"""
107
if category is None:
108
category = (RegularCrystals(), FiniteCrystals())
109
self._cartan_type = cartan_type
110
Parent.__init__(self, category = category)
111
self.classical_crystal = classical_crystal;
112
self.module_generators = map( self.retract, self.classical_crystal.module_generators )
113
self.element_class._latex_ = lambda x: x.lift()._latex_()
114
115
def _repr_(self):
116
"""
117
EXAMPLES::
118
119
sage: n=1
120
sage: C=CrystalOfTableaux(['A',n],shape=[1])
121
sage: pr = attrcall("promotion")
122
sage: pr_inverse = attrcall("promotion_inverse")
123
sage: AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) # indirect doctest
124
An affine crystal for type ['A', 1, 1]
125
"""
126
return "An affine crystal for type %s"%self.cartan_type()
127
128
129
def __iter__(self):
130
r"""
131
Construct the iterator from the underlying classical crystal.
132
133
TESTS::
134
135
sage: n=1
136
sage: C=CrystalOfTableaux(['A',n],shape=[1])
137
sage: pr = attrcall("promotion")
138
sage: pr_inverse = attrcall("promotion_inverse")
139
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) # indirect doctest
140
sage: A.list() # indirect doctest
141
[[[1]], [[2]]]
142
"""
143
for x in self.classical_crystal:
144
yield self.retract(x)
145
146
# should be removed once crystal defines __iter__ instead of list
147
def list(self):
148
"""
149
Returns the list of all crystal elements using the underlying classical crystal
150
151
EXAMPLES::
152
153
sage: n=2
154
sage: C=CrystalOfTableaux(['A',n],shape=[1])
155
sage: pr = attrcall("promotion")
156
sage: pr_inverse = attrcall("promotion_inverse")
157
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
158
sage: A.list()
159
[[[1]], [[2]], [[3]]]
160
"""
161
return map( self.retract, self.classical_crystal.list() )
162
163
def lift(self, affine_elt):
164
"""
165
Lifts an affine crystal element to the corresponding classical crystal element
166
167
EXAMPLES::
168
169
sage: n=2
170
sage: C=CrystalOfTableaux(['A',n],shape=[1])
171
sage: pr = attrcall("promotion")
172
sage: pr_inverse = attrcall("promotion_inverse")
173
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
174
sage: b=A.list()[0]
175
sage: A.lift(b)
176
[[1]]
177
sage: A.lift(b).parent()
178
The crystal of tableaux of type ['A', 2] and shape(s) [[1]]
179
"""
180
return affine_elt.lift()
181
182
def retract(self, classical_elt):
183
"""
184
Transforms a classical crystal element to the corresponding affine crystal element
185
186
EXAMPLES::
187
188
sage: n=2
189
sage: C=CrystalOfTableaux(['A',n],shape=[1])
190
sage: pr = attrcall("promotion")
191
sage: pr_inverse = attrcall("promotion_inverse")
192
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
193
sage: t=C(rows=[[1]])
194
sage: t.parent()
195
The crystal of tableaux of type ['A', 2] and shape(s) [[1]]
196
sage: A.retract(t)
197
[[1]]
198
sage: A.retract(t).parent() is A
199
True
200
"""
201
return self.element_class(self, classical_elt)
202
203
def _element_constructor_(self, *value, **options):
204
r"""
205
Coerces ``value`` into ``self``.
206
207
EXAMPLES:
208
209
sage: n=2
210
sage: C=CrystalOfTableaux(['A',n],shape=[1])
211
sage: pr = attrcall("promotion")
212
sage: pr_inverse = attrcall("promotion_inverse")
213
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
214
sage: b=A(rows=[[1]]) # indirect doctest
215
sage: b
216
[[1]]
217
sage: b.parent()
218
An affine crystal for type ['A', 2, 1]
219
sage: A(b) is b
220
True
221
"""
222
if len(value) == 1 and isinstance(value[0], self.element_class) and value[0].parent() == self:
223
return value[0]
224
else: # Should do sanity checks! (Including check for inconsistent parent.)
225
return self.retract(self.classical_crystal(*value, **options))
226
227
def __contains__(self, x):
228
r"""
229
Checks whether x is an element of self.
230
231
EXAMPLES:
232
233
sage: n=2
234
sage: C=CrystalOfTableaux(['A',n],shape=[1])
235
sage: pr = attrcall("promotion")
236
sage: pr_inverse = attrcall("promotion_inverse")
237
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
238
sage: b=A(rows=[[1]])
239
sage: A.__contains__(b)
240
True
241
"""
242
return x.parent() is self
243
244
245
class AffineCrystalFromClassicalElement(ElementWrapper):
246
r"""
247
Elements of crystals that are constructed from a classical crystal.
248
The elements inherit many of their methods from the classical crystal
249
using lift and retract.
250
251
This class is not instantiated directly but rather __call__ed from
252
AffineCrystalFromClassical. The syntax of this is governed by the
253
(classical) CrystalOfTableaux.
254
255
EXAMPLES::
256
257
sage: n=2
258
sage: C=CrystalOfTableaux(['A',n],shape=[1])
259
sage: pr = attrcall("promotion")
260
sage: pr_inverse = attrcall("promotion_inverse")
261
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
262
sage: b=A(rows=[[1]])
263
sage: b._repr_()
264
'[[1]]'
265
"""
266
267
def classical_weight(self):
268
"""
269
Returns the classical weight corresponding to self.
270
271
EXAMPLES::
272
273
sage: n=2
274
sage: C=CrystalOfTableaux(['A',n],shape=[1])
275
sage: pr = attrcall("promotion")
276
sage: pr_inverse = attrcall("promotion_inverse")
277
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
278
sage: b=A(rows=[[1]])
279
sage: b.classical_weight()
280
(1, 0, 0)
281
"""
282
return self.lift().weight()
283
284
def lift(self):
285
"""
286
Lifts an affine crystal element to the corresponding classical crystal element
287
288
EXAMPLES::
289
290
sage: n=2
291
sage: C=CrystalOfTableaux(['A',n],shape=[1])
292
sage: pr = attrcall("promotion")
293
sage: pr_inverse = attrcall("promotion_inverse")
294
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
295
sage: b=A.list()[0]
296
sage: b.lift()
297
[[1]]
298
sage: b.lift().parent()
299
The crystal of tableaux of type ['A', 2] and shape(s) [[1]]
300
"""
301
return self.value
302
303
def pp(self):
304
"""
305
Method for pretty printing
306
307
EXAMPLES::
308
309
sage: K = KirillovReshetikhinCrystal(['D',3,2],1,1)
310
sage: t=K(rows=[[1]])
311
sage: t.pp()
312
1
313
"""
314
return self.lift().pp()
315
316
@abstract_method
317
def e0(self):
318
r"""
319
Assumes that `e_0` is implemented separately.
320
"""
321
322
@abstract_method
323
def f0(self):
324
r"""
325
Assumes that `f_0` is implemented separately.
326
"""
327
328
def e(self, i):
329
r"""
330
Returns the action of `e_i` on self.
331
332
EXAMPLES::
333
334
sage: n=2
335
sage: C=CrystalOfTableaux(['A',n],shape=[1])
336
sage: pr = attrcall("promotion")
337
sage: pr_inverse = attrcall("promotion_inverse")
338
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
339
sage: b=A(rows=[[1]])
340
sage: b.e(0)
341
[[3]]
342
sage: b.e(1)
343
"""
344
if i == 0:
345
return self.e0()
346
else:
347
x = self.lift().e(i)
348
if (x == None):
349
return None
350
else:
351
return self.parent().retract(x)
352
353
def f(self, i):
354
r"""
355
Returns the action of `f_i` on self.
356
357
EXAMPLES::
358
359
sage: n=2
360
sage: C=CrystalOfTableaux(['A',n],shape=[1])
361
sage: pr = attrcall("promotion")
362
sage: pr_inverse = attrcall("promotion_inverse")
363
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
364
sage: b=A(rows=[[3]])
365
sage: b.f(0)
366
[[1]]
367
sage: b.f(2)
368
"""
369
if i == 0:
370
return self.f0()
371
else:
372
x = self.lift().f(i)
373
if (x == None):
374
return None
375
else:
376
return self.parent().retract(x)
377
378
def epsilon0(self):
379
r"""
380
Uses `epsilon_0` from the super class, but should be implemented if a faster implementation exists.
381
"""
382
return super(AffineCrystalFromClassicalElement, self).epsilon(0)
383
384
def epsilon(self, i):
385
"""
386
Returns the maximal time the crystal operator `e_i` can be applied to self.
387
388
EXAMPLES::
389
390
sage: n=2
391
sage: C=CrystalOfTableaux(['A',n],shape=[1])
392
sage: pr = attrcall("promotion")
393
sage: pr_inverse = attrcall("promotion_inverse")
394
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
395
sage: [x.epsilon(0) for x in A.list()]
396
[1, 0, 0]
397
sage: [x.epsilon(1) for x in A.list()]
398
[0, 1, 0]
399
"""
400
if i == 0:
401
return self.epsilon0()
402
else:
403
return self.lift().epsilon(i)
404
405
def phi0(self):
406
r"""
407
Uses `phi_0` from the super class, but should be implemented if a faster implementation exists.
408
"""
409
return super(AffineCrystalFromClassicalElement, self).phi(0)
410
411
def phi(self, i):
412
r"""
413
Returns the maximal time the crystal operator `f_i` can be applied to self.
414
415
EXAMPLES::
416
417
sage: n=2
418
sage: C=CrystalOfTableaux(['A',n],shape=[1])
419
sage: pr = attrcall("promotion")
420
sage: pr_inverse = attrcall("promotion_inverse")
421
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
422
sage: [x.phi(0) for x in A.list()]
423
[0, 0, 1]
424
sage: [x.phi(1) for x in A.list()]
425
[1, 0, 0]
426
"""
427
if i == 0:
428
return self.phi0()
429
else:
430
return self.lift().phi(i)
431
432
def __lt__(self, other):
433
"""
434
Non elements of the crystal are incomparable with elements of the crystal
435
(or should it return NotImplemented?). Elements of this crystal are compared
436
using the comparison in the underlying classical crystal.
437
438
EXAMPLES::
439
440
sage: K = KirillovReshetikhinCrystal(['A',2,1],1,1)
441
sage: b = K(rows=[[1]])
442
sage: c = K(rows=[[2]])
443
sage: c<b
444
False
445
sage: b<b
446
False
447
sage: b<c
448
True
449
"""
450
if self.parent() is not other.parent():
451
return False
452
return self.lift() < other.lift()
453
454
AffineCrystalFromClassical.Element = AffineCrystalFromClassicalElement
455
456
457
class AffineCrystalFromClassicalAndPromotion(AffineCrystalFromClassical):
458
r"""
459
Crystals that are constructed from a classical crystal and a
460
Dynkin diagram automorphism `\sigma`. In type `A_n`, the Dynkin
461
diagram automorphism is `i \to i+1 \pmod n+1` and the
462
corresponding map on the crystal is the promotion operation
463
`\mathrm{pr}` on tableaux. The affine crystal operators are given
464
by `f_0= \mathrm{pr}^{-1} f_{\sigma(0)} \mathrm{pr}`.
465
466
INPUT:
467
468
- ``cartan_type`` - The Cartan type of the resulting affine crystal
469
470
- ``classical_crystal`` - instance of a classical crystal.
471
472
- ``automorphism, inverse_automorphism`` - A function on the
473
elements of the classical_crystal
474
475
- ``dynkin_node`` - Integer specifying the classical node in the
476
image of the zero node under the automorphism sigma.
477
478
EXAMPLES::
479
480
sage: n=2
481
sage: C=CrystalOfTableaux(['A',n],shape=[1])
482
sage: pr = attrcall("promotion")
483
sage: pr_inverse = attrcall("promotion_inverse")
484
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
485
sage: A.list()
486
[[[1]], [[2]], [[3]]]
487
sage: A.cartan_type()
488
['A', 2, 1]
489
sage: A.index_set()
490
(0, 1, 2)
491
sage: b=A(rows=[[1]])
492
sage: b.weight()
493
-Lambda[0] + Lambda[1]
494
sage: b.classical_weight()
495
(1, 0, 0)
496
sage: [x.s(0) for x in A.list()]
497
[[[3]], [[2]], [[1]]]
498
sage: [x.s(1) for x in A.list()]
499
[[[2]], [[1]], [[3]]]
500
"""
501
502
def __init__(self, cartan_type, classical_crystal, p_automorphism, p_inverse_automorphism, dynkin_node):
503
"""
504
Input is an affine Cartan type 'cartan_type', a classical crystal 'classical_crystal', and automorphism and its
505
inverse 'automorphism' and 'inverse_automorphism', and the Dynkin node 'dynkin_node'
506
507
EXAMPLES::
508
509
sage: n=1
510
sage: C=CrystalOfTableaux(['A',n],shape=[1])
511
sage: pr = attrcall("promotion")
512
sage: pr_inverse = attrcall("promotion_inverse")
513
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
514
sage: A.list()
515
[[[1]], [[2]]]
516
sage: A.cartan_type()
517
['A', 1, 1]
518
sage: A.index_set()
519
(0, 1)
520
521
TESTS::
522
523
sage: TestSuite(A).run()
524
"""
525
AffineCrystalFromClassical.__init__(self, cartan_type, classical_crystal)
526
self.p_automorphism = p_automorphism
527
self.p_inverse_automorphism = p_inverse_automorphism
528
self.dynkin_node = dynkin_node
529
530
def automorphism(self, x):
531
"""
532
Gives the analogue of the affine Dynkin diagram automorphism on the level of crystals
533
534
EXAMPLES::
535
536
sage: n=2
537
sage: C=CrystalOfTableaux(['A',n],shape=[1])
538
sage: pr = attrcall("promotion")
539
sage: pr_inverse = attrcall("promotion_inverse")
540
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
541
sage: b=A.list()[0]
542
sage: A.automorphism(b)
543
[[2]]
544
"""
545
return self.retract( self.p_automorphism( x.lift() ) )
546
547
def inverse_automorphism(self, x):
548
"""
549
Gives the analogue of the inverse of the affine Dynkin diagram automorphism on the level of crystals
550
551
EXAMPLES::
552
553
sage: n=2
554
sage: C=CrystalOfTableaux(['A',n],shape=[1])
555
sage: pr = attrcall("promotion")
556
sage: pr_inverse = attrcall("promotion_inverse")
557
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
558
sage: b=A.list()[0]
559
sage: A.inverse_automorphism(b)
560
[[3]]
561
"""
562
return self.retract( self.p_inverse_automorphism( x.lift() ) )
563
564
class AffineCrystalFromClassicalAndPromotionElement(AffineCrystalFromClassicalElement):
565
r"""
566
Elements of crystals that are constructed from a classical crystal
567
and a Dynkin diagram automorphism. In type A, the automorphism is
568
the promotion operation on tableaux.
569
570
This class is not instantiated directly but rather __call__ed from
571
AffineCrystalFromClassicalAndPromotion. The syntax of this is governed by the
572
(classical) CrystalOfTableaux.
573
574
Since this class inherits from AffineClassicalFromClassicalElement, the methods
575
that need to be implemented are e0, f0 and possibly epsilon0 and phi0 if more efficient
576
algorithms exist.
577
578
EXAMPLES::
579
580
sage: n=2
581
sage: C=CrystalOfTableaux(['A',n],shape=[1])
582
sage: pr = attrcall("promotion")
583
sage: pr_inverse = attrcall("promotion_inverse")
584
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
585
sage: b=A(rows=[[1]])
586
sage: b._repr_()
587
'[[1]]'
588
"""
589
590
def e0(self):
591
r"""
592
Implements `e_0` using the automorphism as
593
`e_0 = \operatorname{pr}^{-1} e_{dynkin_node} \operatorname{pr}`
594
595
EXAMPLES::
596
597
sage: n=2
598
sage: C=CrystalOfTableaux(['A',n],shape=[1])
599
sage: pr = attrcall("promotion")
600
sage: pr_inverse = attrcall("promotion_inverse")
601
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
602
sage: b=A(rows=[[1]])
603
sage: b.e0()
604
[[3]]
605
"""
606
x = self.parent().automorphism(self).e(self.parent().dynkin_node)
607
if (x == None):
608
return None
609
else:
610
return self.parent().inverse_automorphism(x)
611
612
def f0(self):
613
r"""
614
Implements `f_0` using the automorphism as
615
`f_0 = \operatorname{pr}^{-1} f_{dynkin_node} \operatorname{pr}`
616
617
EXAMPLES::
618
619
sage: n=2
620
sage: C=CrystalOfTableaux(['A',n],shape=[1])
621
sage: pr = attrcall("promotion")
622
sage: pr_inverse = attrcall("promotion_inverse")
623
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
624
sage: b=A(rows=[[3]])
625
sage: b.f0()
626
[[1]]
627
"""
628
x = self.parent().automorphism(self).f(self.parent().dynkin_node)
629
if (x == None):
630
return None
631
else:
632
return self.parent().inverse_automorphism(x)
633
634
def epsilon0(self):
635
r"""
636
Implements `epsilon_0` using the automorphism.
637
638
EXAMPLES::
639
640
sage: n=2
641
sage: C=CrystalOfTableaux(['A',n],shape=[1])
642
sage: pr = attrcall("promotion")
643
sage: pr_inverse = attrcall("promotion_inverse")
644
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
645
sage: [x.epsilon0() for x in A.list()]
646
[1, 0, 0]
647
"""
648
x = self.parent().automorphism(self)
649
return x.lift().epsilon(self.parent().dynkin_node)
650
651
def phi0(self):
652
r"""
653
Implements `phi_0` using the automorphism.
654
655
EXAMPLES::
656
657
sage: n=2
658
sage: C=CrystalOfTableaux(['A',n],shape=[1])
659
sage: pr = attrcall("promotion")
660
sage: pr_inverse = attrcall("promotion_inverse")
661
sage: A=AffineCrystalFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1)
662
sage: [x.phi0() for x in A.list()]
663
[0, 0, 1]
664
"""
665
x = self.parent().automorphism(self)
666
return x.lift().phi(self.parent().dynkin_node)
667
668
AffineCrystalFromClassicalAndPromotion.Element = AffineCrystalFromClassicalAndPromotionElement
669
670