Documentation

Atlas.AlgebraicCombinatorics.code.PartitionCycles

Partition Insertion-Deletion Cycle Count (Corollary 8.9) #

This file formalizes Corollary 8.9 from Stanley's Algebraic Combinatorics: the number of ways to choose a partition λ ⊢ j, then alternately delete and insert squares m times each, returning to λ, is given by

∑_{s=1}^{j} [p(j-s) - p(j-s-1)] · s^m, m > 0

where p(i) is the number of partitions of i and p(-1) := 0.

Main definitions #

Main results #

Proof structure #

The book's proof of Corollary 8.9 has three distinct steps:

  1. Bipartite symmetry: exactly half the closed walks in Y_{j-1,j} of length 2m begin at an element of Y_j.
  2. Trace formula (Corollary 1.3, Chapter 1): the total number of closed walks of length 2m in a graph equals ∑ θᵢ^{2m}, where θᵢ are the eigenvalues of the adjacency matrix. This spectral theory from Chapter 1 is not proved here.
  3. Eigenvalue substitution (Theorem 8.8): plugging in the specific eigenvalues 0, ±√1, ±√2, ..., ±√j with their multiplicities.

In this formalization:

References #

Covering relation in Young's lattice #

def PartitionCycles.PartitionCovers {n : } (μ : n.Partition) (ν : (n + 1).Partition) :

The covering relation in Young's lattice: PartitionCovers μ ν means μ ⊢ n is obtained from ν ⊢ (n+1) by removing exactly one square from ν's Young diagram. In terms of multiset parts: there exists a part k ∈ ν.parts such that μ.parts is obtained by replacing k with k-1 (or removing k entirely if k = 1).

Instances For

    Closed walk definition #

    def PartitionCycles.IsValidCycle (n m : ) (ν : Fin (m + 1)(n + 1).Partition) (μ : Fin mn.Partition) :

    A valid closed cycle in the bipartite graph Y_{n, n+1} of length 2m. This represents a sequence ν₀ → μ₀ → ν₁ → μ₁ → ⋯ → μ_{m-1} → νₘ where ν₀ = νₘ (closed walk), each νᵢ ⊢ (n+1), each μᵢ ⊢ n, and each consecutive pair is related by the covering relation PartitionCovers.

    The walk goes: "delete a square" (ν → μ), "insert a square" (μ → ν'), alternating m times each, ending back at the starting partition.

    Instances For
      noncomputable def PartitionCycles.partitionCycleCount (n m : ) :

      The partition cycle count: the number of ways to choose a partition λ ⊢ (n+1), then alternately delete and insert squares m times each, returning to λ.

      Formally, this is the cardinality of the set of all valid closed alternating walks of length 2m in the bipartite graph Y_{n, n+1}, starting (and ending) at vertices in Y_{n+1}. We parametrize by n so that j = n + 1, avoiding ℕ subtraction in types.

      Instances For

        Eigenvalue multiplicity function #

        noncomputable def PartitionCycles.eigenMult (j s : ) :

        The eigenvalue multiplicity function for the bipartite graph Y_{j-1, j}. For each s with 1 ≤ s ≤ j, the eigenvalues ±√s each have multiplicity p(j-s) - p(j-s-1), where p(-1) := 0 by convention.

        This function computes the multiplicity in ℤ to correctly handle the boundary case s = j, where p(j - j - 1) = p(-1) = 0 rather than p(0) = 1 (which ℕ truncation would give).

        Instances For

          Eigenvalue power sum (Theorem 8.8 data) #

          By Theorem 8.8 (young_lattice_eigenvalue_multiplicities), the eigenvalues of the adjacency matrix of Y_{j-1, j} are:

          Since (±√s)^{2m} = s^m, the sum of the 2m-th powers of all eigenvalues is: eigenMult(j, 0) · 0^{2m} + ∑_{s=1}^j 2 · eigenMult(j, s) · s^m.

          We define this sum as eigenvaluePowerSum, encoding the eigenvalue data from Theorem 8.8 (which is fully proved in YoungEigenvalues.lean).

          noncomputable def PartitionCycles.eigenvaluePowerSum (j m : ) :

          The sum of the 2m-th powers of all eigenvalues of the adjacency matrix of Y_{j-1, j}, computed using the eigenvalue data from Theorem 8.8.

          By Theorem 8.8, the eigenvalues are 0 (mult p(j)-p(j-1)) and ±√s (mult p(j-s)-p(j-s-1)) for 1 ≤ s ≤ j. Since (±√s)^{2m} = s^m, the sum is: eigenMult(j, 0) · 0^{2m} + ∑_{s=1}^j 2 · eigenMult(j, s) · s^m.

          Instances For
            theorem PartitionCycles.eigenMult_matches_eigenspace_dims (j : ) (hj : 1 j) :
            eigenMult j 0 = (YoungEigenvalues.p j) - (YoungEigenvalues.p (j - 1)) ∀ (s : ), 1 ss jeigenMult j s = (YoungEigenvalues.p (j - s)) - if s + 1 j then (YoungEigenvalues.p (j - (s + 1))) else 0

            The eigenvalue multiplicities encoded in eigenMult match the eigenspace dimensions from Theorem 8.8 (young_lattice_eigenvalue_multiplicities).

            Specifically, for the bipartite graph Y_{j-1,j}:

            • The eigenspace of 0 has dimension eigenMult j 0 = p(j) - p(j-1).
            • For 1 ≤ s ≤ j, each eigenspace of ±√s has dimension eigenMult j s = p(j-s) - p(j-s-1).

            These values are encoded directly in the definition of eigenMult, and Theorem 8.8 (young_lattice_eigenvalue_multiplicities) proves that the adjacency operator's eigenspaces have exactly these dimensions. The completeness condition (part (d) of Theorem 8.8) ensures these are ALL the eigenvalues.

            Abstract trace sum and trace formula (Corollary 1.3, Chapter 1) #

            The proof of Corollary 8.9 relies on two ingredients:

            1. Trace formula + bipartite symmetry (Corollary 1.3, Chapter 1): The number of closed walks of length 2m starting at Y_{n+1} vertices equals half the sum of the 2m-th powers of all eigenvalues of the adjacency matrix. This is a spectral theory result from Chapter 1, not proved in this project.

            2. Eigenvalue substitution (Theorem 8.8): The eigenvalues of Y_{n, n+1} are 0, ±√1, ..., ±√(n+1) with specific multiplicities. Substituting these into the trace sum yields eigenvaluePowerSum.

            We separate these two steps explicitly:

            noncomputable def PartitionCycles.closedWalkTraceSum (n m : ) :

            The abstract sum of 2m-th powers of all eigenvalues of the adjacency matrix of Y_{n, n+1}. This represents the spectral quantity ∑ θᵢ^{2m} that appears in the trace formula (Corollary 1.3).

            By Theorem 8.8, the eigenvalues of Y_{n, n+1} are 0 (mult p(n+1)-p(n)) and ±√s (mult p(n+1-s)-p(n-s)) for 1 ≤ s ≤ n+1. Since (±√s)^{2m} = s^m, this sum equals eigenvaluePowerSum (n + 1) m.

            Instances For

              Eigenvalue substitution (from Theorem 8.8).

              The abstract trace sum ∑ θᵢ^{2m} for the adjacency matrix of Y_{n, n+1} equals the concrete formula eigenvaluePowerSum (n+1) m, once we substitute the eigenvalues determined by Theorem 8.8:

              • eigenvalue 0 with multiplicity p(n+1) - p(n) (contributes 0 when m ≥ 1),
              • eigenvalues ±√s with multiplicity p(n+1-s) - p(n-s) for 1 ≤ s ≤ n+1.

              Since (±√s)^{2m} = s^m, each pair ±√s contributes 2 · eigenMult(n+1, s) · s^m.

              This step uses the eigenvalue data from the fully proved Theorem 8.8 (young_lattice_eigenvalue_multiplicities in YoungEigenvalues.lean); it does NOT use the trace formula (Corollary 1.3) from Chapter 1.

              Main theorem #

              theorem PartitionCycles.partition_cycle_count (n m : ) (hm : 1 m) :
              (partitionCycleCount n m) = sFinset.Icc 1 (n + 1), eigenMult (n + 1) s * s ^ m

              Corollary 8.9. Fix j ≥ 1. The number of ways to choose a partition λ ⊢ j, then delete a square, then insert a square, ..., for a total of m insertions and m deletions, ending back at λ, is:

              ∑_{s=1}^{j} [p(j-s) - p(j-s-1)] · s^m, for m > 0

              where p(i) is the number of partitions of i and p(-1) := 0.

              We state this with j = n + 1 to avoid ℕ subtraction in the partition type indices. The equality is in ℤ to correctly handle the convention p(-1) = 0.

              The proof uses:

              1. The trace formula (Corollary 1.3, Chapter 1) combined with bipartite symmetry, axiomatized as trace_formula_closed_walks.
              2. The eigenvalue substitution step (eigenvalue_substitution), which connects the abstract trace sum to the concrete eigenvaluePowerSum using Theorem 8.8's data.

              From the trace formula axiom: 2 · count = closedWalkTraceSum n m = eigenvaluePowerSum(n+1, m) [by eigenvalue_substitution] = eigenMult(j, 0) · 0^{2m} + ∑{s=1}^j 2 · eigenMult(j, s) · s^m. Since m ≥ 1, 0^{2m} = 0, so the first term vanishes. The factor of 2 cancels, giving count = ∑{s=1}^j eigenMult(j, s) · s^m.