Affine Crystals#
- class sage.combinat.crystals.affine.AffineCrystalFromClassical(cartan_type, classical_crystal, category=None)[source]#
Bases:
UniqueRepresentation
,Parent
This abstract class can be used for affine crystals that are constructed from a classical crystal. The zero arrows can be implemented using different methods (for example using a Dynkin diagram automorphisms or virtual crystals).
This is a helper class, mostly used to implement Kirillov-Reshetikhin crystals (see:
KirillovReshetikhinCrystal()
).For general information about crystals see
sage.combinat.crystals
.INPUT:
cartan_type
– the Cartan type of the resulting affine crystalclassical_crystal
– instance of a classical crystal
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: A.list() [[[1]], [[2]], [[3]]] sage: A.cartan_type() ['A', 2, 1] sage: A.index_set() (0, 1, 2) sage: b = A(rows=[[1]]) sage: b.weight() -Lambda[0] + Lambda[1] sage: b.classical_weight() (1, 0, 0) sage: [x.s(0) for x in A.list()] [[[3]], [[2]], [[1]]] sage: [x.s(1) for x in A.list()] [[[2]], [[1]], [[3]]]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> A.list() [[[1]], [[2]], [[3]]] >>> A.cartan_type() ['A', 2, 1] >>> A.index_set() (0, 1, 2) >>> b = A(rows=[[Integer(1)]]) >>> b.weight() -Lambda[0] + Lambda[1] >>> b.classical_weight() (1, 0, 0) >>> [x.s(Integer(0)) for x in A.list()] [[[3]], [[2]], [[1]]] >>> [x.s(Integer(1)) for x in A.list()] [[[2]], [[1]], [[3]]]
- Element[source]#
alias of
AffineCrystalFromClassicalElement
- cardinality()[source]#
Return the cardinality of
self
.EXAMPLES:
sage: C = crystals.Tableaux(['A',3],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',3,1],C,pr,pr_inverse,1) sage: A.cardinality() == C.cardinality() True
>>> from sage.all import * >>> C = crystals.Tableaux(['A',Integer(3)],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',Integer(3),Integer(1)],C,pr,pr_inverse,Integer(1)) >>> A.cardinality() == C.cardinality() True
- lift(affine_elt)[source]#
Lift an affine crystal element to the corresponding classical crystal element.
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A.list()[0] sage: A.lift(b) [[1]] sage: A.lift(b).parent() The crystal of tableaux of type ['A', 2] and shape(s) [[1]]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A.list()[Integer(0)] >>> A.lift(b) [[1]] >>> A.lift(b).parent() The crystal of tableaux of type ['A', 2] and shape(s) [[1]]
- retract(classical_elt)[source]#
Transform a classical crystal element to the corresponding affine crystal element.
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: t = C(rows=[[1]]) sage: t.parent() The crystal of tableaux of type ['A', 2] and shape(s) [[1]] sage: A.retract(t) [[1]] sage: A.retract(t).parent() is A True
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> t = C(rows=[[Integer(1)]]) >>> t.parent() The crystal of tableaux of type ['A', 2] and shape(s) [[1]] >>> A.retract(t) [[1]] >>> A.retract(t).parent() is A True
- class sage.combinat.crystals.affine.AffineCrystalFromClassicalAndPromotion(cartan_type, classical_crystal, p_automorphism, p_inverse_automorphism, dynkin_node, category=None)[source]#
Bases:
AffineCrystalFromClassical
Crystals that are constructed from a classical crystal and a Dynkin diagram automorphism \(\sigma\). In type \(A_n\), the Dynkin diagram automorphism is \(i \to i+1 \pmod n+1\) and the corresponding map on the crystal is the promotion operation \(\mathrm{pr}\) on tableaux. The affine crystal operators are given by \(f_0= \mathrm{pr}^{-1} f_{\sigma(0)} \mathrm{pr}\).
INPUT:
cartan_type
– the Cartan type of the resulting affine crystalclassical_crystal
– instance of a classical crystalautomorphism, inverse_automorphism
– a function on the elements of theclassical_crystal
dynkin_node
– an integer specifying the classical node in the image of the zero node under the automorphism sigma
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: A.list() [[[1]], [[2]], [[3]]] sage: A.cartan_type() ['A', 2, 1] sage: A.index_set() (0, 1, 2) sage: b = A(rows=[[1]]) sage: b.weight() -Lambda[0] + Lambda[1] sage: b.classical_weight() (1, 0, 0) sage: [x.s(0) for x in A.list()] [[[3]], [[2]], [[1]]] sage: [x.s(1) for x in A.list()] [[[2]], [[1]], [[3]]]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> A.list() [[[1]], [[2]], [[3]]] >>> A.cartan_type() ['A', 2, 1] >>> A.index_set() (0, 1, 2) >>> b = A(rows=[[Integer(1)]]) >>> b.weight() -Lambda[0] + Lambda[1] >>> b.classical_weight() (1, 0, 0) >>> [x.s(Integer(0)) for x in A.list()] [[[3]], [[2]], [[1]]] >>> [x.s(Integer(1)) for x in A.list()] [[[2]], [[1]], [[3]]]
- automorphism(x)[source]#
Give the analogue of the affine Dynkin diagram automorphism on the level of crystals.
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A.list()[0] sage: A.automorphism(b) [[2]]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A.list()[Integer(0)] >>> A.automorphism(b) [[2]]
- inverse_automorphism(x)[source]#
Give the analogue of the inverse of the affine Dynkin diagram automorphism on the level of crystals.
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A.list()[0] sage: A.inverse_automorphism(b) [[3]]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A.list()[Integer(0)] >>> A.inverse_automorphism(b) [[3]]
- class sage.combinat.crystals.affine.AffineCrystalFromClassicalAndPromotionElement[source]#
Bases:
AffineCrystalFromClassicalElement
Elements of crystals that are constructed from a classical crystal and a Dynkin diagram automorphism. In type \(A\), the automorphism is the promotion operation on tableaux.
This class is not instantiated directly but rather
__call__
-ed fromAffineCrystalFromClassicalAndPromotion
. The syntax of this is governed by the (classical) crystal.Since this class inherits from
AffineCrystalFromClassicalElement
, the methods that need to be implemented aree0()
,f0()
and possiblyepsilon0()
andphi0()
if more efficient algorithms exist.EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A(rows=[[1]]) sage: b._repr_() '[[1]]'
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A(rows=[[Integer(1)]]) >>> b._repr_() '[[1]]'
- e0()[source]#
Implement \(e_0\) using the automorphism as \(e_0 = \operatorname{pr}^{-1} e_{dynkin_node} \operatorname{pr}\)
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A(rows=[[1]]) sage: b.e0() [[3]]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A(rows=[[Integer(1)]]) >>> b.e0() [[3]]
- epsilon0()[source]#
Implement \(epsilon_0\) using the automorphism.
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: [x.epsilon0() for x in A.list()] [1, 0, 0]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> [x.epsilon0() for x in A.list()] [1, 0, 0]
- f0()[source]#
Implement \(f_0\) using the automorphism as \(f_0 = \operatorname{pr}^{-1} f_{dynkin_node} \operatorname{pr}\)
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A(rows=[[3]]) sage: b.f0() [[1]]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A(rows=[[Integer(3)]]) >>> b.f0() [[1]]
- phi0()[source]#
Implement \(phi_0\) using the automorphism.
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: [x.phi0() for x in A.list()] [0, 0, 1]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> [x.phi0() for x in A.list()] [0, 0, 1]
- class sage.combinat.crystals.affine.AffineCrystalFromClassicalElement[source]#
Bases:
ElementWrapper
Elements of crystals that are constructed from a classical crystal.
The elements inherit many of their methods from the classical crystal using lift and retract.
This class is not instantiated directly but rather
__call__
-ed fromAffineCrystalFromClassical
. The syntax of this is governed by the (classical) crystal.EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A(rows=[[1]]) sage: b._repr_() '[[1]]'
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A(rows=[[Integer(1)]]) >>> b._repr_() '[[1]]'
- classical_weight()[source]#
Return the classical weight corresponding to
self
.EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A(rows=[[1]]) sage: b.classical_weight() (1, 0, 0)
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A(rows=[[Integer(1)]]) >>> b.classical_weight() (1, 0, 0)
- e(i)[source]#
Return the action of \(e_i\) on
self
.EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A(rows=[[1]]) sage: b.e(0) [[3]] sage: b.e(1)
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A(rows=[[Integer(1)]]) >>> b.e(Integer(0)) [[3]] >>> b.e(Integer(1))
- epsilon(i)[source]#
Return the maximal time the crystal operator \(e_i\) can be applied to
self
.EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: [x.epsilon(0) for x in A.list()] [1, 0, 0] sage: [x.epsilon(1) for x in A.list()] [0, 1, 0]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> [x.epsilon(Integer(0)) for x in A.list()] [1, 0, 0] >>> [x.epsilon(Integer(1)) for x in A.list()] [0, 1, 0]
- epsilon0()[source]#
Uses \(\varepsilon_0\) from the super class, but should be implemented if a faster implementation exists.
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: [x.epsilon0() for x in A.list()] [1, 0, 0]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> [x.epsilon0() for x in A.list()] [1, 0, 0]
- f(i)[source]#
Return the action of \(f_i\) on
self
.EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A(rows=[[3]]) sage: b.f(0) [[1]] sage: b.f(2)
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A(rows=[[Integer(3)]]) >>> b.f(Integer(0)) [[1]] >>> b.f(Integer(2))
- lift()[source]#
Lift an affine crystal element to the corresponding classical crystal element.
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: b = A.list()[0] sage: b.lift() [[1]] sage: b.lift().parent() The crystal of tableaux of type ['A', 2] and shape(s) [[1]]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> b = A.list()[Integer(0)] >>> b.lift() [[1]] >>> b.lift().parent() The crystal of tableaux of type ['A', 2] and shape(s) [[1]]
- phi(i)[source]#
Returns the maximal time the crystal operator \(f_i\) can be applied to self.
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: [x.phi(0) for x in A.list()] [0, 0, 1] sage: [x.phi(1) for x in A.list()] [1, 0, 0]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> [x.phi(Integer(0)) for x in A.list()] [0, 0, 1] >>> [x.phi(Integer(1)) for x in A.list()] [1, 0, 0]
- phi0()[source]#
Uses \(\varphi_0\) from the super class, but should be implemented if a faster implementation exists.
EXAMPLES:
sage: n = 2 sage: C = crystals.Tableaux(['A',n],shape=[1]) sage: pr = attrcall("promotion") sage: pr_inverse = attrcall("promotion_inverse") sage: A = crystals.AffineFromClassicalAndPromotion(['A',n,1],C,pr,pr_inverse,1) sage: [x.phi0() for x in A.list()] [0, 0, 1]
>>> from sage.all import * >>> n = Integer(2) >>> C = crystals.Tableaux(['A',n],shape=[Integer(1)]) >>> pr = attrcall("promotion") >>> pr_inverse = attrcall("promotion_inverse") >>> A = crystals.AffineFromClassicalAndPromotion(['A',n,Integer(1)],C,pr,pr_inverse,Integer(1)) >>> [x.phi0() for x in A.list()] [0, 0, 1]