The Pieri Rules and Jacobi-Trudi Identities #
This file formalizes the Pieri rules for multiplying Schur polynomials by complete homogeneous or elementary symmetric polynomials, and the Jacobi-Trudi identities expressing skew Schur polynomials as determinants.
Main definitions #
NPartition: An N-partition is a weakly decreasing N-tuple of nonnegative integersNPartition.IsTranspose: Predicate asserting that two partitions are transposesSkewPartition: A skew partition λ/μ is a pair of partitions with μ ⊆ λSkewPartition.isHorizontalStrip: A skew partition is a horizontal strip if no two boxes in Y(λ/μ) lie in the same columnSkewPartition.isVerticalStrip: A skew partition is a vertical strip if no two boxes in Y(λ/μ) lie in the same rowSkewPartition.isHorizontalNStrip: A horizontal n-strip has exactly n boxesSkewPartition.isVerticalNStrip: A vertical n-strip has exactly n boxesisHorizontalStripFun: Canonical unbundled horizontal strip predicate with(lam, mu)orderisVerticalStripFun: Canonical unbundled vertical strip predicate with(lam, mu)orderSSYT: A semistandard Young tableau of shape λSkewSSYT: A semistandard Young tableau of skew shape λ/μLatticePath: A lattice path in ℤ² using north and east stepsNipat: A non-intersecting path tuple (for LGV lemma connection)
Main results #
pieri_horizontal: h_n · s_μ = ∑_{λ/μ is horizontal n-strip} s_λ (Theorem thm.sf.pieri(a))pieri_vertical: e_n · s_μ = ∑_{λ/μ is vertical n-strip} s_λ (Theorem thm.sf.pieri(b))horizontalStrip_iff_entries: Characterization of horizontal strips via partition entries (Proposition prop.sf.strips.entries(a))verticalStrip_iff_entries: Characterization of vertical strips via partition entries (Proposition prop.sf.strips.entries(b))jacobiTrudi_h: s_{λ/μ} = det(h_{λᵢ - μⱼ - i + j}) (Theorem thm.sf.jt-h)jacobiTrudi_e: s_{λ/μ} = det(e_{λᵢᵗ - μⱼᵗ - i + j}) (Theorem thm.sf.jt-e)
References #
- Source: AlgebraicCombinatorics/tex/SymmetricFunctions/PieriJacobiTrudi.tex
- [Stanley, Enumerative Combinatorics, Vol. 2][Stanley-EC2]
- [Grinberg-Reiner, Hopf algebras in combinatorics][GriRei]
Implementation notes #
We work with N-partitions as length-N lists of weakly decreasing nonnegative integers. Schur polynomials are defined via semistandard Young tableaux (SSYT). The Jacobi-Trudi identities are proved using the Lindström-Gessel-Viennot lemma (see AlgebraicCombinatorics/Determinants/LGV2.lean).
For h_n and e_n with negative n, we use the convention h_n = 0 and e_n = 0.
Note: In the source, M is the length of the partition tuples (for Jacobi-Trudi), while N is the number of variables (entries in tableaux come from [N]). We use a single parameter N for simplicity in this formalization.
Strip Definition Conventions #
There are three representations for horizontal/vertical strip predicates:
Bundled (
SkewPartition.isHorizontalStrip): Takes aSkewPartition Ndirectly. Use when working with bundled skew partitions.Unbundled canonical (
isHorizontalStripFun): Takes(lam mu : Fin N → ℕ)with argument order matching the mathematical notation λ/μ. Preferred for new code.
See SkewPartition.isHorizontalStrip_iff_isHorizontalStripFun for the equivalence lemma.
N-Partitions #
An N-partition is a weakly decreasing N-tuple of nonnegative integers.
DEPRECATION NOTE: This is a local definition within the SymmetricFunctions namespace.
A canonical definition exists at the top level in NPartition.lean (see
AlgebraicCombinatorics/SymmetricFunctions/NPartition.lean). New code should prefer
the canonical definition. This local definition uses weaklyDecreasing as the field name,
while the canonical definition uses antitone (which matches Mathlib conventions).
Both are semantically equivalent.
Migration support: An equivalence NPartition.equivShared is provided below
to convert between the local and shared definitions. This enables gradual migration:
- Use
NPartition.toSharedto convert local → shared - Use
NPartition.ofSharedto convert shared → local - Both preserve
parts,size, and the≤relation
Note: MonomialSymmetric.lean and SchurBasics.lean have been migrated to use
the canonical definition. This file retains the local definition to avoid large
refactoring of the extensive APIs built on top of it.
An N-partition is a list of length N with weakly decreasing nonnegative entries. This corresponds to Definition def.sf.N-par in the source.
Note: This is SymmetricFunctions.NPartition, a local definition.
A canonical top-level NPartition exists in NPartition.lean with the same
semantics (using antitone as the field name instead of weaklyDecreasing).
See the section docstring for details.
The parts of the partition
The parts are weakly decreasing
Instances For
Two N-partitions are equal if their parts are equal.
Decidable equality for N-partitions.
Equations
- lam.instDecidableEq mu = decidable_of_iff (lam.parts = mu.parts) ⋯
The zero partition (0, 0, ..., 0)
Equations
- SymmetricFunctions.NPartition.zero N = { parts := fun (x : Fin N) => 0, weaklyDecreasing := ⋯ }
Instances For
Equations
The size (sum of parts) of an N-partition
Instances For
Equations
Decidable instance for partition containment.
Equations
The transpose of a partition. See Exercise exe.pars.transpose in the source. The transpose λᵗ satisfies: (λᵗ)ᵢ = |{j : λⱼ ≥ i+1}| for each i. The length of the transpose equals the first (largest) part of λ.
Equations
Instances For
Predicate asserting that lamt is the transpose of lam.
The transpose λᵗ of a partition λ satisfies:
(λᵗ)ᵢ = |{j : λⱼ ≥ i}| for each i.
Since we work with fixed-length tuples, this predicate captures when two tuples represent transpose partitions (possibly with trailing zeros).
Equations
Instances For
The zero partition is its own transpose.
Transpose Box Equivalence #
For Young tableaux, the transpose property gives a key equivalence: a box (i, j) is in the diagram λ iff box (j, i) is in the transpose λᵗ. In the counting formulation: j + 1 ≤ λ_i iff i + 1 ≤ λᵗ_j.
This equivalence is fundamental for proving that the transpose preserves the number of boxes and for the Bender-Knuth bijection.
The transpose box equivalence: for weakly decreasing partitions λ and λᵗ satisfying the transpose property, box (i, j) is in λ iff (j, i) is in λᵗ.
This is the key lemma that relates the two counting conditions: j + 1 ≤ λ_i ↔ i + 1 ≤ λᵗ_j
The proof uses the weakly decreasing property: if j + 1 ≤ λ_i, then all rows 0, 1, ..., i have at least j + 1 boxes, so λᵗ_j ≥ i + 1.
The transpose of a partition preserves the sum of parts (number of boxes).
This is a fundamental property of Young tableau transposition: |λ| = |λᵗ| (the size of the partition equals the size of its transpose).
The proof uses double counting: both ∑ᵢ λᵢ and ∑ⱼ λᵗⱼ count the total number of boxes in the Young diagram, just organized differently.
Row and Column Partitions #
Special partitions consisting of a single row or column, used in the alternative proof of Pieri rules via Littlewood-Richardson.
The row partition (n, 0, 0, ..., 0) with n boxes in the first row. This is the partition corresponding to h_n (complete homogeneous symmetric polynomial). Requires N > 0 to have at least one row.
Equations
Instances For
The row partition has size n.
The first part of the row partition is n.
All other parts of the row partition are 0.
The column partition (1, 1, ..., 1, 0, ..., 0) with n ones (n boxes in first column). This is the partition corresponding to e_n (elementary symmetric polynomial). Requires n ≤ N (can't have more rows than N).
Equations
Instances For
The column partition has size n.
The first n parts of the column partition are 1.
Parts beyond n in the column partition are 0.
NPartition Type Equivalence #
This section provides an equivalence between the local SymmetricFunctions.NPartition
and the shared _root_.NPartition definition from NPartition.lean.
This enables gradual migration: code can use the local definition while having access to theorems proved about the shared definition (and vice versa).
Transpose Bridge Lemmas #
These lemmas connect the local SymmetricFunctions.NPartition.transpose with the
canonical _root_.NPartition.transpose via the toShared/ofShared equivalence.
Both definitions compute the same thing: (λᵗ)ᵢ = |{j : λⱼ ≥ i+1}| for each i. The bridge lemmas make this equivalence explicit, enabling code using the local definition to interoperate with theorems proved about the canonical definition.
Helper Lemmas for Sym-SSYT Bijection #
These lemmas establish the connection between Sym (Fin N) n (multisets of size n)
and weakly increasing sequences, which is key for proving that h_n equals the
Schur polynomial of the row partition.
Convert a Sym to a weakly increasing function. The sorted list of a multiset gives a canonical weakly increasing sequence.
Equations
Instances For
The monomial from a Sym equals the product over its weakly increasing representation. This is a key lemma for connecting h_n to Schur polynomials.
Convert a weakly increasing function back to a Sym. This is the inverse of symToWeaklyIncreasing.
Equations
- SymmetricFunctions.weaklyIncreasingToSym n f = ⟨↑(List.map f (List.finRange n)), ⋯⟩
Instances For
The round-trip from Sym to weakly increasing and back gives the same Sym. This shows that symToWeaklyIncreasing and weaklyIncreasingToSym form a bijection.
Skew Partitions and Strips #
Definition def.sf.strips: A skew partition λ/μ is a pair (μ, λ) of N-partitions. Horizontal and vertical strips are special cases where the skew diagram has no two boxes in the same column or row, respectively.
A skew partition λ/μ is a pair of N-partitions with μ ⊆ λ. Definition def.sf.strips(a).
- outer : NPartition N
The outer partition λ
- inner : NPartition N
The inner partition μ
The containment condition μ ⊆ λ
Instances For
A skew partition λ/μ is a horizontal strip if no two boxes of Y(λ/μ) lie in the same column. Definition def.sf.strips(b).
Bundled definition: This is the preferred version when working with SkewPartition N.
Related definitions:
isHorizontalStripFun: Canonical unbundled version with(lam, mu)argument order
Equivalence: s.isHorizontalStrip ↔ isHorizontalStripFun s.outer.parts s.inner.parts
(see SkewPartition.isHorizontalStrip_iff_isHorizontalStripFun)
Equations
Instances For
A skew partition λ/μ is a vertical strip if no two boxes of Y(λ/μ) lie in the same row. Definition def.sf.strips(c).
Bundled definition: This is the preferred version when working with SkewPartition N.
Related definitions:
isVerticalStripFun: Canonical unbundled version with(lam, mu)argument order
Equivalence: s.isVerticalStrip ↔ isVerticalStripFun s.outer.parts s.inner.parts
(see SkewPartition.isVerticalStrip_iff_isVerticalStripFun)
Instances For
A skew partition is a horizontal n-strip if it is a horizontal strip with |Y(λ/μ)| = n. Definition def.sf.strips(d).
Equations
- s.isHorizontalNStrip n = (s.isHorizontalStrip ∧ s.size = n)
Instances For
A skew partition is a vertical n-strip if it is a vertical strip with |Y(λ/μ)| = n. Definition def.sf.strips(e).
Equations
- s.isVerticalNStrip n = (s.isVerticalStrip ∧ s.size = n)
Instances For
Characterization of Strips #
Proposition prop.sf.strips.entries: Horizontal and vertical strips can be characterized in terms of the entries of the partitions.
Horizontal strip characterization (Proposition prop.sf.strips.entries(a)) Label: prop.sf.strips.entries
A skew partition λ/μ is a horizontal strip iff λ₁ ≥ μ₁ ≥ λ₂ ≥ μ₂ ≥ ⋯ ≥ λ_N ≥ μ_N.
Vertical strip characterization (Proposition prop.sf.strips.entries(b)) Label: prop.sf.strips.entries
A skew partition λ/μ is a vertical strip iff μᵢ ≤ λᵢ ≤ μᵢ + 1 for each i ∈ [N].
Decidability and Basic API for Strips #
These instances and lemmas make the strip predicates computable and provide basic API for working with strips.
Decidable instance for isHorizontalStrip.
Decidable instance for isVerticalStrip.
Decidable instance for isHorizontalNStrip.
Equations
Decidable instance for isVerticalNStrip.
Equations
A horizontal n-strip has size n.
A vertical n-strip has size n.
A horizontal n-strip is a horizontal strip.
A vertical n-strip is a vertical strip.
The empty skew partition (λ = μ) is a horizontal 0-strip.
The empty skew partition (λ = μ) is a vertical 0-strip.
Examples from the textbook #
These examples verify that our definitions match Definition def.sf.strips from the source (AlgebraicCombinatorics/tex/SymmetricFunctions/PieriJacobiTrudi.tex).
Example (a) from the textbook: λ = (8,7,4,3), μ = (7,4,4,1). This is a horizontal 6-strip but NOT a vertical strip.
Equations
- SymmetricFunctions.SkewPartition.exampleA_outer = { parts := ![8, 7, 4, 3], weaklyDecreasing := SymmetricFunctions.SkewPartition.exampleA_outer._proof_1 }
Instances For
Equations
- SymmetricFunctions.SkewPartition.exampleA_inner = { parts := ![7, 4, 4, 1], weaklyDecreasing := SymmetricFunctions.SkewPartition.exampleA_inner._proof_1 }
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Example (b) from the textbook: λ = (3,3,2,1), μ = (2,2,1,0). This is a vertical 4-strip but NOT a horizontal strip.
Equations
- SymmetricFunctions.SkewPartition.exampleB_outer = { parts := ![3, 3, 2, 1], weaklyDecreasing := SymmetricFunctions.SkewPartition.exampleB_outer._proof_1 }
Instances For
Equations
- SymmetricFunctions.SkewPartition.exampleB_inner = { parts := ![2, 2, 1, 0], weaklyDecreasing := SymmetricFunctions.SkewPartition.exampleB_inner._proof_1 }
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Example (c) from the textbook: λ = (4,3,1,1), μ = (3,2,1,0). This is BOTH a horizontal 3-strip AND a vertical 3-strip.
Equations
- SymmetricFunctions.SkewPartition.exampleC_outer = { parts := ![4, 3, 1, 1], weaklyDecreasing := SymmetricFunctions.SkewPartition.exampleC_outer._proof_1 }
Instances For
Equations
- SymmetricFunctions.SkewPartition.exampleC_inner = { parts := ![3, 2, 1, 0], weaklyDecreasing := SymmetricFunctions.SkewPartition.exampleC_inner._proof_1 }
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Example (d) from the textbook: λ = (3,3,2,1), μ = (1,1,1,1). This is NEITHER a horizontal strip NOR a vertical strip.
Equations
- SymmetricFunctions.SkewPartition.exampleD_outer = { parts := ![3, 3, 2, 1], weaklyDecreasing := SymmetricFunctions.SkewPartition.exampleB_outer._proof_1 }
Instances For
Equations
- SymmetricFunctions.SkewPartition.exampleD_inner = { parts := ![1, 1, 1, 1], weaklyDecreasing := SymmetricFunctions.SkewPartition.exampleD_inner._proof_1 }
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Schur Polynomials #
We use Mathlib's symmetric polynomial infrastructure and define Schur polynomials via semistandard Young tableaux (SSYT).
A semistandard Young tableau (SSYT) of shape λ with entries in [N]. The entries are weakly increasing along rows and strictly increasing down columns. Definition def.sf.ssyt.
Note: This is one of two SSYT definitions in this project:
- This definition (
SymmetricFunctions.SSYT): Uses dependent typesentries : (i : Fin N) → (j : Fin (lam.parts i)) → Fin N. Standalone structure. No[NeZero N]requirement. Field names:rowWeak,colStrict. - Alternative definition (
SchurBasics.SSYTinSchurBasics.lean): Usesentry : Fin N × ℕ → Fin Nwith a support condition. ExtendsYoungTableau. Requires[NeZero N]. Field names:row_weak,col_strict.
The equivalence between these definitions is established in SSYTEquiv.lean via
SSYTEquiv.ssytEquiv. Use SSYTEquiv.toSchurBasicsSSYT and SSYTEquiv.toSFSSYT
to convert between representations.
When to use which:
- Use this definition when the dependent type ensures bounds checking at compile time,
or when
[NeZero N]is not available. - Use
SchurBasics.SSYTwhen working with cell coordinates(i, j)directly, or when extending theYoungTableaustructure is beneficial.
The entries of the tableau
Entries are weakly increasing along rows
- colStrict (i : Fin N) (hi : ↑i + 1 < N) (j : Fin (lam.parts i)) (hj : ↑j < lam.parts ⟨↑i + 1, hi⟩) : self.entries i j < self.entries ⟨↑i + 1, hi⟩ ⟨↑j, hj⟩
Entries are strictly increasing down columns
Instances For
A semistandard Young tableau of skew shape λ/μ with entries in [N]. Definition def.sf.skew-schur.
For a skew tableau, the column-strict condition requires that entries are strictly increasing down columns, where column j of Y(λ/μ) consists of boxes (i, j) with μᵢ < j ≤ λᵢ.
Note: This is one of two SkewSSYT definitions in this project:
- This definition (
SymmetricFunctions.SkewSSYT): Uses dependent types. Takess : SkewPartition Nas a single bundled argument. No[NeZero N]requirement. Field names:rowWeak,colStrict. - Alternative definition (
SchurBasics.SkewSSYTinSchurBasics.lean): Usesentry : Fin N × ℕ → Fin Nwith a support condition. ExtendsSkewYoungTableau. Takeslam mu : NPartition Nas separate arguments. Requires[NeZero N]. Field names:row_weak,col_strict.
See SSYTEquiv.lean for conversions between representations.
The entries of the tableau, only for boxes in Y(λ/μ). Entry (i, k) corresponds to box (i, μᵢ + k + 1) in Y(λ/μ).
- rowWeak (i : Fin N) (j k : Fin (s.outer.parts i - s.inner.parts i)) : j ≤ k → self.entries i j ≤ self.entries i k
Entries are weakly increasing along rows
- colStrict (i : Fin N) (hi : ↑i + 1 < N) (k : Fin (s.outer.parts i - s.inner.parts i)) (_hcol : s.inner.parts i + ↑k + 1 > s.inner.parts ⟨↑i + 1, hi⟩ ∧ s.inner.parts i + ↑k + 1 ≤ s.outer.parts ⟨↑i + 1, hi⟩) : let k' := s.inner.parts i + ↑k - s.inner.parts ⟨↑i + 1, hi⟩; ∀ (hk' : k' < s.outer.parts ⟨↑i + 1, hi⟩ - s.inner.parts ⟨↑i + 1, hi⟩), self.entries i k < self.entries ⟨↑i + 1, hi⟩ ⟨k', hk'⟩
Entries are strictly increasing down columns. If boxes (i, c) and (i', c) are both in Y(λ/μ) with i < i', then T(i, c) < T(i', c). Here c = μᵢ + k + 1 for some k. The condition checks: for row i and column offset k, if row i+1 also contains column μᵢ + k + 1 (i.e., μᵢ + k + 1 > μᵢ₊₁ and μᵢ + k + 1 ≤ λᵢ₊₁), then the entry in row i is strictly less than the entry in row i+1.
Instances For
The monomial x^T associated to a tableau T. x_T = ∏{(i,j) ∈ Y(λ)} x{T(i,j)}
Equations
- T.toMonomial = ∏ i : Fin N, ∏ j : Fin (lam.parts i), MvPolynomial.X (T.entries i j)
Instances For
Two skew SSYT are equal if their entries are equal.
For N = 1, all SkewSSYT of a given shape are equal. This is because all entries must be in Fin 1 = {0}, so there's only one possible entry. This is useful for proving special cases of the Bender-Knuth bijection.
Two SSYT are equal if their entries are equal.
The monomial x^T associated to a skew tableau T.
Equations
Instances For
Column-strictness extends to non-adjacent rows. If column c appears in rows i and j with i < j, then T(i, c) < T(j, c).
This is a key lemma for the nipat-SSYT bijection: it shows that the
column-strict condition for adjacent rows implies strict inequality
for any two rows that share a column. The proof uses strong induction
on the row distance j - i, with the base case being adjacent rows
(directly using T.colStrict) and the inductive case going through
an intermediate row j' = j - 1.
Finiteness of SSYT #
The set of semistandard Young tableaux of a given shape is finite because:
- The shape has finitely many cells
- Each cell can contain one of finitely many values (elements of Fin N)
- The SSYT conditions (row-weak, column-strict) define a subset of all fillings
A filling of a skew shape is a function assigning a value in Fin N to each cell.
We use abbrev instead of def to ensure type class inference can see through this.
Equations
Instances For
The type of fillings of a skew shape is finite.
Equations
Predicate for a filling satisfying the SSYT row-weak condition.
Equations
Instances For
Predicate for a filling satisfying the SSYT column-strict condition. This is a simplified version that checks the condition for adjacent rows.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Combined predicate for SSYT conditions.
Equations
Instances For
The row-weak predicate is decidable.
The column-strict predicate is decidable.
The SSYT predicate is decidable.
Equations
The finite set of all fillings satisfying SSYT conditions.
Equations
Instances For
Convert a SkewSSYT to a filling.
Instances For
A filling satisfying SSYT conditions can be converted to a SkewSSYT.
Equations
- SymmetricFunctions.fillingToSkewSSYT f hf = { entries := f, rowWeak := ⋯, colStrict := ⋯ }
Instances For
A filling of a non-skew shape λ.
Instances For
Fintype instance for fillings of non-skew shapes.
Equations
Row-weak predicate for fillings of non-skew shapes.
Equations
Instances For
Column-strict predicate for fillings of non-skew shapes.
Equations
Instances For
Combined SSYT predicate for non-skew fillings.
Equations
Instances For
Decidability of row-weak for non-skew fillings.
Decidability of column-strict for non-skew fillings.
Decidability of SSYT predicate for non-skew fillings.
Equations
Finset of valid fillings for non-skew shapes.
Equations
Instances For
Convert a valid filling to an SSYT.
Equations
- SymmetricFunctions.fillingToSSYT lam f hf = { entries := f, rowWeak := ⋯, colStrict := ⋯ }
Instances For
An SSYT's entries form a valid filling.
An SSYT's entries are in the valid filling finset.
The set of all SSYT of shape λ. This is finite because it's a subset of all fillings, which is finite.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Every SSYT is in ssytFinset.
The set of all skew SSYT of shape λ/μ. This is finite because it's a subset of all fillings, which is finite.
Equations
- One or more equations did not get rendered due to their size.
Instances For
A SkewSSYT's entries form a valid SSYT filling.
A SkewSSYT's entries are in ssytFillingFinset.
Every skew SSYT is a member of skewSSYTFinset. This follows from the definition of skewSSYTFinset as the set of ALL skew SSYT.
The Schur polynomial s_λ defined as the sum over all SSYT of shape λ. Definition def.sf.schur.
Equations
- SymmetricFunctions.schur lam = ∑ T ∈ SymmetricFunctions.ssytFinset lam, T.toMonomial
Instances For
The Schur polynomial of the zero partition #
For the zero partition (0, 0, ..., 0), all rows have 0 entries, so there is exactly one SSYT of this shape (the empty tableau). Its monomial is 1.
The unique SSYT of shape 0 (the empty tableau). Since all rows have 0 entries, the entries function is vacuously defined.
Equations
- SymmetricFunctions.SSYT.unique = { entries := fun (x : Fin N) (j : Fin (SymmetricFunctions.NPartition.parts 0 x)) => j.elim0, rowWeak := ⋯, colStrict := ⋯ }
Instances For
The monomial of the unique SSYT of shape 0 is 1.
The finite set of SSYT of shape 0 is the singleton containing the unique empty tableau.
The skew Schur polynomial s_{λ/μ} defined as the sum over all skew SSYT. Definition def.sf.skew-schur.
Equations
Instances For
Convert an SSYT to a SkewSSYT when the inner partition is zero. This is an identity on entries since lam i - 0 = lam i definitionally.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Convert a SkewSSYT to an SSYT when the inner partition is zero. This is the inverse of ssytToSkewSSYT.
Equations
Instances For
ssytToSkewSSYT and skewSSYTToSSYT are inverses (direction 2).
When the inner partition is zero, the skew Schur polynomial equals the regular Schur polynomial. This is because the skew shape λ/0 is just the shape λ.
The Pieri Rules #
Theorem thm.sf.pieri: The Pieri rules express products h_n · s_μ and e_n · s_μ as sums of Schur polynomials.
Enumeration of Horizontal and Vertical Strip Partitions #
For a fixed N-partition μ and size n, we enumerate all N-partitions λ such that λ/μ is a horizontal (resp. vertical) n-strip. The key observation is that each λ_i is bounded:
- Lower bound: λ_i ≥ μ_i (containment)
- Upper bound: λ_i ≤ μ_{i-1} for i > 0 (horizontal strip condition)
- Upper bound: λ_0 ≤ μ_0 + n (since |λ| = |μ| + n)
This makes the enumeration finite.
The bound for each λ_i when forming a horizontal strip with μ. λ_i must satisfy μ_i ≤ λ_i ≤ bound_i where:
- For i = 0: bound_0 = μ_0 + n (since |λ| - |μ| = n and all parts are bounded by λ_0)
- For i > 0: bound_i = μ_{i-1} (horizontal strip condition: μ_{i-1} ≥ λ_i)
Equations
Instances For
A function from Fin N to ℕ that could potentially form a horizontal n-strip with μ. This is the set of all functions bounded by the horizontal strip constraints.
Equations
- SymmetricFunctions.potentialHorizontalStrips mu n = Fintype.piFinset fun (i : Fin N) => Finset.Icc (mu.parts i) (SymmetricFunctions.horizontalStripUpperBound mu n i)
Instances For
Equations
- SymmetricFunctions.instDecidableHasSizeDiff mu lam n = inferInstanceAs (Decidable (∑ i : Fin N, lam i = ∑ i : Fin N, mu i + n))
A skew partition λ/μ is a horizontal strip if no two boxes lie in the same column. Equivalently: μ_i ≥ λ_{i+1} for all i.
The argument order (lam, mu) matches standard mathematical notation λ/μ.
Related definitions:
SkewPartition.isHorizontalStrip: Bundled version forSkewPartition N
Equations
Instances For
A skew partition λ/μ is a vertical strip if no two boxes lie in the same row. Equivalently: λ_i ≤ μ_i + 1 for all i.
The argument order (lam, mu) matches standard mathematical notation λ/μ.
Related definitions:
SkewPartition.isVerticalStrip: Bundled version forSkewPartition N
Equations
- SymmetricFunctions.isVerticalStripFun lam mu = ∀ (i : Fin N), lam i ≤ mu i + 1
Instances For
Decidable instance for horizontal strip predicate.
Decidable instance for vertical strip predicate.
Convert a valid function to an NPartition.
Equations
- SymmetricFunctions.toNPartition f hf = { parts := f, weaklyDecreasing := hf }
Instances For
The set of N-partitions λ such that λ/μ is a horizontal n-strip.
This is the set of all N-partitions λ satisfying:
- μ ⊆ λ (containment): μ_i ≤ λ_i for all i
- Horizontal strip: μ_i ≥ λ_{i+1} for all i < N
- Size: |λ| - |μ| = n
The set is finite because each λ_i is bounded.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The bound for each λ_i when forming a vertical strip with μ. λ_i must satisfy μ_i ≤ λ_i ≤ μ_i + 1 (vertical strip condition).
Equations
- SymmetricFunctions.verticalStripUpperBound mu i = mu.parts i + 1
Instances For
A function from Fin N to ℕ that could potentially form a vertical n-strip with μ.
Equations
- SymmetricFunctions.potentialVerticalStrips mu = Fintype.piFinset fun (i : Fin N) => Finset.Icc (mu.parts i) (SymmetricFunctions.verticalStripUpperBound mu i)
Instances For
The set of N-partitions λ such that λ/μ is a vertical n-strip.
This is the set of all N-partitions λ satisfying:
- μ ⊆ λ (containment): μ_i ≤ λ_i for all i
- Vertical strip: λ_i ≤ μ_i + 1 for all i
- Size: |λ| - |μ| = n
The set is finite because each λ_i ∈ {μ_i, μ_i + 1}.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Properties of Horizontal Strip Partitions #
If λ ∈ horizontalNStripPartitions μ n, then μ ⊆ λ.
If λ ∈ horizontalNStripPartitions μ n, then λ/μ is a horizontal strip.
If λ ∈ horizontalNStripPartitions μ n, then |λ| - |μ| = n.
If λ ∈ horizontalNStripPartitions μ n, then the skew partition λ/μ is a horizontal n-strip. This combines the horizontal strip condition and size condition into a single predicate.
Properties of Vertical Strip Partitions #
If λ ∈ verticalNStripPartitions μ n, then μ ⊆ λ.
If λ ∈ verticalNStripPartitions μ n, then λ/μ is a vertical strip.
If λ ∈ verticalNStripPartitions μ n, then |λ| - |μ| = n.
If λ ∈ verticalNStripPartitions μ n, then the skew partition λ/μ is a vertical n-strip. This combines the vertical strip condition and size condition into a single predicate.
Membership Characterization for Strip Partitions #
These theorems provide complete characterizations of membership in
horizontalNStripPartitions and verticalNStripPartitions, useful for
proving that specific partitions belong to these sets.
Complete characterization of membership in horizontalNStripPartitions.
An N-partition λ is in horizontalNStripPartitions μ n if and only if:
- μ ⊆ λ (containment): μ_i ≤ λ_i for all i
- λ/μ is a horizontal strip: μ_i ≥ λ_{i+1} for all i < N
- |λ| - |μ| = n (size constraint)
- Each λ_i is bounded by
horizontalStripUpperBound μ n i
This characterization is useful for proving that specific partitions
belong to horizontalNStripPartitions μ n.
Complete characterization of membership in verticalNStripPartitions.
An N-partition λ is in verticalNStripPartitions μ n if and only if:
- μ ⊆ λ (containment): μ_i ≤ λ_i for all i
- λ/μ is a vertical strip: λ_i ≤ μ_i + 1 for all i
- |λ| - |μ| = n (size constraint)
This characterization is useful for proving that specific partitions
belong to verticalNStripPartitions μ n.
Helper lemma relating SkewPartition.size to hasSizeDiff for horizontal strips.
Helper lemma relating SkewPartition.size to hasSizeDiff for vertical strips.
Simplified membership criterion for horizontal strip partitions using SkewPartition API.
This theorem bridges the gap between the horizontalNStripPartitions finset
and the SkewPartition.isHorizontalNStrip predicate.
Simplified membership criterion for vertical strip partitions using SkewPartition API.
This theorem bridges the gap between the verticalNStripPartitions finset
and the SkewPartition.isVerticalNStrip predicate.
Infrastructure for Pieri Rule Proofs #
The Pieri rules require a bijection between:
- Domain:
Sym (Fin N) n × SSYT μ(multisets of size n paired with tableaux of shape μ) - Codomain:
⨆_{λ ∈ horizontalNStripPartitions μ n} SSYT λ(tableaux of shapes forming horizontal n-strips)
This bijection is the RSK row insertion. Below we provide lemmas that show how the RHS of the Pieri rule can be rewritten as a sum over a sigma type, making the structure of the proof clear.
Alternative Approach: Pieri Rules via Littlewood-Richardson #
An alternative proof of the Pieri rules derives them from the Littlewood-Richardson rule. The key observations are:
h_n = s_{(n,0,...,0)}: The complete homogeneous symmetric polynomial h_n equals the Schur polynomial indexed by the row partition (n, 0, ..., 0).
e_n = s_{(1,1,...,1,0,...,0)}: The elementary symmetric polynomial e_n equals the Schur polynomial indexed by the column partition with n ones.
Littlewood-Richardson specialization: When ν = (n, 0, ..., 0), the ν-Yamanouchi tableaux of shape λ/μ correspond exactly to horizontal n-strips (or vertical n-strips for the column partition case).
The infrastructure for this approach requires:
NPartition.rowPartition: The partition (n, 0, ..., 0) ✓ (defined above)NPartition.colPartition: The partition (1, 1, ..., 1, 0, ..., 0) ✓ (defined above)hsymm_eq_schur_rowPartition: h_n = s_{rowPartition} ✓ (proved below)esymm_eq_schur_colPartition: e_n = s_{colPartition} ✓ (proved below)- Characterization of Yamanouchi tableaux for row/column partitions (partial: reverse direction proved)
This approach is documented in Exercise exe.sf.pieri of the source text.
The Pieri rules themselves are left as exercises (see pieri_horizontal, pieri_vertical).
Yamanouchi Tableaux Infrastructure for Row/Column Partitions #
This section provides infrastructure for working with row and column partitions
in the context of Yamanouchi tableaux (defined in LittlewoodRichardson.lean).
Mathematical Background:
The key insight connecting the Littlewood-Richardson rule to Pieri rules is that Yamanouchi tableaux for row and column partitions have a simple characterization:
For row partition ν = (n, 0, ..., 0): A semistandard tableau T of shape λ/μ is ν-Yamanouchi iff:
- All entries of T are 0 (the first row index)
- λ/μ is a horizontal strip (no two cells in same column)
This is because:
- The Yamanouchi condition requires ν + cont(col_{≥j}(T)) to be weakly decreasing for all j > 0
- For ν = (n, 0, ..., 0), adding any content to position i > 0 would violate this
- So all entries must be 0, and semistandardness forces at most one cell per column
For column partition ν = (1, 1, ..., 1, 0, ..., 0) with n ones: A semistandard tableau T of shape λ/μ is ν-Yamanouchi iff:
- Entries form a valid "staircase" pattern (entry in row i is at least i)
- λ/μ is a vertical strip (no two cells in same row)
This is because:
- The Yamanouchi condition with column partition ensures votes are spread across rows
- Semistandardness with at most one entry per row gives vertical strip
What's provided here:
rowPartitionFun,colPartitionFun: Functions extracting partition parts- Simp lemmas for accessing row/column partition values
- Proofs that these are valid N-partitions
Note: The reverse direction allEntriesZero_implies_isYamanouchi_rowPartition is proved below:
for row partition ν = (n, 0, ..., 0), if all entries of a semistandard tableau are 0,
then it is ν-Yamanouchi.
Row partition as a function (for use with LittlewoodRichardson.IsYamanouchi).
Equations
Instances For
Column partition as a function (for use with LittlewoodRichardson.IsYamanouchi).
Equations
Instances For
The row partition function has n at position 0 and 0 elsewhere.
The column partition function has 1 at positions < n and 0 elsewhere.
The row partition function is an N-partition (weakly decreasing).
The column partition function is an N-partition (weakly decreasing).
Yamanouchi Tableaux Characterization for Row/Column Partitions #
This section provides the key characterization theorems connecting Yamanouchi tableaux with horizontal and vertical strips. These theorems enable the alternative proof of Pieri rules via the Littlewood-Richardson rule.
Mathematical Background:
For the row partition ν = (n, 0, ..., 0):
- A semistandard tableau T of shape λ/μ is ν-Yamanouchi iff all entries are 0 and λ/μ is a horizontal strip.
- This is because adding any content to position i > 0 would violate the weakly decreasing property of ν + cont(col_{≥j}(T)).
For the column partition ν = (1, 1, ..., 1, 0, ..., 0) with n ones:
- A semistandard tableau T of shape λ/μ is ν-Yamanouchi iff entries follow a specific pattern and λ/μ is a vertical strip.
Equivalences Between Strip Definitions #
The following lemmas establish equivalences between the bundled and unbundled representations of horizontal/vertical strip predicates:
Bundled:
SkewPartition.isHorizontalStrip/SkewPartition.isVerticalStrip- Input:
SkewPartition N(bundled outer/inner partitions) - Used in: Main theorems like
pieri_horizontal,pieri_vertical
- Input:
Unbundled (canonical):
isHorizontalStripFun/isVerticalStripFun- Input:
(lam mu : Fin N → ℕ)with argument order(lam, mu)matching λ/μ notation - Used in:
horizontalNStripPartitions,verticalNStripPartitions, and integration withLittlewoodRichardson.Tableau
- Input:
The bundled SkewPartition.isHorizontalStrip is equivalent to the canonical
unbundled isHorizontalStripFun applied to the outer and inner partitions.
The bundled SkewPartition.isVerticalStrip is equivalent to the canonical
unbundled isVerticalStripFun applied to the outer and inner partitions.
All entries of a tableau are 0 (the first row index). This is the key property for row partition Yamanouchi tableaux.
Equations
Instances For
Decidable instance for allEntriesZero when the diagram is finite.
When all entries of a tableau are 0, the content at any position k > 0 is 0. This is because no cell has entry k when all entries are 0.
Row partition Yamanouchi characterization (reverse direction): If all entries of T are 0 and T is semistandard, then T is ν-Yamanouchi for ν = (n, 0, ..., 0).
Note on Horizontal Strips and Semistandard Tableaux #
WARNING: The statement "horizontal strip + semistandard ⟹ all entries 0" is FALSE.
Counterexample: N = 2, λ = (2, 1), μ = (1, 0)
- This is a horizontal strip: μ₀ = 1 ≥ λ₁ = 1 ✓
- Cells: (0, 2) and (1, 1) — in different columns
- Any assignment is semistandard (vacuously, since no two cells share a row or column)
- In particular, T(0, 2) = 1 gives a non-zero entry
WARNING: The statement "Yamanouchi w.r.t. row partition ⟹ all entries 0" is also FALSE without the horizontal strip hypothesis!
Counterexample: N = 3, λ = (2, 2, 0), μ = (0, 0, 0), n = 1, ν = (1, 0, 0)
- This is NOT a horizontal strip (both row 0 and row 1 have 2 cells)
- The tableau T with T(0,1) = 0, T(0,2) = 1, T(1,1) = 1, T(1,2) = 2 is semistandard
- At j = 1: ν + contentColGeq T 1 = (1, 0, 0) + (1, 2, 1) = (2, 2, 1), an N-partition ✓
- At j = 2: ν + contentColGeq T 2 = (1, 0, 0) + (0, 1, 1) = (1, 1, 1), an N-partition ✓
- So T is (1, 0, 0)-Yamanouchi, but has positive entries 1 and 2!
The correct characterization requires BOTH being a horizontal strip AND being Yamanouchi with respect to a row partition.
Convert a Sym to an SSYT of row partition shape. The sorted multiset gives a weakly increasing sequence for row 0.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Convert an SSYT of row partition shape back to a Sym. Row 0 entries form a weakly increasing sequence which gives a multiset.
Equations
- SymmetricFunctions.rowSSYTToSym hN n T = SymmetricFunctions.weaklyIncreasingToSym n fun (j : Fin n) => T.entries ⟨0, hN⟩ ⟨↑j, ⋯⟩
Instances For
The complete homogeneous symmetric polynomial h_n equals the Schur polynomial indexed by the row partition (n, 0, ..., 0).
This is because:
- The only SSYT of shape (n, 0, ..., 0) is a single row of n boxes
- A single row SSYT with entries from Fin N is exactly a weakly increasing sequence
- Such sequences correspond to multisets of size n from Fin N
- The monomial of such a tableau is exactly (s.1.map X).prod for s : Sym (Fin N) n
This lemma enables deriving the horizontal Pieri rule from Littlewood-Richardson.
Convert a subset of size n to an SSYT of column partition shape. The sorted subset gives a strictly increasing sequence for column 0.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Inverse bijection: SSYT(colPartition) → Finset
Equations
- SymmetricFunctions.colSSYTToFinset n hn T = Finset.image (fun (k : Fin n) => SymmetricFunctions.colSSYTEntry n hn T ↑k ⋯) Finset.univ
Instances For
Column entries are strictly increasing - consecutive case
Column entries are strictly increasing - general case
The image has cardinality n because entries are strictly increasing
Sorting colSSYTToFinset gives back the original entries as a list
The elementary symmetric polynomial e_n equals the Schur polynomial indexed by the column partition (1, 1, ..., 1, 0, ..., 0) with n ones.
This is because:
- The only SSYT of shape (1, 1, ..., 1, 0, ..., 0) is a single column of n boxes
- A single column SSYT with entries from Fin N must have strictly increasing entries
- Such sequences correspond to subsets of size n from Fin N
- The monomial of such a tableau is exactly ∏_{i ∈ s} X_i for s : Finset (Fin N)
This lemma enables deriving the vertical Pieri rule from Littlewood-Richardson.
Proof structure:
- Both sides are sums of monomials
- esymm sums over powersetCard n univ with monomial ∏_{i ∈ s} X_i
- schur sums over SSYT of shape (1,...,1,0,...,0) with monomial T.toMonomial
- For column partition, SSYT entries in column 0 form strictly increasing sequences
- The bijection: s ↦ SSYT with entries = sorted(s) in column 0
- Weight preservation: ∏_{i ∈ s} X_i = T.toMonomial
First Pieri rule (Theorem thm.sf.pieri(a)) Label: exe.sf.pieri
h_n · s_μ = ∑_{λ/μ is horizontal n-strip} s_λ
where h_n is the n-th complete homogeneous symmetric polynomial.
This is Exercise exe.sf.pieri in the TeX source. The proof requires the Robinson-Schensted-Knuth (RSK) row insertion bijection, which is not yet formalized in this project.
Second Pieri rule (Theorem thm.sf.pieri(b)) Label: exe.sf.pieri
e_n · s_μ = ∑_{λ/μ is vertical n-strip} s_λ
where e_n is the n-th elementary symmetric polynomial.
This is Exercise exe.sf.pieri in the TeX source. The proof requires the
Robinson-Schensted-Knuth (RSK) column insertion bijection, or alternatively
can be derived from pieri_horizontal via the ω-involution.
The Jacobi-Trudi Identities #
The Jacobi-Trudi identities express skew Schur polynomials as determinants of matrices involving h_n or e_n.
Extended h_n: h_n = 0 for n < 0, h_0 = 1. This is needed since the Jacobi-Trudi formula may have negative indices.
Equations
- SymmetricFunctions.hsymmExt n = if 0 ≤ n then MvPolynomial.hsymm (Fin N) R n.toNat else 0
Instances For
hsymmExt is symmetric.
The Jacobi-Trudi matrix for h (first Jacobi-Trudi formula). Entry (i,j) is h_{λᵢ - μⱼ - i + j}.
Equations
- SymmetricFunctions.jacobiTrudiMatrixH lam mu = Matrix.of fun (i j : Fin N) => SymmetricFunctions.hsymmExt (↑(lam i) - ↑(mu j) - ↑↑i + ↑↑j)
Instances For
Second Jacobi-Trudi formula (Exercise exe.sf.jt-e) Label: thm.sf.jt-e Status: EXERCISE (exe.sf.jt-e in tex source)
s_{λ/μ} = det((e_{λᵢᵗ - μⱼᵗ - i + j})_{1 ≤ i,j ≤ N})
where λᵗ and μᵗ are the transposes of λ and μ, and e_n denotes the n-th elementary symmetric polynomial (with e_n = 0 for n < 0).
This is a 6-point exercise with no hint provided in the TeX source.
References #
- [Stanley, EC2, Theorem 7.16.1]
- [Grinberg-Reiner, Section 2.4]
- [Fulton, Young Tableaux, Section 4.3]
LGV Lemma Connection #
The proof of the first Jacobi-Trudi formula uses the LGV lemma. We outline the key constructions here.
Source and Target Vertices for Jacobi-Trudi #
For the Jacobi-Trudi identity, we define:
- Source vertices: Aᵢ = (μᵢ - i, 1) for i ∈ [N]
- Target vertices: Bⱼ = (λⱼ - j, N) for j ∈ [N]
These vertices satisfy the sorting conditions required by the LGV lemma (Corollary cor.lgv.kpaths.wt-np):
- x-coordinates are weakly decreasing: x(A₁) ≥ x(A₂) ≥ ... ≥ x(Aₖ)
- y-coordinates are constant (trivially weakly increasing)
The source vertex A_i = (μ_i - i, 1) for the Jacobi-Trudi LGV setup. Here 1 represents the "starting height" in the lattice.
Equations
- SymmetricFunctions.jacobiTrudiSourceX mu i = ↑(mu i) - ↑↑i
Instances For
The target vertex B_j = (λ_j - j, N) for the Jacobi-Trudi LGV setup. Here N represents the "ending height" in the lattice.
Equations
- SymmetricFunctions.jacobiTrudiTargetX lam j = ↑(lam j) - ↑↑j
Instances For
The source x-coordinates are weakly decreasing. This follows from the partition being weakly decreasing: μᵢ - i ≥ μⱼ - j when i ≤ j, since μᵢ ≥ μⱼ and i ≤ j.
The target x-coordinates are weakly decreasing. This follows from the partition being weakly decreasing.
The path from A_i to B_j has length λ_j - μ_i - j + i (when non-negative). This equals the index of h in the Jacobi-Trudi matrix entry (j, i).
The Jacobi-Trudi matrix entry (i, j) equals h_{path length from A_j to B_i}. Note: The path is from source A_j to target B_i. This matches the LGV convention where M_{i,j} = ∑_{p : A_i → B_j} w(p), but with the matrix transposed. Equivalently, the Jacobi-Trudi matrix is the transpose of the LGV path weight matrix.
A lattice path in ℤ² from (a, 1) to (c, N) using north and east steps. This is the type of paths relevant for the Jacobi-Trudi proof.
The sequence of heights at which east-steps are taken. A path from (a, 1) to (c, N) has exactly (c - a) east-steps (when c ≥ a), and each east-step occurs at some height in [1, N].
- weaklyIncreasing : List.IsChain (fun (x1 x2 : Fin N) => x1 ≤ x2) self.eastStepHeights
The heights form a weakly increasing sequence (path goes north or east)
The number of east-steps equals c - a (when non-negative)
Instances For
The weight of a lattice path is the product of x_j for each east-step at height j. This corresponds to the weight function w in the source.
Equations
- p.weight = (List.map (fun (j : Fin N) => MvPolynomial.X j) p.eastStepHeights).prod
Instances For
Extensionality lemma for lattice paths.
Convert a lattice path to a Sym element (multiset of heights).
Equations
- p.toSym = ⟨↑p.eastStepHeights, ⋯⟩
Instances For
Convert a Sym element (multiset) to a lattice path by sorting.
Equations
Instances For
Converting a path to Sym and back gives the original path.
The equivalence between lattice paths and Sym (multisets).
Equations
- SymmetricFunctions.latticePathSymEquiv = { toFun := SymmetricFunctions.LatticePath.toSym, invFun := SymmetricFunctions.symToLatticePath, left_inv := ⋯, right_inv := ⋯ }
Instances For
Fintype instance for LatticePath via the equivalence with Sym.
Equations
The set of all lattice paths from (a, 1) to (c, N). Empty when c < a (no valid paths), otherwise all paths.
Equations
- SymmetricFunctions.latticePathFinset a c = if 0 ≤ c - a then Finset.univ else ∅
Instances For
Observation 1 from the proof of Theorem thm.sf.jt-h: The sum of path weights from (a, 1) to (c, N) in ℤ² equals h_{c-a}.
This follows from Proposition prop.lgv.1-paths.ct. The key insight is that the weakly increasing sequences of length n with entries in [N] are in bijection with multisets of size n from [N], which are exactly what h_n counts.
A non-intersecting path tuple (nipat) from sources A to targets B. For Jacobi-Trudi, A_i = (μᵢ - i, 1) and B_i = (λᵢ - i, N).
- paths (i : Fin N) : LatticePath (↑(mu i) - ↑↑i) (↑(lam i) - ↑↑i)
The tuple of paths, one for each i ∈ [N]
- colStrictPaths (i j : Fin N) : i < j → ∀ (k : ℕ) (hk : k < (self.paths i).eastStepHeights.length) (k' : ℕ) (hk' : k' < (self.paths j).eastStepHeights.length), mu i + k = mu j + k' → (self.paths i).eastStepHeights[k] < (self.paths j).eastStepHeights[k']
The paths satisfy column-strictness: for i < j, if east steps k (in path i) and k' (in path j) correspond to the same tableau column (mu i + k = mu j + k'), then the height of path i at step k is strictly less than the height of path j at step k'. This is the key property that makes the nipat-SSYT bijection work.
Instances For
The weight of a nipat is the product of the weights of its component paths.
Instances For
The bijection between nipats and SSYT, sending a nipat to the tableau whose i-th row contains the heights of east-steps in path i.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Helper to create a LatticePath from tableau entries for a single row. Given entries for row i of a tableau, creates the corresponding lattice path with east-steps at the heights given by the entries.
Equations
- SymmetricFunctions.mkLatticePathFromEntries lam mu i entries hrowWeak = { eastStepHeights := List.ofFn entries, weaklyIncreasing := ⋯, length_eq := ⋯ }
Instances For
The inverse bijection from SSYT to nipats, sending a tableau to the nipat whose i-th path has east-steps at the heights given by row i of the tableau.
Equations
- SymmetricFunctions.ssytToNipat T = { paths := fun (i : Fin N) => SymmetricFunctions.mkLatticePathFromEntries (lam i) (mu i) (↑i) (T.entries i) ⋯, colStrictPaths := ⋯ }
Instances For
Two nipats with equal paths are equal.
ssytToNipat is a left inverse of nipatToSSYT.
The length of path i's eastStepHeights equals lam i - mu i.
Specification lemma for nipatToSSYT: the entries of row i are the heights of the east-steps in path i. This captures the key property of the bijection.
Specification lemma for ssytToNipat: the east-step heights of path i are the entries of row i of the tableau. This is the inverse specification to nipatToSSYT_entries.
nipatToSSYT is a left inverse of ssytToNipat.
The weight of a nipat equals the monomial of the corresponding tableau.
Observation 2 from the proof of Theorem thm.sf.jt-h: There is a bijection between nipats from 𝐀 to 𝐁 and SSYT(λ/μ).
The bijection sends a nipat 𝐩 = (p₁, ..., pₖ) to the tableau T(𝐩) where the entries in row i are the heights of the east-steps of pᵢ.
Moreover, the weight of a nipat equals the monomial x_T of the corresponding tableau.
Fintype instance for Nipat via the bijection with SkewSSYT #
The Nipat type is finite because it is in bijection with SkewSSYT, which is finite.
We establish this by constructing an equivalence using nipatToSSYT and ssytToNipat.
Fintype instance for SkewSSYT via the equivalence with valid fillings.
Equations
- One or more equations did not get rendered due to their size.
The equivalence between Nipat and SkewSSYT, established by the bijection functions.
Equations
- SymmetricFunctions.nipatSSYTEquiv lam mu hlam hmu hcontained = { toFun := SymmetricFunctions.nipatToSSYT, invFun := SymmetricFunctions.ssytToNipat, left_inv := ⋯, right_inv := ⋯ }
Instances For
Fintype instance for Nipat via the equivalence with SkewSSYT.
Equations
- One or more equations did not get rendered due to their size.
The finite set of all nipats for given partitions λ/μ.
Equations
- SymmetricFunctions.nipatFinset' lam mu hlam hmu hcontained = Finset.univ
Instances For
The sum of nipat weights equals the sum of SSYT monomials. This follows from the bijection and weight preservation.
The sum of nipat weights equals skewSchur. This combines the bijection with the definition of skewSchur.
LGV Infrastructure for Jacobi-Trudi #
The proof of det_jacobiTrudiMatrixH_eq_nipatSum requires bridging this file's
LatticePath and Nipat types with the LGV infrastructure in LGV2.lean.
We define:
- Source vertices A_i = (μ_i - i, 1) and target vertices B_j = (λ_j - j, N) in ℤ²
- An arc weight function that assigns X_j to east-steps at height j
- Helper lemmas connecting the path weight sum to h_n
The key insight is that:
- The Jacobi-Trudi matrix entry (i, j) = h_{λᵢ - μⱼ - i + j}
- This equals the sum of path weights from A_j to B_i
- By LGV nonpermutable, det = sum over non-intersecting path tuples
- Non-intersecting path tuples correspond exactly to our Nipat type
The source k-vertex for the Jacobi-Trudi LGV setup: A_i = (μ_i - i, 1). The y-coordinate 1 represents the starting height in the lattice.
Equations
Instances For
The target k-vertex for the Jacobi-Trudi LGV setup: B_j = (λ_j - j, N). The y-coordinate N represents the ending height in the lattice.
Equations
Instances For
The source vertices have y-coordinates that are constant (trivially increasing).
The target vertices have y-coordinates that are constant (trivially increasing).
The arc weight function for the Jacobi-Trudi proof. East-steps at height j (where 1 ≤ j ≤ N) are weighted by X_{j-1}. North-steps are weighted by 1.
Note: The lattice uses y-coordinates 1 to N, but Fin N uses 0 to N-1. An east-step at y-coordinate y gets weight X_{y-1} when 1 ≤ y ≤ N.
Equations
Instances For
Extract y-coordinates at east-step positions from a path vertex list. For a path from (a, 1) to (c, N), this gives the sequence of y-coordinates where east-steps occur. The sequence is weakly increasing and has length (c - a).
This is a helper function for constructing the bijection between LGV paths and Sym.
Equations
Instances For
LGV-Nipat Bijection Infrastructure #
The following lemmas establish the connection between LGV's PathTuple.isNonIntersecting
and our Nipat.colStrictPaths. This is needed for step 4 of the Jacobi-Trudi proof.
The key insight is that for lattice paths from (μᵢ - i, 1) to (λᵢ - i, N):
- Two paths intersect (share a vertex) iff they share a point (x, y) for some x, y
- In the integer lattice, paths can only go north or east
- If path i and path j (with i < j) share a vertex, then at some column c, they have the same height
- This violates column-strictness (which requires path j to be strictly higher than path i at the same column)
Conversely, column-strictness implies non-intersection.
Bijection Overview #
The bijection between LGV paths and our LatticePath works as follows:
LGV Path → LatticePath: An LGV path from (a, 1) to (c, N) in the integer lattice is a sequence of vertices where each step is either east (+1 in x) or north (+1 in y). We extract the y-coordinates at which east-steps occur (converted to Fin N by subtracting 1).
LatticePath → LGV Path: A LatticePath has eastStepHeights : List (Fin N) which is weakly increasing. We construct the LGV path by starting at (a, 1) and making north-steps until we reach the first east-step height + 1, then east, then more north-steps, etc.
Weight Preservation:
- jacobiTrudiArcWeight assigns X_{y-1} to east-steps at height y (for 1 ≤ y ≤ N)
- North-steps are assigned weight 1
- LatticePath.weight = ∏ h ∈ eastStepHeights, X_h
- These match since the bijection maps y-coordinate y to height h = y - 1
Non-intersection ↔ Column-strictness: For paths from sources A_i = (μ_i - i, 1) to targets B_i = (λ_i - i, N):
- Two LGV paths intersect iff they share a vertex (x, y)
- At any x-coordinate, path i has a well-defined y-coordinate (height)
- If paths i < j share vertex (x, y), then at column (x - (μ_i - i)) in path i and column (x - (μ_j - j)) in path j, both paths have height y
- Since μ_i - i > μ_j - j (by sorting), the column indices satisfy: col_i = x - μ_i + i and col_j = x - μ_j + j If μ_i + col_i = μ_j + col_j (same tableau column), then col_i = col_j + (μ_j - μ_i)
- Column-strictness requires height_i < height_j at same tableau column
- Intersection would give height_i = height_j = y, violating column-strictness
Extract the y-coordinates of east-steps from an LGV path vertex list. For a path from (a, 1) to (c, N), this returns the y-coordinates at which each east-step occurs.
Equations
Instances For
The number of east-steps equals the x-displacement. This is a key property for the bijection.
East-step y-coordinates are weakly increasing (paths go north or east).
East-step y-coordinates are bounded between start and end y-coordinates.
The k-th east-step y-coordinate equals the y-coordinate at x = start_x + k.
This lemma establishes that lgvPathEastStepYCoords[k] is the y-coordinate of the
path at x-coordinate start_x + k, where start_x is the x-coordinate of the first vertex.
The k-th east step occurs at x = start_x + k because:
- The path starts at x = start_x
- Each east step increases x by 1
- The k-th east step is preceded by exactly k east steps (indices 0, 1, ..., k-1)
- So the k-th east step starts at x = start_x + k
The index returned by lgvPathEastStepYCoords_at_x is the start of an east step. If idx + 1 < vertices.length, then the step from idx to idx+1 is an east step.
Key lemma: for two non-intersecting paths, if one is above the other at some x-coordinate, it stays above at all greater x-coordinates where both paths have vertices.
This is the "paths don't cross" property for x-coordinates. The proof uses discrete IVT: if the y-difference ever becomes ≤ 0, there must be a point where it equals 0, meaning the paths share a vertex (contradiction).
LGV Path to LatticePath Bijection #
We now construct the explicit bijection between LGV paths from (a, 1) to (c, N) and
our LatticePath a c type. This is needed for lgv_pathWeightSum_eq_hsymmExt.
The bijection:
- LGV Path → LatticePath: Extract east-step y-coordinates using
lgvPathEastStepYCoords, then convert from ℤ (in range [1, N]) to Fin N by subtracting 1. - LatticePath → LGV Path: Given a weakly increasing list of Fin N, construct the unique path that makes east-steps at the specified heights.
Weight preservation follows from the definition of jacobiTrudiArcWeight:
- East-step at y-coordinate y gets weight X_{y-1}
- North-steps get weight 1
- This matches
LatticePath.weight = ∏ h ∈ eastStepHeights, X_h
The k-th element of lgvYCoordsToFinN equals (ycoords[k] - 1).toNat. Since ycoords[k] ∈ [1, N], we have (lgvYCoordsToFinN ycoords h)[k].val + 1 = ycoords[k].
The converted list preserves the chain property (weakly increasing).
The conversion lgvYCoordsToFinN is injective when both lists have elements in [1, N].
The proof uses the fact that y ↦ (y - 1).toNat is injective on [1, N]: if (y₁ - 1).toNat = (y₂ - 1).toNat and both y₁, y₂ ∈ [1, N], then y₁ = y₂.
Proof sketch:
- The lengths are equal (pmap preserves length)
- At each position i, the Fin N values are equal (from heq)
- Since y ↦ (y - 1).toNat is injective on [1, N], the original values are equal
Helper: lgvYCoordsToFinN inverts the map (fun h => h.val + 1).
If l = heights.map (fun h => h.val + 1), then lgvYCoordsToFinN l h = heights.
Convert an LGV path from (a, 1) to (c, N) to a LatticePath. This extracts the east-step heights and converts them to Fin N.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Injectivity of lgvPathToLatticePath #
The key lemma for the bijection is that lgvPathToLatticePath is injective.
This follows from the fact that paths in the integer lattice from the same start
to the same end are uniquely determined by their east-step y-coordinates.
Key uniqueness lemma: Paths in the integer lattice from the same start to the same end with the same east-step y-coordinates must have the same vertices.
This is the fundamental lemma for proving injectivity of lgvPathToLatticePath.
Proof idea: At each vertex (x, y), the next step is uniquely determined:
- If y appears in the remaining east-step y-coordinates, we go east
- Otherwise, we go north Since both paths have the same start and the same east-step y-coordinates, they must make the same choices at each step, hence have the same vertices.
The proof proceeds by strong induction on the total number of steps remaining. At each step, we show the next vertex is determined by whether the current y-coordinate matches the next east-step height.
Corollary: lgvPathToLatticePath is injective on paths with the same start and end.
If two LGV paths from (a, 1) to (c, N) map to the same LatticePath, then they have the same vertices (and hence are equal as paths).
LatticePath to LGV Path Bijection: Inverse Direction #
We construct the inverse of lgvPathToLatticePath, converting a LatticePath back to
an LGV SimpleDigraph.Path. This completes the bidirectional conversion between the
two lattice path representations.
Representation equivalence:
LGV.LatticePath(in LGV1.lean):List LatticeStep(sequence of east/north steps)SymmetricFunctions.LatticePath(here):eastStepHeights : List (Fin N)with constraints
The bijection works because:
- A path from (a, 1) to (c, N) is uniquely determined by its east-step heights
- East-step heights form a weakly increasing sequence of length (c - a).toNat
- This is exactly the data in a LatticePath
Construction algorithm: Given eastStepHeights = [h₀, h₁, ...], construct vertices by:
- Start at (a, 1)
- For each height hᵢ (which represents y-coordinate hᵢ.val + 1):
- Go north until y = hᵢ.val + 1
- Go east
- Finally go north until y = N
The LGV path weight sum equals the LatticePath weight sum. This is proved using lgvPathToLatticePath as a bijection.
The proof establishes that lgvPathToLatticePath is a bijection by showing:
- Injectivity: paths with the same east-step heights are equal
- Surjectivity: every LatticePath corresponds to an LGV path
- Weight preservation: lgvPathToLatticePath_weight_eq
The bijection works because:
- A path from (a, 1) to (c, N) is uniquely determined by its east-step heights
- East-step heights form a weakly increasing sequence of length (c - a)
- This is exactly the data in a LatticePath
Key infrastructure lemma: The LGV path weight sum from (a, 1) to (c, N) with jacobiTrudiArcWeight equals hsymmExt(c - a).
This connects the LGV framework (using SimpleDigraph.Path in integerLattice) to our LatticePath representation (using eastStepHeights).
The proof uses lgv_pathWeightSum_eq_latticePathSum to establish a weight-preserving bijection between LGV paths and LatticePaths, then applies pathWeightSum_eq_hsymm.
This is a key infrastructure lemma needed for det_jacobiTrudiMatrixH_eq_nipatSum.
The Jacobi-Trudi matrix is the transpose of the LGV path weight matrix.
This is a key step in the proof of det_jacobiTrudiMatrixH_eq_nipatSum. The (i,j) entry of jacobiTrudiMatrixH is h_{λᵢ - μⱼ - i + j}, which equals the path weight sum from source A_j to target B_i. This is exactly the (j,i) entry of the path weight matrix, hence the transpose relationship.
The proof uses lgv_pathWeightSum_eq_hsymmExt to connect the LGV path weight sum to hsymmExt, which is how jacobiTrudiMatrixH entries are defined.
LGV-Nipat Bijection: PathTuple to Nipat Conversion #
The following definitions and lemmas establish the conversion from LGV PathTuples
to our Nipat type. This is used to prove lgv_nipatWeightSum_eq_nipatSum.
The LGV nipat weight sum equals our Nipat weight sum.
This connects the two representations of non-intersecting path tuples:
- LGV:
PathTuplewithisNonIntersecting(no shared vertices) - Ours:
NipatwithcolStrictPaths(column-strictness)
The bijection works as follows:
- An LGV path from (a, 1) to (c, N) is encoded by its east-step heights
- This is exactly our
LatticePathtype - Non-intersection of LGV paths ↔ column-strictness of east-step heights
The proof uses pathTupleToNipat to convert LGV nipats to our Nipat type,
with weight preservation via pathTupleToNipat_weight.
Key lemma: The Jacobi-Trudi matrix determinant equals the sum of nipat weights.
This is the core connection between the LGV lemma and the Jacobi-Trudi formula. The proof follows from:
- jacobiTrudiMatrixH entries are h_{λᵢ - μⱼ - i + j} = pathWeightSum from A_j to B_i
- By LGV nonpermutable lemma, det(pathWeightMatrix) = sum over nipats
- The Nipat type captures exactly the non-intersecting path tuples
First Jacobi-Trudi formula (Theorem thm.sf.jt-h) Label: thm.sf.jt-h
s_{λ/μ} = det((h_{λᵢ - μⱼ - i + j})_{1 ≤ i,j ≤ M})
The proof uses the Lindström-Gessel-Viennot lemma with appropriate source and target vertices in the integer lattice ℤ².
Proof Strategy #
Step 1: Set up the LGV framework Define source vertices Aᵢ = (μᵢ - i, 1) and target vertices Bⱼ = (λⱼ - j, N) in ℤ². The path weight matrix M_{i,j} = ∑_{p : Aᵢ → Bⱼ} w(p) where w(p) is the product of x_h for each east-step at height h.
Step 2: Identify M with the Jacobi-Trudi matrix
By pathWeightSum_eq_hsymm, M_{i,j} = h_{λⱼ - μᵢ - j + i} = h_{λⱼ - μᵢ - (j - i)}.
Note: The textbook uses 1-indexed notation; our Lean formalization uses 0-indexed.
The matrix entry (i,j) is h_{λᵢ - μⱼ - i + j} in the textbook convention.
Step 3: Apply the LGV lemma
By lgv_nonpermutable (Corollary cor.lgv.kpaths.wt-np), since the source and
target vertices satisfy the sorting conditions (x-decreasing, y-increasing),
we have:
det(M) = ∑_{nipats from 𝐀 to 𝐁} w(nipat)
where the sum is only over non-intersecting path tuples (nipats).
Step 4: Establish the nipat-SSYT bijection
By nipat_ssyt_bijection, there is a weight-preserving bijection between
nipats from 𝐀 to 𝐁 and SSYT of skew shape λ/μ:
- The nipat (p₁, ..., pₖ) maps to the tableau T where row i contains the heights of east-steps in path pᵢ (in weakly increasing order).
- Non-intersection of paths ensures column-strictness of the tableau.
- The weight w(nipat) = ∏ᵢ w(pᵢ) equals the monomial x^T.
Step 5: Conclude det(M) = ∑{nipats} w(nipat) = ∑{SSYT T of shape λ/μ} x^T = s_{λ/μ}
Key Lemmas Required #
pathWeightSum_eq_hsymm: Path weight sums equal h_n (Observation 1)nipat_ssyt_bijection: Bijection between nipats and SSYT (Observation 2)lgv_nonpermutable: LGV lemma for sorted vertices (from LGV2.lean)- Sorting conditions on A and B vertices (follows from partition monotonicity)
References #
- TeX source: AlgebraicCombinatorics/tex/SymmetricFunctions/PieriJacobiTrudi.tex
- LGV infrastructure: AlgebraicCombinatorics/Determinants/LGV2.lean
Special Cases #
When μ = 0 (the empty partition), we get formulas for non-skew Schur polynomials.
The Schur polynomial for a partition λ equals the skew Schur polynomial for λ/0. This follows from the fact that a skew partition λ/0 is just the partition λ, so SSYT(λ) and SkewSSYT(λ/0) are in natural bijection.
Symmetry of Skew Schur Polynomials via Jacobi-Trudi #
The Jacobi-Trudi formula provides an alternative proof that skew Schur polynomials are symmetric, without relying on the Bender-Knuth involution.
Key insight: The Jacobi-Trudi matrix has entries h_{λᵢ - μⱼ - i + j}, where h_n is the n-th complete homogeneous symmetric polynomial. Since each h_n is symmetric and the determinant is a polynomial in the entries, the determinant is also symmetric.
This provides a sorry-free proof of symmetry for skew Schur polynomials, complementing the Bender-Knuth approach in SchurBasics.lean (which is also sorry-free).
If all entries of a matrix are symmetric polynomials, then the determinant is symmetric. This is because rename σ commutes with det, and rename σ fixes each symmetric entry.
The Jacobi-Trudi matrix (h-version) has symmetric entries.
The determinant of the Jacobi-Trudi matrix (h-version) is symmetric.
Skew Schur polynomials are symmetric (via Jacobi-Trudi).
This provides a sorry-free proof of symmetry using the Jacobi-Trudi formula, complementing the Bender-Knuth approach in SchurBasics.lean.
The proof works by:
- Using
jacobiTrudi_hto express skewSchur as det(jacobiTrudiMatrixH) - Showing each entry h_{λᵢ - μⱼ - i + j} is symmetric (via
hsymmExt_isSymmetric) - Concluding the determinant is symmetric (via
det_isSymmetric_of_entries_symmetric)
Theorem \ref{thm.sf.skew-schur-symm} in the source.
Schur polynomials are symmetric (via Jacobi-Trudi).
This is a corollary of skewSchur_isSymmetric_jacobiTrudi with μ = 0.
Theorem \ref{thm.sf.schur-symm}(a) in the source.