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[source]#

Bases: TensorProductOfSuperCrystalsElement

Element class for the crystal of tableaux for Lie superalgebras of [BKK2000].

pp()[source]#

Pretty print self.

EXAMPLES:

sage: C = crystals.Tableaux(['A',[1,2]], shape=[1,1])
sage: c = C.an_element()
sage: c.pp()
-2
-1
>>> from sage.all import *
>>> C = crystals.Tableaux(['A',[Integer(1),Integer(2)]], shape=[Integer(1),Integer(1)])
>>> c = C.an_element()
>>> c.pp()
-2
-1
to_tableau()[source]#

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'>
>>> from sage.all import *
>>> C = crystals.Tableaux(['A',[Integer(1),Integer(2)]], shape=[Integer(1),Integer(1)])
>>> c = C.an_element()
>>> c.to_tableau()
[[-2], [-1]]
>>> type(c.to_tableau())
<class 'sage.combinat.tableau.Tableaux_all_with_category.element_class'>
>>> type(c)
<class 'sage.combinat.crystals.bkk_crystals.CrystalOfBKKTableaux_with_category.element_class'>
class sage.combinat.crystals.tensor_product_element.CrystalOfTableauxElement[source]#

Bases: TensorProductOfRegularCrystalsElement

Element in a crystal of tableaux.

pp()[source]#

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
>>> from sage.all import *
>>> T = crystals.Tableaux(['A',Integer(3)], shape = [Integer(2),Integer(2)])
>>> t = T(rows=[[Integer(1),Integer(2)],[Integer(3),Integer(4)]])
>>> t.pp()
1  2
3  4
promotion()[source]#

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]]
>>> from sage.all import *
>>> C = crystals.Tableaux(["A",Integer(3)], shape = [Integer(3),Integer(3),Integer(3)])
>>> t = C(Tableau([[Integer(1),Integer(1),Integer(1)],[Integer(2),Integer(2),Integer(3)],[Integer(3),Integer(4),Integer(4)]]))
>>> t
[[1, 1, 1], [2, 2, 3], [3, 4, 4]]
>>> t.promotion()
[[1, 1, 2], [2, 2, 3], [3, 4, 4]]
>>> t.promotion().parent()
The crystal of tableaux of type ['A', 3] and shape(s) [[3, 3, 3]]
promotion_inverse()[source]#

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]]
>>> from sage.all import *
>>> C = crystals.Tableaux(["A",Integer(3)], shape = [Integer(3),Integer(3),Integer(3)])
>>> t = C(Tableau([[Integer(1),Integer(1),Integer(1)],[Integer(2),Integer(2),Integer(3)],[Integer(3),Integer(4),Integer(4)]]))
>>> t
[[1, 1, 1], [2, 2, 3], [3, 4, 4]]
>>> t.promotion_inverse()
[[1, 1, 2], [2, 3, 3], [4, 4, 4]]
>>> t.promotion_inverse().parent()
The crystal of tableaux of type ['A', 3] and shape(s) [[3, 3, 3]]
shape()[source]#

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]
>>> from sage.all import *
>>> C = crystals.Tableaux(["A", Integer(2)], shape=[Integer(2),Integer(1)])
>>> x = C.an_element()
>>> x.to_tableau().shape()
[2, 1]
>>> x.shape()
[2, 1]
to_tableau()[source]#

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]]
>>> from sage.all import *
>>> T = crystals.Tableaux(['A',Integer(3)], shape = [Integer(2),Integer(2)])
>>> t = T(rows=[[Integer(1),Integer(2)],[Integer(3),Integer(4)]]).to_tableau(); t
[[1, 2], [3, 4]]
>>> type(t)
<class 'sage.combinat.tableau.Tableaux_all_with_category.element_class'>
>>> type(t[Integer(0)][Integer(0)])
<class 'int'>
>>> T = crystals.Tableaux(['D',Integer(3)], shape = [Integer(1),Integer(1)])
>>> t=T(rows=[[-Integer(3)],[Integer(3)]]).to_tableau(); t
[[-3], [3]]
>>> t=T(rows=[[Integer(3)],[-Integer(3)]]).to_tableau(); t
[[3], [-3]]
>>> T = crystals.Tableaux(['B',Integer(2)], shape = [Integer(1),Integer(1)])
>>> t = T(rows=[[Integer(0)],[Integer(0)]]).to_tableau(); t
[[0], [0]]
class sage.combinat.crystals.tensor_product_element.ImmutableListWithParent[source]#

Bases: 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[source]#

Bases: CrystalOfTableauxElement

e(i)[source]#

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
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux(['B',Integer(3)])
>>> b = B(rows=[[Integer(1),Integer(1),Integer(1),Integer(1),Integer(1),Integer(1),Integer(1),Integer(2),Integer(0),-Integer(3),-Integer(1),-Integer(1),-Integer(1),-Integer(1)],[Integer(2),Integer(2),Integer(2),Integer(2),-Integer(2),-Integer(2)],[Integer(3),-Integer(3),-Integer(3)]])
>>> b.e(Integer(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
>>> b.e(Integer(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)[source]#

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
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux(['C',Integer(4)])
>>> b = B.highest_weight_vector()
>>> b.f(Integer(1)).pp()
1  1  1  1  2
2  2  2
3  3
4
>>> b.f(Integer(3)).pp()
1  1  1  1  1
2  2  2  2
3  3  4
4
>>> b.f(Integer(3)).f(Integer(4)).pp()
1  1  1  1  1
2  2  2  2
3  3 -4
4
class sage.combinat.crystals.tensor_product_element.InfinityCrystalOfTableauxElementTypeD[source]#

Bases: InfinityCrystalOfTableauxElement

e(i)[source]#

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
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux(['D',Integer(4)])
>>> b = B.highest_weight_vector().f_string([Integer(1),Integer(4),Integer(3),Integer(1),Integer(2)]); b.pp()
1  1  1  1  2  3
2  2  2
3 -3
>>> b.e(Integer(2)).pp()
1  1  1  1  2  2
2  2  2
3 -3
f(i)[source]#

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
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux(['D',Integer(5)])
>>> b = B.highest_weight_vector().f_string([Integer(1),Integer(4),Integer(3),Integer(1),Integer(5)]); b.pp()
1  1  1  1  1  1  2  2
2  2  2  2  2
3  3  3 -5
4  5
>>> b.f(Integer(1)).pp()
1  1  1  1  1  1  2  2  2
2  2  2  2  2
3  3  3 -5
4  5
>>> b.f(Integer(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[source]#

Bases: 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()
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux(['Q',Integer(4)])
>>> t = B([[Integer(4),Integer(4),Integer(4),Integer(4),Integer(2),Integer(1)],[Integer(3),Integer(3),Integer(3)],[Integer(2),Integer(2)],[Integer(1)]])
>>> t
[[4, 4, 4, 4, 2, 1], [3, 3, 3], [2, 2], [1]]
>>> TestSuite(t).run()
e(i)[source]#

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)
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux(['Q',Integer(4)])
>>> t = B([[Integer(4),Integer(4),Integer(4),Integer(4),Integer(4),Integer(2),Integer(1)],[Integer(3),Integer(3),Integer(3),Integer(3)],[Integer(2),Integer(2),Integer(1)],[Integer(1)]])
>>> t.e(Integer(1))
[[4, 4, 4, 4, 4, 4, 2, 1], [3, 3, 3, 3, 3], [2, 2, 1, 1], [1]]
>>> t.e(Integer(3))
[[4, 4, 4, 4, 4, 3, 2, 1], [3, 3, 3, 3], [2, 2, 1], [1]]
>>> t.e(-Integer(1))
epsilon(i)[source]#

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]
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux(['Q',Integer(4)])
>>> t = B([[Integer(4),Integer(4),Integer(4),Integer(4),Integer(4),Integer(2),Integer(1)],[Integer(3),Integer(3),Integer(3),Integer(3)],[Integer(2),Integer(2),Integer(1)],[Integer(1)]])
>>> [t.epsilon(i) for i in B.index_set()]
[-1, 1, -2, 0]
f(i)[source]#

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]]
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux(['Q',Integer(4)])
>>> t = B([[Integer(4),Integer(4),Integer(4),Integer(4),Integer(4),Integer(2),Integer(1)],[Integer(3),Integer(3),Integer(3),Integer(3)],[Integer(2),Integer(2),Integer(1)],[Integer(1)]])
>>> t.f(Integer(1))
[[4, 4, 4, 4, 4, 2, 2], [3, 3, 3, 3], [2, 2, 1], [1]]
>>> t.f(Integer(3))
>>> t.f(-Integer(1))
[[4, 4, 4, 4, 4, 2, 2], [3, 3, 3, 3], [2, 2, 1], [1]]
rows()[source]#

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]]
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux(['Q',Integer(4)])
>>> t = B([[Integer(4),Integer(4),Integer(4),Integer(4),Integer(4),Integer(2),Integer(1)],[Integer(3),Integer(3),Integer(3),Integer(3)],[Integer(2),Integer(2),Integer(1)],[Integer(1)]])
>>> t.rows()
[[1, 2, 4, 4, 4, 4, 4], [3, 3, 3, 3], [1, 2, 2], [1]]
weight()[source]#

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)
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux(['Q',Integer(4)])
>>> t = B([[Integer(4),Integer(4),Integer(4),Integer(4),Integer(4),Integer(2),Integer(1)],[Integer(3),Integer(3),Integer(3),Integer(3)],[Integer(2),Integer(2),Integer(1)],[Integer(1)]])
>>> t.weight()
(4, 2, 2, 0)
class sage.combinat.crystals.tensor_product_element.TensorProductOfCrystalsElement[source]#

Bases: ImmutableListWithParent

A class for elements of tensor products of crystals.

e(i)[source]#

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]]]
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux("D4")
>>> T = crystals.TensorProduct(B,B)
>>> b1 = B.highest_weight_vector().f_string([Integer(1),Integer(4),Integer(3)])
>>> b2 = B.highest_weight_vector().f_string([Integer(2),Integer(2),Integer(3),Integer(1),Integer(4)])
>>> t = T(b2, b1)
>>> t.e(Integer(1))
[[[1, 1, 1, 1, 1], [2, 2, 3, -3], [3]], [[1, 1, 1, 1, 2], [2, 2, 2], [3, -3]]]
>>> t.e(Integer(2))
>>> t.e(Integer(3))
[[[1, 1, 1, 1, 1, 2], [2, 2, 3, -4], [3]], [[1, 1, 1, 1, 2], [2, 2, 2], [3, -3]]]
>>> t.e(Integer(4))
[[[1, 1, 1, 1, 1, 2], [2, 2, 3, 4], [3]], [[1, 1, 1, 1, 2], [2, 2, 2], [3, -3]]]
epsilon(i)[source]#

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]
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux("G2")
>>> T = crystals.TensorProduct(B,B)
>>> b1 = B.highest_weight_vector().f(Integer(2))
>>> b2 = B.highest_weight_vector().f_string([Integer(2),Integer(2),Integer(1)])
>>> t = T(b2, b1)
>>> [t.epsilon(i) for i in B.index_set()]
[0, 3]
f(i)[source]#

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]]]
>>> from sage.all import *
>>> La = RootSystem(['A',Integer(3),Integer(1)]).weight_lattice(extended=True).fundamental_weights()
>>> B = crystals.GeneralizedYoungWalls(Integer(3),La[Integer(0)])
>>> T = crystals.TensorProduct(B,B,B)
>>> b1 = B.highest_weight_vector().f_string([Integer(0),Integer(3)])
>>> b2 = B.highest_weight_vector().f_string([Integer(0)])
>>> b3 = B.highest_weight_vector()
>>> t = T(b3, b2, b1)
>>> t.f(Integer(0))
[[[0]], [[0]], [[0, 3]]]
>>> t.f(Integer(1))
[[], [[0]], [[0, 3], [1]]]
>>> t.f(Integer(2))
[[], [[0]], [[0, 3, 2]]]
>>> t.f(Integer(3))
[[], [[0, 3]], [[0, 3]]]
phi(i)[source]#

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]
>>> from sage.all import *
>>> La = RootSystem(['A',Integer(2),Integer(1)]).weight_lattice(extended=True).fundamental_weights()
>>> B = crystals.GeneralizedYoungWalls(Integer(2),La[Integer(0)]+La[Integer(1)])
>>> T = crystals.TensorProduct(B,B)
>>> b1 = B.highest_weight_vector().f_string([Integer(1),Integer(0)])
>>> b2 = B.highest_weight_vector().f_string([Integer(0),Integer(1)])
>>> t = T(b2, b1)
>>> [t.phi(i) for i in B.index_set()]
[1, 1, 4]
pp()[source]#

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
>>> from sage.all import *
>>> C = crystals.Tableaux(['A',Integer(3)], shape=[Integer(3),Integer(1)])
>>> D = crystals.Tableaux(['A',Integer(3)], shape=[Integer(1)])
>>> E = crystals.Tableaux(['A',Integer(3)], shape=[Integer(2),Integer(2),Integer(2)])
>>> T = crystals.TensorProduct(C,D,E)
>>> T.module_generators[Integer(0)].pp()
  1  1  1 (X)   1 (X)   1  1
  2                     2  2
                        3  3
weight()[source]#

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)
>>> from sage.all import *
>>> B = crystals.infinity.Tableaux("A3")
>>> T = crystals.TensorProduct(B,B)
>>> b1 = B.highest_weight_vector().f_string([Integer(2),Integer(1),Integer(3)])
>>> b2 = B.highest_weight_vector().f(Integer(1))
>>> t = T(b2, b1)
>>> t
[[[1, 1, 1, 2], [2, 2], [3]], [[1, 1, 1, 1, 2], [2, 2, 4], [3]]]
>>> 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)
>>> from sage.all import *
>>> C = crystals.Letters(['A',Integer(3)])
>>> T = crystals.TensorProduct(C,C)
>>> T(C(Integer(1)),C(Integer(2))).weight()
(1, 1, 0, 0)
>>> T = crystals.Tableaux(['D',Integer(4)],shape=[])
>>> T.list()[Integer(0)].weight()
(0, 0, 0, 0)
class sage.combinat.crystals.tensor_product_element.TensorProductOfQueerSuperCrystalsElement[source]#

Bases: 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)[source]#

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]
>>> from sage.all import *
>>> Q = crystals.Letters(['Q', Integer(3)])
>>> T = tensor([Q,Q])
>>> t = T(Q(Integer(1)),Q(Integer(1)))
>>> t.e(-Integer(1))
>>> t = T(Q(Integer(2)),Q(Integer(1)))
>>> t.e(-Integer(1))
[1, 1]

>>> T = tensor([Q,Q,Q,Q])
>>> t = T(Q(Integer(1)),Q(Integer(3)),Q(Integer(2)),Q(Integer(1)))
>>> t.e(-Integer(2))
[2, 2, 1, 1]
epsilon(i)[source]#

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
>>> from sage.all import *
>>> Q = crystals.Letters(['Q', Integer(3)])
>>> T = tensor([Q, Q, Q, Q])
>>> t = T(Q(Integer(1)), Q(Integer(3)), Q(Integer(2)), Q(Integer(1)))
>>> t.epsilon(-Integer(2))
1
f(i)[source]#

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]
>>> from sage.all import *
>>> Q = crystals.Letters(['Q', Integer(3)])
>>> T = tensor([Q, Q])
>>> t = T(Q(Integer(1)), Q(Integer(1)))
>>> t.f(-Integer(1))
[2, 1]
phi(i)[source]#

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
>>> from sage.all import *
>>> Q = crystals.Letters(['Q', Integer(3)])
>>> T = tensor([Q, Q, Q, Q])
>>> t = T(Q(Integer(1)), Q(Integer(3)), Q(Integer(2)), Q(Integer(1)))
>>> t.phi(-Integer(2))
0
>>> t.phi(-Integer(1))
1
class sage.combinat.crystals.tensor_product_element.TensorProductOfRegularCrystalsElement[source]#

Bases: TensorProductOfCrystalsElement

Element class for a tensor product of regular crystals.

e(i)[source]#

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
>>> from sage.all import *
>>> C = crystals.Letters(['A',Integer(5)])
>>> T = crystals.TensorProduct(C,C)
>>> T(C(Integer(1)),C(Integer(2))).e(Integer(1)) == T(C(Integer(1)),C(Integer(1)))
True
>>> T(C(Integer(2)),C(Integer(1))).e(Integer(1)) is None
True
>>> T(C(Integer(2)),C(Integer(2))).e(Integer(1)) == T(C(Integer(1)),C(Integer(2)))
True
epsilon(i)[source]#

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
>>> from sage.all import *
>>> C = crystals.Letters(['A',Integer(5)])
>>> T = crystals.TensorProduct(C,C)
>>> T(C(Integer(1)),C(Integer(1))).epsilon(Integer(1))
0
>>> T(C(Integer(1)),C(Integer(2))).epsilon(Integer(1))
1
>>> T(C(Integer(2)),C(Integer(1))).epsilon(Integer(1))
0
f(i)[source]#

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
>>> from sage.all import *
>>> C = crystals.Letters(['A',Integer(5)])
>>> T = crystals.TensorProduct(C,C)
>>> T(C(Integer(1)),C(Integer(1))).f(Integer(1))
[1, 2]
>>> T(C(Integer(1)),C(Integer(2))).f(Integer(1))
[2, 2]
>>> T(C(Integer(2)),C(Integer(1))).f(Integer(1)) is None
True
phi(i)[source]#

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
>>> from sage.all import *
>>> C = crystals.Letters(['A',Integer(5)])
>>> T = crystals.TensorProduct(C,C)
>>> T(C(Integer(1)),C(Integer(1))).phi(Integer(1))
2
>>> T(C(Integer(1)),C(Integer(2))).phi(Integer(1))
1
>>> T(C(Integer(2)),C(Integer(1))).phi(Integer(1))
0
position_of_first_unmatched_plus(i)[source]#

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
>>> from sage.all import *
>>> C = crystals.Letters(['A',Integer(5)])
>>> T = crystals.TensorProduct(C,C)
>>> T(C(Integer(2)),C(Integer(1))).position_of_first_unmatched_plus(Integer(1))
>>> T(C(Integer(1)),C(Integer(2))).position_of_first_unmatched_plus(Integer(1))
1
position_of_last_unmatched_minus(i)[source]#

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
>>> from sage.all import *
>>> C = crystals.Letters(['A',Integer(5)])
>>> T = crystals.TensorProduct(C,C)
>>> T(C(Integer(2)),C(Integer(1))).position_of_last_unmatched_minus(Integer(1))
>>> T(C(Integer(1)),C(Integer(2))).position_of_last_unmatched_minus(Integer(1))
0
positions_of_unmatched_minus(i, dual=False, reverse=False)[source]#

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]
>>> from sage.all import *
>>> C = crystals.Letters(['A',Integer(5)])
>>> T = crystals.TensorProduct(C,C)
>>> T(C(Integer(2)),C(Integer(1))).positions_of_unmatched_minus(Integer(1))
[]
>>> T(C(Integer(1)),C(Integer(2))).positions_of_unmatched_minus(Integer(1))
[0]
positions_of_unmatched_plus(i)[source]#

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]
>>> from sage.all import *
>>> C = crystals.Letters(['A',Integer(5)])
>>> T = crystals.TensorProduct(C,C)
>>> T(C(Integer(2)),C(Integer(1))).positions_of_unmatched_plus(Integer(1))
[]
>>> T(C(Integer(1)),C(Integer(2))).positions_of_unmatched_plus(Integer(1))
[1]
class sage.combinat.crystals.tensor_product_element.TensorProductOfSuperCrystalsElement[source]#

Bases: 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)[source]#

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]
>>> from sage.all import *
>>> C = crystals.Letters(['A', [Integer(2), Integer(1)]])
>>> T = tensor([C,C])
>>> t = T(C(Integer(1)),C(Integer(1)))
>>> t.e(Integer(0))
[-1, 1]
epsilon(i)[source]#

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
>>> from sage.all import *
>>> C = crystals.Letters(['A', [Integer(2), Integer(1)]])
>>> T = tensor([C,C])
>>> t = T(C(Integer(1)),C(Integer(1)))
>>> t.epsilon(Integer(0))
1
f(i)[source]#

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]
>>> from sage.all import *
>>> C = crystals.Letters(['A', [Integer(2), Integer(1)]])
>>> T = tensor([C,C])
>>> t = T(C(Integer(1)),C(Integer(1)))
>>> t.f(Integer(0))
>>> t.f(Integer(1))
[1, 2]
phi(i)[source]#

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
>>> from sage.all import *
>>> C = crystals.Letters(['A', [Integer(2), Integer(1)]])
>>> T = tensor([C,C])
>>> t = T(C(Integer(1)),C(Integer(1)))
>>> t.phi(Integer(0))
0