Documentation

AlgebraicCombinatorics.SymmetricFunctions.PieriJacobiTrudi

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 #

Main results #

References #

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:

  1. Bundled (SkewPartition.isHorizontalStrip): Takes a SkewPartition N directly. Use when working with bundled skew partitions.

  2. 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:

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.

  • parts : Fin N

    The parts of the partition

  • weaklyDecreasing (i j : Fin N) : i jself.parts j self.parts i

    The parts are weakly decreasing

Instances For
    theorem SymmetricFunctions.NPartition.ext {N : } {lam mu : NPartition N} (h : lam.parts = mu.parts) :
    lam = mu

    Two N-partitions are equal if their parts are equal.

    theorem SymmetricFunctions.NPartition.ext_iff {N : } {lam mu : NPartition N} :
    lam = mu lam.parts = mu.parts

    Decidable equality for N-partitions.

    Equations

    The zero partition (0, 0, ..., 0)

    Equations
    Instances For

      The size (sum of parts) of an N-partition

      Equations
      Instances For

        Containment of partitions: μ ⊆ λ means μᵢ ≤ λᵢ for all i

        Equations
        Instances For
          theorem SymmetricFunctions.NPartition.le_def {N : } (mu lam : NPartition N) :
          mu lam ∀ (i : Fin N), mu.parts i lam.parts i

          Decidable instance for partition containment.

          Equations
          noncomputable def SymmetricFunctions.NPartition.transpose {N : } (lam : NPartition N) (hN : 0 < N) :

          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
            def SymmetricFunctions.NPartition.IsTranspose {N M : } (lam : Fin N) (lamt : Fin M) :

            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
              theorem SymmetricFunctions.NPartition.zero_isTranspose {N : } :
              IsTranspose (fun (x : Fin N) => 0) fun (x : Fin N) => 0

              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.

              theorem SymmetricFunctions.NPartition.IsTranspose.box_equiv {N M : } {lam : Fin N} {lamt : Fin M} (hlam_mono : ∀ (i j : Fin N), i jlam j lam i) (hlamt_mono : ∀ (i j : Fin M), i jlamt j lamt i) (htranspose : IsTranspose lam lamt) (i : Fin N) (j : Fin M) :
              j + 1 lam i i + 1 lamt j

              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.

              theorem SymmetricFunctions.NPartition.IsTranspose.sum_eq {N M : } {lam : Fin N} {lamt : Fin M} (hlam_mono : ∀ (i j : Fin N), i jlam j lam i) (hlamt_mono : ∀ (i j : Fin M), i jlamt j lamt i) (htranspose : IsTranspose lam lamt) :
              i : Fin N, lam i = j : Fin M, lamt j

              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
                @[simp]

                The row partition has size n.

                @[simp]

                The first part of the row partition is n.

                @[simp]
                theorem SymmetricFunctions.NPartition.rowPartition_parts_pos (N n : ) (hN : 0 < N) (i : Fin N) (hi : 0 < i) :
                (rowPartition N n hN).parts i = 0

                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
                  @[simp]

                  The column partition has size n.

                  @[simp]
                  theorem SymmetricFunctions.NPartition.colPartition_parts_lt (N n : ) (hn : n N) (i : Fin N) (hi : i < n) :
                  (colPartition N n hn).parts i = 1

                  The first n parts of the column partition are 1.

                  @[simp]
                  theorem SymmetricFunctions.NPartition.colPartition_parts_ge (N n : ) (hn : n N) (i : Fin N) (hi : n i) :
                  (colPartition N n hn).parts i = 0

                  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).

                  Convert a local SymmetricFunctions.NPartition to the shared _root_.NPartition.

                  Equations
                  Instances For

                    Convert a shared _root_.NPartition to the local SymmetricFunctions.NPartition.

                    Equations
                    Instances For
                      @[simp]

                      Converting to shared and back is the identity.

                      @[simp]

                      Converting from shared and back is the identity.

                      The equivalence between local and shared NPartition types.

                      Equations
                      Instances For
                        @[simp]

                        Converting to shared preserves parts.

                        @[simp]

                        Converting from shared preserves parts.

                        @[simp]

                        Converting to shared preserves size.

                        @[simp]

                        Converting from shared preserves size.

                        @[simp]

                        The zero partitions correspond under the equivalence.

                        @[simp]

                        The zero partitions correspond under the equivalence.

                        The equivalence preserves the LE relation.

                        The equivalence preserves the LE relation.

                        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.

                        The transpose of the local SymmetricFunctions.NPartition equals the transpose of the shared _root_.NPartition (via the toShared/ofShared equivalence).

                        This is the bridge lemma connecting the two transpose definitions. Since both definitions compute (λᵗ)ᵢ = |{j : λⱼ ≥ i+1}|, they are definitionally equal when the parts are the same.

                        The transpose of a shared _root_.NPartition converted to local equals the local transpose of the converted partition.

                        This is the inverse direction of the bridge lemma.

                        The transpose commutes with the equivalence.

                        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.

                        def SymmetricFunctions.symToWeaklyIncreasing {N : } (n : ) (s : Sym (Fin N) n) :
                        { f : Fin nFin N // ∀ (i j : Fin n), i jf i f j }

                        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.

                          def SymmetricFunctions.weaklyIncreasingToSym {N : } (n : ) (f : Fin nFin N) :
                          Sym (Fin N) n

                          Convert a weakly increasing function back to a Sym. This is the inverse of symToWeaklyIncreasing.

                          Equations
                          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).

                            Instances For

                              The size of a skew partition |Y(λ/μ)| = |λ| - |μ|

                              Equations
                              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:

                                Equivalence: s.isHorizontalStripisHorizontalStripFun 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:

                                  Equivalence: s.isVerticalStripisVerticalStripFun s.outer.parts s.inner.parts (see SkewPartition.isVerticalStrip_iff_isVerticalStripFun)

                                  Equations
                                  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
                                    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
                                      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.

                                        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.

                                        theorem SymmetricFunctions.SkewPartition.empty_isHorizontalNStrip {N : } (lam : NPartition N) :
                                        { outer := lam, inner := lam, contained := }.isHorizontalNStrip 0

                                        The empty skew partition (λ = μ) is a horizontal 0-strip.

                                        theorem SymmetricFunctions.SkewPartition.empty_isVerticalNStrip {N : } (lam : NPartition N) :
                                        { outer := lam, inner := lam, contained := }.isVerticalNStrip 0

                                        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
                                        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
                                            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
                                                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
                                                    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).

                                                        structure SymmetricFunctions.SSYT {N : } (lam : NPartition N) :

                                                        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 types entries : (i : Fin N) → (j : Fin (lam.parts i)) → Fin N. Standalone structure. No [NeZero N] requirement. Field names: rowWeak, colStrict.
                                                        • Alternative definition (SchurBasics.SSYT in SchurBasics.lean): Uses entry : Fin N × ℕ → Fin N with a support condition. Extends YoungTableau. 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.SSYT when working with cell coordinates (i, j) directly, or when extending the YoungTableau structure is beneficial.
                                                        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. Takes s : SkewPartition N as a single bundled argument. No [NeZero N] requirement. Field names: rowWeak, colStrict.
                                                          • Alternative definition (SchurBasics.SkewSSYT in SchurBasics.lean): Uses entry : Fin N × ℕ → Fin N with a support condition. Extends SkewYoungTableau. Takes lam mu : NPartition N as separate arguments. Requires [NeZero N]. Field names: row_weak, col_strict.

                                                          See SSYTEquiv.lean for conversions between representations.

                                                          Instances For
                                                            noncomputable def SymmetricFunctions.SSYT.toMonomial {N : } {R : Type u_1} [CommRing R] {lam : NPartition N} (T : SSYT lam) :

                                                            The monomial x^T associated to a tableau T. x_T = ∏{(i,j) ∈ Y(λ)} x{T(i,j)}

                                                            Equations
                                                            Instances For
                                                              theorem SymmetricFunctions.SkewSSYT.eq_of_entries_eq {N : } {s : SkewPartition N} {T1 T2 : SkewSSYT s} (h : T1.entries = T2.entries) :
                                                              T1 = T2

                                                              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.

                                                              theorem SymmetricFunctions.SSYT.eq_of_entries_eq {N : } {lam : NPartition N} {T1 T2 : SSYT lam} (h : T1.entries = T2.entries) :
                                                              T1 = T2

                                                              Two SSYT are equal if their entries are equal.

                                                              noncomputable def SymmetricFunctions.SkewSSYT.toMonomial {N : } {R : Type u_1} [CommRing R] {s : SkewPartition N} (T : SkewSSYT s) :

                                                              The monomial x^T associated to a skew tableau T.

                                                              Equations
                                                              Instances For
                                                                theorem SymmetricFunctions.SkewSSYT.colStrict_nonadjacent {N : } {s : SkewPartition N} (T : SkewSSYT s) (i j : Fin N) (hij : i < j) (k : Fin (s.outer.parts i - s.inner.parts i)) (k' : Fin (s.outer.parts j - s.inner.parts j)) (hcol_eq : s.inner.parts i + k = s.inner.parts j + k') :
                                                                T.entries i k < T.entries j k'

                                                                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:

                                                                1. The shape has finitely many cells
                                                                2. Each cell can contain one of finitely many values (elements of Fin N)
                                                                3. The SSYT conditions (row-weak, column-strict) define a subset of all fillings
                                                                @[reducible, inline]

                                                                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 finite set of all fillings satisfying SSYT conditions.

                                                                        Equations
                                                                        Instances For

                                                                          Convert a SkewSSYT to a filling.

                                                                          Equations
                                                                          Instances For

                                                                            A filling satisfying SSYT conditions can be converted to a SkewSSYT.

                                                                            Equations
                                                                            Instances For
                                                                              @[reducible, inline]

                                                                              A filling of a non-skew shape λ.

                                                                              Equations
                                                                              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 SSYT predicate for non-skew fillings.

                                                                                      Equations

                                                                                      Finset of valid fillings for non-skew shapes.

                                                                                      Equations
                                                                                      Instances For
                                                                                        def SymmetricFunctions.fillingToSSYT {N : } (lam : NPartition N) (f : Filling lam) (hf : isSSYTFillingNonSkew lam f) :
                                                                                        SSYT lam

                                                                                        Convert a valid filling to an SSYT.

                                                                                        Equations
                                                                                        Instances For

                                                                                          An SSYT's entries form a valid filling.

                                                                                          An SSYT's entries are in the valid filling finset.

                                                                                          noncomputable def SymmetricFunctions.ssytFinset {N : } (lam : NPartition N) :
                                                                                          Finset (SSYT lam)

                                                                                          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
                                                                                            theorem SymmetricFunctions.ssytFinset_mem {N : } (lam : NPartition N) (T : SSYT lam) :

                                                                                            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.

                                                                                              noncomputable def SymmetricFunctions.schur {N : } {R : Type u_1} [CommRing R] (lam : NPartition N) :

                                                                                              The Schur polynomial s_λ defined as the sum over all SSYT of shape λ. Definition def.sf.schur.

                                                                                              Equations
                                                                                              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
                                                                                                Instances For

                                                                                                  Any SSYT of shape 0 equals the unique empty tableau.

                                                                                                  @[simp]

                                                                                                  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.

                                                                                                  @[simp]
                                                                                                  theorem SymmetricFunctions.schur_zero {N : } {R : Type u_1} [CommRing R] :
                                                                                                  schur 0 = 1

                                                                                                  The Schur polynomial of the zero partition is 1. This is because the only SSYT of shape 0 is the empty tableau with monomial 1.

                                                                                                  noncomputable def SymmetricFunctions.skewSchur {N : } {R : Type u_1} [CommRing R] (s : SkewPartition N) :

                                                                                                  The skew Schur polynomial s_{λ/μ} defined as the sum over all skew SSYT. Definition def.sf.skew-schur.

                                                                                                  Equations
                                                                                                  Instances For
                                                                                                    def SymmetricFunctions.ssytToSkewSSYT {N : } (lam : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (T : SSYT { parts := lam, weaklyDecreasing := hlam }) :
                                                                                                    SkewSSYT { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := fun (x : Fin N) => 0, weaklyDecreasing := }, contained := }

                                                                                                    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
                                                                                                      def SymmetricFunctions.skewSSYTToSSYT {N : } (lam : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (T : SkewSSYT { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := fun (x : Fin N) => 0, weaklyDecreasing := }, contained := }) :
                                                                                                      SSYT { parts := lam, weaklyDecreasing := hlam }

                                                                                                      Convert a SkewSSYT to an SSYT when the inner partition is zero. This is the inverse of ssytToSkewSSYT.

                                                                                                      Equations
                                                                                                      Instances For
                                                                                                        theorem SymmetricFunctions.ssytToSkewSSYT_skewSSYTToSSYT {N : } (lam : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (T : SSYT { parts := lam, weaklyDecreasing := hlam }) :
                                                                                                        skewSSYTToSSYT lam hlam (ssytToSkewSSYT lam hlam T) = T

                                                                                                        ssytToSkewSSYT and skewSSYTToSSYT are inverses (direction 1).

                                                                                                        theorem SymmetricFunctions.skewSSYTToSSYT_ssytToSkewSSYT {N : } (lam : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (T : SkewSSYT { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := fun (x : Fin N) => 0, weaklyDecreasing := }, contained := }) :
                                                                                                        ssytToSkewSSYT lam hlam (skewSSYTToSSYT lam hlam T) = T

                                                                                                        ssytToSkewSSYT and skewSSYTToSSYT are inverses (direction 2).

                                                                                                        theorem SymmetricFunctions.ssytToSkewSSYT_toMonomial {N : } {R : Type u_1} [CommRing R] (lam : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (T : SSYT { parts := lam, weaklyDecreasing := hlam }) :

                                                                                                        ssytToSkewSSYT preserves monomials.

                                                                                                        theorem SymmetricFunctions.skewSchur_zero_eq_schur {N : } {R : Type u_1} [CommRing R] (lam : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) :
                                                                                                        skewSchur { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := fun (x : Fin N) => 0, weaklyDecreasing := }, contained := } = schur { parts := lam, weaklyDecreasing := hlam }

                                                                                                        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:

                                                                                                        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
                                                                                                          Instances For

                                                                                                            Check if a function forms a valid N-partition (weakly decreasing).

                                                                                                            Equations
                                                                                                            Instances For
                                                                                                              def SymmetricFunctions.hasSizeDiff {N : } (mu lam : Fin N) (n : ) :

                                                                                                              Check if |λ| - |μ| = n.

                                                                                                              Equations
                                                                                                              Instances For
                                                                                                                instance SymmetricFunctions.instDecidableHasSizeDiff {N : } (mu lam : Fin N) (n : ) :
                                                                                                                Equations

                                                                                                                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:

                                                                                                                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:

                                                                                                                  Equations
                                                                                                                  Instances For

                                                                                                                    Convert a valid function to an NPartition.

                                                                                                                    Equations
                                                                                                                    Instances For

                                                                                                                      The set of N-partitions λ such that λ/μ is a horizontal n-strip.

                                                                                                                      This is the set of all N-partitions λ satisfying:

                                                                                                                      1. μ ⊆ λ (containment): μ_i ≤ λ_i for all i
                                                                                                                      2. Horizontal strip: μ_i ≥ λ_{i+1} for all i < N
                                                                                                                      3. 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
                                                                                                                        Instances For

                                                                                                                          A function from Fin N to ℕ that could potentially form a vertical n-strip with μ.

                                                                                                                          Equations
                                                                                                                          Instances For

                                                                                                                            The set of N-partitions λ such that λ/μ is a vertical n-strip.

                                                                                                                            This is the set of all N-partitions λ satisfying:

                                                                                                                            1. μ ⊆ λ (containment): μ_i ≤ λ_i for all i
                                                                                                                            2. Vertical strip: λ_i ≤ μ_i + 1 for all i
                                                                                                                            3. 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 μ ⊆ λ.

                                                                                                                              theorem SymmetricFunctions.horizontalNStripPartitions_isHorizontalStrip {N : } (mu : NPartition N) (n : ) (lam : NPartition N) (hlam : lam horizontalNStripPartitions mu n) :
                                                                                                                              { outer := lam, inner := mu, contained := }.isHorizontalStrip

                                                                                                                              If λ ∈ horizontalNStripPartitions μ n, then λ/μ is a horizontal strip.

                                                                                                                              theorem SymmetricFunctions.horizontalNStripPartitions_size {N : } (mu : NPartition N) (n : ) (lam : NPartition N) (hlam : lam horizontalNStripPartitions mu n) :
                                                                                                                              lam.size - mu.size = n

                                                                                                                              If λ ∈ horizontalNStripPartitions μ n, then |λ| - |μ| = n.

                                                                                                                              theorem SymmetricFunctions.horizontalNStripPartitions_isHorizontalNStrip' {N : } (mu : NPartition N) (n : ) (lam : NPartition N) (hlam : lam horizontalNStripPartitions mu n) :
                                                                                                                              { outer := lam, inner := mu, contained := }.isHorizontalNStrip 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 μ ⊆ λ.

                                                                                                                              theorem SymmetricFunctions.verticalNStripPartitions_isVerticalStrip {N : } (mu : NPartition N) (n : ) (lam : NPartition N) (hlam : lam verticalNStripPartitions mu n) :
                                                                                                                              { outer := lam, inner := mu, contained := }.isVerticalStrip

                                                                                                                              If λ ∈ verticalNStripPartitions μ n, then λ/μ is a vertical strip.

                                                                                                                              theorem SymmetricFunctions.verticalNStripPartitions_size {N : } (mu : NPartition N) (n : ) (lam : NPartition N) (hlam : lam verticalNStripPartitions mu n) :
                                                                                                                              lam.size - mu.size = n

                                                                                                                              If λ ∈ verticalNStripPartitions μ n, then |λ| - |μ| = n.

                                                                                                                              theorem SymmetricFunctions.verticalNStripPartitions_isVerticalNStrip' {N : } (mu : NPartition N) (n : ) (lam : NPartition N) (hlam : lam verticalNStripPartitions mu n) :
                                                                                                                              { outer := lam, inner := mu, contained := }.isVerticalNStrip 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:

                                                                                                                              1. μ ⊆ λ (containment): μ_i ≤ λ_i for all i
                                                                                                                              2. λ/μ is a horizontal strip: μ_i ≥ λ_{i+1} for all i < N
                                                                                                                              3. |λ| - |μ| = n (size constraint)
                                                                                                                              4. 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:

                                                                                                                              1. μ ⊆ λ (containment): μ_i ≤ λ_i for all i
                                                                                                                              2. λ/μ is a vertical strip: λ_i ≤ μ_i + 1 for all i
                                                                                                                              3. |λ| - |μ| = n (size constraint)

                                                                                                                              This characterization is useful for proving that specific partitions belong to verticalNStripPartitions μ n.

                                                                                                                              theorem SymmetricFunctions.hasSizeDiff_of_isHorizontalNStrip {N : } (mu : NPartition N) (n : ) (lam : NPartition N) (hcontained : mu lam) (hstrip : { outer := lam, inner := mu, contained := hcontained }.isHorizontalNStrip n) :

                                                                                                                              Helper lemma relating SkewPartition.size to hasSizeDiff for horizontal strips.

                                                                                                                              theorem SymmetricFunctions.hasSizeDiff_of_isVerticalNStrip {N : } (mu : NPartition N) (n : ) (lam : NPartition N) (hcontained : mu lam) (hstrip : { outer := lam, inner := mu, contained := hcontained }.isVerticalNStrip n) :

                                                                                                                              Helper lemma relating SkewPartition.size to hasSizeDiff for vertical strips.

                                                                                                                              theorem SymmetricFunctions.mem_horizontalNStripPartitions_of_isHorizontalNStrip {N : } (mu : NPartition N) (n : ) (lam : NPartition N) (hcontained : mu lam) (hstrip : { outer := lam, inner := mu, contained := hcontained }.isHorizontalNStrip n) (hbound : ∀ (i : Fin N), lam.parts i horizontalStripUpperBound mu n i) :

                                                                                                                              Simplified membership criterion for horizontal strip partitions using SkewPartition API.

                                                                                                                              This theorem bridges the gap between the horizontalNStripPartitions finset and the SkewPartition.isHorizontalNStrip predicate.

                                                                                                                              theorem SymmetricFunctions.mem_verticalNStripPartitions_of_isVerticalNStrip {N : } (mu : NPartition N) (n : ) (lam : NPartition N) (hcontained : mu lam) (hstrip : { outer := lam, inner := mu, contained := hcontained }.isVerticalNStrip n) :

                                                                                                                              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:

                                                                                                                              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:

                                                                                                                              1. 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).

                                                                                                                              2. 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.

                                                                                                                              3. 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:

                                                                                                                              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:

                                                                                                                              1. All entries of T are 0 (the first row index)
                                                                                                                              2. λ/μ is a horizontal strip (no two cells in same column)

                                                                                                                              This is because:

                                                                                                                              For column partition ν = (1, 1, ..., 1, 0, ..., 0) with n ones: A semistandard tableau T of shape λ/μ is ν-Yamanouchi iff:

                                                                                                                              1. Entries form a valid "staircase" pattern (entry in row i is at least i)
                                                                                                                              2. λ/μ is a vertical strip (no two cells in same row)

                                                                                                                              This is because:

                                                                                                                              What's provided here:

                                                                                                                              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.

                                                                                                                              def SymmetricFunctions.rowPartitionFun (N n : ) (hN : 0 < N) :
                                                                                                                              Fin N

                                                                                                                              Row partition as a function (for use with LittlewoodRichardson.IsYamanouchi).

                                                                                                                              Equations
                                                                                                                              Instances For
                                                                                                                                def SymmetricFunctions.colPartitionFun (N n : ) (hn : n N) :
                                                                                                                                Fin N

                                                                                                                                Column partition as a function (for use with LittlewoodRichardson.IsYamanouchi).

                                                                                                                                Equations
                                                                                                                                Instances For
                                                                                                                                  @[simp]
                                                                                                                                  theorem SymmetricFunctions.rowPartitionFun_zero (N n : ) (hN : 0 < N) :
                                                                                                                                  rowPartitionFun N n hN 0, hN = n

                                                                                                                                  The row partition function has n at position 0 and 0 elsewhere.

                                                                                                                                  @[simp]
                                                                                                                                  theorem SymmetricFunctions.rowPartitionFun_pos (N n : ) (hN : 0 < N) (i : Fin N) (hi : 0 < i) :
                                                                                                                                  rowPartitionFun N n hN i = 0
                                                                                                                                  @[simp]
                                                                                                                                  theorem SymmetricFunctions.colPartitionFun_lt (N n : ) (hn : n N) (i : Fin N) (hi : i < n) :
                                                                                                                                  colPartitionFun N n hn i = 1

                                                                                                                                  The column partition function has 1 at positions < n and 0 elsewhere.

                                                                                                                                  @[simp]
                                                                                                                                  theorem SymmetricFunctions.colPartitionFun_ge (N n : ) (hn : n N) (i : Fin N) (hi : n i) :
                                                                                                                                  colPartitionFun N n hn i = 0

                                                                                                                                  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):

                                                                                                                                  For the column partition ν = (1, 1, ..., 1, 0, ..., 0) with n ones:

                                                                                                                                  Equivalences Between Strip Definitions #

                                                                                                                                  The following lemmas establish equivalences between the bundled and unbundled representations of horizontal/vertical strip predicates:

                                                                                                                                  1. Bundled: SkewPartition.isHorizontalStrip / SkewPartition.isVerticalStrip

                                                                                                                                  2. Unbundled (canonical): isHorizontalStripFun / isVerticalStripFun

                                                                                                                                  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.

                                                                                                                                    Equations
                                                                                                                                    theorem SymmetricFunctions.contentColGeq_zero_of_allEntriesZero {N : } {lam mu : Fin N} (T : AlgebraicCombinatorics.Tableau lam mu) (hZero : allEntriesZero T) (j : ) (k : Fin N) (hk : 0 < k) :

                                                                                                                                    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)

                                                                                                                                    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)

                                                                                                                                    The correct characterization requires BOTH being a horizontal strip AND being Yamanouchi with respect to a row partition.

                                                                                                                                    def SymmetricFunctions.symToRowSSYT {N : } (hN : 0 < N) (n : ) (s : Sym (Fin N) n) :

                                                                                                                                    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
                                                                                                                                      def SymmetricFunctions.rowSSYTToSym {N : } (hN : 0 < N) (n : ) (T : SSYT (NPartition.rowPartition N n hN)) :
                                                                                                                                      Sym (Fin N) n

                                                                                                                                      Convert an SSYT of row partition shape back to a Sym. Row 0 entries form a weakly increasing sequence which gives a multiset.

                                                                                                                                      Equations
                                                                                                                                      Instances For
                                                                                                                                        theorem SymmetricFunctions.rowSSYTToSym_symToRowSSYT {N : } (hN : 0 < N) (n : ) (s : Sym (Fin N) n) :
                                                                                                                                        rowSSYTToSym hN n (symToRowSSYT hN n s) = s

                                                                                                                                        symToRowSSYT and rowSSYTToSym are inverses (Sym → SSYT → Sym).

                                                                                                                                        theorem SymmetricFunctions.symToRowSSYT_toMonomial {N : } {R : Type u_1} [CommRing R] (hN : 0 < N) (n : ) (s : Sym (Fin N) n) :

                                                                                                                                        symToRowSSYT preserves monomials.

                                                                                                                                        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.

                                                                                                                                        def SymmetricFunctions.finsetToColSSYT {N : } (n : ) (hn : n N) (s : Finset (Fin N)) (hs : s.card = n) :

                                                                                                                                        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
                                                                                                                                          def SymmetricFunctions.colSSYTEntry {N : } (n : ) (hn : n N) (T : SSYT (NPartition.colPartition N n hn)) (k : ) (hk : k < n) :
                                                                                                                                          Fin N

                                                                                                                                          Helper for extracting entry from column SSYT

                                                                                                                                          Equations
                                                                                                                                          Instances For
                                                                                                                                            def SymmetricFunctions.colSSYTToFinset {N : } (n : ) (hn : n N) (T : SSYT (NPartition.colPartition N n hn)) :

                                                                                                                                            Inverse bijection: SSYT(colPartition) → Finset

                                                                                                                                            Equations
                                                                                                                                            Instances For
                                                                                                                                              theorem SymmetricFunctions.colSSYTEntry_succ_lt {N : } (n : ) (hn : n N) (T : SSYT (NPartition.colPartition N n hn)) (k : ) (hk : k < n) (hk1 : k + 1 < n) :
                                                                                                                                              colSSYTEntry n hn T k hk < colSSYTEntry n hn T (k + 1) hk1

                                                                                                                                              Column entries are strictly increasing - consecutive case

                                                                                                                                              theorem SymmetricFunctions.colSSYTEntry_strictMono {N : } (n : ) (hn : n N) (T : SSYT (NPartition.colPartition N n hn)) (k₁ k₂ : ) (hk₁ : k₁ < n) (hk₂ : k₂ < n) (hlt : k₁ < k₂) :
                                                                                                                                              colSSYTEntry n hn T k₁ hk₁ < colSSYTEntry n hn T k₂ hk₂

                                                                                                                                              Column entries are strictly increasing - general case

                                                                                                                                              theorem SymmetricFunctions.colSSYTToFinset_card {N : } (n : ) (hn : n N) (T : SSYT (NPartition.colPartition N n hn)) :

                                                                                                                                              The image has cardinality n because entries are strictly increasing

                                                                                                                                              theorem SymmetricFunctions.colSSYTToFinset_sort_eq {N : } (n : ) (hn : n N) (T : SSYT (NPartition.colPartition N n hn)) :
                                                                                                                                              ((colSSYTToFinset n hn T).sort fun (x1 x2 : Fin N) => x1 x2) = List.ofFn fun (k : Fin n) => colSSYTEntry n hn T k

                                                                                                                                              Sorting colSSYTToFinset gives back the original entries as a list

                                                                                                                                              theorem SymmetricFunctions.finsetToColSSYT_toMonomial {N : } {R : Type u_1} [CommRing R] (n : ) (hn : n N) (s : Finset (Fin N)) (hs : s.card = n) :
                                                                                                                                              (finsetToColSSYT n hn s hs).toMonomial = is, MvPolynomial.X i

                                                                                                                                              finsetToColSSYT preserves monomials

                                                                                                                                              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:

                                                                                                                                              1. Both sides are sums of monomials
                                                                                                                                              2. esymm sums over powersetCard n univ with monomial ∏_{i ∈ s} X_i
                                                                                                                                              3. schur sums over SSYT of shape (1,...,1,0,...,0) with monomial T.toMonomial
                                                                                                                                              4. For column partition, SSYT entries in column 0 form strictly increasing sequences
                                                                                                                                              5. The bijection: s ↦ SSYT with entries = sorted(s) in column 0
                                                                                                                                              6. Weight preservation: ∏_{i ∈ s} X_i = T.toMonomial
                                                                                                                                              theorem SymmetricFunctions.pieri_horizontal {N : } {R : Type u_1} [CommRing R] (n : ) (mu : NPartition N) :

                                                                                                                                              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.

                                                                                                                                              theorem SymmetricFunctions.pieri_vertical {N : } {R : Type u_1} [CommRing R] (n : ) (mu : NPartition N) :
                                                                                                                                              MvPolynomial.esymm (Fin N) R n * schur mu = lamverticalNStripPartitions mu n, schur lam

                                                                                                                                              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.

                                                                                                                                              noncomputable def SymmetricFunctions.hsymmExt {N : } {R : Type u_1} [CommRing R] (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
                                                                                                                                              Instances For

                                                                                                                                                hsymmExt is symmetric.

                                                                                                                                                noncomputable def SymmetricFunctions.jacobiTrudiMatrixH {N : } {R : Type u_1} [CommRing R] (lam mu : Fin N) :
                                                                                                                                                Matrix (Fin N) (Fin N) (MvPolynomial (Fin N) R)

                                                                                                                                                The Jacobi-Trudi matrix for h (first Jacobi-Trudi formula). Entry (i,j) is h_{λᵢ - μⱼ - i + j}.

                                                                                                                                                Equations
                                                                                                                                                Instances For
                                                                                                                                                  theorem SymmetricFunctions.jacobiTrudi_e {N : } {R : Type u_1} [CommRing R] (lam mu lamt muT : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hlamt : ∀ (i j : Fin N), i jlamt j lamt i) (hmuT : ∀ (i j : Fin N), i jmuT j muT i) (hcontained : ∀ (i : Fin N), mu i lam i) (htranspose_lam : NPartition.IsTranspose lam lamt) (htranspose_mu : NPartition.IsTranspose mu muT) :
                                                                                                                                                  skewSchur { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := } = (Matrix.of fun (i j : Fin N) => have n := (lamt i) - (muT j) - i + j; if 0 n then MvPolynomial.esymm (Fin N) R n.toNat else 0).det

                                                                                                                                                  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:

                                                                                                                                                  These vertices satisfy the sorting conditions required by the LGV lemma (Corollary cor.lgv.kpaths.wt-np):

                                                                                                                                                  def SymmetricFunctions.jacobiTrudiSourceX {N : } (mu : Fin N) (i : Fin N) :

                                                                                                                                                  The source vertex A_i = (μ_i - i, 1) for the Jacobi-Trudi LGV setup. Here 1 represents the "starting height" in the lattice.

                                                                                                                                                  Equations
                                                                                                                                                  Instances For
                                                                                                                                                    def SymmetricFunctions.jacobiTrudiTargetX {N : } (lam : Fin N) (j : Fin N) :

                                                                                                                                                    The target vertex B_j = (λ_j - j, N) for the Jacobi-Trudi LGV setup. Here N represents the "ending height" in the lattice.

                                                                                                                                                    Equations
                                                                                                                                                    Instances For
                                                                                                                                                      theorem SymmetricFunctions.jacobiTrudiSourceX_antitone {N : } (mu : Fin N) (hmu : ∀ (i j : Fin N), i jmu j mu i) (i j : Fin N) :

                                                                                                                                                      The source x-coordinates are weakly decreasing. This follows from the partition being weakly decreasing: μᵢ - i ≥ μⱼ - j when i ≤ j, since μᵢ ≥ μⱼ and i ≤ j.

                                                                                                                                                      theorem SymmetricFunctions.jacobiTrudiTargetX_antitone {N : } (lam : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (i j : Fin N) :

                                                                                                                                                      The target x-coordinates are weakly decreasing. This follows from the partition being weakly decreasing.

                                                                                                                                                      theorem SymmetricFunctions.jacobiTrudiPathLength {N : } (lam mu : Fin N) (i j : Fin N) :
                                                                                                                                                      jacobiTrudiTargetX lam j - jacobiTrudiSourceX mu i = (lam j) - (mu i) - j + i

                                                                                                                                                      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.

                                                                                                                                                      structure SymmetricFunctions.LatticePath {N : } (a c : ) :

                                                                                                                                                      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.

                                                                                                                                                      • eastStepHeights : List (Fin N)

                                                                                                                                                        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)

                                                                                                                                                      • length_eq : self.eastStepHeights.length = (c - a).toNat

                                                                                                                                                        The number of east-steps equals c - a (when non-negative)

                                                                                                                                                      Instances For
                                                                                                                                                        noncomputable def SymmetricFunctions.LatticePath.weight {N : } {R : Type u_1} [CommRing R] {a c : } (p : LatticePath a c) :

                                                                                                                                                        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
                                                                                                                                                        Instances For
                                                                                                                                                          theorem SymmetricFunctions.LatticePath.ext {N : } {a c : } {p q : LatticePath a c} (h : p.eastStepHeights = q.eastStepHeights) :
                                                                                                                                                          p = q

                                                                                                                                                          Extensionality lemma for lattice paths.

                                                                                                                                                          def SymmetricFunctions.LatticePath.toSym {N : } {a c : } (p : LatticePath a c) :
                                                                                                                                                          Sym (Fin N) (c - a).toNat

                                                                                                                                                          Convert a lattice path to a Sym element (multiset of heights).

                                                                                                                                                          Equations
                                                                                                                                                          Instances For
                                                                                                                                                            noncomputable def SymmetricFunctions.symToLatticePath {N : } {a c : } (s : Sym (Fin N) (c - a).toNat) :

                                                                                                                                                            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.

                                                                                                                                                              theorem SymmetricFunctions.toSym_symToLatticePath {N : } {a c : } (s : Sym (Fin N) (c - a).toNat) :

                                                                                                                                                              Converting a Sym to a path and back gives the original Sym.

                                                                                                                                                              noncomputable def SymmetricFunctions.latticePathSymEquiv {N : } {a c : } :
                                                                                                                                                              LatticePath a c Sym (Fin N) (c - a).toNat

                                                                                                                                                              The equivalence between lattice paths and Sym (multisets).

                                                                                                                                                              Equations
                                                                                                                                                              Instances For
                                                                                                                                                                noncomputable instance SymmetricFunctions.instFintypeLatticePath {N : } {a c : } :

                                                                                                                                                                Fintype instance for LatticePath via the equivalence with Sym.

                                                                                                                                                                Equations
                                                                                                                                                                theorem SymmetricFunctions.symToLatticePath_weight {N : } {R : Type u_1} [CommRing R] {a c : } (s : Sym (Fin N) (c - a).toNat) :

                                                                                                                                                                The weight of a path obtained from sorting a Sym equals the Sym product.

                                                                                                                                                                noncomputable def SymmetricFunctions.latticePathFinset {N : } (a c : ) :

                                                                                                                                                                The set of all lattice paths from (a, 1) to (c, N). Empty when c < a (no valid paths), otherwise all paths.

                                                                                                                                                                Equations
                                                                                                                                                                Instances For
                                                                                                                                                                  theorem SymmetricFunctions.pathWeightSum_eq_hsymm {N : } {R : Type u_1} [CommRing R] (a c : ) :
                                                                                                                                                                  platticePathFinset a c, p.weight = hsymmExt (c - a)

                                                                                                                                                                  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.

                                                                                                                                                                  structure SymmetricFunctions.Nipat {N : } (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :

                                                                                                                                                                  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
                                                                                                                                                                    noncomputable def SymmetricFunctions.Nipat.weight {N : } {R : Type u_1} [CommRing R] {lam mu : Fin N} {hlam : ∀ (i j : Fin N), i jlam j lam i} {hmu : ∀ (i j : Fin N), i jmu j mu i} {hcontained : ∀ (i : Fin N), mu i lam i} (np : Nipat lam mu hlam hmu hcontained) :

                                                                                                                                                                    The weight of a nipat is the product of the weights of its component paths.

                                                                                                                                                                    Equations
                                                                                                                                                                    Instances For
                                                                                                                                                                      noncomputable def SymmetricFunctions.nipatToSSYT {N : } {lam mu : Fin N} {hlam : ∀ (i j : Fin N), i jlam j lam i} {hmu : ∀ (i j : Fin N), i jmu j mu i} {hcontained : ∀ (i : Fin N), mu i lam i} (np : Nipat lam mu hlam hmu hcontained) :
                                                                                                                                                                      SkewSSYT { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := }

                                                                                                                                                                      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
                                                                                                                                                                        def SymmetricFunctions.mkLatticePathFromEntries {N : } (lam mu i : ) (entries : Fin (lam - mu)Fin N) (hrowWeak : ∀ (j k : Fin (lam - mu)), j kentries j entries k) :
                                                                                                                                                                        LatticePath (mu - i) (lam - i)

                                                                                                                                                                        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
                                                                                                                                                                        Instances For
                                                                                                                                                                          noncomputable def SymmetricFunctions.ssytToNipat {N : } {lam mu : Fin N} {hlam : ∀ (i j : Fin N), i jlam j lam i} {hmu : ∀ (i j : Fin N), i jmu j mu i} {hcontained : ∀ (i : Fin N), mu i lam i} (T : SkewSSYT { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := }) :
                                                                                                                                                                          Nipat lam mu hlam hmu hcontained

                                                                                                                                                                          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
                                                                                                                                                                          Instances For
                                                                                                                                                                            theorem SymmetricFunctions.Nipat.eq_of_paths_eq {N : } {lam mu : Fin N} {hlam : ∀ (i j : Fin N), i jlam j lam i} {hmu : ∀ (i j : Fin N), i jmu j mu i} {hcontained : ∀ (i : Fin N), mu i lam i} (np1 np2 : Nipat lam mu hlam hmu hcontained) (h : np1.paths = np2.paths) :
                                                                                                                                                                            np1 = np2

                                                                                                                                                                            Two nipats with equal paths are equal.

                                                                                                                                                                            theorem SymmetricFunctions.ssytToNipat_nipatToSSYT {N : } {lam mu : Fin N} {hlam : ∀ (i j : Fin N), i jlam j lam i} {hmu : ∀ (i j : Fin N), i jmu j mu i} {hcontained : ∀ (i : Fin N), mu i lam i} (np : Nipat lam mu hlam hmu hcontained) :

                                                                                                                                                                            ssytToNipat is a left inverse of nipatToSSYT.

                                                                                                                                                                            theorem SymmetricFunctions.nipat_path_length {N : } {lam mu : Fin N} {hlam : ∀ (i j : Fin N), i jlam j lam i} {hmu : ∀ (i j : Fin N), i jmu j mu i} {hcontained : ∀ (i : Fin N), mu i lam i} (np : Nipat lam mu hlam hmu hcontained) (i : Fin N) :
                                                                                                                                                                            (np.paths i).eastStepHeights.length = lam i - mu i

                                                                                                                                                                            The length of path i's eastStepHeights equals lam i - mu i.

                                                                                                                                                                            theorem SymmetricFunctions.nipatToSSYT_entries {N : } {lam mu : Fin N} {hlam : ∀ (i j : Fin N), i jlam j lam i} {hmu : ∀ (i j : Fin N), i jmu j mu i} {hcontained : ∀ (i : Fin N), mu i lam i} (np : Nipat lam mu hlam hmu hcontained) (i : Fin N) (k : Fin (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.

                                                                                                                                                                            theorem SymmetricFunctions.ssytToNipat_paths {N : } {lam mu : Fin N} {hlam : ∀ (i j : Fin N), i jlam j lam i} {hmu : ∀ (i j : Fin N), i jmu j mu i} {hcontained : ∀ (i : Fin N), mu i lam i} (T : SkewSSYT { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := }) (i : Fin N) (k : Fin (lam i - mu i)) :

                                                                                                                                                                            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.

                                                                                                                                                                            theorem SymmetricFunctions.nipatToSSYT_ssytToNipat {N : } {lam mu : Fin N} {hlam : ∀ (i j : Fin N), i jlam j lam i} {hmu : ∀ (i j : Fin N), i jmu j mu i} {hcontained : ∀ (i : Fin N), mu i lam i} (T : SkewSSYT { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := }) :

                                                                                                                                                                            nipatToSSYT is a left inverse of ssytToNipat.

                                                                                                                                                                            theorem SymmetricFunctions.nipatToSSYT_weight {N : } {R : Type u_1} [CommRing R] {lam mu : Fin N} {hlam : ∀ (i j : Fin N), i jlam j lam i} {hmu : ∀ (i j : Fin N), i jmu j mu i} {hcontained : ∀ (i : Fin N), mu i lam i} (np : Nipat lam mu hlam hmu hcontained) :

                                                                                                                                                                            The weight of a nipat equals the monomial of the corresponding tableau.

                                                                                                                                                                            theorem SymmetricFunctions.nipat_ssyt_bijection {N : } {R : Type u_1} [CommRing R] (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :
                                                                                                                                                                            ∃ (f : Nipat lam mu hlam hmu hcontainedSkewSSYT { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := }), Function.Bijective f ∀ (np : Nipat lam mu hlam hmu hcontained), np.weight = (f np).toMonomial

                                                                                                                                                                            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.

                                                                                                                                                                            noncomputable instance SymmetricFunctions.SkewSSYT.fintype {N : } (s : SkewPartition N) :

                                                                                                                                                                            Fintype instance for SkewSSYT via the equivalence with valid fillings.

                                                                                                                                                                            Equations
                                                                                                                                                                            • One or more equations did not get rendered due to their size.
                                                                                                                                                                            noncomputable def SymmetricFunctions.nipatSSYTEquiv {N : } (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :
                                                                                                                                                                            Nipat lam mu hlam hmu hcontained SkewSSYT { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := }

                                                                                                                                                                            The equivalence between Nipat and SkewSSYT, established by the bijection functions.

                                                                                                                                                                            Equations
                                                                                                                                                                            Instances For
                                                                                                                                                                              noncomputable instance SymmetricFunctions.Nipat.fintype {N : } (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :
                                                                                                                                                                              Fintype (Nipat lam mu hlam hmu hcontained)

                                                                                                                                                                              Fintype instance for Nipat via the equivalence with SkewSSYT.

                                                                                                                                                                              Equations
                                                                                                                                                                              • One or more equations did not get rendered due to their size.
                                                                                                                                                                              noncomputable def SymmetricFunctions.nipatFinset' {N : } (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :
                                                                                                                                                                              Finset (Nipat lam mu hlam hmu hcontained)

                                                                                                                                                                              The finite set of all nipats for given partitions λ/μ.

                                                                                                                                                                              Equations
                                                                                                                                                                              Instances For
                                                                                                                                                                                theorem SymmetricFunctions.nipatWeightSum_eq_ssytSum {N : } {R : Type u_1} [CommRing R] (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :
                                                                                                                                                                                np : Nipat lam mu hlam hmu hcontained, np.weight = T : SkewSSYT { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := }, T.toMonomial

                                                                                                                                                                                The sum of nipat weights equals the sum of SSYT monomials. This follows from the bijection and weight preservation.

                                                                                                                                                                                theorem SymmetricFunctions.nipatWeightSum_eq_skewSchur {N : } {R : Type u_1} [CommRing R] (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :
                                                                                                                                                                                np : Nipat lam mu hlam hmu hcontained, np.weight = skewSchur { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := }

                                                                                                                                                                                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:

                                                                                                                                                                                1. Source vertices A_i = (μ_i - i, 1) and target vertices B_j = (λ_j - j, N) in ℤ²
                                                                                                                                                                                2. An arc weight function that assigns X_j to east-steps at height j
                                                                                                                                                                                3. Helper lemmas connecting the path weight sum to h_n

                                                                                                                                                                                The key insight is that:

                                                                                                                                                                                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
                                                                                                                                                                                    theorem SymmetricFunctions.jacobiTrudiSourceVertex_xDecreasing {N : } (mu : Fin N) (hmu : ∀ (i j : Fin N), i jmu j mu i) :

                                                                                                                                                                                    The source vertices have x-coordinates that are weakly decreasing.

                                                                                                                                                                                    The source vertices have y-coordinates that are constant (trivially increasing).

                                                                                                                                                                                    theorem SymmetricFunctions.jacobiTrudiTargetVertex_xDecreasing {N : } (lam : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) :

                                                                                                                                                                                    The target vertices have x-coordinates that are weakly decreasing.

                                                                                                                                                                                    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):

                                                                                                                                                                                        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:

                                                                                                                                                                                        Non-intersection ↔ Column-strictness: For paths from sources A_i = (μ_i - i, 1) to targets B_i = (λ_i - i, N):

                                                                                                                                                                                        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
                                                                                                                                                                                          theorem SymmetricFunctions.lgvPathEastStepYCoords_length_eq_xDisplacement (vertices : List ( × )) (h_ne : vertices []) (h_arcs : ∀ (i : ) (hi : i + 1 < vertices.length), LGV.integerLattice.arc (vertices.get i, ) (vertices.get i + 1, hi)) :
                                                                                                                                                                                          (lgvPathEastStepYCoords vertices).length = ((vertices.getLast h_ne).1 - (vertices.head h_ne).1).toNat

                                                                                                                                                                                          The number of east-steps equals the x-displacement. This is a key property for the bijection.

                                                                                                                                                                                          theorem SymmetricFunctions.lgvPathEastStepYCoords_weaklyIncreasing (vertices : List ( × )) (h_arcs : ∀ (i : ) (hi : i + 1 < vertices.length), LGV.integerLattice.arc (vertices.get i, ) (vertices.get i + 1, hi)) :
                                                                                                                                                                                          List.IsChain (fun (x1 x2 : ) => x1 x2) (lgvPathEastStepYCoords vertices)

                                                                                                                                                                                          East-step y-coordinates are weakly increasing (paths go north or east).

                                                                                                                                                                                          theorem SymmetricFunctions.lgvPathEastStepYCoords_bounded (vertices : List ( × )) (h_ne : vertices []) (h_arcs : ∀ (i : ) (hi : i + 1 < vertices.length), LGV.integerLattice.arc (vertices.get i, ) (vertices.get i + 1, hi)) (y : ) (hy : y lgvPathEastStepYCoords vertices) :
                                                                                                                                                                                          (vertices.head h_ne).2 y y (vertices.getLast h_ne).2

                                                                                                                                                                                          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
                                                                                                                                                                                          theorem SymmetricFunctions.lgvPathEastStepYCoords_at_x_is_east_step (p : LGV.integerLattice.Path) (k : ) (hk : k < (lgvPathEastStepYCoords p.vertices).length) (idx : ) (hidx : idx < p.vertices.length) (_hx : (p.vertices.get idx, hidx).1 = p.start.1 + k) (hy : (p.vertices.get idx, hidx).2 = (lgvPathEastStepYCoords p.vertices)[k]) (hidx_next : idx + 1 < p.vertices.length) :
                                                                                                                                                                                          (p.vertices.get idx + 1, hidx_next).1 = (p.vertices.get idx, hidx).1 + 1 (p.vertices.get idx + 1, hidx_next).2 = (p.vertices.get idx, hidx).2

                                                                                                                                                                                          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.

                                                                                                                                                                                          theorem SymmetricFunctions.paths_above_at_x_stays_above (p p' : LGV.integerLattice.Path) (hni : vp.vertices, vp'.vertices) (x₀ : ) (hx₀_p : ∃ (idx : ) (hidx : idx < p.vertices.length), (p.vertices.get idx, hidx).1 = x₀) (hx₀_p' : ∃ (idx : ) (hidx : idx < p'.vertices.length), (p'.vertices.get idx, hidx).1 = x₀) (h_above : ∀ (idx_p : ) (hidx_p : idx_p < p.vertices.length) (idx_p' : ) (hidx_p' : idx_p' < p'.vertices.length), (p.vertices.get idx_p, hidx_p).1 = x₀(p'.vertices.get idx_p', hidx_p').1 = x₀(p'.vertices.get idx_p', hidx_p').2 > (p.vertices.get idx_p, hidx_p).2) (x₁ : ) (hx₁ : x₁ x₀) (hx₁_p : ∃ (idx : ) (hidx : idx < p.vertices.length), (p.vertices.get idx, hidx).1 = x₁) (hx₁_p' : ∃ (idx : ) (hidx : idx < p'.vertices.length), (p'.vertices.get idx, hidx).1 = x₁) (idx_p : ) (hidx_p : idx_p < p.vertices.length) (idx_p' : ) (hidx_p' : idx_p' < p'.vertices.length) :
                                                                                                                                                                                          (p.vertices.get idx_p, hidx_p).1 = x₁(p'.vertices.get idx_p', hidx_p').1 = x₁(p'.vertices.get idx_p', hidx_p').2 > (p.vertices.get idx_p, hidx_p).2

                                                                                                                                                                                          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:

                                                                                                                                                                                          Weight preservation follows from the definition of jacobiTrudiArcWeight:

                                                                                                                                                                                          def SymmetricFunctions.lgvYCoordsToFinN {N : } (ycoords : List ) (h : yycoords, 1 y y N) :
                                                                                                                                                                                          List (Fin N)

                                                                                                                                                                                          Convert east-step y-coordinates (in ℤ, range [1, N]) to Fin N elements. This is a helper for the LGV path to LatticePath bijection.

                                                                                                                                                                                          Equations
                                                                                                                                                                                          Instances For
                                                                                                                                                                                            theorem SymmetricFunctions.lgvYCoordsToFinN_length {N : } (ycoords : List ) (h : yycoords, 1 y y N) :
                                                                                                                                                                                            (lgvYCoordsToFinN ycoords h).length = ycoords.length

                                                                                                                                                                                            The length of lgvYCoordsToFinN equals the length of the input list.

                                                                                                                                                                                            theorem SymmetricFunctions.lgvYCoordsToFinN_getElem {N : } (ycoords : List ) (h : yycoords, 1 y y N) (k : ) (hk : k < ycoords.length) (hk' : k < (lgvYCoordsToFinN ycoords h).length := by rw [lgvYCoordsToFinN_length]; exact hk) :
                                                                                                                                                                                            (lgvYCoordsToFinN ycoords h)[k] + 1 = ycoords[k]

                                                                                                                                                                                            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].

                                                                                                                                                                                            theorem SymmetricFunctions.lgvYCoordsToFinN_isChain {N : } (ycoords : List ) (h : yycoords, 1 y y N) (hchain : List.IsChain (fun (x1 x2 : ) => x1 x2) ycoords) :
                                                                                                                                                                                            List.IsChain (fun (x1 x2 : Fin N) => x1 x2) (lgvYCoordsToFinN ycoords h)

                                                                                                                                                                                            The converted list preserves the chain property (weakly increasing).

                                                                                                                                                                                            theorem SymmetricFunctions.lgvYCoordsToFinN_injective {N : } (l₁ l₂ : List ) (h₁ : yl₁, 1 y y N) (h₂ : yl₂, 1 y y N) (heq : lgvYCoordsToFinN l₁ h₁ = lgvYCoordsToFinN l₂ h₂) :
                                                                                                                                                                                            l₁ = l₂

                                                                                                                                                                                            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:

                                                                                                                                                                                            1. The lengths are equal (pmap preserves length)
                                                                                                                                                                                            2. At each position i, the Fin N values are equal (from heq)
                                                                                                                                                                                            3. Since y ↦ (y - 1).toNat is injective on [1, N], the original values are equal
                                                                                                                                                                                            theorem SymmetricFunctions.lgvYCoordsToFinN_map_val_add_one_eq {N : } (heights : List (Fin N)) {l : List } (heq : l = List.map (fun (h : Fin N) => h + 1) heights) (h : yl, 1 y y N) :
                                                                                                                                                                                            lgvYCoordsToFinN l h = heights

                                                                                                                                                                                            Helper: lgvYCoordsToFinN inverts the map (fun h => h.val + 1). If l = heights.map (fun h => h.val + 1), then lgvYCoordsToFinN l h = heights.

                                                                                                                                                                                            noncomputable def SymmetricFunctions.lgvPathToLatticePath {N : } (a c : ) (p : LGV.integerLattice.Path) (hstart : p.start = (a, 1)) (hfinish : p.finish = (c, N)) :

                                                                                                                                                                                            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.

                                                                                                                                                                                              theorem SymmetricFunctions.lgvPathToLatticePath_injective {N : } (a c : ) (p₁ p₂ : LGV.integerLattice.Path) (hstart₁ : p₁.start = (a, 1)) (hfinish₁ : p₁.finish = (c, N)) (hstart₂ : p₂.start = (a, 1)) (hfinish₂ : p₂.finish = (c, N)) (heq : lgvPathToLatticePath a c p₁ hstart₁ hfinish₁ = lgvPathToLatticePath a c p₂ hstart₂ hfinish₂) :
                                                                                                                                                                                              p₁ = p₂

                                                                                                                                                                                              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:

                                                                                                                                                                                              The bijection works because:

                                                                                                                                                                                              1. A path from (a, 1) to (c, N) is uniquely determined by its east-step heights
                                                                                                                                                                                              2. East-step heights form a weakly increasing sequence of length (c - a).toNat
                                                                                                                                                                                              3. This is exactly the data in a LatticePath

                                                                                                                                                                                              Construction algorithm: Given eastStepHeights = [h₀, h₁, ...], construct vertices by:

                                                                                                                                                                                              1. Start at (a, 1)
                                                                                                                                                                                              2. For each height hᵢ (which represents y-coordinate hᵢ.val + 1):
                                                                                                                                                                                                • Go north until y = hᵢ.val + 1
                                                                                                                                                                                                • Go east
                                                                                                                                                                                              3. Finally go north until y = N
                                                                                                                                                                                              theorem SymmetricFunctions.lgvPathToLatticePath_weight_eq {N : } {R : Type u_1} [CommRing R] (a c : ) (p : LGV.integerLattice.Path) (hstart : p.start = (a, 1)) (hfinish : p.finish = (c, 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:

                                                                                                                                                                                              1. Injectivity: paths with the same east-step heights are equal
                                                                                                                                                                                              2. Surjectivity: every LatticePath corresponds to an LGV path
                                                                                                                                                                                              3. 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.

                                                                                                                                                                                              Corollary: The determinant of jacobiTrudiMatrixH equals the determinant of the path weight matrix. This follows from det(Mᵀ) = det(M).

                                                                                                                                                                                              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.

                                                                                                                                                                                              theorem SymmetricFunctions.lgv_nipatWeightSum_eq_nipatSum {N : } {R : Type u_1} [CommRing R] (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :

                                                                                                                                                                                              The LGV nipat weight sum equals our Nipat weight sum.

                                                                                                                                                                                              This connects the two representations of non-intersecting path tuples:

                                                                                                                                                                                              • LGV: PathTuple with isNonIntersecting (no shared vertices)
                                                                                                                                                                                              • Ours: Nipat with colStrictPaths (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 LatticePath type
                                                                                                                                                                                              • 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.

                                                                                                                                                                                              theorem SymmetricFunctions.det_jacobiTrudiMatrixH_eq_nipatSum {N : } {R : Type u_1} [CommRing R] (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :
                                                                                                                                                                                              (jacobiTrudiMatrixH lam mu).det = np : Nipat lam mu hlam hmu hcontained, np.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:

                                                                                                                                                                                              1. jacobiTrudiMatrixH entries are h_{λᵢ - μⱼ - i + j} = pathWeightSum from A_j to B_i
                                                                                                                                                                                              2. By LGV nonpermutable lemma, det(pathWeightMatrix) = sum over nipats
                                                                                                                                                                                              3. The Nipat type captures exactly the non-intersecting path tuples
                                                                                                                                                                                              theorem SymmetricFunctions.jacobiTrudi_h {N : } {R : Type u_1} [CommRing R] (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :
                                                                                                                                                                                              skewSchur { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := } = (jacobiTrudiMatrixH lam mu).det

                                                                                                                                                                                              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 #

                                                                                                                                                                                              1. pathWeightSum_eq_hsymm: Path weight sums equal h_n (Observation 1)
                                                                                                                                                                                              2. nipat_ssyt_bijection: Bijection between nipats and SSYT (Observation 2)
                                                                                                                                                                                              3. lgv_nonpermutable: LGV lemma for sorted vertices (from LGV2.lean)
                                                                                                                                                                                              4. 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.

                                                                                                                                                                                              theorem SymmetricFunctions.schur_eq_skewSchur_zero {N : } {R : Type u_1} [CommRing R] (lam : NPartition N) :
                                                                                                                                                                                              schur lam = skewSchur { outer := lam, inner := 0, contained := }

                                                                                                                                                                                              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.

                                                                                                                                                                                              theorem SymmetricFunctions.jacobiTrudi_h_nonSkew {N : } {R : Type u_1} [CommRing R] (lam : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) :
                                                                                                                                                                                              schur { parts := lam, weaklyDecreasing := hlam } = (jacobiTrudiMatrixH lam fun (x : Fin N) => 0).det

                                                                                                                                                                                              Jacobi-Trudi for non-skew Schur polynomials: s_λ = det((h_{λᵢ - i + j})_{1 ≤ i,j ≤ N})

                                                                                                                                                                                              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).

                                                                                                                                                                                              theorem SymmetricFunctions.det_isSymmetric_of_entries_symmetric {N : } {R : Type u_1} [CommRing R] (M : Matrix (Fin N) (Fin N) (MvPolynomial (Fin N) R)) (h : ∀ (i j : Fin N), (M i j).IsSymmetric) :

                                                                                                                                                                                              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.

                                                                                                                                                                                              theorem SymmetricFunctions.jacobiTrudiMatrixH_entries_isSymmetric {N : } {R : Type u_1} [CommRing R] (lam mu : Fin N) (i j : Fin N) :

                                                                                                                                                                                              The Jacobi-Trudi matrix (h-version) has symmetric entries.

                                                                                                                                                                                              The determinant of the Jacobi-Trudi matrix (h-version) is symmetric.

                                                                                                                                                                                              theorem SymmetricFunctions.skewSchur_isSymmetric_jacobiTrudi {N : } {R : Type u_1} [CommRing R] (lam mu : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) (hmu : ∀ (i j : Fin N), i jmu j mu i) (hcontained : ∀ (i : Fin N), mu i lam i) :
                                                                                                                                                                                              (skewSchur { outer := { parts := lam, weaklyDecreasing := hlam }, inner := { parts := mu, weaklyDecreasing := hmu }, contained := }).IsSymmetric

                                                                                                                                                                                              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:

                                                                                                                                                                                              1. Using jacobiTrudi_h to express skewSchur as det(jacobiTrudiMatrixH)
                                                                                                                                                                                              2. Showing each entry h_{λᵢ - μⱼ - i + j} is symmetric (via hsymmExt_isSymmetric)
                                                                                                                                                                                              3. Concluding the determinant is symmetric (via det_isSymmetric_of_entries_symmetric)

                                                                                                                                                                                              Theorem \ref{thm.sf.skew-schur-symm} in the source.

                                                                                                                                                                                              theorem SymmetricFunctions.schur_isSymmetric_jacobiTrudi {N : } {R : Type u_1} [CommRing R] (lam : Fin N) (hlam : ∀ (i j : Fin N), i jlam j lam i) :
                                                                                                                                                                                              (schur { parts := lam, weaklyDecreasing := hlam }).IsSymmetric

                                                                                                                                                                                              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.