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 to self.

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

to_tableau()

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 to self.

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 form C(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