Semistandard Tableaux#
This is an implementation of the abstract base class
sage.combinat.path_tableaux.path_tableau.PathTableau
.
This implementation is for semistandard tableaux, represented as a chain of partitions (essentially, the Gelfand-Tsetlin pattern). This generalises the jeu de taquin operations of rectification, promotion, evacuation from standard tableaux to semistandard tableaux. The local rule is the Bender-Knuth involution.
EXAMPLES:
sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1],
....: [3,3,2,1], [4,3,3,1,0]])
sage: pt.promotion()
[(), (2,), (3, 1), (3, 2, 1), (4, 3, 1, 0), (4, 3, 3, 1, 0)]
sage: pt.evacuation()
[(), (2,), (4, 0), (4, 2, 0), (4, 3, 1, 0), (4, 3, 3, 1, 0)]
sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1],
....: [3,3,2,1], [9/2,3,3,1,0]])
sage: pt.promotion()
[(), (2,), (3, 1), (3, 2, 1), (9/2, 3, 1, 0), (9/2, 3, 3, 1, 0)]
sage: pt.evacuation()
[(), (5/2,), (9/2, 0), (9/2, 2, 0), (9/2, 3, 1, 0), (9/2, 3, 3, 1, 0)]
sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [4,2], [5,4,1]])
sage: path_tableaux.CylindricalDiagram(pt)
[ (), (3,), (4, 2), (5, 4, 1)]
[ , (), (3,), (5, 2), (5, 4, 1)]
[ , , (), (4,), (4, 3), (5, 4, 1)]
[ , , , (), (3,), (5, 1), (5, 4, 1)]
sage: pt2 = path_tableaux.SemistandardPathTableau([[3,2], [3,3,1],
....: [3,3,2,1], [4,3,3,1,0]])
sage: pt1 = path_tableaux.SemistandardPathTableau([[], [3], [3,2]])
sage: pt1.commutor(pt2)
([(), (2,), (2, 2), (4, 2, 0)], [(4, 2, 0), (4, 3, 2, 0), (4, 3, 3, 1, 0)])
sage: pt1.commutor(pt2,verbose=True)
[(3, 2), (3, 3, 1), (3, 3, 2, 1), (4, 3, 3, 1, 0)]
[(3,), (3, 2), (3, 2, 2), (4, 3, 2, 0)]
[(), (2,), (2, 2), (4, 2, 0)]
([(), (2,), (2, 2), (4, 2, 0)], [(4, 2, 0), (4, 3, 2, 0), (4, 3, 3, 1, 0)])
sage: st = SkewTableau([[None, None, None, 4, 4, 5, 6, 7], [None, 2, 4, 6, 7, 7, 7],
....: [None, 4, 5, 8, 8, 9], [None, 6, 7, 10], [None, 8, 8, 11],
....: [None], [4]])
sage: pt = path_tableaux.SemistandardPathTableau(st)
sage: bk = [SkewTableau(st.bender_knuth_involution(i+1)) for i in range(10)]
sage: lr = [pt.local_rule(i+1) for i in range(10)]
sage: [r.to_tableau() for r in lr] == bk
True
>>> from sage.all import *
>>> pt = path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(3),Integer(2)], [Integer(3),Integer(3),Integer(1)],
... [Integer(3),Integer(3),Integer(2),Integer(1)], [Integer(4),Integer(3),Integer(3),Integer(1),Integer(0)]])
>>> pt.promotion()
[(), (2,), (3, 1), (3, 2, 1), (4, 3, 1, 0), (4, 3, 3, 1, 0)]
>>> pt.evacuation()
[(), (2,), (4, 0), (4, 2, 0), (4, 3, 1, 0), (4, 3, 3, 1, 0)]
>>> pt = path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(3),Integer(2)], [Integer(3),Integer(3),Integer(1)],
... [Integer(3),Integer(3),Integer(2),Integer(1)], [Integer(9)/Integer(2),Integer(3),Integer(3),Integer(1),Integer(0)]])
>>> pt.promotion()
[(), (2,), (3, 1), (3, 2, 1), (9/2, 3, 1, 0), (9/2, 3, 3, 1, 0)]
>>> pt.evacuation()
[(), (5/2,), (9/2, 0), (9/2, 2, 0), (9/2, 3, 1, 0), (9/2, 3, 3, 1, 0)]
>>> pt = path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(4),Integer(2)], [Integer(5),Integer(4),Integer(1)]])
>>> path_tableaux.CylindricalDiagram(pt)
[ (), (3,), (4, 2), (5, 4, 1)]
[ , (), (3,), (5, 2), (5, 4, 1)]
[ , , (), (4,), (4, 3), (5, 4, 1)]
[ , , , (), (3,), (5, 1), (5, 4, 1)]
>>> pt2 = path_tableaux.SemistandardPathTableau([[Integer(3),Integer(2)], [Integer(3),Integer(3),Integer(1)],
... [Integer(3),Integer(3),Integer(2),Integer(1)], [Integer(4),Integer(3),Integer(3),Integer(1),Integer(0)]])
>>> pt1 = path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(3),Integer(2)]])
>>> pt1.commutor(pt2)
([(), (2,), (2, 2), (4, 2, 0)], [(4, 2, 0), (4, 3, 2, 0), (4, 3, 3, 1, 0)])
>>> pt1.commutor(pt2,verbose=True)
[(3, 2), (3, 3, 1), (3, 3, 2, 1), (4, 3, 3, 1, 0)]
[(3,), (3, 2), (3, 2, 2), (4, 3, 2, 0)]
[(), (2,), (2, 2), (4, 2, 0)]
([(), (2,), (2, 2), (4, 2, 0)], [(4, 2, 0), (4, 3, 2, 0), (4, 3, 3, 1, 0)])
>>> st = SkewTableau([[None, None, None, Integer(4), Integer(4), Integer(5), Integer(6), Integer(7)], [None, Integer(2), Integer(4), Integer(6), Integer(7), Integer(7), Integer(7)],
... [None, Integer(4), Integer(5), Integer(8), Integer(8), Integer(9)], [None, Integer(6), Integer(7), Integer(10)], [None, Integer(8), Integer(8), Integer(11)],
... [None], [Integer(4)]])
>>> pt = path_tableaux.SemistandardPathTableau(st)
>>> bk = [SkewTableau(st.bender_knuth_involution(i+Integer(1))) for i in range(Integer(10))]
>>> lr = [pt.local_rule(i+Integer(1)) for i in range(Integer(10))]
>>> [r.to_tableau() for r in lr] == bk
True
AUTHORS:
Bruce Westbury (2020): initial version
- class sage.combinat.path_tableaux.semistandard.SemistandardPathTableau(parent, st, check=True)[source]#
Bases:
PathTableau
An instance is a sequence of lists. Usually the entries will be non-negative integers in which case this is the chain of partitions of a (skew) semistandard tableau. In general the entries are elements of an ordered abelian group; each list is weakly decreasing and successive lists are interleaved.
INPUT:
Can be any of the following
a sequence of partitions
a sequence of lists/tuples
a semistandard tableau
a semistandard skew tableau
a Gelfand-Tsetlin pattern
EXAMPLES:
sage: path_tableaux.SemistandardPathTableau([[], [2], [2,1]]) [(), (2,), (2, 1)] sage: gt = GelfandTsetlinPattern([[2,1], [2]]) sage: path_tableaux.SemistandardPathTableau(gt) [(), (2,), (2, 1)] sage: st = SemistandardTableau([[1,1], [2]]) sage: path_tableaux.SemistandardPathTableau(st) [(), (2,), (2, 1)] sage: st = SkewTableau([[1,1], [2]]) sage: path_tableaux.SemistandardPathTableau(st) [(), (2,), (2, 1)] sage: st = SkewTableau([[None,1,1], [2]]) sage: path_tableaux.SemistandardPathTableau(st) [(1,), (3, 0), (3, 1, 0)] sage: path_tableaux.SemistandardPathTableau([[], [5/2], [7/2,2]]) [(), (5/2,), (7/2, 2)] sage: path_tableaux.SemistandardPathTableau([[], [2.5], [3.5,2]]) [(), (2.50000000000000,), (3.50000000000000, 2)]
>>> from sage.all import * >>> path_tableaux.SemistandardPathTableau([[], [Integer(2)], [Integer(2),Integer(1)]]) [(), (2,), (2, 1)] >>> gt = GelfandTsetlinPattern([[Integer(2),Integer(1)], [Integer(2)]]) >>> path_tableaux.SemistandardPathTableau(gt) [(), (2,), (2, 1)] >>> st = SemistandardTableau([[Integer(1),Integer(1)], [Integer(2)]]) >>> path_tableaux.SemistandardPathTableau(st) [(), (2,), (2, 1)] >>> st = SkewTableau([[Integer(1),Integer(1)], [Integer(2)]]) >>> path_tableaux.SemistandardPathTableau(st) [(), (2,), (2, 1)] >>> st = SkewTableau([[None,Integer(1),Integer(1)], [Integer(2)]]) >>> path_tableaux.SemistandardPathTableau(st) [(1,), (3, 0), (3, 1, 0)] >>> path_tableaux.SemistandardPathTableau([[], [Integer(5)/Integer(2)], [Integer(7)/Integer(2),Integer(2)]]) [(), (5/2,), (7/2, 2)] >>> path_tableaux.SemistandardPathTableau([[], [RealNumber('2.5')], [RealNumber('3.5'),Integer(2)]]) [(), (2.50000000000000,), (3.50000000000000, 2)]
- check()[source]#
Check that
self
is a valid path.EXAMPLES:
sage: path_tableaux.SemistandardPathTableau([[], [3], [2,2]]) # indirect doctest Traceback (most recent call last): ... ValueError: [(), (3,), (2, 2)] does not satisfy the required inequalities in row 1 sage: path_tableaux.SemistandardPathTableau([[], [3/2], [2,5/2]]) # indirect doctest Traceback (most recent call last): ... ValueError: [(), (3/2,), (2, 5/2)] does not satisfy the required inequalities in row 1
>>> from sage.all import * >>> path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(2),Integer(2)]]) # indirect doctest Traceback (most recent call last): ... ValueError: [(), (3,), (2, 2)] does not satisfy the required inequalities in row 1 >>> path_tableaux.SemistandardPathTableau([[], [Integer(3)/Integer(2)], [Integer(2),Integer(5)/Integer(2)]]) # indirect doctest Traceback (most recent call last): ... ValueError: [(), (3/2,), (2, 5/2)] does not satisfy the required inequalities in row 1
- is_integral()[source]#
Return
True
if all entries are non-negative integers.EXAMPLES:
sage: path_tableaux.SemistandardPathTableau([[], [3], [3,2]]).is_integral() True sage: path_tableaux.SemistandardPathTableau([[], [5/2], [7/2,2]]).is_integral() False sage: path_tableaux.SemistandardPathTableau([[], [3], [3,-2]]).is_integral() False
>>> from sage.all import * >>> path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(3),Integer(2)]]).is_integral() True >>> path_tableaux.SemistandardPathTableau([[], [Integer(5)/Integer(2)], [Integer(7)/Integer(2),Integer(2)]]).is_integral() False >>> path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(3),-Integer(2)]]).is_integral() False
- is_skew()[source]#
Return
True
ifself
is skew.EXAMPLES:
sage: path_tableaux.SemistandardPathTableau([[], [2]]).is_skew() False sage: path_tableaux.SemistandardPathTableau([[2,1]]).is_skew() True
>>> from sage.all import * >>> path_tableaux.SemistandardPathTableau([[], [Integer(2)]]).is_skew() False >>> path_tableaux.SemistandardPathTableau([[Integer(2),Integer(1)]]).is_skew() True
- local_rule(i)[source]#
This is the Bender-Knuth involution.
This is implemented by toggling the entries of the \(i\)-th list. The allowed range for
i
is0 < i < len(self)-1
so any row except the first and last can be changed.EXAMPLES:
sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], ....: [3,3,1], [3,3,2,1]]) sage: pt.local_rule(1) [(), (2,), (3, 2), (3, 3, 1), (3, 3, 2, 1)] sage: pt.local_rule(2) [(), (3,), (3, 2), (3, 3, 1), (3, 3, 2, 1)] sage: pt.local_rule(3) [(), (3,), (3, 2), (3, 2, 2), (3, 3, 2, 1)]
>>> from sage.all import * >>> pt = path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(3),Integer(2)], ... [Integer(3),Integer(3),Integer(1)], [Integer(3),Integer(3),Integer(2),Integer(1)]]) >>> pt.local_rule(Integer(1)) [(), (2,), (3, 2), (3, 3, 1), (3, 3, 2, 1)] >>> pt.local_rule(Integer(2)) [(), (3,), (3, 2), (3, 3, 1), (3, 3, 2, 1)] >>> pt.local_rule(Integer(3)) [(), (3,), (3, 2), (3, 2, 2), (3, 3, 2, 1)]
- rectify(inner=None, verbose=False)[source]#
Rectify
self
.This gives the usual rectification of a skew standard tableau and gives a generalisation to skew semistandard tableaux. The usual construction uses jeu de taquin but here we use the Bender-Knuth involutions.
EXAMPLES:
sage: st = SkewTableau([[None, None, None, 4], [None, None, 1, 6], ....: [None, None, 5], [2, 3]]) sage: path_tableaux.SemistandardPathTableau(st).rectify() [(), (1,), (1, 1), (2, 1, 0), (3, 1, 0, 0), (3, 2, 0, 0, 0), (4, 2, 0, 0, 0, 0)] sage: path_tableaux.SemistandardPathTableau(st).rectify(verbose=True) [[(3, 2, 2), (3, 3, 2, 0), (3, 3, 2, 1, 0), (3, 3, 2, 2, 0, 0), (4, 3, 2, 2, 0, 0, 0), (4, 3, 3, 2, 0, 0, 0, 0), (4, 4, 3, 2, 0, 0, 0, 0, 0)], [(3, 2), (3, 3, 0), (3, 3, 1, 0), (3, 3, 2, 0, 0), (4, 3, 2, 0, 0, 0), (4, 3, 3, 0, 0, 0, 0), (4, 4, 3, 0, 0, 0, 0, 0)], [(3,), (3, 1), (3, 1, 1), (3, 2, 1, 0), (4, 2, 1, 0, 0), (4, 3, 1, 0, 0, 0), (4, 4, 1, 0, 0, 0, 0)], [(), (1,), (1, 1), (2, 1, 0), (3, 1, 0, 0), (3, 2, 0, 0, 0), (4, 2, 0, 0, 0, 0)]]
>>> from sage.all import * >>> st = SkewTableau([[None, None, None, Integer(4)], [None, None, Integer(1), Integer(6)], ... [None, None, Integer(5)], [Integer(2), Integer(3)]]) >>> path_tableaux.SemistandardPathTableau(st).rectify() [(), (1,), (1, 1), (2, 1, 0), (3, 1, 0, 0), (3, 2, 0, 0, 0), (4, 2, 0, 0, 0, 0)] >>> path_tableaux.SemistandardPathTableau(st).rectify(verbose=True) [[(3, 2, 2), (3, 3, 2, 0), (3, 3, 2, 1, 0), (3, 3, 2, 2, 0, 0), (4, 3, 2, 2, 0, 0, 0), (4, 3, 3, 2, 0, 0, 0, 0), (4, 4, 3, 2, 0, 0, 0, 0, 0)], [(3, 2), (3, 3, 0), (3, 3, 1, 0), (3, 3, 2, 0, 0), (4, 3, 2, 0, 0, 0), (4, 3, 3, 0, 0, 0, 0), (4, 4, 3, 0, 0, 0, 0, 0)], [(3,), (3, 1), (3, 1, 1), (3, 2, 1, 0), (4, 2, 1, 0, 0), (4, 3, 1, 0, 0, 0), (4, 4, 1, 0, 0, 0, 0)], [(), (1,), (1, 1), (2, 1, 0), (3, 1, 0, 0), (3, 2, 0, 0, 0), (4, 2, 0, 0, 0, 0)]]
- size()[source]#
Return the size or length of
self
.EXAMPLES:
sage: path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1], [3,3,2,1]]).size() 5
>>> from sage.all import * >>> path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(3),Integer(2)], [Integer(3),Integer(3),Integer(1)], [Integer(3),Integer(3),Integer(2),Integer(1)]]).size() 5
- to_pattern()[source]#
Convert
self
to a Gelfand-Tsetlin pattern.EXAMPLES:
sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1], ....: [3,3,2,1], [4,3,3,1]]) sage: pt.to_pattern() [[4, 3, 3, 1, 0], [3, 3, 2, 1], [3, 3, 1], [3, 2], [3]]
>>> from sage.all import * >>> pt = path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(3),Integer(2)], [Integer(3),Integer(3),Integer(1)], ... [Integer(3),Integer(3),Integer(2),Integer(1)], [Integer(4),Integer(3),Integer(3),Integer(1)]]) >>> pt.to_pattern() [[4, 3, 3, 1, 0], [3, 3, 2, 1], [3, 3, 1], [3, 2], [3]]
- to_tableau()[source]#
Convert
self
to aSemistandardTableau
.The
SemistandardSkewTableau
is not implemented so this returns aSkewTableau
EXAMPLES:
sage: pt = path_tableaux.SemistandardPathTableau([[], [3], [3,2], [3,3,1], ....: [3,3,2,1], [4,3,3,1,0]]) sage: pt.to_tableau() [[1, 1, 1, 5], [2, 2, 3], [3, 4, 5], [4]]
>>> from sage.all import * >>> pt = path_tableaux.SemistandardPathTableau([[], [Integer(3)], [Integer(3),Integer(2)], [Integer(3),Integer(3),Integer(1)], ... [Integer(3),Integer(3),Integer(2),Integer(1)], [Integer(4),Integer(3),Integer(3),Integer(1),Integer(0)]]) >>> pt.to_tableau() [[1, 1, 1, 5], [2, 2, 3], [3, 4, 5], [4]]
- class sage.combinat.path_tableaux.semistandard.SemistandardPathTableaux[source]#
Bases:
PathTableaux
The parent class for
SemistandardPathTableau
.- Element[source]#
alias of
SemistandardPathTableau