Path: blob/master/src/sage/combinat/crystals/letters.pyx
8817 views
r"""1Crystals of letters2"""34#*****************************************************************************5# Copyright (C) 2007 Anne Schilling <anne at math.ucdavis.edu>6# Nicolas M. Thiery <nthiery at users.sf.net>7# Daniel Bump <bump at match.stanford.edu>8# Brant Jones <brant at math.ucdavis.edu>9#10# Distributed under the terms of the GNU General Public License (GPL)11#12# This code is distributed in the hope that it will be useful,13# but WITHOUT ANY WARRANTY; without even the implied warranty of14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU15# General Public License for more details.16#17# The full text of the GPL is available at:18#19# http://www.gnu.org/licenses/20#****************************************************************************2122include "../../ext/python.pxi"2324from sage.misc.cachefunc import cached_method25from sage.misc.lazy_attribute import lazy_attribute26from sage.structure.unique_representation import UniqueRepresentation27from sage.structure.parent import Parent28from sage.structure.element cimport Element29from sage.categories.enumerated_sets import EnumeratedSets30from sage.categories.classical_crystals import ClassicalCrystals31from sage.combinat.root_system.cartan_type import CartanType3233def CrystalOfLetters(cartan_type, element_print_style=None, dual=None):34r"""35Return the crystal of letters of the given type.3637For classical types, this is a combinatorial model for the crystal38with highest weight `\Lambda_1` (the first fundamental weight).3940Any irreducible classical crystal appears as the irreducible41component of the tensor product of several copies of this crystal42(plus possibly one copy of the spin crystal, see :class:`CrystalOfSpins`).43See [KN94]_. Elements of this irreducible component have a fixed shape,44and can be fit inside a tableau shape. Otherwise said, any irreducible45classical crystal is isomorphic to a crystal of tableaux with cells46filled by elements of the crystal of letters (possibly tensored with47the crystal of spins).4849INPUT:5051- ``T`` -- A Cartan type5253REFERENCES:5455.. [KN94] M. Kashiwara and T. Nakashima.56Crystal graphs for representations of the `q`-analogue of classical Lie57algebras.58J. Algebra **165**, no. 2, pp. 295--345, 1994.5960EXAMPLES::6162sage: C = CrystalOfLetters(['A',5])63sage: C.list()64[1, 2, 3, 4, 5, 6]65sage: C.cartan_type()66['A', 5]6768For type `E_6`, one can also specify how elements are printed.69This option is usually set to None and the default representation is used.70If one chooses the option 'compact', the elements are printed in the more71compact convention with 27 letters ``+abcdefghijklmnopqrstuvwxyz`` and72the 27 letters ``-ABCDEFGHIJKLMNOPQRSTUVWXYZ`` for the dual crystal.7374EXAMPLES::7576sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact')77sage: C78The crystal of letters for type ['E', 6]79sage: C.list()80[+, 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]81sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact', dual = True)82sage: C83The crystal of letters for type ['E', 6] (dual)84sage: C.list()85[-, 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]86"""87ct = CartanType(cartan_type)88if ct.letter == 'A':89return ClassicalCrystalOfLetters(ct, Crystal_of_letters_type_A_element)90elif ct.letter == 'B':91return ClassicalCrystalOfLetters(ct, Crystal_of_letters_type_B_element)92elif ct.letter == 'C':93return ClassicalCrystalOfLetters(ct, Crystal_of_letters_type_C_element)94elif ct.letter == 'D':95return ClassicalCrystalOfLetters(ct, Crystal_of_letters_type_D_element)96elif ct.letter == 'E' and ct.rank() == 6:97if dual is None:98return ClassicalCrystalOfLetters(ct,99Crystal_of_letters_type_E6_element,100element_print_style)101else:102return ClassicalCrystalOfLetters(ct,103Crystal_of_letters_type_E6_element_dual,104element_print_style, dual = True)105elif ct.letter == 'E' and ct.rank() == 7:106return ClassicalCrystalOfLetters(ct, Crystal_of_letters_type_E7_element)107elif ct.letter == 'G':108return ClassicalCrystalOfLetters(ct, Crystal_of_letters_type_G_element)109else:110raise NotImplementedError111112class ClassicalCrystalOfLetters(UniqueRepresentation, Parent):113r"""114A generic class for classical crystals of letters.115116All classical crystals of letters should be instances of this class117or of subclasses. To define a new crystal of letters, one only118needs to implement a class for the elements (which subclasses119:class:`~sage.combinat.crystals.Letter`), with appropriate120`e_i` and `f_i` operations. If the module generator is not `1`, one also121needs to define the subclass :class:`ClassicalCrystalOfLetters` for the122crystal itself.123124The basic assumption is that crystals of letters are small, but125used intensively as building blocks. Therefore, we explicitly build126in memory the list of all elements, the crystal graph and its127transitive closure, so as to make the following operations constant128time: ``list``, ``cmp``, (todo: ``phi``, ``epsilon``, ``e``, and129``f`` with caching)130"""131def __init__(self, cartan_type, element_class, element_print_style = None, dual = None):132"""133EXAMPLES::134135sage: C = CrystalOfLetters(['A',5])136sage: C.category()137Category of classical crystals138sage: TestSuite(C).run()139"""140self.Element = element_class141Parent.__init__(self, category = ClassicalCrystals())142self._cartan_type = CartanType(cartan_type)143self.rename("The crystal of letters for type %s"%self._cartan_type)144if cartan_type.type() == 'E':145if cartan_type.rank() == 6:146if dual:147self.module_generators = (self._element_constructor_((6,)),)148self._ambient = CrystalOfLetters(CartanType(['E',6]))149self.rename("%s (dual)"%self)150else:151self.module_generators = (self._element_constructor_((1,)),)152elif cartan_type.rank() == 7:153self.module_generators = (self._element_constructor_((7,)),)154self._list = [x for x in super(ClassicalCrystalOfLetters, self).__iter__()]155else:156self.module_generators = (self._element_constructor_(1),)157if cartan_type.type() == 'G':158self._list = [self._element_constructor_(1),159self._element_constructor_(2),160self._element_constructor_(3),161self._element_constructor_(0),162self._element_constructor_(-3),163self._element_constructor_(-2),164self._element_constructor_(-1)]165else:166self._list = [self._element_constructor_(i)167for i in xrange(1, cartan_type.rank()+1)]168if cartan_type.type() == 'B':169self._list.append(self._element_constructor_(0))170if cartan_type.type() != 'A':171self._list += [self._element_constructor_(-i)172for i in xrange(cartan_type.rank(), 0, -1)]173else:174self._list.append(self._element_constructor_(cartan_type.rank()+1))175self._element_print_style = element_print_style176177def __call__(self, value):178"""179Parse input to valid values to give to ``_element_constructor_()``.180181EXAMPLES::182183sage: C = CrystalOfLetters(['E',6])184sage: c = C((1,))185sage: C([1]) == c186True187"""188if value.__class__ == self.element_class and value.parent() is self:189return value190if isinstance(value, list):191return self._element_constructor_(tuple(value))192return self._element_constructor_(value)193194@cached_method195def _element_constructor_(self, value):196"""197Convert ``value`` into an element of ``self``.198199EXAMPLES::200201sage: C = CrystalOfLetters(['A',5])202sage: c = C(1); c2031204sage: c.parent()205The crystal of letters for type ['A', 5]206sage: c is C(c)207True208"""209if value == 'E':210return EmptyLetter(self)211else: # Should do sanity checks!212return self.element_class(self, value)213214def __iter__(self):215"""216Iterate through ``self``.217218EXAMPLES::219220sage: C = CrystalOfLetters(['A',5])221sage: [x for x in C]222[1, 2, 3, 4, 5, 6]223"""224return iter(self._list)225226def list(self):227"""228Return a list of the elements of ``self``.229230EXAMPLES::231232sage: C = CrystalOfLetters(['A',5])233sage: C.list()234[1, 2, 3, 4, 5, 6]235"""236return self._list237238@lazy_attribute239def _digraph_closure(self):240"""241The transitive closure of the directed graph associated to ``self``.242243EXAMPLES::244245sage: CrystalOfLetters(['A',5])._digraph_closure246Transitive closure of : Digraph on 6 vertices247"""248return self.digraph().transitive_closure()249250def __contains__(self, x):251"""252EXAMPLES::253254sage: C = CrystalOfLetters(['A',5])255sage: 1 in C256False257sage: C(1) in C258True259"""260return x in self._list261262def lt_elements(self, x, y):263r"""264Return ``True`` if and only if there is a path from ``x`` to ``y`` in265the crystal graph, when ``x`` is not equal to ``y``.266267Because the crystal graph is classical, it is a directed acyclic268graph which can be interpreted as a poset. This function implements269the comparison function of this poset.270271EXAMPLES::272273sage: C = CrystalOfLetters(['A', 5])274sage: x = C(1)275sage: y = C(2)276sage: C.lt_elements(x,y)277True278sage: C.lt_elements(y,x)279False280sage: C.lt_elements(x,x)281False282sage: C = CrystalOfLetters(['D', 4])283sage: C.lt_elements(C(4),C(-4))284False285sage: C.lt_elements(C(-4),C(4))286False287"""288if x.parent() is not self or y.parent() is not self:289raise ValueError("Cannot compare elements of different parents")290if self._digraph_closure.has_edge(x,y):291return True292return False293294# temporary woraround while an_element is overriden by Parent295_an_element_ = EnumeratedSets.ParentMethods._an_element_296297# Utility. Note: much of this class should be factored out at some point!298cdef class Letter(Element):299r"""300A class for letters.301302Like :class:`ElementWrapper`, plus delegates ``__lt__`` (comparison)303to the parent.304305EXAMPLES::306307sage: from sage.combinat.crystals.letters import Letter308sage: a = Letter(ZZ, 1)309sage: Letter(ZZ, 1).parent()310Integer Ring311312sage: Letter(ZZ, 1)._repr_()313'1'314315sage: parent1 = ZZ # Any fake value ...316sage: parent2 = QQ # Any fake value ...317sage: l11 = Letter(parent1, 1)318sage: l12 = Letter(parent1, 2)319sage: l21 = Letter(parent2, 1)320sage: l22 = Letter(parent2, 2)321sage: l11 == l11322True323sage: l11 == l12324False325sage: l11 == l21 # not tested326False327328sage: C = CrystalOfLetters(['B', 3])329sage: C(0) != C(0)330False331sage: C(1) != C(-1)332True333"""334cdef readonly int value335336def __init__(self, parent, int value):337"""338EXAMPLES::339340sage: C = CrystalOfLetters(['B',4])341sage: a = C(3)342sage: TestSuite(a).run()343"""344self.value = value345Element.__init__(self, parent)346347def __setstate__(self, state):348r"""349Used in unpickling old pickles.350351EXAMPLES::352353sage: C = CrystalOfLetters(['B',4])354sage: a = C(3)355sage: loads(dumps(a)) == a356True357"""358self._set_parent(state[0])359self.value = state[1]['value']360361def __reduce__(self):362r"""363Used in pickling crystal of letters elements.364365EXAMPLES::366367sage: C = CrystalOfLetters(['A',3])368sage: a = C(1)369sage: a.__reduce__()370(The crystal of letters for type ['A', 3], (1,))371"""372return (self._parent, (self.value,))373374def _repr_(self):375"""376Return a string representation of ``self``.377378EXAMPLES::379380sage: C = CrystalOfLetters(['B', 3])381sage: C(0)3820383sage: C(1)3841385sage: C(-1)386-1387"""388return repr(self.value)389390def _latex_(self):391r"""392A latex representation of ``self``.393394EXAMPLES::395396sage: C = CrystalOfLetters(['D', 4])397sage: latex(C(2))3982399sage: latex(C(-3))400\overline{3}401"""402if self.value < 0:403return "\\overline{" + repr(-self.value) + "}"404return repr(self.value)405406def __hash__(self):407"""408Return the hash value of ``self``.409410EXAMPLES::411412sage: C = CrystalOfLetters(['D', 4])413sage: hash(C(4)) == hash(4)414True415"""416return self.value417418def __richcmp__(left, right, int op):419"""420Entry point for rich comparisons. Needed for cython because we are421overriding `__hash__()`.422423EXAMPLES::424425sage: C = CrystalOfLetters(['D', 4])426sage: C(4) > C(-4)427False428"""429return (<Element>left)._richcmp(right, op)430431cdef _richcmp_c_impl(left, Element right, int op):432"""433Return ``True`` if ``left`` compares with ``right`` based on ``op``.434435EXAMPLES::436437sage: C = CrystalOfLetters(['D', 4])438sage: C(4) > C(-4) # indirect doctest439False440sage: C(4) < C(-3)441True442sage: C(4) == C(4)443True444445TESTS::446447sage: C = CrystalOfLetters(['C', 3])448sage: C('E') == C(2)449False450sage: C(2) == C('E')451False452sage: C('E') == C('E')453True454"""455# Special case for the empty letter456if isinstance(left, EmptyLetter):457return isinstance(right, EmptyLetter) \458and (op == Py_EQ or op == Py_LE or op == Py_GE)459if isinstance(right, EmptyLetter):460return op == Py_NE461462cdef Letter self, x463self = left464x = right465if op == Py_EQ:466return self.value == x.value467if op == Py_NE:468return self.value != x.value469if op == Py_LT:470return self._parent.lt_elements(self, x)471if op == Py_GT:472return x.parent().lt_elements(x, self)473if op == Py_LE:474return self.value == x.value or self._parent.lt_elements(self, x)475if op == Py_GE:476return self.value == x.value or x.parent().lt_elements(x, self)477return False478479cdef class EmptyLetter(Element):480"""481The affine letter `\emptyset` thought of as a classical crystal letter482in classical type `B_n` and `C_n`.483484.. WARNING::485486This is not a classical letter.487488Used in the rigged configuration bijections.489"""490cdef readonly str value491492def __init__(self, parent):493"""494Initialize ``xelf``.495496EXAMPLES::497498sage: C = CrystalOfLetters(['C', 3])499sage: TestSuite(C('E')).run()500"""501self.value = 'E'502Element.__init__(self, parent)503504def __reduce__(self):505r"""506Used in pickling crystal of letters elements.507508EXAMPLES::509510sage: C = CrystalOfLetters(['C',3])511sage: a = C('E')512sage: a.__reduce__()513(The crystal of letters for type ['C', 3], ('E',))514"""515return (self._parent, ('E',))516517def _repr_(self):518"""519Return a string representation of ``self``.520521EXAMPLES::522523sage: C = CrystalOfLetters(['C', 3])524sage: C('E')525E526"""527return 'E'528529def _latex_(self):530"""531Return a latex representation of ``self``.532533EXAMPLES::534535sage: C = CrystalOfLetters(['C', 3])536sage: latex(C('E'))537\emptyset538"""539return "\\emptyset"540541def __hash__(self):542"""543Return the hash value of ``self``.544545EXAMPLES::546547sage: C = CrystalOfLetters(['D', 4])548sage: hash(C('E')) == hash('E')549True550"""551return hash(self.value)552553def weight(self):554"""555Return the weight of ``self``.556557EXAMPLES::558559sage: C = CrystalOfLetters(['C', 3])560sage: C('E').weight()561(0, 0, 0)562"""563return self.parent().weight_lattice_realization().zero()564565cpdef e(self, int i):566"""567Return `e_i` of ``self`` which is ``None``.568569EXAMPLES::570571sage: C = CrystalOfLetters(['C', 3])572sage: C('E').e(1)573"""574return None575576cpdef f(self, int i):577"""578Return `f_i` of ``self`` which is ``None``.579580EXAMPLES::581582sage: C = CrystalOfLetters(['C', 3])583sage: C('E').f(1)584"""585return None586587cpdef int epsilon(self, int i):588r"""589Return `\varepsilon_i` of ``self``.590591EXAMPLES::592593sage: C = CrystalOfLetters(['C', 3])594sage: C('E').epsilon(1)5950596"""597return 0598599cpdef int phi(self, int i):600r"""601Return `\varphi_i` of ``self``.602603EXAMPLES::604605sage: C = CrystalOfLetters(['C', 3])606sage: C('E').phi(1)6070608"""609return 0610611#########################612# Type A613#########################614615cdef class Crystal_of_letters_type_A_element(Letter):616r"""617Type `A` crystal of letters elements.618619TESTS::620621sage: C = CrystalOfLetters(['A',3])622sage: C.list()623[1, 2, 3, 4]624sage: [ [x < y for y in C] for x in C ]625[[False, True, True, True],626[False, False, True, True],627[False, False, False, True],628[False, False, False, False]]629630::631632sage: C = CrystalOfLetters(['A',5])633sage: C(1) < C(1), C(1) < C(2), C(1) < C(3), C(2) < C(1)634(False, True, True, False)635636::637638sage: TestSuite(C).run()639"""640def weight(self):641"""642Return the weight of ``self``.643644EXAMPLES::645646sage: [v.weight() for v in CrystalOfLetters(['A',3])]647[(1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1)]648"""649return self._parent.weight_lattice_realization().monomial(self.value-1)650651cpdef Letter e(self, int i):652r"""653Return the action of `e_i` on ``self``.654655EXAMPLES::656657sage: C = CrystalOfLetters(['A',4])658sage: [(c,i,c.e(i)) for i in C.index_set() for c in C if c.e(i) is not None]659[(2, 1, 1), (3, 2, 2), (4, 3, 3), (5, 4, 4)]660"""661if self.value == i+1:662return self._parent._element_constructor_(self.value-1)663else:664return None665666cpdef Letter f(self, int i):667r"""668Return the action of `f_i` on ``self``.669670EXAMPLES::671672sage: C = CrystalOfLetters(['A',4])673sage: [(c,i,c.f(i)) for i in C.index_set() for c in C if c.f(i) is not None]674[(1, 1, 2), (2, 2, 3), (3, 3, 4), (4, 4, 5)]675"""676if self.value == i:677return self._parent._element_constructor_(self.value+1)678else:679return None680681cpdef int epsilon(self, int i):682r"""683Return `\varepsilon_i` of ``self``.684685EXAMPLES::686687sage: C = CrystalOfLetters(['A',4])688sage: [(c,i) for i in C.index_set() for c in C if c.epsilon(i) != 0]689[(2, 1), (3, 2), (4, 3), (5, 4)]690"""691if self.value == i+1:692return 1693return 0694695cpdef int phi(self, int i):696r"""697Return `\varphi_i` of ``self``.698699EXAMPLES::700701sage: C = CrystalOfLetters(['A',4])702sage: [(c,i) for i in C.index_set() for c in C if c.phi(i) != 0]703[(1, 1), (2, 2), (3, 3), (4, 4)]704"""705if self.value == i:706return 1707return 0708709#########################710# Type B711#########################712713cdef class Crystal_of_letters_type_B_element(Letter):714r"""715Type `B` crystal of letters elements.716717TESTS::718719sage: C = CrystalOfLetters(['B',3])720sage: TestSuite(C).run()721"""722def weight(self):723"""724Return the weight of ``self``.725726EXAMPLES::727728sage: [v.weight() for v in CrystalOfLetters(['B',3])]729[(1, 0, 0),730(0, 1, 0),731(0, 0, 1),732(0, 0, 0),733(0, 0, -1),734(0, -1, 0),735(-1, 0, 0)]736"""737if self.value > 0:738return self._parent.weight_lattice_realization().monomial(self.value-1)739elif self.value < 0:740return -self._parent.weight_lattice_realization().monomial(-self.value-1)741else:742return self._parent.weight_lattice_realization()(0)743744cpdef Letter e(self, int i):745r"""746Return the action of `e_i` on ``self``.747748EXAMPLES::749750sage: C = CrystalOfLetters(['B',4])751sage: [(c,i,c.e(i)) for i in C.index_set() for c in C if c.e(i) is not None]752[(2, 1, 1),753(-1, 1, -2),754(3, 2, 2),755(-2, 2, -3),756(4, 3, 3),757(-3, 3, -4),758(0, 4, 4),759(-4, 4, 0)]760"""761if self.value == i+1:762return self._parent._element_constructor_(i)763elif self.value == 0 and i == self._parent._cartan_type.n:764return self._parent._element_constructor_(self._parent._cartan_type.n)765elif self.value == -i:766if i == self._parent._cartan_type.n:767return self._parent._element_constructor_(0)768else:769return self._parent._element_constructor_(-i-1)770else:771return None772773cpdef Letter f(self, int i):774r"""775Return the actions of `f_i` on ``self``.776777EXAMPLES::778779sage: C = CrystalOfLetters(['B',4])780sage: [(c,i,c.f(i)) for i in C.index_set() for c in C if c.f(i) is not None]781[(1, 1, 2),782(-2, 1, -1),783(2, 2, 3),784(-3, 2, -2),785(3, 3, 4),786(-4, 3, -3),787(4, 4, 0),788(0, 4, -4)]789"""790if self.value == i:791if i < self._parent._cartan_type.n:792return self._parent._element_constructor_(i+1)793else:794return self._parent._element_constructor_(0)795elif self.value == 0 and i == self._parent._cartan_type.n:796return self._parent._element_constructor_(-self._parent._cartan_type.n)797elif self.value == -i-1:798return self._parent._element_constructor_(-i)799else:800return None801802cpdef int epsilon(self, int i):803r"""804Return `\varepsilon_i` of ``self``.805806EXAMPLES::807808sage: C = CrystalOfLetters(['B',3])809sage: [(c,i) for i in C.index_set() for c in C if c.epsilon(i) != 0]810[(2, 1), (-1, 1), (3, 2), (-2, 2), (0, 3), (-3, 3)]811"""812cdef int n = self._parent._cartan_type.n813if self.value == 0:814if i == n:815return 1816return 0817if i == n and self.value == -n:818return 2819if self.value == i+1 or self.value == -i:820return 1821return 0822823cpdef int phi(self, int i):824r"""825Return `\varphi_i` of ``self``.826827EXAMPLES::828829sage: C = CrystalOfLetters(['B',3])830sage: [(c,i) for i in C.index_set() for c in C if c.phi(i) != 0]831[(1, 1), (-2, 1), (2, 2), (-3, 2), (3, 3), (0, 3)]832"""833cdef int n = self._parent._cartan_type.n834if self.value == 0:835if i == n:836return 1837return 0838if i == n and self.value == n:839return 2840if self.value == i or self.value == -i-1:841return 1842return 0843844#########################845# Type C846#########################847848cdef class Crystal_of_letters_type_C_element(Letter):849r"""850Type `C` crystal of letters elements.851852TESTS::853854sage: C = CrystalOfLetters (['C',3])855sage: C.list()856[1, 2, 3, -3, -2, -1]857sage: [ [x < y for y in C] for x in C ]858[[False, True, True, True, True, True],859[False, False, True, True, True, True],860[False, False, False, True, True, True],861[False, False, False, False, True, True],862[False, False, False, False, False, True],863[False, False, False, False, False, False]]864sage: TestSuite(C).run()865"""866def weight(self):867"""868Return the weight of ``self``.869870EXAMPLES::871872sage: [v.weight() for v in CrystalOfLetters(['C',3])]873[(1, 0, 0), (0, 1, 0), (0, 0, 1), (0, 0, -1), (0, -1, 0), (-1, 0, 0)]874"""875if self.value > 0:876return self._parent.weight_lattice_realization().monomial(self.value-1)877elif self.value < 0:878return -self._parent.weight_lattice_realization().monomial(-self.value-1)879else:880return self._parent.weight_lattice_realization()(0)881882cpdef Letter e(self, int i):883r"""884Return the action of `e_i` on ``self``.885886EXAMPLES::887888sage: C = CrystalOfLetters(['C',4])889sage: [(c,i,c.e(i)) for i in C.index_set() for c in C if c.e(i) is not None]890[(2, 1, 1),891(-1, 1, -2),892(3, 2, 2),893(-2, 2, -3),894(4, 3, 3),895(-3, 3, -4),896(-4, 4, 4)]897"""898if self.value == -self._parent._cartan_type.n and self.value == -i:899return self._parent._element_constructor_(-self.value)900elif self.value == i+1 or self.value == -i:901return self._parent._element_constructor_(self.value-1)902else:903return None904905cpdef Letter f(self, int i):906r"""907Return the action of `f_i` on ``self``.908909EXAMPLES::910911sage: C = CrystalOfLetters(['C',4])912sage: [(c,i,c.f(i)) for i in C.index_set() for c in C if c.f(i) is not None]913[(1, 1, 2), (-2, 1, -1), (2, 2, 3),914(-3, 2, -2), (3, 3, 4), (-4, 3, -3), (4, 4, -4)]915"""916if self.value == self._parent._cartan_type.n and self.value == i:917return self._parent._element_constructor_(-self.value)918elif self.value == i or self.value == -i-1:919return self._parent._element_constructor_(self.value+1)920else:921return None922923cpdef int epsilon(self, int i):924r"""925Return `\varepsilon_i` of ``self``.926927EXAMPLES::928929sage: C = CrystalOfLetters(['C',3])930sage: [(c,i) for i in C.index_set() for c in C if c.epsilon(i) != 0]931[(2, 1), (-1, 1), (3, 2), (-2, 2), (-3, 3)]932"""933if self.value == i+1 or self.value == -i:934return 1935return 0936937cpdef int phi(self, int i):938r"""939Return `\varphi_i` of ``self``.940941EXAMPLES::942943sage: C = CrystalOfLetters(['C',3])944sage: [(c,i) for i in C.index_set() for c in C if c.phi(i) != 0]945[(1, 1), (-2, 1), (2, 2), (-3, 2), (3, 3)]946"""947if self.value == i or self.value == -i-1:948return 1949return 0950951#########################952# Type D953#########################954955cdef class Crystal_of_letters_type_D_element(Letter):956r"""957Type `D` crystal of letters elements.958959TESTS::960961sage: C = CrystalOfLetters(['D',4])962sage: C.list()963[1, 2, 3, 4, -4, -3, -2, -1]964sage: TestSuite(C).run()965"""966def weight(self):967"""968Return the weight of ``self``.969970EXAMPLES::971972sage: [v.weight() for v in CrystalOfLetters(['D',4])]973[(1, 0, 0, 0),974(0, 1, 0, 0),975(0, 0, 1, 0),976(0, 0, 0, 1),977(0, 0, 0, -1),978(0, 0, -1, 0),979(0, -1, 0, 0),980(-1, 0, 0, 0)]981"""982if self.value > 0:983return self._parent.weight_lattice_realization().monomial(self.value-1)984elif self.value < 0:985return -self._parent.weight_lattice_realization().monomial(-self.value-1)986else:987return self._parent.weight_lattice_realization()(0)988989cpdef Letter e(self, int i):990r"""991Return the action of `e_i` on ``self``.992993EXAMPLES::994995sage: C = CrystalOfLetters(['D',5])996sage: [(c,i,c.e(i)) for i in C.index_set() for c in C if c.e(i) is not None]997[(2, 1, 1),998(-1, 1, -2),999(3, 2, 2),1000(-2, 2, -3),1001(4, 3, 3),1002(-3, 3, -4),1003(5, 4, 4),1004(-4, 4, -5),1005(-5, 5, 4),1006(-4, 5, 5)]1007"""1008if i == self._parent._cartan_type.n:1009if self.value == -i:1010return self._parent._element_constructor_(i-1)1011elif self.value == -(i-1):1012return self._parent._element_constructor_(i)1013else:1014return None1015elif self.value == i+1:1016return self._parent._element_constructor_(i)1017elif self.value == -i:1018return self._parent._element_constructor_(-(i+1))1019else:1020return None10211022cpdef Letter f(self, int i):1023r"""1024Return the action of `f_i` on ``self``.10251026EXAMPLES::10271028sage: C = CrystalOfLetters(['D',5])1029sage: [(c,i,c.f(i)) for i in C.index_set() for c in C if c.f(i) is not None]1030[(1, 1, 2),1031(-2, 1, -1),1032(2, 2, 3),1033(-3, 2, -2),1034(3, 3, 4),1035(-4, 3, -3),1036(4, 4, 5),1037(-5, 4, -4),1038(4, 5, -5),1039(5, 5, -4)]1040"""1041if i == self.value:1042if i == self._parent._cartan_type.n:1043return self._parent._element_constructor_(-(i-1))1044else:1045return self._parent._element_constructor_(i+1)1046elif self.value == -(i+1):1047return self._parent._element_constructor_(-i)1048elif self.value == self._parent._cartan_type.n-1 and i == self.value+1:1049return self._parent._element_constructor_(-i)1050else:1051return None10521053cpdef int epsilon(self, int i):1054r"""1055Return `\varepsilon_i` of ``self``.10561057EXAMPLES::10581059sage: C = CrystalOfLetters(['D',4])1060sage: [(c,i) for i in C.index_set() for c in C if c.epsilon(i) != 0]1061[(2, 1), (-1, 1), (3, 2), (-2, 2), (4, 3), (-3, 3), (-4, 4), (-3, 4)]1062"""1063if self.value == i+1 or self.value == -i:1064return 11065cdef int n = self._parent._cartan_type.n1066if i == n and self.value == -n+1:1067return 11068return 010691070cpdef int phi(self, int i):1071r"""1072Return `\varphi_i` of ``self``.10731074EXAMPLES::10751076sage: C = CrystalOfLetters(['D',4])1077sage: [(c,i) for i in C.index_set() for c in C if c.phi(i) != 0]1078[(1, 1), (-2, 1), (2, 2), (-3, 2), (3, 3), (-4, 3), (3, 4), (4, 4)]1079"""1080if self.value == i or self.value == -i-1:1081return 11082cdef int n = self._parent._cartan_type.n1083if i == n and self.value == n-1:1084return 11085return 010861087#########################1088# Type G21089#########################10901091cdef class Crystal_of_letters_type_G_element(Letter):1092r"""1093Type `G_2` crystal of letters elements.10941095TESTS::10961097sage: C = CrystalOfLetters(['G',2])1098sage: C.list()1099[1, 2, 3, 0, -3, -2, -1]1100sage: TestSuite(C).run()1101"""1102def weight(self):1103"""1104Return the weight of ``self``.11051106EXAMPLES::11071108sage: [v.weight() for v in CrystalOfLetters(['G',2])]1109[(1, 0, -1), (1, -1, 0), (0, 1, -1), (0, 0, 0), (0, -1, 1), (-1, 1, 0), (-1, 0, 1)]1110"""1111if self.value == 1:1112return self._parent.weight_lattice_realization()((1, 0, -1))1113elif self.value == 2:1114return self._parent.weight_lattice_realization()((1, -1, 0))1115elif self.value == 3:1116return self._parent.weight_lattice_realization()((0, 1, -1))1117elif self.value == 0:1118return self._parent.weight_lattice_realization()((0, 0, 0))1119elif self.value == -3:1120return self._parent.weight_lattice_realization()((0, -1, 1))1121elif self.value == -2:1122return self._parent.weight_lattice_realization()((-1, 1, 0))1123elif self.value == -1:1124return self._parent.weight_lattice_realization()((-1, 0, 1))1125else:1126raise RuntimeError("G2 crystal of letters element %d not valid"%self.value)11271128cpdef Letter e(self, int i):1129r"""1130Return the action of `e_i` on ``self``.11311132EXAMPLES::11331134sage: C = CrystalOfLetters(['G',2])1135sage: [(c,i,c.e(i)) for i in C.index_set() for c in C if c.e(i) is not None]1136[(2, 1, 1),1137(0, 1, 3),1138(-3, 1, 0),1139(-1, 1, -2),1140(3, 2, 2),1141(-2, 2, -3)]1142"""1143if i == 1:1144if self.value == 2:1145return self._parent._element_constructor_(1)1146elif self.value == 0:1147return self._parent._element_constructor_(3)1148elif self.value == -3:1149return self._parent._element_constructor_(0)1150elif self.value == -1:1151return self._parent._element_constructor_(-2)1152else:1153return None1154else:1155if self.value == 3:1156return self._parent._element_constructor_(2)1157elif self.value == -2:1158return self._parent._element_constructor_(-3)1159else:1160return None11611162cpdef Letter f(self, int i):1163r"""1164Return the action of `f_i` on ``self``.11651166EXAMPLES::11671168sage: C = CrystalOfLetters(['G',2])1169sage: [(c,i,c.f(i)) for i in C.index_set() for c in C if c.f(i) is not None]1170[(1, 1, 2),1171(3, 1, 0),1172(0, 1, -3),1173(-2, 1, -1),1174(2, 2, 3),1175(-3, 2, -2)]1176"""1177if i == 1:1178if self.value == 1:1179return self._parent._element_constructor_(2)1180elif self.value == 3:1181return self._parent._element_constructor_(0)1182elif self.value == 0:1183return self._parent._element_constructor_(-3)1184elif self.value == -2:1185return self._parent._element_constructor_(-1)1186else:1187return None1188else:1189if self.value == 2:1190return self._parent._element_constructor_(3)1191elif self.value == -3:1192return self._parent._element_constructor_(-2)1193else:1194return None11951196cpdef int epsilon(self, int i):1197r"""1198Return `\varepsilon_i` of ``self``.11991200EXAMPLES::12011202sage: C = CrystalOfLetters(['G',2])1203sage: [(c,i,c.epsilon(i)) for i in C.index_set() for c in C if c.epsilon(i) != 0]1204[(2, 1, 1), (0, 1, 1), (-3, 1, 2), (-1, 1, 1), (3, 2, 1), (-2, 2, 1)]1205"""1206if i == 1:1207if self.value in (2,0,-1):1208return 11209if self.value == -3:1210return 21211return 01212if self.value == 3 or self.value == -2: # i must be 21213return 11214return 012151216cpdef int phi(self, int i):1217r"""1218Return `\varphi_i` of ``self``.12191220EXAMPLES::12211222sage: C = CrystalOfLetters(['G',2])1223sage: [(c,i,c.phi(i)) for i in C.index_set() for c in C if c.phi(i) != 0]1224[(1, 1, 1), (3, 1, 2), (0, 1, 1), (-2, 1, 1), (2, 2, 1), (-3, 2, 1)]1225"""1226if i == 1:1227if self.value in (1,0,-2):1228return 11229if self.value == 3:1230return 21231return 01232if self.value == -3 or self.value == 2: # i must be 21233return 11234return 012351236#########################1237# Type E Letter1238#########################12391240cdef class LetterTuple(Element):1241"""1242Abstract class for type `E` letters.1243"""1244cdef readonly tuple value12451246def __init__(self, parent, tuple value):1247"""1248Initialize ``self``.12491250EXAMPLES::12511252sage: C = CrystalOfLetters(['E',6])1253sage: a = C((1,-3))1254sage: TestSuite(a).run()1255"""1256self.value = value1257Element.__init__(self, parent)12581259def __setstate__(self, state):1260r"""1261Used in unpickling old pickles.12621263EXAMPLES::12641265sage: C = CrystalOfLetters(['E',6])1266sage: a = C((1,-3))1267sage: loads(dumps(a)) == a1268True1269"""1270self._set_parent(state[0])1271self.value = tuple(state[1]['value'])12721273def __reduce__(self):1274"""1275Used in pickling of letters.12761277EXAMPLES::12781279sage: C = CrystalOfLetters(['E',6])1280sage: a = C((1,-3))1281sage: a.__reduce__()1282(The crystal of letters for type ['E', 6], ((1, -3),))1283"""1284return (self._parent, (self.value,))12851286def __hash__(self):1287"""1288Return the hash value of ``self``.12891290EXAMPLES::12911292sage: C = CrystalOfLetters(['E', 6])1293sage: hash(C((1, -3))) == hash((1, -3))1294True1295"""1296return hash(self.value)12971298def __richcmp__(left, right, int op):1299"""1300Entry point for rich comparisons. Needed for cython because we are1301overriding `__hash__()`.13021303EXAMPLES::13041305sage: C = CrystalOfLetters(['E', 6])1306sage: C((1,)) > C((-1, 3))1307False1308"""1309return (<Element>left)._richcmp(right, op)13101311cdef _richcmp_c_impl(left, Element right, int op):1312"""1313Check comparison between ``left`` and ``right`` based on ``op``13141315EXAMPLES::13161317sage: C = CrystalOfLetters(['E', 6])1318sage: C((1,)) < C((-1, 3)) # indirect doctest1319True1320sage: C((6,)) < C((1,))1321False1322sage: C((-1, 3)) == C((-1, 3))1323True1324"""1325cdef LetterTuple self, x1326self = left1327x = right1328if op == Py_EQ:1329return self.value == x.value1330if op == Py_NE:1331return self.value != x.value1332if op == Py_LT:1333return self._parent.lt_elements(self, x)1334if op == Py_GT:1335return x._parent.lt_elements(x, self)1336if op == Py_LE:1337return self.value == x.value or self._parent.lt_elements(self, x)1338if op == Py_GE:1339return self.value == x.value or x._parent.lt_elements(x, self)1340return False13411342def _repr_(self):1343"""1344Return a string representation of ``self``.13451346EXAMPLES::13471348sage: C = CrystalOfLetters(['E', 6])1349sage: C((-1, 3))1350(-1, 3)1351"""1352return repr(self.value)13531354def _latex_(self):1355r"""1356A latex representation of ``self``.13571358EXAMPLES::13591360sage: C = CrystalOfLetters(['E', 6])1361sage: latex(C((-1, 3)))1362\left(\overline{1}, 3\right)1363"""1364ret = "\\left("1365first = True1366for v in self.value:1367if not first:1368ret += ", "1369else:1370first = False1371if v < 0:1372ret += "\\overline{" + repr(-v) + "}"1373else:1374ret+= repr(v)1375return ret + "\\right)"13761377cpdef int epsilon(self, int i):1378r"""1379Return `\varepsilon_i` of ``self``.13801381EXAMPLES::13821383sage: C = CrystalOfLetters(['E',6])1384sage: C((-6,)).epsilon(1)138501386sage: C((-6,)).epsilon(6)138711388"""1389if -i in self.value:1390return 11391return 013921393cpdef int phi(self, int i):1394r"""1395Return `\varphi_i` of ``self``.13961397EXAMPLES::13981399sage: C = CrystalOfLetters(['E',6])1400sage: C((1,)).phi(1)140111402sage: C((1,)).phi(6)140301404"""1405if i in self.value:1406return 11407return 014081409#########################1410# Type E61411#########################14121413cdef class Crystal_of_letters_type_E6_element(LetterTuple):1414r"""1415Type `E_6` crystal of letters elements. This crystal corresponds to the highest weight1416crystal `B(\Lambda_1)`.14171418TESTS::14191420sage: C = CrystalOfLetters(['E',6])1421sage: C.module_generators1422((1,),)1423sage: C.list()1424[(1,), (-1, 3), (-3, 4), (-4, 2, 5), (-2, 5), (-5, 2, 6), (-2, -5, 4, 6),1425(-4, 3, 6), (-3, 1, 6), (-1, 6), (-6, 2), (-2, -6, 4), (-4, -6, 3, 5),1426(-3, -6, 1, 5), (-1, -6, 5), (-5, 3), (-3, -5, 1, 4), (-1, -5, 4), (-4, 1, 2),1427(-1, -4, 2, 3), (-3, 2), (-2, -3, 4), (-4, 5), (-5, 6), (-6,), (-2, 1), (-1, -2, 3)]1428sage: TestSuite(C).run()1429sage: all(b.f(i).e(i) == b for i in C.index_set() for b in C if b.f(i) is not None)1430True1431sage: all(b.e(i).f(i) == b for i in C.index_set() for b in C if b.e(i) is not None)1432True1433sage: G = C.digraph()1434sage: G.show(edge_labels=true, figsize=12, vertex_size=1)1435"""14361437def _repr_(self):1438"""1439In their full representation, the vertices of this crystal are labeled1440by their weight. For example vertex (-5,2,6) indicates that a 5-arrow1441is coming into this vertex, and a 2-arrow and 6-arrow is leaving the vertex.1442Specifying element_print_style = 'compact' for a given crystal C, labels the1443vertices of this crystal by the 27 letters +abcdefghijklmnopqrstuvwxyz.14441445EXAMPLES::14461447sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact')1448sage: C.list()1449[+, 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]1450"""1451if self._parent._element_print_style == 'compact':1452l=['+','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']1453return l[self._parent.list().index(self)]1454return repr(self.value)14551456def weight(self):1457"""1458Return the weight of ``self``.14591460EXAMPLES::14611462sage: [v.weight() for v in CrystalOfLetters(['E',6])]1463[(0, 0, 0, 0, 0, -2/3, -2/3, 2/3),1464(-1/2, 1/2, 1/2, 1/2, 1/2, -1/6, -1/6, 1/6),1465(1/2, -1/2, 1/2, 1/2, 1/2, -1/6, -1/6, 1/6),1466(1/2, 1/2, -1/2, 1/2, 1/2, -1/6, -1/6, 1/6),1467(-1/2, -1/2, -1/2, 1/2, 1/2, -1/6, -1/6, 1/6),1468(1/2, 1/2, 1/2, -1/2, 1/2, -1/6, -1/6, 1/6),1469(-1/2, -1/2, 1/2, -1/2, 1/2, -1/6, -1/6, 1/6),1470(-1/2, 1/2, -1/2, -1/2, 1/2, -1/6, -1/6, 1/6),1471(1/2, -1/2, -1/2, -1/2, 1/2, -1/6, -1/6, 1/6),1472(0, 0, 0, 0, 1, 1/3, 1/3, -1/3),1473(1/2, 1/2, 1/2, 1/2, -1/2, -1/6, -1/6, 1/6),1474(-1/2, -1/2, 1/2, 1/2, -1/2, -1/6, -1/6, 1/6),1475(-1/2, 1/2, -1/2, 1/2, -1/2, -1/6, -1/6, 1/6),1476(1/2, -1/2, -1/2, 1/2, -1/2, -1/6, -1/6, 1/6),1477(0, 0, 0, 1, 0, 1/3, 1/3, -1/3),1478(-1/2, 1/2, 1/2, -1/2, -1/2, -1/6, -1/6, 1/6),1479(1/2, -1/2, 1/2, -1/2, -1/2, -1/6, -1/6, 1/6),1480(0, 0, 1, 0, 0, 1/3, 1/3, -1/3),1481(1/2, 1/2, -1/2, -1/2, -1/2, -1/6, -1/6, 1/6),1482(0, 1, 0, 0, 0, 1/3, 1/3, -1/3),1483(1, 0, 0, 0, 0, 1/3, 1/3, -1/3),1484(0, -1, 0, 0, 0, 1/3, 1/3, -1/3),1485(0, 0, -1, 0, 0, 1/3, 1/3, -1/3),1486(0, 0, 0, -1, 0, 1/3, 1/3, -1/3),1487(0, 0, 0, 0, -1, 1/3, 1/3, -1/3),1488(-1/2, -1/2, -1/2, -1/2, -1/2, -1/6, -1/6, 1/6),1489(-1, 0, 0, 0, 0, 1/3, 1/3, -1/3)]1490"""1491R=self._parent.weight_lattice_realization().fundamental_weights()1492return sum(cmp(i,0)*R[abs(i)] for i in self.value)14931494cpdef LetterTuple e(self, int i):1495r"""1496Return the action of `e_i` on ``self``.14971498EXAMPLES::14991500sage: C = CrystalOfLetters(['E',6])1501sage: C((-1,3)).e(1)1502(1,)1503sage: C((-2,-3,4)).e(2)1504(-3, 2)1505sage: C((1,)).e(1)1506"""1507if self.value == (-1, 3) and i == 1:1508return self._parent._element_constructor_((1,))1509if self.value == (-3, 4) and i == 3:1510return self._parent._element_constructor_((-1, 3))1511if self.value == (-4, 2, 5) and i == 4:1512return self._parent._element_constructor_((-3, 4))1513if self.value == (-5, 2, 6) and i == 5:1514return self._parent._element_constructor_((-4, 2, 5))1515if self.value == (-2, 5) and i == 2:1516return self._parent._element_constructor_((-4, 2, 5))1517if self.value == (-6, 2) and i == 6:1518return self._parent._element_constructor_((-5, 2, 6))1519if self.value == (-2, -5, 4, 6) and i == 2:1520return self._parent._element_constructor_((-5, 2, 6))1521if self.value == (-2, -6, 4) and i == 2:1522return self._parent._element_constructor_((-6, 2))1523if self.value == (-2, -5, 4, 6) and i == 5:1524return self._parent._element_constructor_((-2, 5))1525if self.value == (-2, -6, 4) and i == 6:1526return self._parent._element_constructor_((-2, -5, 4, 6))1527if self.value == (-4, 3, 6) and i == 4:1528return self._parent._element_constructor_((-2, -5, 4, 6))1529if self.value == (-4, -6, 3, 5) and i == 4:1530return self._parent._element_constructor_((-2, -6, 4))1531if self.value == (-4, -6, 3, 5) and i == 6:1532return self._parent._element_constructor_((-4, 3, 6))1533if self.value == (-3, 1, 6) and i == 3:1534return self._parent._element_constructor_((-4, 3, 6))1535if self.value == (-5, 3) and i == 5:1536return self._parent._element_constructor_((-4, -6, 3, 5))1537if self.value == (-3, -6, 1, 5) and i == 3:1538return self._parent._element_constructor_((-4, -6, 3, 5))1539if self.value == (-3, -5, 1, 4) and i == 3:1540return self._parent._element_constructor_((-5, 3))1541if self.value == (-3, -6, 1, 5) and i == 6:1542return self._parent._element_constructor_((-3, 1, 6))1543if self.value == (-1, 6) and i == 1:1544return self._parent._element_constructor_((-3, 1, 6))1545if self.value == (-3, -5, 1, 4) and i == 5:1546return self._parent._element_constructor_((-3, -6, 1, 5))1547if self.value == (-1, -6, 5) and i == 1:1548return self._parent._element_constructor_((-3, -6, 1, 5))1549if self.value == (-4, 1, 2) and i == 4:1550return self._parent._element_constructor_((-3, -5, 1, 4))1551if self.value == (-1, -5, 4) and i == 1:1552return self._parent._element_constructor_((-3, -5, 1, 4))1553if self.value == (-2, 1) and i == 2:1554return self._parent._element_constructor_((-4, 1, 2))1555if self.value == (-1, -4, 2, 3) and i == 1:1556return self._parent._element_constructor_((-4, 1, 2))1557if self.value == (-1, -2, 3) and i == 1:1558return self._parent._element_constructor_((-2, 1))1559if self.value == (-1, -6, 5) and i == 6:1560return self._parent._element_constructor_((-1, 6))1561if self.value == (-1, -5, 4) and i == 5:1562return self._parent._element_constructor_((-1, -6, 5))1563if self.value == (-1, -4, 2, 3) and i == 4:1564return self._parent._element_constructor_((-1, -5, 4))1565if self.value == (-1, -2, 3) and i == 2:1566return self._parent._element_constructor_((-1, -4, 2, 3))1567if self.value == (-3, 2) and i == 3:1568return self._parent._element_constructor_((-1, -4, 2, 3))1569if self.value == (-2, -3, 4) and i == 3:1570return self._parent._element_constructor_((-1, -2, 3))1571if self.value == (-2, -3, 4) and i == 2:1572return self._parent._element_constructor_((-3, 2))1573if self.value == (-4, 5) and i == 4:1574return self._parent._element_constructor_((-2, -3, 4))1575if self.value == (-5, 6) and i == 5:1576return self._parent._element_constructor_((-4, 5))1577if self.value == (-6,) and i == 6:1578return self._parent._element_constructor_((-5, 6))1579else:1580return None15811582cpdef LetterTuple f(self, int i):1583r"""1584Return the action of `f_i` on ``self``.15851586EXAMPLES::15871588sage: C = CrystalOfLetters(['E',6])1589sage: C((1,)).f(1)1590(-1, 3)1591sage: C((-6,)).f(1)1592"""1593if self.value == (1,) and i == 1:1594return self._parent._element_constructor_((-1, 3))1595if self.value == (-1, 3) and i == 3:1596return self._parent._element_constructor_((-3, 4))1597if self.value == (-3, 4) and i == 4:1598return self._parent._element_constructor_((-4, 2, 5))1599if self.value == (-4, 2, 5) and i == 5:1600return self._parent._element_constructor_((-5, 2, 6))1601if self.value == (-4, 2, 5) and i == 2:1602return self._parent._element_constructor_((-2, 5))1603if self.value == (-5, 2, 6) and i == 6:1604return self._parent._element_constructor_((-6, 2))1605if self.value == (-5, 2, 6) and i == 2:1606return self._parent._element_constructor_((-2, -5, 4, 6))1607if self.value == (-6, 2) and i == 2:1608return self._parent._element_constructor_((-2, -6, 4))1609if self.value == (-2, 5) and i == 5:1610return self._parent._element_constructor_((-2, -5, 4, 6))1611if self.value == (-2, -5, 4, 6) and i == 6:1612return self._parent._element_constructor_((-2, -6, 4))1613if self.value == (-2, -5, 4, 6) and i == 4:1614return self._parent._element_constructor_((-4, 3, 6))1615if self.value == (-2, -6, 4) and i == 4:1616return self._parent._element_constructor_((-4, -6, 3, 5))1617if self.value == (-4, 3, 6) and i == 6:1618return self._parent._element_constructor_((-4, -6, 3, 5))1619if self.value == (-4, 3, 6) and i == 3:1620return self._parent._element_constructor_((-3, 1, 6))1621if self.value == (-4, -6, 3, 5) and i == 5:1622return self._parent._element_constructor_((-5, 3))1623if self.value == (-4, -6, 3, 5) and i == 3:1624return self._parent._element_constructor_((-3, -6, 1, 5))1625if self.value == (-5, 3) and i == 3:1626return self._parent._element_constructor_((-3, -5, 1, 4))1627if self.value == (-3, 1, 6) and i == 6:1628return self._parent._element_constructor_((-3, -6, 1, 5))1629if self.value == (-3, 1, 6) and i == 1:1630return self._parent._element_constructor_((-1, 6))1631if self.value == (-3, -6, 1, 5) and i == 5:1632return self._parent._element_constructor_((-3, -5, 1, 4))1633if self.value == (-3, -6, 1, 5) and i == 1:1634return self._parent._element_constructor_((-1, -6, 5))1635if self.value == (-3, -5, 1, 4) and i == 4:1636return self._parent._element_constructor_((-4, 1, 2))1637if self.value == (-3, -5, 1, 4) and i == 1:1638return self._parent._element_constructor_((-1, -5, 4))1639if self.value == (-4, 1, 2) and i == 2:1640return self._parent._element_constructor_((-2, 1))1641if self.value == (-4, 1, 2) and i == 1:1642return self._parent._element_constructor_((-1, -4, 2, 3))1643if self.value == (-2, 1) and i == 1:1644return self._parent._element_constructor_((-1, -2, 3))1645if self.value == (-1, 6) and i == 6:1646return self._parent._element_constructor_((-1, -6, 5))1647if self.value == (-1, -6, 5) and i == 5:1648return self._parent._element_constructor_((-1, -5, 4))1649if self.value == (-1, -5, 4) and i == 4:1650return self._parent._element_constructor_((-1, -4, 2, 3))1651if self.value == (-1, -4, 2, 3) and i == 2:1652return self._parent._element_constructor_((-1, -2, 3))1653if self.value == (-1, -4, 2, 3) and i == 3:1654return self._parent._element_constructor_((-3, 2))1655if self.value == (-1, -2, 3) and i == 3:1656return self._parent._element_constructor_((-2, -3, 4))1657if self.value == (-3, 2) and i == 2:1658return self._parent._element_constructor_((-2, -3, 4))1659if self.value == (-2, -3, 4) and i == 4:1660return self._parent._element_constructor_((-4, 5))1661if self.value == (-4, 5) and i == 5:1662return self._parent._element_constructor_((-5, 6))1663if self.value == (-5, 6) and i == 6:1664return self._parent._element_constructor_((-6,))1665else:1666return None16671668cdef class Crystal_of_letters_type_E6_element_dual(LetterTuple):1669r"""1670Type `E_6` crystal of letters elements. This crystal corresponds to the highest weight1671crystal `B(\Lambda_6)`. This crystal is dual to `B(\Lambda_1)` of type `E_6`.16721673TESTS::16741675sage: C = CrystalOfLetters(['E',6], dual = True)1676sage: C.module_generators1677((6,),)1678sage: all(b==b.retract(b.lift()) for b in C)1679True1680sage: C.list()1681[(6,), (5, -6), (4, -5), (2, 3, -4), (3, -2), (1, 2, -3), (2, -1), (1, 4, -2, -3),1682(4, -1, -2), (1, 5, -4), (3, 5, -1, -4), (5, -3), (1, 6, -5), (3, 6, -1, -5), (4, 6, -3, -5),1683(2, 6, -4), (6, -2), (1, -6), (3, -1, -6), (4, -3, -6), (2, 5, -4, -6), (5, -2, -6), (2, -5),1684(4, -2, -5), (3, -4), (1, -3), (-1,)]1685sage: TestSuite(C).run()1686sage: all(b.f(i).e(i) == b for i in C.index_set() for b in C if b.f(i) is not None)1687True1688sage: all(b.e(i).f(i) == b for i in C.index_set() for b in C if b.e(i) is not None)1689True1690sage: G = C.digraph()1691sage: G.show(edge_labels=true, figsize=12, vertex_size=1)1692"""16931694def _repr_(self):1695"""1696In their full representation, the vertices of this crystal are labeled1697by their weight. For example vertex (-2,1) indicates that a 2-arrow1698is coming into this vertex, and a 1-arrow is leaving the vertex.1699Specifying the option element_print_style = 'compact' for a given crystal C,1700labels the vertices of this crystal by the 27 letters -ABCDEFGHIJKLMNOPQRSTUVWXYZ17011702EXAMPLES::17031704sage: C = CrystalOfLetters(['E',6], element_print_style = 'compact', dual = True)1705sage: C.list()1706[-, 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]1707"""1708if self._parent._element_print_style == 'compact':1709l=['-','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']1710return l[self._parent.list().index(self)]1711return repr(self.value)17121713cpdef LetterTuple lift(self):1714"""1715Lift an element of ``self`` to the crystal of letters1716``CrystalOfLetters(['E',6])`` by taking its inverse weight.17171718EXAMPLES::17191720sage: C = CrystalOfLetters(['E',6], dual = True)1721sage: b = C.module_generators[0]1722sage: b.lift()1723(-6,)1724"""1725# Because a generators are not supported and the element constuctor1726# being a cached method can't take lists as input, we have to make a1727# tuple from a list1728return self._parent._ambient(tuple([-i for i in self.value]))17291730cpdef LetterTuple retract(self, LetterTuple p):1731"""1732Retract element ``p``, which is an element in1733``CrystalOfLetters(['E',6])`` to an element in1734``CrystalOfLetters(['E',6], dual=True)`` by taking its inverse weight.17351736EXAMPLES::17371738sage: C = CrystalOfLetters(['E',6])1739sage: Cd = CrystalOfLetters(['E',6], dual = True)1740sage: b = Cd.module_generators[0]1741sage: p = C((-1,3))1742sage: b.retract(p)1743(1, -3)1744sage: b.retract(None)1745"""1746if p is None:1747return None1748# Because a generators are not supported and the element constuctor1749# being a cached method can't take lists as input, we have to make a1750# tuple from a list1751return self._parent._element_constructor_(tuple([-i for i in p.value]))17521753cpdef LetterTuple e(self, int i):1754r"""1755Return the action of `e_i` on ``self``.17561757EXAMPLES::17581759sage: C = CrystalOfLetters(['E',6], dual = True)1760sage: C((-1,)).e(1)1761(1, -3)1762"""1763return self.retract(self.lift().f(i))17641765cpdef LetterTuple f(self, int i):1766r"""1767Return the action of `f_i` on ``self``.17681769EXAMPLES::17701771sage: C = CrystalOfLetters(['E',6], dual = True)1772sage: C((6,)).f(6)1773(5, -6)1774sage: C((6,)).f(1)1775"""1776return self.retract(self.lift().e(i))17771778def weight(self):1779"""1780Return the weight of ``self``.17811782EXAMPLES::17831784sage: C = CrystalOfLetters(['E',6], dual = True)1785sage: b=C.module_generators[0]1786sage: b.weight()1787(0, 0, 0, 0, 1, -1/3, -1/3, 1/3)1788sage: [v.weight() for v in C]1789[(0, 0, 0, 0, 1, -1/3, -1/3, 1/3),1790(0, 0, 0, 1, 0, -1/3, -1/3, 1/3),1791(0, 0, 1, 0, 0, -1/3, -1/3, 1/3),1792(0, 1, 0, 0, 0, -1/3, -1/3, 1/3),1793(-1, 0, 0, 0, 0, -1/3, -1/3, 1/3),1794(1, 0, 0, 0, 0, -1/3, -1/3, 1/3),1795(1/2, 1/2, 1/2, 1/2, 1/2, 1/6, 1/6, -1/6),1796(0, -1, 0, 0, 0, -1/3, -1/3, 1/3),1797(-1/2, -1/2, 1/2, 1/2, 1/2, 1/6, 1/6, -1/6),1798(0, 0, -1, 0, 0, -1/3, -1/3, 1/3),1799(-1/2, 1/2, -1/2, 1/2, 1/2, 1/6, 1/6, -1/6),1800(1/2, -1/2, -1/2, 1/2, 1/2, 1/6, 1/6, -1/6),1801(0, 0, 0, -1, 0, -1/3, -1/3, 1/3),1802(-1/2, 1/2, 1/2, -1/2, 1/2, 1/6, 1/6, -1/6),1803(1/2, -1/2, 1/2, -1/2, 1/2, 1/6, 1/6, -1/6),1804(1/2, 1/2, -1/2, -1/2, 1/2, 1/6, 1/6, -1/6),1805(-1/2, -1/2, -1/2, -1/2, 1/2, 1/6, 1/6, -1/6),1806(0, 0, 0, 0, -1, -1/3, -1/3, 1/3),1807(-1/2, 1/2, 1/2, 1/2, -1/2, 1/6, 1/6, -1/6),1808(1/2, -1/2, 1/2, 1/2, -1/2, 1/6, 1/6, -1/6),1809(1/2, 1/2, -1/2, 1/2, -1/2, 1/6, 1/6, -1/6),1810(-1/2, -1/2, -1/2, 1/2, -1/2, 1/6, 1/6, -1/6),1811(1/2, 1/2, 1/2, -1/2, -1/2, 1/6, 1/6, -1/6),1812(-1/2, -1/2, 1/2, -1/2, -1/2, 1/6, 1/6, -1/6),1813(-1/2, 1/2, -1/2, -1/2, -1/2, 1/6, 1/6, -1/6),1814(1/2, -1/2, -1/2, -1/2, -1/2, 1/6, 1/6, -1/6),1815(0, 0, 0, 0, 0, 2/3, 2/3, -2/3)]1816"""1817return -self.lift().weight()181818191820#########################1821# Type E71822#########################18231824cdef class Crystal_of_letters_type_E7_element(LetterTuple):1825r"""1826Type `E_7` crystal of letters elements. This crystal corresponds to the highest weight1827crystal `B(\Lambda_7)`.18281829TESTS::18301831sage: C = CrystalOfLetters(['E',7])1832sage: C.module_generators1833((7,),)1834sage: C.list()1835[(7,), (-7, 6), (-6, 5), (-5, 4), (-4, 2, 3), (-2, 3), (-3, 1, 2), (-1,18362), (-3, -2, 1, 4), (-1, -2, 4), (-4, 1, 5), (-4, -1, 3, 5), (-3, 5),1837(-5, 6, 1), (-5, -1, 3, 6), (-5, -3, 4, 6), (-4, 2, 6), (-2, 6), (-6, 7,18381), (-1, -6, 3, 7), (-6, -3, 7, 4), (-6, -4, 2, 7, 5), (-6, -2, 7, 5),1839(-5, 7, 2), (-5, -2, 4, 7), (-4, 7, 3), (-3, 1, 7), (-1, 7), (-7, 1),1840(-1, -7, 3), (-7, -3, 4), (-4, -7, 2, 5), (-7, -2, 5), (-5, -7, 6, 2),1841(-5, -2, -7, 4, 6), (-7, -4, 6, 3), (-3, -7, 1, 6), (-7, -1, 6), (-6,18422), (-2, -6, 4), (-6, -4, 5, 3), (-3, -6, 1, 5), (-6, -1, 5), (-5, 3),1843(-3, -5, 4, 1), (-5, -1, 4), (-4, 1, 2), (-1, -4, 3, 2), (-3, 2), (-2,1844-3, 4), (-4, 5), (-5, 6), (-6, 7), (-7,), (-2, 1), (-2, -1, 3)]1845sage: TestSuite(C).run()1846sage: all(b.f(i).e(i) == b for i in C.index_set() for b in C if b.f(i) is not None)1847True1848sage: all(b.e(i).f(i) == b for i in C.index_set() for b in C if b.e(i) is not None)1849True1850sage: G = C.digraph()1851sage: G.show(edge_labels=true, figsize=12, vertex_size=1)1852"""18531854def weight(self):1855"""1856Return the weight of ``self``.18571858EXAMPLES::18591860sage: [v.weight() for v in CrystalOfLetters(['E',7])]1861[(0, 0, 0, 0, 0, 1, -1/2, 1/2), (0, 0, 0, 0, 1, 0, -1/2, 1/2), (0, 0, 0,18621, 0, 0, -1/2, 1/2), (0, 0, 1, 0, 0, 0, -1/2, 1/2), (0, 1, 0, 0, 0, 0,1863-1/2, 1/2), (-1, 0, 0, 0, 0, 0, -1/2, 1/2), (1, 0, 0, 0, 0, 0, -1/2,18641/2), (1/2, 1/2, 1/2, 1/2, 1/2, 1/2, 0, 0), (0, -1, 0, 0, 0, 0, -1/2,18651/2), (-1/2, -1/2, 1/2, 1/2, 1/2, 1/2, 0, 0), (0, 0, -1, 0, 0, 0, -1/2,18661/2), (-1/2, 1/2, -1/2, 1/2, 1/2, 1/2, 0, 0), (1/2, -1/2, -1/2, 1/2,18671/2, 1/2, 0, 0), (0, 0, 0, -1, 0, 0, -1/2, 1/2), (-1/2, 1/2, 1/2, -1/2,18681/2, 1/2, 0, 0), (1/2, -1/2, 1/2, -1/2, 1/2, 1/2, 0, 0), (1/2, 1/2,1869-1/2, -1/2, 1/2, 1/2, 0, 0), (-1/2, -1/2, -1/2, -1/2, 1/2, 1/2, 0, 0),1870(0, 0, 0, 0, -1, 0, -1/2, 1/2), (-1/2, 1/2, 1/2, 1/2, -1/2, 1/2, 0, 0),1871(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,18720, 0), (-1/2, -1/2, -1/2, 1/2, -1/2, 1/2, 0, 0), (1/2, 1/2, 1/2, -1/2,1873-1/2, 1/2, 0, 0), (-1/2, -1/2, 1/2, -1/2, -1/2, 1/2, 0, 0), (-1/2, 1/2,1874-1/2, -1/2, -1/2, 1/2, 0, 0), (1/2, -1/2, -1/2, -1/2, -1/2, 1/2, 0, 0),1875(0, 0, 0, 0, 0, 1, 1/2, -1/2), (0, 0, 0, 0, 0, -1, -1/2, 1/2), (-1/2,18761/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),1877(1/2, 1/2, -1/2, 1/2, 1/2, -1/2, 0, 0), (-1/2, -1/2, -1/2, 1/2, 1/2,1878-1/2, 0, 0), (1/2, 1/2, 1/2, -1/2, 1/2, -1/2, 0, 0), (-1/2, -1/2, 1/2,1879-1/2, 1/2, -1/2, 0, 0), (-1/2, 1/2, -1/2, -1/2, 1/2, -1/2, 0, 0), (1/2,1880-1/2, -1/2, -1/2, 1/2, -1/2, 0, 0), (0, 0, 0, 0, 1, 0, 1/2, -1/2), (1/2,18811/2, 1/2, 1/2, -1/2, -1/2, 0, 0), (-1/2, -1/2, 1/2, 1/2, -1/2, -1/2, 0,18820), (-1/2, 1/2, -1/2, 1/2, -1/2, -1/2, 0, 0), (1/2, -1/2, -1/2, 1/2,1883-1/2, -1/2, 0, 0), (0, 0, 0, 1, 0, 0, 1/2, -1/2), (-1/2, 1/2, 1/2, -1/2,1884-1/2, -1/2, 0, 0), (1/2, -1/2, 1/2, -1/2, -1/2, -1/2, 0, 0), (0, 0, 1,18850, 0, 0, 1/2, -1/2), (1/2, 1/2, -1/2, -1/2, -1/2, -1/2, 0, 0), (0, 1, 0,18860, 0, 0, 1/2, -1/2), (1, 0, 0, 0, 0, 0, 1/2, -1/2), (0, -1, 0, 0, 0, 0,18871/2, -1/2), (0, 0, -1, 0, 0, 0, 1/2, -1/2), (0, 0, 0, -1, 0, 0, 1/2,1888-1/2), (0, 0, 0, 0, -1, 0, 1/2, -1/2), (0, 0, 0, 0, 0, -1, 1/2, -1/2),1889(-1/2, -1/2, -1/2, -1/2, -1/2, -1/2, 0, 0), (-1, 0, 0, 0, 0, 0, 1/2,1890-1/2)]1891"""1892R=self._parent.weight_lattice_realization().fundamental_weights()1893return sum(cmp(i,0)*R[abs(i)] for i in self.value)18941895cpdef LetterTuple e(self, int i):1896r"""1897Return the action of `e_i` on ``self``.18981899EXAMPLES::19001901sage: C = CrystalOfLetters(['E',7])1902sage: C((7,)).e(7)1903sage: C((-7,6)).e(7)1904(7,)1905"""1906if self.value == (-7, 6) and i == 7 :1907return self._parent._element_constructor_( (7,) )1908if self.value == (-6, 5) and i == 6 :1909return self._parent._element_constructor_( (-7, 6) )1910if self.value == (-5, 4) and i == 5 :1911return self._parent._element_constructor_( (-6, 5) )1912if self.value == (-4, 2, 3) and i == 4 :1913return self._parent._element_constructor_( (-5, 4) )1914if self.value == (-2, 3) and i == 2 :1915return self._parent._element_constructor_( (-4, 2, 3) )1916if self.value == (-3, 1, 2) and i == 3 :1917return self._parent._element_constructor_( (-4, 2, 3) )1918if self.value == (-3, -2, 1, 4) and i == 3 :1919return self._parent._element_constructor_( (-2, 3) )1920if self.value == (-1, 2) and i == 1 :1921return self._parent._element_constructor_( (-3, 1, 2) )1922if self.value == (-3, -2, 1, 4) and i == 2 :1923return self._parent._element_constructor_( (-3, 1, 2) )1924if self.value == (-1, -2, 4) and i == 1 :1925return self._parent._element_constructor_( (-3, -2, 1, 4) )1926if self.value == (-4, 1, 5) and i == 4 :1927return self._parent._element_constructor_( (-3, -2, 1, 4) )1928if self.value == (-7, 1) and i == 7 :1929return self._parent._element_constructor_( (-6, 7, 1) )1930if self.value == (-1, -6, 3, 7) and i == 1 :1931return self._parent._element_constructor_( (-6, 7, 1) )1932if self.value == (-1, -2, 4) and i == 2 :1933return self._parent._element_constructor_( (-1, 2) )1934if self.value == (-4, -1, 3, 5) and i == 4 :1935return self._parent._element_constructor_( (-1, -2, 4) )1936if self.value == (-4, -1, 3, 5) and i == 1 :1937return self._parent._element_constructor_( (-4, 1, 5) )1938if self.value == (-5, 6, 1) and i == 5 :1939return self._parent._element_constructor_( (-4, 1, 5) )1940if self.value == (-3, 5) and i == 3 :1941return self._parent._element_constructor_( (-4, -1, 3, 5) )1942if self.value == (-5, -1, 3, 6) and i == 5 :1943return self._parent._element_constructor_( (-4, -1, 3, 5) )1944if self.value == (-5, -3, 4, 6) and i == 5 :1945return self._parent._element_constructor_( (-3, 5) )1946if self.value == (-6, 7, 1) and i == 6 :1947return self._parent._element_constructor_( (-5, 6, 1) )1948if self.value == (-5, -1, 3, 6) and i == 1 :1949return self._parent._element_constructor_( (-5, 6, 1) )1950if self.value == (-5, -3, 4, 6) and i == 3 :1951return self._parent._element_constructor_( (-5, -1, 3, 6) )1952if self.value == (-1, -6, 3, 7) and i == 6 :1953return self._parent._element_constructor_( (-5, -1, 3, 6) )1954if self.value == (-4, 2, 6) and i == 4 :1955return self._parent._element_constructor_( (-5, -3, 4, 6) )1956if self.value == (-6, -3, 7, 4) and i == 6 :1957return self._parent._element_constructor_( (-5, -3, 4, 6) )1958if self.value == (-6, -2, 7, 5) and i == 6 :1959return self._parent._element_constructor_( (-2, 6) )1960if self.value == (-6, -3, 7, 4) and i == 3 :1961return self._parent._element_constructor_( (-1, -6, 3, 7) )1962if self.value == (-1, -7, 3) and i == 7 :1963return self._parent._element_constructor_( (-1, -6, 3, 7) )1964if self.value == (-7, -3, 4) and i == 7 :1965return self._parent._element_constructor_( (-6, -3, 7, 4) )1966if self.value == (-6, -4, 2, 7, 5) and i == 4 :1967return self._parent._element_constructor_( (-6, -3, 7, 4) )1968if self.value == (-2, 6) and i == 2 :1969return self._parent._element_constructor_( (-4, 2, 6) )1970if self.value == (-6, -4, 2, 7, 5) and i == 6 :1971return self._parent._element_constructor_( (-4, 2, 6) )1972if self.value == (-6, -2, 7, 5) and i == 2 :1973return self._parent._element_constructor_( (-6, -4, 2, 7, 5) )1974if self.value == (-4, -7, 2, 5) and i == 7 :1975return self._parent._element_constructor_( (-6, -4, 2, 7, 5) )1976if self.value == (-7, -4, 6, 3) and i == 7 :1977return self._parent._element_constructor_( (-4, 7, 3) )1978if self.value == (-3, 1, 7) and i == 3 :1979return self._parent._element_constructor_( (-4, 7, 3) )1980if self.value == (-1, 7) and i == 1 :1981return self._parent._element_constructor_( (-3, 1, 7) )1982if self.value == (-3, -7, 1, 6) and i == 7 :1983return self._parent._element_constructor_( (-3, 1, 7) )1984if self.value == (-1, -7, 3) and i == 1 :1985return self._parent._element_constructor_( (-7, 1) )1986if self.value == (-7, -2, 5) and i == 2 :1987return self._parent._element_constructor_( (-4, -7, 2, 5) )1988if self.value == (-5, -7, 6, 2) and i == 5 :1989return self._parent._element_constructor_( (-4, -7, 2, 5) )1990if self.value == (-5, -2, -7, 4, 6) and i == 5 :1991return self._parent._element_constructor_( (-7, -2, 5) )1992if self.value == (-5, -7, 6, 2) and i == 7 :1993return self._parent._element_constructor_( (-5, 7, 2) )1994if self.value == (-5, -2, 4, 7) and i == 2 :1995return self._parent._element_constructor_( (-5, 7, 2) )1996if self.value == (-7, -3, 4) and i == 3 :1997return self._parent._element_constructor_( (-1, -7, 3) )1998if self.value == (-5, 7, 2) and i == 5 :1999return self._parent._element_constructor_( (-6, -4, 2, 7, 5) )2000if self.value == (-6, 2) and i == 6 :2001return self._parent._element_constructor_( (-5, -7, 6, 2) )2002if self.value == (-5, -2, -7, 4, 6) and i == 2 :2003return self._parent._element_constructor_( (-5, -7, 6, 2) )2004if self.value == (-7, -2, 5) and i == 7 :2005return self._parent._element_constructor_( (-6, -2, 7, 5) )2006if self.value == (-5, -2, 4, 7) and i == 5 :2007return self._parent._element_constructor_( (-6, -2, 7, 5) )2008if self.value == (-4, 7, 3) and i == 4 :2009return self._parent._element_constructor_( (-5, -2, 4, 7) )2010if self.value == (-5, -2, -7, 4, 6) and i == 7 :2011return self._parent._element_constructor_( (-5, -2, 4, 7) )2012if self.value == (-4, -7, 2, 5) and i == 4 :2013return self._parent._element_constructor_( (-7, -3, 4) )2014if self.value == (-7, -4, 6, 3) and i == 4 :2015return self._parent._element_constructor_( (-5, -2, -7, 4, 6) )2016if self.value == (-2, -6, 4) and i == 6 :2017return self._parent._element_constructor_( (-5, -2, -7, 4, 6) )2018if self.value == (-6, -4, 5, 3) and i == 6 :2019return self._parent._element_constructor_( (-7, -4, 6, 3) )2020if self.value == (-3, -7, 1, 6) and i == 3 :2021return self._parent._element_constructor_( (-7, -4, 6, 3) )2022if self.value == (-3, -6, 1, 5) and i == 6 :2023return self._parent._element_constructor_( (-3, -7, 1, 6) )2024if self.value == (-6, -1, 5) and i == 6 :2025return self._parent._element_constructor_( (-7, -1, 6) )2026if self.value == (-2, -6, 4) and i == 2 :2027return self._parent._element_constructor_( (-6, 2) )2028if self.value == (-6, -4, 5, 3) and i == 4 :2029return self._parent._element_constructor_( (-2, -6, 4) )2030if self.value == (-7, -1, 6) and i == 1 :2031return self._parent._element_constructor_( (-3, -7, 1, 6) )2032if self.value == (-5, 3) and i == 5 :2033return self._parent._element_constructor_( (-6, -4, 5, 3) )2034if self.value == (-3, -6, 1, 5) and i == 3 :2035return self._parent._element_constructor_( (-6, -4, 5, 3) )2036if self.value == (-6, -1, 5) and i == 1 :2037return self._parent._element_constructor_( (-3, -6, 1, 5) )2038if self.value == (-3, -5, 4, 1) and i == 5 :2039return self._parent._element_constructor_( (-3, -6, 1, 5) )2040if self.value == (-5, -1, 4) and i == 5 :2041return self._parent._element_constructor_( (-6, -1, 5) )2042if self.value == (-3, -5, 4, 1) and i == 3 :2043return self._parent._element_constructor_( (-5, 3) )2044if self.value == (-4, 1, 2) and i == 4 :2045return self._parent._element_constructor_( (-3, -5, 4, 1) )2046if self.value == (-5, -1, 4) and i == 1 :2047return self._parent._element_constructor_( (-3, -5, 4, 1) )2048if self.value == (-1, -4, 3, 2) and i == 4 :2049return self._parent._element_constructor_( (-5, -1, 4) )2050if self.value == (-1, -4, 3, 2) and i == 1 :2051return self._parent._element_constructor_( (-4, 1, 2) )2052if self.value == (-2, 1) and i == 2 :2053return self._parent._element_constructor_( (-4, 1, 2) )2054if self.value == (-3, 2) and i == 3 :2055return self._parent._element_constructor_( (-1, -4, 3, 2) )2056if self.value == (-2, -1, 3) and i == 2 :2057return self._parent._element_constructor_( (-1, -4, 3, 2) )2058if self.value == (-2, -1, 3) and i == 1 :2059return self._parent._element_constructor_( (-2, 1) )2060if self.value == (-7, -1, 6) and i == 7 :2061return self._parent._element_constructor_( (-1, 7) )2062if self.value == (-2, -3, 4) and i == 3 :2063return self._parent._element_constructor_( (-2, -1, 3) )2064if self.value == (-2, -3, 4) and i == 2 :2065return self._parent._element_constructor_( (-3, 2) )2066if self.value == (-4, 5) and i == 4 :2067return self._parent._element_constructor_( (-2, -3, 4) )2068if self.value == (-5, 6) and i == 5 :2069return self._parent._element_constructor_( (-4, 5) )2070if self.value == (-6, 7) and i == 6 :2071return self._parent._element_constructor_( (-5, 6) )2072if self.value == (-7,) and i == 7 :2073return self._parent._element_constructor_( (-6, 7) )2074else:2075return None20762077cpdef LetterTuple f(self, int i):2078r"""2079Return the action of `f_i` on ``self``.20802081EXAMPLES::20822083sage: C = CrystalOfLetters(['E',7])2084sage: C((-7,)).f(7)2085sage: C((7,)).f(7)2086(-7, 6)2087"""2088if self.value == (7,) and i == 7 :2089return self._parent._element_constructor_( (-7, 6) )2090if self.value == (-7, 6) and i == 6 :2091return self._parent._element_constructor_( (-6, 5) )2092if self.value == (-6, 5) and i == 5 :2093return self._parent._element_constructor_( (-5, 4) )2094if self.value == (-5, 4) and i == 4 :2095return self._parent._element_constructor_( (-4, 2, 3) )2096if self.value == (-4, 2, 3) and i == 2 :2097return self._parent._element_constructor_( (-2, 3) )2098if self.value == (-4, 2, 3) and i == 3 :2099return self._parent._element_constructor_( (-3, 1, 2) )2100if self.value == (-2, 3) and i == 3 :2101return self._parent._element_constructor_( (-3, -2, 1, 4) )2102if self.value == (-3, 1, 2) and i == 1 :2103return self._parent._element_constructor_( (-1, 2) )2104if self.value == (-3, 1, 2) and i == 2 :2105return self._parent._element_constructor_( (-3, -2, 1, 4) )2106if self.value == (-3, -2, 1, 4) and i == 1 :2107return self._parent._element_constructor_( (-1, -2, 4) )2108if self.value == (-3, -2, 1, 4) and i == 4 :2109return self._parent._element_constructor_( (-4, 1, 5) )2110if self.value == (-6, 7, 1) and i == 7 :2111return self._parent._element_constructor_( (-7, 1) )2112if self.value == (-6, 7, 1) and i == 1 :2113return self._parent._element_constructor_( (-1, -6, 3, 7) )2114if self.value == (-1, 2) and i == 2 :2115return self._parent._element_constructor_( (-1, -2, 4) )2116if self.value == (-1, -2, 4) and i == 4 :2117return self._parent._element_constructor_( (-4, -1, 3, 5) )2118if self.value == (-4, 1, 5) and i == 1 :2119return self._parent._element_constructor_( (-4, -1, 3, 5) )2120if self.value == (-4, 1, 5) and i == 5 :2121return self._parent._element_constructor_( (-5, 6, 1) )2122if self.value == (-4, -1, 3, 5) and i == 3 :2123return self._parent._element_constructor_( (-3, 5) )2124if self.value == (-4, -1, 3, 5) and i == 5 :2125return self._parent._element_constructor_( (-5, -1, 3, 6) )2126if self.value == (-3, 5) and i == 5 :2127return self._parent._element_constructor_( (-5, -3, 4, 6) )2128if self.value == (-5, 6, 1) and i == 6 :2129return self._parent._element_constructor_( (-6, 7, 1) )2130if self.value == (-5, 6, 1) and i == 1 :2131return self._parent._element_constructor_( (-5, -1, 3, 6) )2132if self.value == (-5, -1, 3, 6) and i == 3 :2133return self._parent._element_constructor_( (-5, -3, 4, 6) )2134if self.value == (-5, -1, 3, 6) and i == 6 :2135return self._parent._element_constructor_( (-1, -6, 3, 7) )2136if self.value == (-5, -3, 4, 6) and i == 4 :2137return self._parent._element_constructor_( (-4, 2, 6) )2138if self.value == (-5, -3, 4, 6) and i == 6 :2139return self._parent._element_constructor_( (-6, -3, 7, 4) )2140if self.value == (-2, 6) and i == 6 :2141return self._parent._element_constructor_( (-6, -2, 7, 5) )2142if self.value == (-1, -6, 3, 7) and i == 3 :2143return self._parent._element_constructor_( (-6, -3, 7, 4) )2144if self.value == (-1, -6, 3, 7) and i == 7 :2145return self._parent._element_constructor_( (-1, -7, 3) )2146if self.value == (-6, -3, 7, 4) and i == 7 :2147return self._parent._element_constructor_( (-7, -3, 4) )2148if self.value == (-6, -3, 7, 4) and i == 4 :2149return self._parent._element_constructor_( (-6, -4, 2, 7, 5) )2150if self.value == (-4, 2, 6) and i == 2 :2151return self._parent._element_constructor_( (-2, 6) )2152if self.value == (-4, 2, 6) and i == 6 :2153return self._parent._element_constructor_( (-6, -4, 2, 7, 5) )2154if self.value == (-6, -4, 2, 7, 5) and i == 2 :2155return self._parent._element_constructor_( (-6, -2, 7, 5) )2156if self.value == (-6, -4, 2, 7, 5) and i == 7 :2157return self._parent._element_constructor_( (-4, -7, 2, 5) )2158if self.value == (-4, 7, 3) and i == 7 :2159return self._parent._element_constructor_( (-7, -4, 6, 3) )2160if self.value == (-4, 7, 3) and i == 3 :2161return self._parent._element_constructor_( (-3, 1, 7) )2162if self.value == (-3, 1, 7) and i == 1 :2163return self._parent._element_constructor_( (-1, 7) )2164if self.value == (-3, 1, 7) and i == 7 :2165return self._parent._element_constructor_( (-3, -7, 1, 6) )2166if self.value == (-7, 1) and i == 1 :2167return self._parent._element_constructor_( (-1, -7, 3) )2168if self.value == (-4, -7, 2, 5) and i == 2 :2169return self._parent._element_constructor_( (-7, -2, 5) )2170if self.value == (-4, -7, 2, 5) and i == 5 :2171return self._parent._element_constructor_( (-5, -7, 6, 2) )2172if self.value == (-7, -2, 5) and i == 5 :2173return self._parent._element_constructor_( (-5, -2, -7, 4, 6) )2174if self.value == (-5, 7, 2) and i == 7 :2175return self._parent._element_constructor_( (-5, -7, 6, 2) )2176if self.value == (-5, 7, 2) and i == 2 :2177return self._parent._element_constructor_( (-5, -2, 4, 7) )2178if self.value == (-1, -7, 3) and i == 3 :2179return self._parent._element_constructor_( (-7, -3, 4) )2180if self.value == (-6, -4, 2, 7, 5) and i == 5 :2181return self._parent._element_constructor_( (-5, 7, 2) )2182if self.value == (-5, -7, 6, 2) and i == 6 :2183return self._parent._element_constructor_( (-6, 2) )2184if self.value == (-5, -7, 6, 2) and i == 2 :2185return self._parent._element_constructor_( (-5, -2, -7, 4, 6) )2186if self.value == (-6, -2, 7, 5) and i == 7 :2187return self._parent._element_constructor_( (-7, -2, 5) )2188if self.value == (-6, -2, 7, 5) and i == 5 :2189return self._parent._element_constructor_( (-5, -2, 4, 7) )2190if self.value == (-5, -2, 4, 7) and i == 4 :2191return self._parent._element_constructor_( (-4, 7, 3) )2192if self.value == (-5, -2, 4, 7) and i == 7 :2193return self._parent._element_constructor_( (-5, -2, -7, 4, 6) )2194if self.value == (-7, -3, 4) and i == 4 :2195return self._parent._element_constructor_( (-4, -7, 2, 5) )2196if self.value == (-5, -2, -7, 4, 6) and i == 4 :2197return self._parent._element_constructor_( (-7, -4, 6, 3) )2198if self.value == (-5, -2, -7, 4, 6) and i == 6 :2199return self._parent._element_constructor_( (-2, -6, 4) )2200if self.value == (-7, -4, 6, 3) and i == 6 :2201return self._parent._element_constructor_( (-6, -4, 5, 3) )2202if self.value == (-7, -4, 6, 3) and i == 3 :2203return self._parent._element_constructor_( (-3, -7, 1, 6) )2204if self.value == (-3, -7, 1, 6) and i == 6 :2205return self._parent._element_constructor_( (-3, -6, 1, 5) )2206if self.value == (-7, -1, 6) and i == 6 :2207return self._parent._element_constructor_( (-6, -1, 5) )2208if self.value == (-6, 2) and i == 2 :2209return self._parent._element_constructor_( (-2, -6, 4) )2210if self.value == (-2, -6, 4) and i == 4 :2211return self._parent._element_constructor_( (-6, -4, 5, 3) )2212if self.value == (-3, -7, 1, 6) and i == 1 :2213return self._parent._element_constructor_( (-7, -1, 6) )2214if self.value == (-6, -4, 5, 3) and i == 5 :2215return self._parent._element_constructor_( (-5, 3) )2216if self.value == (-6, -4, 5, 3) and i == 3 :2217return self._parent._element_constructor_( (-3, -6, 1, 5) )2218if self.value == (-3, -6, 1, 5) and i == 1 :2219return self._parent._element_constructor_( (-6, -1, 5) )2220if self.value == (-3, -6, 1, 5) and i == 5 :2221return self._parent._element_constructor_( (-3, -5, 4, 1) )2222if self.value == (-6, -1, 5) and i == 5 :2223return self._parent._element_constructor_( (-5, -1, 4) )2224if self.value == (-5, 3) and i == 3 :2225return self._parent._element_constructor_( (-3, -5, 4, 1) )2226if self.value == (-3, -5, 4, 1) and i == 4 :2227return self._parent._element_constructor_( (-4, 1, 2) )2228if self.value == (-3, -5, 4, 1) and i == 1 :2229return self._parent._element_constructor_( (-5, -1, 4) )2230if self.value == (-5, -1, 4) and i == 4 :2231return self._parent._element_constructor_( (-1, -4, 3, 2) )2232if self.value == (-4, 1, 2) and i == 1 :2233return self._parent._element_constructor_( (-1, -4, 3, 2) )2234if self.value == (-4, 1, 2) and i == 2 :2235return self._parent._element_constructor_( (-2, 1) )2236if self.value == (-1, -4, 3, 2) and i == 3 :2237return self._parent._element_constructor_( (-3, 2) )2238if self.value == (-1, -4, 3, 2) and i == 2 :2239return self._parent._element_constructor_( (-2, -1, 3) )2240if self.value == (-2, 1) and i == 1 :2241return self._parent._element_constructor_( (-2, -1, 3) )2242if self.value == (-1, 7) and i == 7 :2243return self._parent._element_constructor_( (-7, -1, 6) )2244if self.value == (-2, -1, 3) and i == 3 :2245return self._parent._element_constructor_( (-2, -3, 4) )2246if self.value == (-3, 2) and i == 2 :2247return self._parent._element_constructor_( (-2, -3, 4) )2248if self.value == (-2, -3, 4) and i == 4 :2249return self._parent._element_constructor_( (-4, 5) )2250if self.value == (-4, 5) and i == 5 :2251return self._parent._element_constructor_( (-5, 6) )2252if self.value == (-5, 6) and i == 6 :2253return self._parent._element_constructor_( (-6, 7) )2254if self.value == (-6, 7) and i == 7 :2255return self._parent._element_constructor_( (-7,) )2256else:2257return None2258225922602261