The Bender-Knuth involutions #
Fix a semistandard Young tableau T and a letter v. The Bender-Knuth involution at v
rewrites the vs and (v + 1)s of T so as to exchange how often the two letters occur, leaving
every other letter untouched. It is the combinatorial mechanism behind the symmetry of the Schur
polynomials, and this file builds it.
The construction here is not the usual row-by-row description ("the vs and (v + 1)s that are
not vertically paired form, in each row, a block of a copies of v followed by b copies of
v + 1; replace it by b copies of v and a copies of v + 1"). It is organized instead
around a single counting function, SemistandardYoungTableau.rowCountLt T i x, the number of
entries smaller than x in row i. Rows increase weakly, so the entries of row i smaller than
x occupy exactly the columns below rowCountLt T i x, and this one function records the whole
row. Writing a i = rowCountLt T i v, n i = rowCountLt T i (v + 1) and
b i = rowCountLt T i (v + 2), the letters v and v + 1 of row i occupy the columns of
Finset.Ico (a i) (b i), split at n i.
A filling with the same entries outside those blocks is then the same thing as a choice of a new
splitting point cut i in each row, and SemistandardYoungTableau.recut builds it. Two
inequalities per row beyond a i ≤ cut i ≤ b i are enough to make the result semistandard again —
this is SemistandardYoungTableau.IsCut, a sufficient condition — and together they place cut i
in the interval [max (a i) (b (i + 1)), min (b i) (a (i - 1))], which contains n i. The
Bender-Knuth involution recuts each row at the reflection of n i in that interval, and being a
reflection is what makes it an involution: the interval is unchanged by a recut, because its
endpoints depend only on a and b, which a recut does not move.
Main definitions #
SemistandardYoungTableau.rowCountLt: the number of entries smaller than a given letter in a given row.SemistandardYoungTableau.IsCut: the condition on a family of splitting points that makes the recut filling semistandard.SemistandardYoungTableau.recut: the tableau obtained by splitting thev/(v + 1)block of each row at a prescribed column.SemistandardYoungTableau.benderKnuth: the Bender-Knuth involution at a letterv.
Main results #
SemistandardYoungTableau.benderKnuth_benderKnuth: the Bender-Knuth involution is an involution.SemistandardYoungTableau.content_benderKnuth: it exchanges the multiplicities ofvandv + 1and fixes every other one.
References #
- E. A. Bender and D. E. Knuth, Enumeration of plane partitions, J. Combinatorial Theory 13 (1972), 40--54, where the involution originates.
- W. Fulton, Young Tableaux, Section 2.2.
- Schur--Weyl roadmap, Layer 7.
Counting the entries of a row #
The number of entries smaller than x in row i of a tableau. As rows increase weakly, these
entries occupy exactly the columns below this number — the content of
SemistandardYoungTableau.lt_rowCountLt_iff — so a single such counting function records the whole
row.
Equations
- T.rowCountLt i x = {j ∈ Finset.range (μ.rowLen i) | T i j < x}.card
Instances For
The entries of a row smaller than x occupy an initial segment of columns, of length
SemistandardYoungTableau.rowCountLt.
The columns of a row carrying an entry smaller than x are exactly those below
SemistandardYoungTableau.rowCountLt.
A row has at most as many entries smaller than x as it has cells.
Counting entries below a larger letter counts more of them.
The column inequality, in the form everything below rests on: entries increase strictly
down a column, so row i + 1 has no more entries smaller than x + 1 than row i has entries
smaller than x.
A row past the height of the shape has no entries at all.
The block of a letter and its successor #
Equations
The block of a row is the interval of columns from rowCountLt T i v to
rowCountLt T i (v + 2).
A cell outside the shape is outside the block.
Recutting a block #
The recut condition: a family of splitting points, one per row, produces a semistandard
filling — SemistandardYoungTableau.recut — as soon as each cut i lies inside the block of row
i and no vertically adjacent pair of a v above a v + 1 is broken. The last two clauses say
the latter: such a pair sits in the columns of
Finset.Ico (rowCountLt T i v) (rowCountLt T (i + 1) (v + 2)), so its v keeps its letter when
cut i is at least the right endpoint, and its v + 1 keeps its letter when cut (i + 1) is at
most the left one.
This is a sufficient condition, not a necessary one: a row whose block is empty carries no letter
that a recut can move, so the recut filling ignores cut i there while the condition still pins it
down. Every family of splitting points used here — the tableau's own, and the reflected ones of
SemistandardYoungTableau.benderKnuth — satisfies it.
The splitting point of a row is at least the start of its block.
The splitting point of a row is at most the end of its block.
The
vof a vertically adjacent pair keeps its letter.The
v + 1of a vertically adjacent pair keeps its letter.
Instances For
The recut tableau: the semistandard tableau agreeing with T outside the v/(v + 1)
blocks, whose blocks are split at the prescribed columns.
Equations
- T.recut v cut hcut = { entry := SemistandardYoungTableau.recutEntry✝ T v cut, row_weak' := ⋯, col_strict' := ⋯, zeros' := ⋯ }
Instances For
The entries of a recut tableau: inside the block of a row, v before the splitting point and
v + 1 after it; everywhere else, the old entry.
Inside the block, the entry of a recut tableau is v before the splitting point and v + 1
after it.
Outside the block, the entry of a recut tableau is the old entry.
A recut moves no letter into or out of the block, so the two tableaux have the same blocks.
The row counts of a recut tableau #
Below the block, a recut changes no row count.
Above the block, a recut changes no row count.
A recut is exactly a change of splitting point: in the recut tableau, the block of row i
is split at cut i.
Recutting at the splitting points of T itself changes nothing.
A recut condition for T is a recut condition for any recut of T: the constraints depend
only on the row counts below and above the block, which a recut leaves alone.
Recutting twice is recutting once.
The content of a recut tableau #
Inside a row, the cells of a recut tableau carrying the letter v are those from the start of
the block to the splitting point.
Inside a row, the cells of a recut tableau carrying the letter v + 1 are those from the
splitting point to the end of the block.
A recut moves no letter other than v and v + 1.
How often the letter v occurs in a recut tableau, counted row by row.
How often the letter v + 1 occurs in a recut tableau, counted row by row.
How often the letter v occurs in a tableau, counted row by row: it is the recut count at the
tableau's own splitting points.
How often the letter v + 1 occurs in a tableau, counted row by row.
A recut preserves how many cells carry one of the two letters v and v + 1; it only moves
the boundary between them.
The Bender-Knuth involution #
The Bender-Knuth involution at the letter v: the recut of T at the reflected splitting
points.
Equations
- T.benderKnuth v = T.recut v (SemistandardYoungTableau.bkCut✝ T v) ⋯
Instances For
Outside the block, the involution leaves the entry alone.
The involution writes no letter other than the ones already there and the two it exchanges.
The involution moves no letter into or out of the block, so it leaves the block alone.
The Bender-Knuth involution is an involution.
The effect on the content #
The Bender-Knuth involution exchanges the two letters it is named for: after it, the letter
v occurs as often as v + 1 did.
The Bender-Knuth involution exchanges the two letters it is named for: after it, the letter
v + 1 occurs as often as v did.
The Bender-Knuth involution leaves every other letter alone.
The Bender-Knuth involution exchanges the multiplicities of v and v + 1 and fixes every
other one.