Tensor Products of Crystal Elements#
AUTHORS:
Anne Schilling, Nicolas Thiery (2007): Initial version
Ben Salisbury, Travis Scrimshaw (2013): Refactored tensor products to handle non-regular crystals and created new subclass to take advantage of the regularity
Travis Scrimshaw (2017): Cythonized element classes
Franco Saliola (2017): Tensor products for crystal of super algebras
Anne Schilling (2018): Tensor products for crystals of queer super algebras
- class sage.combinat.crystals.tensor_product_element.CrystalOfBKKTableauxElement#
Bases:
sage.combinat.crystals.tensor_product_element.TensorProductOfSuperCrystalsElement
Element class for the crystal of tableaux for Lie superalgebras of [BKK2000].
- pp()#
Pretty print
self
.EXAMPLES:
sage: C = crystals.Tableaux(['A',[1,2]], shape=[1,1]) sage: c = C.an_element() sage: c.pp() -2 -1
- to_tableau()#
Return the
Tableau
object corresponding toself
.EXAMPLES:
sage: C = crystals.Tableaux(['A',[1,2]], shape=[1,1]) sage: c = C.an_element() sage: c.to_tableau() [[-2], [-1]] sage: type(c.to_tableau()) <class 'sage.combinat.tableau.Tableaux_all_with_category.element_class'> sage: type(c) <class 'sage.combinat.crystals.bkk_crystals.CrystalOfBKKTableaux_with_category.element_class'>
- class sage.combinat.crystals.tensor_product_element.CrystalOfTableauxElement#
Bases:
sage.combinat.crystals.tensor_product_element.TensorProductOfRegularCrystalsElement
Element in a crystal of tableaux.
- pp()#
EXAMPLES:
sage: T = crystals.Tableaux(['A',3], shape = [2,2]) sage: t = T(rows=[[1,2],[3,4]]) sage: t.pp() 1 2 3 4
- promotion()#
Return the result of applying promotion on
self
.Promotion for type A crystals of tableaux of rectangular shape. This method only makes sense in type A with rectangular shapes.
EXAMPLES:
sage: C = crystals.Tableaux(["A",3], shape = [3,3,3]) sage: t = C(Tableau([[1,1,1],[2,2,3],[3,4,4]])) sage: t [[1, 1, 1], [2, 2, 3], [3, 4, 4]] sage: t.promotion() [[1, 1, 2], [2, 2, 3], [3, 4, 4]] sage: t.promotion().parent() The crystal of tableaux of type ['A', 3] and shape(s) [[3, 3, 3]]
- promotion_inverse()#
Return the result of applying inverse promotion on
self
.Inverse promotion for type A crystals of tableaux of rectangular shape. This method only makes sense in type A with rectangular shapes.
EXAMPLES:
sage: C = crystals.Tableaux(["A",3], shape = [3,3,3]) sage: t = C(Tableau([[1,1,1],[2,2,3],[3,4,4]])) sage: t [[1, 1, 1], [2, 2, 3], [3, 4, 4]] sage: t.promotion_inverse() [[1, 1, 2], [2, 3, 3], [4, 4, 4]] sage: t.promotion_inverse().parent() The crystal of tableaux of type ['A', 3] and shape(s) [[3, 3, 3]]
- shape()#
Return the shape of the tableau corresponding to
self
.OUTPUT: an instance of
Partition
See also
EXAMPLES:
sage: C = crystals.Tableaux(["A", 2], shape=[2,1]) sage: x = C.an_element() sage: x.to_tableau().shape() [2, 1] sage: x.shape() [2, 1]
- to_tableau()#
Return the
Tableau
object corresponding toself
.EXAMPLES:
sage: T = crystals.Tableaux(['A',3], shape = [2,2]) sage: t = T(rows=[[1,2],[3,4]]).to_tableau(); t [[1, 2], [3, 4]] sage: type(t) <class 'sage.combinat.tableau.Tableaux_all_with_category.element_class'> sage: type(t[0][0]) <class 'int'> sage: T = crystals.Tableaux(['D',3], shape = [1,1]) sage: t=T(rows=[[-3],[3]]).to_tableau(); t [[-3], [3]] sage: t=T(rows=[[3],[-3]]).to_tableau(); t [[3], [-3]] sage: T = crystals.Tableaux(['B',2], shape = [1,1]) sage: t = T(rows=[[0],[0]]).to_tableau(); t [[0], [0]]
- class sage.combinat.crystals.tensor_product_element.ImmutableListWithParent#
Bases:
sage.structure.list_clone.ClonableArray
A class for lists having a parent
Specification: any subclass
C
should implement__init__
which accepts the following formC(parent, list=list)
- class sage.combinat.crystals.tensor_product_element.InfinityCrystalOfTableauxElement#
Bases:
sage.combinat.crystals.tensor_product_element.CrystalOfTableauxElement
- e(i)#
Return the action of \(\widetilde{e}_i\) on
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: B = crystals.infinity.Tableaux(['B',3]) sage: b = B(rows=[[1,1,1,1,1,1,1,2,0,-3,-1,-1,-1,-1],[2,2,2,2,-2,-2],[3,-3,-3]]) sage: b.e(3).pp() 1 1 1 1 1 1 1 2 0 -3 -1 -1 -1 -1 2 2 2 2 -2 -2 3 0 -3 sage: b.e(1).pp() 1 1 1 1 1 1 1 0 -3 -1 -1 -1 -1 2 2 2 2 -2 -2 3 -3 -3
- f(i)#
Return the action of \(\widetilde{f}_i\) on
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: B = crystals.infinity.Tableaux(['C',4]) sage: b = B.highest_weight_vector() sage: b.f(1).pp() 1 1 1 1 2 2 2 2 3 3 4 sage: b.f(3).pp() 1 1 1 1 1 2 2 2 2 3 3 4 4 sage: b.f(3).f(4).pp() 1 1 1 1 1 2 2 2 2 3 3 -4 4
- class sage.combinat.crystals.tensor_product_element.InfinityCrystalOfTableauxElementTypeD#
Bases:
sage.combinat.crystals.tensor_product_element.InfinityCrystalOfTableauxElement
- e(i)#
Return the action of \(\widetilde{e}_i\) on
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: B = crystals.infinity.Tableaux(['D',4]) sage: b = B.highest_weight_vector().f_string([1,4,3,1,2]); b.pp() 1 1 1 1 2 3 2 2 2 3 -3 sage: b.e(2).pp() 1 1 1 1 2 2 2 2 2 3 -3
- f(i)#
Return the action of \(\widetilde{f}_i\) on
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: B = crystals.infinity.Tableaux(['D',5]) sage: b = B.highest_weight_vector().f_string([1,4,3,1,5]); b.pp() 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 -5 4 5 sage: b.f(1).pp() 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 -5 4 5 sage: b.f(5).pp() 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 -5 4 -4
- class sage.combinat.crystals.tensor_product_element.InfinityQueerCrystalOfTableauxElement#
Bases:
sage.combinat.crystals.tensor_product_element.TensorProductOfQueerSuperCrystalsElement
Initialize
self
.EXAMPLES:
sage: B = crystals.infinity.Tableaux(['Q',4]) sage: t = B([[4,4,4,4,2,1],[3,3,3],[2,2],[1]]) sage: t [[4, 4, 4, 4, 2, 1], [3, 3, 3], [2, 2], [1]] sage: TestSuite(t).run()
- e(i)#
Return the action of \(e_i\) on
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: B = crystals.infinity.Tableaux(['Q',4]) sage: t = B([[4,4,4,4,4,2,1],[3,3,3,3],[2,2,1],[1]]) sage: t.e(1) [[4, 4, 4, 4, 4, 4, 2, 1], [3, 3, 3, 3, 3], [2, 2, 1, 1], [1]] sage: t.e(3) [[4, 4, 4, 4, 4, 3, 2, 1], [3, 3, 3, 3], [2, 2, 1], [1]] sage: t.e(-1)
- epsilon(i)#
Return \(\varepsilon_i\) of
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: B = crystals.infinity.Tableaux(['Q',4]) sage: t = B([[4,4,4,4,4,2,1],[3,3,3,3],[2,2,1],[1]]) sage: [t.epsilon(i) for i in B.index_set()] [-1, 1, -2, 0]
- f(i)#
Return the action of \(f_i\) on
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: B = crystals.infinity.Tableaux(['Q',4]) sage: t = B([[4,4,4,4,4,2,1],[3,3,3,3],[2,2,1],[1]]) sage: t.f(1) [[4, 4, 4, 4, 4, 2, 2], [3, 3, 3, 3], [2, 2, 1], [1]] sage: t.f(3) sage: t.f(-1) [[4, 4, 4, 4, 4, 2, 2], [3, 3, 3, 3], [2, 2, 1], [1]]
- rows()#
Return the list of rows of
self
.EXAMPLES:
sage: B = crystals.infinity.Tableaux(['Q',4]) sage: t = B([[4,4,4,4,4,2,1],[3,3,3,3],[2,2,1],[1]]) sage: t.rows() [[1, 2, 4, 4, 4, 4, 4], [3, 3, 3, 3], [1, 2, 2], [1]]
- weight()#
Return the weight of
self
.EXAMPLES:
sage: B = crystals.infinity.Tableaux(['Q',4]) sage: t = B([[4,4,4,4,4,2,1],[3,3,3,3],[2,2,1],[1]]) sage: t.weight() (4, 2, 2, 0)
- class sage.combinat.crystals.tensor_product_element.TensorProductOfCrystalsElement#
Bases:
sage.combinat.crystals.tensor_product_element.ImmutableListWithParent
A class for elements of tensor products of crystals.
- e(i)#
Return the action of \(e_i\) on
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: B = crystals.infinity.Tableaux("D4") sage: T = crystals.TensorProduct(B,B) sage: b1 = B.highest_weight_vector().f_string([1,4,3]) sage: b2 = B.highest_weight_vector().f_string([2,2,3,1,4]) sage: t = T(b2, b1) sage: t.e(1) [[[1, 1, 1, 1, 1], [2, 2, 3, -3], [3]], [[1, 1, 1, 1, 2], [2, 2, 2], [3, -3]]] sage: t.e(2) sage: t.e(3) [[[1, 1, 1, 1, 1, 2], [2, 2, 3, -4], [3]], [[1, 1, 1, 1, 2], [2, 2, 2], [3, -3]]] sage: t.e(4) [[[1, 1, 1, 1, 1, 2], [2, 2, 3, 4], [3]], [[1, 1, 1, 1, 2], [2, 2, 2], [3, -3]]]
- epsilon(i)#
Return \(\varepsilon_i\) of
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: B = crystals.infinity.Tableaux("G2") sage: T = crystals.TensorProduct(B,B) sage: b1 = B.highest_weight_vector().f(2) sage: b2 = B.highest_weight_vector().f_string([2,2,1]) sage: t = T(b2, b1) sage: [t.epsilon(i) for i in B.index_set()] [0, 3]
- f(i)#
Return the action of \(f_i\) on
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: La = RootSystem(['A',3,1]).weight_lattice(extended=True).fundamental_weights() sage: B = crystals.GeneralizedYoungWalls(3,La[0]) sage: T = crystals.TensorProduct(B,B,B) sage: b1 = B.highest_weight_vector().f_string([0,3]) sage: b2 = B.highest_weight_vector().f_string([0]) sage: b3 = B.highest_weight_vector() sage: t = T(b3, b2, b1) sage: t.f(0) [[[0]], [[0]], [[0, 3]]] sage: t.f(1) [[], [[0]], [[0, 3], [1]]] sage: t.f(2) [[], [[0]], [[0, 3, 2]]] sage: t.f(3) [[], [[0, 3]], [[0, 3]]]
- phi(i)#
Return \(\varphi_i\) of
self
.INPUT:
i
– an element of the index set
EXAMPLES:
sage: La = RootSystem(['A',2,1]).weight_lattice(extended=True).fundamental_weights() sage: B = crystals.GeneralizedYoungWalls(2,La[0]+La[1]) sage: T = crystals.TensorProduct(B,B) sage: b1 = B.highest_weight_vector().f_string([1,0]) sage: b2 = B.highest_weight_vector().f_string([0,1]) sage: t = T(b2, b1) sage: [t.phi(i) for i in B.index_set()] [1, 1, 4]
- pp()#
Pretty print
self
.EXAMPLES:
sage: C = crystals.Tableaux(['A',3], shape=[3,1]) sage: D = crystals.Tableaux(['A',3], shape=[1]) sage: E = crystals.Tableaux(['A',3], shape=[2,2,2]) sage: T = crystals.TensorProduct(C,D,E) sage: T.module_generators[0].pp() 1 1 1 (X) 1 (X) 1 1 2 2 2 3 3
- weight()#
Return the weight of
self
.EXAMPLES:
sage: B = crystals.infinity.Tableaux("A3") sage: T = crystals.TensorProduct(B,B) sage: b1 = B.highest_weight_vector().f_string([2,1,3]) sage: b2 = B.highest_weight_vector().f(1) sage: t = T(b2, b1) sage: t [[[1, 1, 1, 2], [2, 2], [3]], [[1, 1, 1, 1, 2], [2, 2, 4], [3]]] sage: t.weight() (-2, 1, 0, 1)
sage: C = crystals.Letters(['A',3]) sage: T = crystals.TensorProduct(C,C) sage: T(C(1),C(2)).weight() (1, 1, 0, 0) sage: T = crystals.Tableaux(['D',4],shape=[]) sage: T.list()[0].weight() (0, 0, 0, 0)
- class sage.combinat.crystals.tensor_product_element.TensorProductOfQueerSuperCrystalsElement#
Bases:
sage.combinat.crystals.tensor_product_element.TensorProductOfRegularCrystalsElement
Element class for a tensor product of crystals for queer Lie superalgebras.
This implements the tensor product rule for crystals of Grantcharov et al. [GJK+2014]. Given crystals \(B_1\) and \(B_2\) of type \(\mathfrak{q}_{n+1}\), we define the tensor product \(b_1 \otimes b_2 \in B_1 \otimes B_2\), where \(b_1 \in B_1\) and \(b_2 \in B_2\), as the following:
In addition to the tensor product rule for type \(A_n\), the tensor product rule for \(e_{-1}\) and \(f_{-1}\) on \(b_1\otimes b_2\) are given by
\[\begin{split}\begin{aligned} e_{-1}(b_1\otimes b_2) &= \begin{cases} b_1 \otimes e_{-1}b_2 & \text{if } \operatorname{wt}(b_1)_1 = \operatorname{wt}(b_1)_2 = 0,\\ e_{-1}b_1 \otimes b_2 & \text{otherwise}, \end{cases} \\ f_{-1}(b_1\otimes b_2) &= \begin{cases} b_1 \otimes f_{-1}b_2 & \text{if } \operatorname{wt}(b_1)_1 = \operatorname{wt}(b_1)_2 = 0,\\ f_{-1}b_1 \otimes b_2 & \text{otherwise}. \end{cases} \end{aligned}\end{split}\]For \(1 < i \leq n\), the operators \(e_{-i}\) and \(f_{-i}\) are defined as
\[e_{-i} = s_{w^{-1}_i} e_{-1} s_{w_i}, \quad f_{-i} = s_{w^{-1}_i} f_{-1} s_{w_i}.\]Here, \(w_i = s_2 \cdots s_i s_1 \cdots s_{i-1}\) and \(s_i\) is the reflection along the \(i\)-string in the crystal. Moreover, for \(1<i\leq n\), we define the operators \(e_{-i'}\) and \(f_{-i'}\) as
\[e_{-i'} = s_{w_0} f_{-(n+1-i)} s_{w_0}, \quad f_{-i'} = s_{w_0} e_{-(n+1-i)} s_{w_0},\]where \(w_0\) is the longest element in the symmetric group \(S_{n+1}\) generated by \(s_1,\ldots,s_n\). In this implementation, we use the integers \(-2n, \ldots, -(n+1)\) to respectively denote the indices \(-n', \ldots, -1'\).
- e(i)#
Return \(e_i\) on
self
.EXAMPLES:
sage: Q = crystals.Letters(['Q', 3]) sage: T = tensor([Q,Q]) sage: t = T(Q(1),Q(1)) sage: t.e(-1) sage: t = T(Q(2),Q(1)) sage: t.e(-1) [1, 1] sage: T = tensor([Q,Q,Q,Q]) sage: t = T(Q(1),Q(3),Q(2),Q(1)) sage: t.e(-2) [2, 2, 1, 1]
- epsilon(i)#
Return \(\varepsilon_i\) on
self
.EXAMPLES:
sage: Q = crystals.Letters(['Q', 3]) sage: T = tensor([Q, Q, Q, Q]) sage: t = T(Q(1), Q(3), Q(2), Q(1)) sage: t.epsilon(-2) 1
- f(i)#
Return \(f_i\) on
self
.EXAMPLES:
sage: Q = crystals.Letters(['Q', 3]) sage: T = tensor([Q, Q]) sage: t = T(Q(1), Q(1)) sage: t.f(-1) [2, 1]
- phi(i)#
Return \(\varphi_i\) on
self
.EXAMPLES:
sage: Q = crystals.Letters(['Q', 3]) sage: T = tensor([Q, Q, Q, Q]) sage: t = T(Q(1), Q(3), Q(2), Q(1)) sage: t.phi(-2) 0 sage: t.phi(-1) 1
- class sage.combinat.crystals.tensor_product_element.TensorProductOfRegularCrystalsElement#
Bases:
sage.combinat.crystals.tensor_product_element.TensorProductOfCrystalsElement
Element class for a tensor product of regular crystals.
- e(i)#
Return the action of \(e_i\) on
self
.EXAMPLES:
sage: C = crystals.Letters(['A',5]) sage: T = crystals.TensorProduct(C,C) sage: T(C(1),C(2)).e(1) == T(C(1),C(1)) True sage: T(C(2),C(1)).e(1) is None True sage: T(C(2),C(2)).e(1) == T(C(1),C(2)) True
- epsilon(i)#
Return \(\varepsilon_i\) of
self
.EXAMPLES:
sage: C = crystals.Letters(['A',5]) sage: T = crystals.TensorProduct(C,C) sage: T(C(1),C(1)).epsilon(1) 0 sage: T(C(1),C(2)).epsilon(1) 1 sage: T(C(2),C(1)).epsilon(1) 0
- f(i)#
Return the action of \(f_i\) on
self
.EXAMPLES:
sage: C = crystals.Letters(['A',5]) sage: T = crystals.TensorProduct(C,C) sage: T(C(1),C(1)).f(1) [1, 2] sage: T(C(1),C(2)).f(1) [2, 2] sage: T(C(2),C(1)).f(1) is None True
- phi(i)#
Return \(\varphi_i\) of
self
.EXAMPLES:
sage: C = crystals.Letters(['A',5]) sage: T = crystals.TensorProduct(C,C) sage: T(C(1),C(1)).phi(1) 2 sage: T(C(1),C(2)).phi(1) 1 sage: T(C(2),C(1)).phi(1) 0
- position_of_first_unmatched_plus(i)#
Return the position of the first unmatched \(+\) or
None
if there is no unmatched \(+\).EXAMPLES:
sage: C = crystals.Letters(['A',5]) sage: T = crystals.TensorProduct(C,C) sage: T(C(2),C(1)).position_of_first_unmatched_plus(1) sage: T(C(1),C(2)).position_of_first_unmatched_plus(1) 1
- position_of_last_unmatched_minus(i)#
Return the position of the last unmatched \(-\) or
None
if there is no unmatched \(-\).EXAMPLES:
sage: C = crystals.Letters(['A',5]) sage: T = crystals.TensorProduct(C,C) sage: T(C(2),C(1)).position_of_last_unmatched_minus(1) sage: T(C(1),C(2)).position_of_last_unmatched_minus(1) 0
- positions_of_unmatched_minus(i, dual=False, reverse=False)#
EXAMPLES:
sage: C = crystals.Letters(['A',5]) sage: T = crystals.TensorProduct(C,C) sage: T(C(2),C(1)).positions_of_unmatched_minus(1) [] sage: T(C(1),C(2)).positions_of_unmatched_minus(1) [0]
- positions_of_unmatched_plus(i)#
EXAMPLES:
sage: C = crystals.Letters(['A',5]) sage: T = crystals.TensorProduct(C,C) sage: T(C(2),C(1)).positions_of_unmatched_plus(1) [] sage: T(C(1),C(2)).positions_of_unmatched_plus(1) [1]
- class sage.combinat.crystals.tensor_product_element.TensorProductOfSuperCrystalsElement#
Bases:
sage.combinat.crystals.tensor_product_element.TensorProductOfRegularCrystalsElement
Element class for a tensor product of crystals for Lie superalgebras.
This implements the tensor product rule for crystals of Lie superalgebras of [BKK2000].
- e(i)#
Return \(e_i\) on
self
.EXAMPLES:
sage: C = crystals.Letters(['A', [2, 1]]) sage: T = tensor([C,C]) sage: t = T(C(1),C(1)) sage: t.e(0) [-1, 1]
- epsilon(i)#
Return \(\varepsilon_i\) on
self
.EXAMPLES:
sage: C = crystals.Letters(['A', [2, 1]]) sage: T = tensor([C,C]) sage: t = T(C(1),C(1)) sage: t.epsilon(0) 1
- f(i)#
Return \(f_i\) on
self
.EXAMPLES:
sage: C = crystals.Letters(['A', [2, 1]]) sage: T = tensor([C,C]) sage: t = T(C(1),C(1)) sage: t.f(0) sage: t.f(1) [1, 2]
- phi(i)#
Return \(\varphi_i\) on
self
.EXAMPLES:
sage: C = crystals.Letters(['A', [2, 1]]) sage: T = tensor([C,C]) sage: t = T(C(1),C(1)) sage: t.phi(0) 0