Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagesmc
Path: blob/master/src/sage/combinat/crystals/elementary_crystals.py
8817 views
1
r"""
2
Elementary Crystals
3
4
Let `\lambda` be a weight. The crystals `T_{\lambda}`, `R_{\lambda}`, `B_i`,
5
and `C` are important objects in the tensor category of crystals.
6
For example, the crystal `T_0` is the neutral object in this category; i.e.,
7
`T_0 \otimes B \cong B \otimes T_0 \cong B` for any crystal `B`. We list
8
some other properties of these crystals:
9
10
- The crystal `T_{\lambda} \otimes B(\infty)` is the crystal of the Verma
11
module with highest weight `\lambda`, where `\lambda` is a dominant integral
12
weight.
13
14
- Let `u_{\infty}` be the highest weight vector of `B(\infty)` and `\lambda`
15
be a dominant integral weight. There is an embedding of crystals `B(\lambda)
16
\longrightarrow T_{\lambda} \otimes B(\infty)` sending `u_{\lambda} \mapsto
17
t_{\lambda} \otimes u_{\infty}` which is not strict, but the embedding
18
`B(\lambda) \longrightarrow C \otimes T_{\lambda} \otimes B(\infty)` by
19
`u_{\lambda} \mapsto c \otimes t_{\lambda} \otimes u_{\infty}` is a strict
20
embedding.
21
22
- For any dominant integral weight `\lambda`, there is a surjective crystal
23
morphism `\Psi_{\lambda} \colon R_{\lambda} \otimes B(\infty) \longrightarrow
24
B(\lambda)`. More precisely, if `B = \{r_{\lambda} \otimes b \in R_{\lambda}
25
\otimes B(\infty) : \Psi_{\lambda}(r_{\lambda} \otimes b) \neq 0 \}`, then
26
`B \cong B(\lambda)` as crystals.
27
28
- For all Cartan types and all weights `\lambda`, we have `R_{\lambda} \cong C
29
\otimes T_{\lambda}` as crystals.
30
31
- For each `i`, there is a strict crystal morphism `\Psi_i \colon B(\infty)
32
\longrightarrow B_i \otimes B(\infty)` defined by `u_{\infty} \mapsto
33
b_i(0) \otimes u_{\infty}`, where `u_\infty` is the highest weight vector
34
of `B(\infty)`.
35
36
For more information on `B(\infty)`, see :class:`InfinityCrystalOfTableaux`.
37
38
.. NOTE::
39
40
As with :class:`TensorProductOfCrystals`, we are using the opposite of
41
Kashiwara's convention.
42
43
AUTHORS:
44
45
- Ben Salisbury: Initial version
46
47
REFERENCES:
48
49
.. [Kashiwara93] M. Kashiwara.
50
The Crystal Base and Littelmann's Refined Demazure Character Formula.
51
Duke Math. J. **71** (3), pp. 839--858, 1993.
52
53
.. [NZ97] T. Nakashima and A. Zelevinsky.
54
Polyhedral Realizations of Crystal Bases for Quantized Kac-Moody Algebras.
55
Adv. Math. **131**, pp. 253--278, 1997.
56
"""
57
58
#*****************************************************************************
59
# Copyright (C) 2013 Ben Salisbury <benjamin_salisbury at brown dot edu>
60
#
61
# Distributed under the terms of the GNU General Public License (GPL)
62
#
63
# This code is distributed in the hope that it will be useful,
64
# but WITHOUT ANY WARRANTY; without even the implied warranty of
65
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
66
# General Public License for more details.
67
#
68
# The full text of the GPL is available at:
69
#
70
# http://www.gnu.org/licenses/
71
#****************************************************************************
72
73
from sage.categories.crystals import Crystals
74
from sage.categories.finite_crystals import FiniteCrystals
75
from sage.categories.highest_weight_crystals import HighestWeightCrystals
76
from sage.categories.classical_crystals import ClassicalCrystals
77
from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
78
from sage.structure.element import Element
79
from sage.structure.parent import Parent
80
from sage.structure.unique_representation import UniqueRepresentation
81
from sage.combinat.root_system.cartan_type import CartanType
82
from sage.combinat.root_system.root_system import RootSystem
83
from sage.rings.integer import Integer
84
from sage.rings.infinity import Infinity
85
86
class AbstractSingleCrystalElement(Element):
87
r"""
88
Abstract base class for elements in crystals with a single element.
89
"""
90
def __lt__(self,other):
91
r"""
92
EXAMPLES::
93
94
sage: La = RootSystem("D4").ambient_space().fundamental_weights()
95
sage: T = TCrystal("D4",La[3]+La[4])
96
sage: t = T.highest_weight_vector()
97
sage: t < t.e(1)
98
False
99
sage: t < t
100
False
101
"""
102
return False
103
104
def __eq__(self,other):
105
r"""
106
EXAMPLES::
107
108
sage: La = RootSystem("A2").weight_lattice().fundamental_weights()
109
sage: T = TCrystal("A2",La[1])
110
sage: U = TCrystal("A2",La[2])
111
sage: la = RootSystem("B2").weight_lattice().fundamental_weights()
112
sage: V = TCrystal("B2",la[1])
113
sage: t = T.highest_weight_vector()
114
sage: u = U.highest_weight_vector()
115
sage: v = V.highest_weight_vector()
116
sage: [t == t, u == u, v == v]
117
[True, True, True]
118
sage: [t == u, u == v, t == v]
119
[False, False, False]
120
121
sage: C = ComponentCrystal("D7")
122
sage: c = C.highest_weight_vector()
123
sage: c == c
124
True
125
sage: c == c.f(7)
126
False
127
"""
128
if isinstance(other, AbstractSingleCrystalElement):
129
return self.parent() is other.parent()
130
return False
131
132
def __ne__(self,other):
133
r"""
134
EXAMPLES::
135
136
sage: La = RootSystem("A2").weight_lattice().fundamental_weights()
137
sage: T = TCrystal("A2",La[1])
138
sage: T.highest_weight_vector() != T.highest_weight_vector()
139
False
140
sage: T.highest_weight_vector() != T.highest_weight_vector().e(1)
141
True
142
"""
143
return not self.__eq__(other)
144
145
def e(self,i):
146
r"""
147
Return `e_i` of ``self``, which is ``None`` for all `i`.
148
149
INPUT:
150
151
- ``i`` -- An element of the index set
152
153
EXAMPLES::
154
155
sage: ct = CartanType(['A',2])
156
sage: la = RootSystem(ct).weight_lattice().fundamental_weights()
157
sage: T = TCrystal(ct,la[1])
158
sage: t = T.highest_weight_vector()
159
sage: t.e(1)
160
sage: t.e(2)
161
"""
162
return None
163
164
def f(self,i):
165
r"""
166
Return `f_i` of ``self``, which is ``None`` for all `i`.
167
168
INPUT:
169
170
- ``i`` -- An element of the index set
171
172
EXAMPLES::
173
174
sage: ct = CartanType(['A',2])
175
sage: la = RootSystem(ct).weight_lattice().fundamental_weights()
176
sage: T = TCrystal(ct,la[1])
177
sage: t = T.highest_weight_vector()
178
sage: t.f(1)
179
sage: t.f(2)
180
"""
181
return None
182
183
class TCrystal(Parent, UniqueRepresentation):
184
r"""
185
The crystal `T_{\lambda}`.
186
187
Let `\lambda` be a weight. As defined in [Kashiwara93]_ the crystal
188
`T_{\lambda} = \{ t_{\lambda} \}` is a single element crystal with the
189
crystal structure defined by
190
191
.. MATH::
192
193
\mathrm{wt}(t_\lambda) = \lambda, \quad
194
e_i t_{\lambda} = f_i t_{\lambda} = 0, \quad
195
\varepsilon_i(t_{\lambda}) = \varphi_i(t_{\lambda}) = -\infty.
196
197
The crystal `T_{\lambda}` shifts the weights of the vertices in a crystal
198
`B` by `\lambda` when tensored with `B`, but leaves the graph structure of
199
`B` unchanged. That is to say, for all `b \in B`, we have `\mathrm{wt}(b
200
\otimes t_{\lambda}) = \mathrm{wt}(b) + \lambda`.
201
202
INPUT:
203
204
- ``cartan_type`` -- A Cartan type
205
206
- ``weight`` -- An element of the weight lattice of type ``cartan_type``
207
208
EXAMPLES::
209
210
sage: ct = CartanType(['A',2])
211
sage: C = CrystalOfTableaux(ct, shape=[1])
212
sage: for x in C: x.weight()
213
(1, 0, 0)
214
(0, 1, 0)
215
(0, 0, 1)
216
sage: La = RootSystem(ct).ambient_space().fundamental_weights()
217
sage: TLa = TCrystal(ct, 3*(La[1] + La[2]))
218
sage: TP = TensorProductOfCrystals(TLa, C)
219
sage: for x in TP: x.weight()
220
(7, 3, 0)
221
(6, 4, 0)
222
(6, 3, 1)
223
sage: G = C.digraph()
224
sage: H = TP.digraph()
225
sage: G.is_isomorphic(H,edge_labels=True)
226
True
227
"""
228
229
@staticmethod
230
def __classcall_private__(cls, cartan_type, weight):
231
r"""
232
Normalize input to ensure a unique representation.
233
234
EXAMPLES::
235
236
sage: ct = CartanType(['A',3])
237
sage: la = RootSystem(ct).weight_lattice().fundamental_weights()
238
sage: wts = RootSystem(ct).ambient_space().fundamental_weights()
239
sage: X = TCrystal(['A',3], la[1])
240
sage: Y = TCrystal(ct, wts[1])
241
sage: X is Y
242
True
243
"""
244
cartan_type = CartanType(cartan_type)
245
La = RootSystem(cartan_type).ambient_space()(weight)
246
return super(TCrystal, cls).__classcall__(cls, cartan_type, La)
247
248
def __init__(self, cartan_type, weight):
249
r"""
250
Initialize ``self``.
251
252
EXAMPLES::
253
254
sage: la = RootSystem("A2").weight_lattice().fundamental_weights()
255
sage: B = TCrystal("A2", 5*la[2])
256
sage: TestSuite(B).run()
257
"""
258
Parent.__init__(self, category = (FiniteCrystals(), HighestWeightCrystals()))
259
self._weight = weight
260
self._cartan_type = cartan_type
261
self.module_generators = (self.element_class(self),)
262
263
def _repr_(self):
264
r"""
265
Return a string representation of ``self``.
266
267
EXAMPLES::
268
269
sage: la = RootSystem(['E',6]).weight_lattice().fundamental_weights()
270
sage: B = TCrystal(['E',6], la[6])
271
sage: B
272
The T crystal of type ['E', 6] and weight (0, 0, 0, 0, 1, -1/3, -1/3, 1/3)
273
"""
274
return "The T crystal of type {1!s} and weight {0!s}".format(self._weight,self._cartan_type)
275
276
def _element_constructor_(self, weight):
277
r"""
278
Construct an element of ``self`` from ``weight``.
279
280
INPUT:
281
282
- ``weight`` -- An element of the weight lattice
283
284
EXAMPLES::
285
286
sage: la = RootSystem("E8").weight_lattice().fundamental_weights()
287
sage: T = TCrystal("E8",la[7]+la[8])
288
sage: T(la[7]+la[8])
289
(0, 0, 0, 0, 0, 1, 2, 3)
290
"""
291
if weight != self._weight:
292
raise ValueError("Only element is t(%s)"%self._weight)
293
return self.element_class(self)
294
295
def cardinality(self):
296
r"""
297
Return the cardinality of ``self``, which is always `1`.
298
299
EXAMPLES::
300
301
sage: La = RootSystem(['C',12]).weight_lattice().fundamental_weights()
302
sage: T = TCrystal(['C',12], La[9])
303
sage: T.cardinality()
304
1
305
"""
306
return Integer(1)
307
308
class Element(AbstractSingleCrystalElement):
309
r"""
310
Element of a `T_{\lambda}` crystal.
311
"""
312
def _repr_(self):
313
r"""
314
EXAMPLES::
315
316
sage: ct = CartanType(['F',4])
317
sage: la = RootSystem(ct).weight_lattice().fundamental_weights()
318
sage: T = TCrystal(ct,2*la[1]-3*la[3])
319
sage: t = T.highest_weight_vector()
320
sage: t
321
(-5/2, 1/2, -3/2, -3/2)
322
"""
323
return repr(self.parent()._weight)
324
325
def _latex_(self):
326
r"""
327
Return a LaTeX representation of ``self``.
328
329
EXAMPLES::
330
331
sage: ct = CartanType(['B',5,1])
332
sage: la = RootSystem(ct).ambient_space().fundamental_weights()
333
sage: T = TCrystal(ct, 2*la[1]-3*la[3]+la[0])
334
sage: t = T.highest_weight_vector()
335
sage: latex(t)
336
{t_{-e_{0} - 3e_{1} - 3e_{2} - 3e_{deltacheck}}}
337
"""
338
return "{t_{"+self.parent()._weight._latex_()+"}}"
339
340
def epsilon(self,i):
341
r"""
342
Return `\varepsilon_i` of ``self``, which is `-\infty` for all `i`.
343
344
INPUT:
345
346
- ``i`` -- An element of the index set
347
348
EXAMPLES::
349
350
sage: ct = CartanType(['C',5])
351
sage: la = RootSystem(ct).weight_lattice().fundamental_weights()
352
sage: T = TCrystal(ct,la[4]+la[5]-la[1]-la[2])
353
sage: t = T.highest_weight_vector()
354
sage: [t.epsilon(i) for i in T.index_set()]
355
[-inf, -inf, -inf, -inf, -inf]
356
"""
357
return float("-inf")
358
359
def phi(self,i):
360
r"""
361
Return `\varphi_i` of ``self``, which is `-\infty` for all `i`.
362
363
INPUT:
364
365
- ``i`` -- An element of the index set
366
367
EXAMPLES::
368
369
sage: ct = CartanType(['C',5])
370
sage: la = RootSystem(ct).weight_lattice().fundamental_weights()
371
sage: T = TCrystal(ct,la[4]+la[5]-la[1]-la[2])
372
sage: t = T.highest_weight_vector()
373
sage: [t.phi(i) for i in T.index_set()]
374
[-inf, -inf, -inf, -inf, -inf]
375
"""
376
return float("-inf")
377
378
def weight(self):
379
r"""
380
Return the weight of ``self``, which is always `\lambda`.
381
382
EXAMPLES::
383
384
sage: ct = CartanType(['C',5])
385
sage: la = RootSystem(ct).weight_lattice().fundamental_weights()
386
sage: T = TCrystal(ct,la[4]+la[5]-la[1]-la[2])
387
sage: t = T.highest_weight_vector()
388
sage: t.weight()
389
(0, 1, 2, 2, 1)
390
"""
391
return self.parent()._weight
392
393
class RCrystal(Parent, UniqueRepresentation):
394
r"""
395
The crystal `R_{\lambda}`.
396
397
For a fixed weight `\lambda`, the crystal `R_{\lambda} = \{ r_{\lambda} \}`
398
is a single element crystal with the crystal structure defined by
399
400
.. MATH::
401
402
\mathrm{wt}(r_{\lambda}) = \lambda, \quad
403
e_i r_{\lambda} = f_i r_{\lambda} = 0, \quad
404
\varepsilon_i(r_{\lambda}) = -\langle h_i, \lambda\rangle, \quad
405
\varphi_i(r_{\lambda}) = 0,
406
407
where `\{h_i\}` are the simple coroots.
408
409
Tensoring `R_{\lambda}` with a crystal `B` results in shifting the weights
410
of the vertices in `B` by `\lambda` and may also cut a subset out of the
411
original graph of `B`. That is, `\mathrm{wt}(r_{\lambda} \otimes b) =
412
\mathrm{wt}(b) + \lambda`, where `b \in B`, provided `r_{\lambda} \otimes
413
b \neq 0`. For example, the crystal graph of `B(\lambda)` is the same as
414
the crystal graph of `R_{\lambda} \otimes B(\infty)` generated from the
415
component `r_{\lambda} \otimes u_{\infty}`.
416
417
INPUT:
418
419
- ``cartan_type`` -- A Cartan type
420
421
- ``weight`` -- An element of the weight lattice of type ``cartan_type``
422
423
EXAMPLES:
424
425
We check by tensoring `R_{\lambda}` with `B(\infty)` results in a
426
component of `B(\lambda)`::
427
428
sage: B = InfinityCrystalOfTableaux("A2")
429
sage: R = RCrystal("A2", B.Lambda()[1]+B.Lambda()[2])
430
sage: T = TensorProductOfCrystals(R, B)
431
sage: mg = T(R.highest_weight_vector(), B.highest_weight_vector())
432
sage: S = T.subcrystal(generators=[mg])
433
sage: for x in S: x.weight()
434
(2, 1, 0)
435
(2, 0, 1)
436
(1, 2, 0)
437
(1, 1, 1)
438
(1, 1, 1)
439
(1, 0, 2)
440
(0, 2, 1)
441
(0, 1, 2)
442
sage: C = CrystalOfTableaux("A2", shape=[2,1])
443
sage: for x in C: x.weight()
444
(2, 1, 0)
445
(1, 2, 0)
446
(1, 1, 1)
447
(1, 0, 2)
448
(0, 1, 2)
449
(2, 0, 1)
450
(1, 1, 1)
451
(0, 2, 1)
452
sage: GT = T.digraph(subset=S)
453
sage: GC = C.digraph()
454
sage: GT.is_isomorphic(GC, edge_labels=True)
455
True
456
"""
457
458
@staticmethod
459
def __classcall_private__(cls, cartan_type, weight):
460
r"""
461
Normalize input to ensure a unique representation.
462
463
EXAMPLES::
464
465
sage: ct = CartanType(['A',3])
466
sage: la = RootSystem(ct).weight_lattice().fundamental_weights()
467
sage: wts = RootSystem(ct).ambient_space().fundamental_weights()
468
sage: X = RCrystal(['A',3], la[1])
469
sage: Y = RCrystal(ct, wts[1])
470
sage: X is Y
471
True
472
"""
473
cartan_type = CartanType(cartan_type)
474
La = RootSystem(cartan_type).ambient_space()(weight)
475
return super(RCrystal, cls).__classcall__(cls, cartan_type, La)
476
477
def __init__(self, cartan_type, weight):
478
r"""
479
Initialize ``self``.
480
481
EXAMPLES::
482
483
sage: la = RootSystem("A2").weight_lattice().fundamental_weights()
484
sage: B = RCrystal("A2",5*la[2])
485
sage: TestSuite(B).run()
486
"""
487
Parent.__init__(self, category = (FiniteCrystals(),HighestWeightCrystals()))
488
self._weight = weight
489
self._cartan_type = cartan_type
490
self.module_generators = (self.element_class(self),)
491
492
def _repr_(self):
493
r"""
494
Return a string representation of ``self``.
495
496
EXAMPLES::
497
498
sage: la = RootSystem(['E',6]).weight_lattice().fundamental_weights()
499
sage: B = RCrystal(['E',6],la[6])
500
sage: B
501
The R crystal of weight (0, 0, 0, 0, 1, -1/3, -1/3, 1/3) and type ['E', 6]
502
"""
503
return "The R crystal of weight {0!s} and type {1!s}".format(self._weight,self._cartan_type)
504
505
def _element_constructor_(self, weight):
506
r"""
507
Construct an element of ``self`` from ``weight``.
508
509
INPUT:
510
511
- ``weight`` -- An element of the weight lattice
512
513
EXAMPLES::
514
515
sage: la = RootSystem("E8").weight_lattice().fundamental_weights()
516
sage: R = RCrystal("E8",la[7]+la[8])
517
sage: R(la[7]+la[8])
518
(0, 0, 0, 0, 0, 1, 2, 3)
519
"""
520
if weight != self._weight:
521
raise ValueError("Only element is r(%s)"%self._weight)
522
return self.element_class(self)
523
524
def cardinality(self):
525
r"""
526
Return the cardinality of ``self``, which is always `1`.
527
528
EXAMPLES::
529
530
sage: La = RootSystem(['C',12]).weight_lattice().fundamental_weights()
531
sage: R = RCrystal(['C',12],La[9])
532
sage: R.cardinality()
533
1
534
"""
535
return Integer(1)
536
537
class Element(AbstractSingleCrystalElement):
538
r"""
539
Element of a `R_{\lambda}` crystal.
540
"""
541
def _repr_(self):
542
r"""
543
EXAMPLES::
544
545
sage: ct = CartanType(['F',4])
546
sage: la = RootSystem(ct).weight_lattice().fundamental_weights()
547
sage: T = TCrystal(ct,2*la[1]-3*la[3])
548
sage: t = T.highest_weight_vector()
549
sage: t
550
(-5/2, 1/2, -3/2, -3/2)
551
"""
552
return repr(self.parent()._weight)
553
554
def _latex_(self):
555
r"""
556
Return a LaTeX representation of ``self``.
557
558
EXAMPLES::
559
560
sage: la = RootSystem("G2").weight_lattice().fundamental_weights()
561
sage: R = RCrystal("G2",la[1])
562
sage: r = R.highest_weight_vector()
563
sage: latex(r)
564
{r_{e_{0} - e_{2}}}
565
"""
566
return "{r_{"+self.parent()._weight._latex_()+"}}"
567
568
def epsilon(self, i):
569
r"""
570
Return `\varepsilon_i` of ``self``.
571
572
We have `\varepsilon_i(r_{\lambda}) = -\langle h_i, \lambda
573
\rangle` for all `i`, where `h_i` is a simple coroot.
574
575
INPUT:
576
577
- ``i`` -- An element of the index set
578
579
EXAMPLES::
580
581
sage: la = RootSystem(['A',2]).weight_lattice().fundamental_weights()
582
sage: R = RCrystal("A2",la[1])
583
sage: r = R.highest_weight_vector()
584
sage: [r.epsilon(i) for i in R.index_set()]
585
[-1, 0]
586
"""
587
P = self.cartan_type().root_system().ambient_space()
588
h = P.simple_coroots()
589
return -1*P(self.weight()).scalar(h[i])
590
591
def phi(self,i):
592
r"""
593
Return `\varphi_i` of ``self``, which is `0` for all `i`.
594
595
INPUT:
596
597
- ``i`` -- An element of the index set
598
599
EXAMPLES::
600
601
sage: la = RootSystem("C5").weight_lattice().fundamental_weights()
602
sage: R = RCrystal("C5",la[4]+la[5])
603
sage: r = R.highest_weight_vector()
604
sage: [r.phi(i) for i in R.index_set()]
605
[0, 0, 0, 0, 0]
606
"""
607
return 0
608
609
def weight(self):
610
r"""
611
Return the weight of ``self``, which is always `\lambda`.
612
613
EXAMPLES::
614
615
sage: ct = CartanType(['C',5])
616
sage: la = RootSystem(ct).weight_lattice().fundamental_weights()
617
sage: T = TCrystal(ct,la[4]+la[5]-la[1]-la[2])
618
sage: t = T.highest_weight_vector()
619
sage: t.weight()
620
(0, 1, 2, 2, 1)
621
"""
622
return self.parent()._weight
623
624
class ElementaryCrystal(Parent, UniqueRepresentation):
625
r"""
626
The elementary crystal `B_i`.
627
628
For `i` an element of the index set of type `X`, the crystal `B_i` of type
629
`X` is the set
630
631
.. MATH::
632
633
B_i = \{ b_i(m) : m \in \ZZ \},
634
635
where the crystal stucture is given by
636
637
.. MATH::
638
639
\begin{aligned}
640
\mathrm{wt}\bigl(b_i(m)\bigr) &= m\alpha_i \\
641
\varphi_j\bigl(b_i(m)\bigr) &= \begin{cases}
642
m & \text{ if } j=i, \\
643
-\infty & \text{ if } j\neq i,
644
\end{cases} \\
645
\varepsilon_j\bigl(b_i(m)\bigr) &= \begin{cases}
646
-m & \text{ if } j=i, \\
647
-\infty & \text{ if } j\neq i,
648
\end{cases} \\
649
e_j b_i(m) &= \begin{cases}
650
b_i(m+1) & \text{ if } j=i, \\
651
0 & \text{ if } j\neq i,
652
\end{cases} \\
653
f_j b_i(m) &= \begin{cases}
654
b_i(m-1) & \text{ if } j=i, \\
655
0 & \text{ if } j\neq i.
656
\end{cases}
657
\end{aligned}
658
659
The *Kashiwara embedding theorem* asserts there is a unique strict crystal
660
embedding of crystals
661
662
.. MATH::
663
664
B(\infty) \hookrightarrow B_i \otimes B(\infty),
665
666
satisfying certain properties (see [Kashiwara93]_). The above embedding
667
may be iterated to obtain a new embedding
668
669
.. MATH::
670
671
B(\infty) \hookrightarrow B_{i_N} \otimes B_{i_{N-1}}
672
\otimes \cdots \otimes B_{i_2} \otimes B_{i_1} \otimes B(\infty),
673
674
which is a foundational object in the study of *polyhedral realizations of
675
crystals* (see, for example, [NZ97]_).
676
"""
677
678
@staticmethod
679
def __classcall_private__(cls, cartan_type, i):
680
r"""
681
Normalize input to ensure a unique representation.
682
683
EXAMPLES::
684
685
sage: B = ElementaryCrystal(['A',4], 3)
686
sage: C = ElementaryCrystal(CartanType("A4"), int(3))
687
sage: B is C
688
True
689
"""
690
cartan_type = CartanType(cartan_type)
691
if i not in cartan_type.index_set():
692
raise ValueError('i must an element of the index set.')
693
return super(ElementaryCrystal, cls).__classcall__(cls, cartan_type, i)
694
695
def __init__(self, cartan_type, i):
696
r"""
697
Initialize ``self``.
698
699
EXAMPLES::
700
701
sage: B = ElementaryCrystal("D4",3)
702
sage: TestSuite(B).run()
703
"""
704
Parent.__init__(self, category = (Crystals(), InfiniteEnumeratedSets()))
705
self._i = i
706
self._cartan_type = cartan_type
707
self.module_generators = (self.element_class(self,0),)
708
709
def _repr_(self):
710
r"""
711
Return a string representation of ``self``.
712
713
EXAMPLES::
714
715
sage: B = ElementaryCrystal(['B',5,1], 4)
716
sage: B
717
The 4-elementary crystal of type ['B', 5, 1]
718
"""
719
return "The {0!s}-elementary crystal of type {1!s}".format(self._i,self._cartan_type)
720
721
def _element_constructor_(self, m):
722
r"""
723
Construct an element of ``self`` from ``weight``.
724
725
INPUT:
726
727
- ``m`` -- An integer
728
729
EXAMPLES::
730
731
sage: B = ElementaryCrystal(['F',4], 2)
732
sage: B(0)
733
0
734
sage: B(-15)
735
-15
736
sage: B(721)
737
721
738
"""
739
return self.element_class(self, m)
740
741
class Element(Element):
742
r"""
743
Element of a `B_i` crystal.
744
"""
745
def __init__(self, parent, m):
746
r"""
747
EXAMPLES::
748
749
sage: B = ElementaryCrystal(['B',7],7)
750
sage: elt = B(17); elt
751
17
752
"""
753
self._m = m
754
Element.__init__(self, parent)
755
756
def _repr_(self):
757
r"""
758
EXAMPLES::
759
760
sage: B = ElementaryCrystal(['A',4],3)
761
sage: B(-47)
762
-47
763
"""
764
return repr(self._m)
765
766
def __lt__(self,other):
767
r"""
768
EXAMPLES::
769
770
sage: B = ElementaryCrystal("D4",3)
771
sage: b = B(1)
772
sage: c = B(-1)
773
sage: b.__lt__(c)
774
False
775
sage: c.__lt__(b)
776
True
777
"""
778
if self.parent() is not other.parent():
779
return False
780
else:
781
if Integer(self._m) < Integer(other._m):
782
return True
783
else:
784
return False
785
786
def __eq__(self,other):
787
r"""
788
EXAMPLES::
789
790
sage: B = ElementaryCrystal("A2",1)
791
sage: C = ElementaryCrystal("A2",2)
792
sage: D = ElementaryCrystal("B2",1)
793
sage: [B(0) == B(1), B(0) == C(0), B(0) == D(0), C(0) == D(0)]
794
[False, False, False, False]
795
sage: [B(1) == B(1), C(12) == C(12), D(-1) == D(-1)]
796
[True, True, True]
797
"""
798
if isinstance(other, ElementaryCrystal.Element):
799
return self.parent() is other.parent() and self._m == other._m
800
return False
801
802
def __ne__(self,other):
803
r"""
804
EXAMPLES::
805
806
sage: B = ElementaryCrystal("A2",1)
807
sage: B(0) != B(2)
808
True
809
sage: B(0) != B(0)
810
False
811
"""
812
return not self.__eq__(other)
813
814
def _latex_(self):
815
r"""
816
Return a LaTeX representation of ``self``.
817
818
EXAMPLES::
819
820
sage: B = ElementaryCrystal(['B',11,1],6)
821
sage: latex(B(26))
822
{b_{6}(26)}
823
"""
824
return "{b_{%s}(%s)}"%(self.parent()._i, self._m)
825
826
def e(self,i):
827
r"""
828
Return the action of `e_i` on ``self``.
829
830
INPUT:
831
832
- ``i`` -- An element of the index set
833
834
EXAMPLES::
835
836
sage: B = ElementaryCrystal(['E',7],1)
837
sage: B(3).e(1)
838
4
839
sage: B(172).e_string([1]*171)
840
343
841
sage: B(0).e(2)
842
"""
843
if i == self.parent()._i:
844
return self.__class__(self.parent(), self._m+1)
845
else:
846
return None
847
848
def f(self, i):
849
r"""
850
Return the action of `f_i` on ``self``.
851
852
INPUT:
853
854
- ``i`` -- An element of the index set
855
856
EXAMPLES::
857
858
sage: B = ElementaryCrystal(['E',7],1)
859
sage: B(3).f(1)
860
2
861
sage: B(172).f_string([1]*171)
862
1
863
sage: B(0).e(2)
864
"""
865
if i == self.parent()._i:
866
return self.__class__(self.parent(), self._m-1)
867
else:
868
return None
869
870
def epsilon(self, i):
871
r"""
872
Return `\varepsilon_i` of ``self``.
873
874
INPUT:
875
876
- ``i`` -- An element of the index set
877
878
EXAMPLES::
879
880
sage: B = ElementaryCrystal(['F',4],3)
881
sage: [[B(j).epsilon(i) for i in B.index_set()] for j in range(5)]
882
[[-inf, -inf, 0, -inf],
883
[-inf, -inf, -1, -inf],
884
[-inf, -inf, -2, -inf],
885
[-inf, -inf, -3, -inf],
886
[-inf, -inf, -4, -inf]]
887
"""
888
if i == self.parent()._i:
889
return -self._m
890
else:
891
return float("-inf")
892
893
def phi(self, i):
894
r"""
895
Return `\varphi_i` of ``self``.
896
897
INPUT:
898
899
- ``i`` -- An element of the index set
900
901
EXAMPLES::
902
903
sage: B = ElementaryCrystal(['E',8,1],4)
904
sage: [[B(m).phi(j) for j in B.index_set()] for m in range(44,49)]
905
[[-inf, -inf, -inf, -inf, 44, -inf, -inf, -inf, -inf],
906
[-inf, -inf, -inf, -inf, 45, -inf, -inf, -inf, -inf],
907
[-inf, -inf, -inf, -inf, 46, -inf, -inf, -inf, -inf],
908
[-inf, -inf, -inf, -inf, 47, -inf, -inf, -inf, -inf],
909
[-inf, -inf, -inf, -inf, 48, -inf, -inf, -inf, -inf]]
910
"""
911
if i == self.parent()._i:
912
return self._m
913
else:
914
return float("-inf")
915
916
def weight(self):
917
r"""
918
Return the weight of ``self``.
919
920
EXAMPLES::
921
922
sage: B = ElementaryCrystal(['C',14],12)
923
sage: B(-385).weight()
924
-385*alpha[12]
925
"""
926
Q = self.parent().cartan_type().root_system().root_lattice()
927
return self._m * Q.simple_root(self.parent()._i)
928
929
class ComponentCrystal(Parent,UniqueRepresentation):
930
r"""
931
The component crystal.
932
933
Defined in [Kashiwara93]_, the component crystal `C = \{c\}` is the single
934
element crystal whose crystal structure is defined by
935
936
.. MATH::
937
938
\mathrm{wt}(c) = 0, \quad
939
e_i c = f_i c = 0, \quad
940
\varepsilon_i(c) = \varphi_i(c) = 0.
941
942
Note `C \cong B(0)`, where `B(0)` is the highest weight crystal of highest
943
weight `0`.
944
945
INPUT:
946
947
- ``cartan_type`` -- A Cartan type
948
"""
949
950
@staticmethod
951
def __classcall_private__(cls, cartan_type):
952
r"""
953
Normalize input to ensure a unique representation.
954
955
EXAMPLES::
956
957
sage: C = ComponentCrystal("A2")
958
sage: D = ComponentCrystal(CartanType(['A',2]))
959
sage: C is D
960
True
961
"""
962
cartan_type = CartanType(cartan_type)
963
return super(ComponentCrystal, cls).__classcall__(cls, cartan_type)
964
965
def __init__(self, cartan_type):
966
r"""
967
Initialize ``self``.
968
969
EXAMPLES::
970
971
sage: B = ComponentCrystal("D4")
972
sage: TestSuite(B).run()
973
"""
974
Parent.__init__(self, category = ClassicalCrystals())
975
self._cartan_type = cartan_type
976
self.module_generators = (self.element_class(self),)
977
978
def _repr_(self):
979
r"""
980
Return a string representation of ``self``.
981
982
EXAMPLES::
983
984
sage: C = ComponentCrystal("D4")
985
sage: C
986
The component crystal of type ['D', 4]
987
"""
988
return "The component crystal of type {0!s}".format(self._cartan_type)
989
990
def _element_constructor_(self, weight):
991
r"""
992
Construct an element of ``self``.
993
994
EXAMPLES::
995
996
sage: C = ComponentCrystal("E6")
997
sage: c = C.highest_weight_vector()
998
sage: c
999
c
1000
"""
1001
if weight != self._weight:
1002
raise ValueError("Only element is c")
1003
return self.element_class(self)
1004
1005
def cardinality(self):
1006
r"""
1007
Return the cardinality of ``self``, which is always `1`.
1008
1009
EXAMPLES::
1010
1011
sage: C = ComponentCrystal("E6")
1012
sage: c = C.highest_weight_vector()
1013
sage: C.cardinality()
1014
1
1015
"""
1016
return Integer(1)
1017
1018
class Element(AbstractSingleCrystalElement):
1019
r"""
1020
Element of a component crystal.
1021
"""
1022
def _repr_(self):
1023
r"""
1024
EXAMPLES::
1025
1026
sage: C = ComponentCrystal("F4")
1027
sage: c = C.highest_weight_vector()
1028
sage: c
1029
c
1030
"""
1031
return 'c'
1032
1033
def _latex_(self):
1034
r"""
1035
Return a LaTeX representation of ``self``.
1036
1037
EXAMPLES::
1038
1039
sage: C = ComponentCrystal("E7")
1040
sage: c = C.highest_weight_vector()
1041
sage: latex(c)
1042
{c}
1043
"""
1044
return "{c}"
1045
1046
def epsilon(self,i):
1047
r"""
1048
Return `\varepsilon_i` of ``self``, which is `0` for all `i`.
1049
1050
INPUT:
1051
1052
- ``i`` -- An element of the index set
1053
1054
EXAMPLES::
1055
1056
sage: C = ComponentCrystal("C5")
1057
sage: c = C.highest_weight_vector()
1058
sage: [c.epsilon(i) for i in C.index_set()]
1059
[0, 0, 0, 0, 0]
1060
"""
1061
return 0
1062
1063
def phi(self,i):
1064
r"""
1065
Return `\varphi_i` of ``self``, which is `0` for all `i`.
1066
1067
INPUT:
1068
1069
- ``i`` -- An element of the index set
1070
1071
EXAMPLES::
1072
1073
sage: C = ComponentCrystal("C5")
1074
sage: c = C.highest_weight_vector()
1075
sage: [c.phi(i) for i in C.index_set()]
1076
[0, 0, 0, 0, 0]
1077
"""
1078
return 0
1079
1080
def weight(self):
1081
r"""
1082
Return the weight of ``self``, which is always `0`.
1083
1084
EXAMPLES::
1085
1086
sage: C = ComponentCrystal("F4")
1087
sage: c = C.highest_weight_vector()
1088
sage: c.weight()
1089
(0, 0, 0, 0)
1090
"""
1091
return self.parent().weight_lattice_realization().zero()
1092
1093
1094