Theorems
Matrices preserving interlacing sequences
A nonnegative polynomial matrix preserves interlacing sequences when every ordered $2 \times 2$ submatrix satisfies the affine interlacing condition. A zero-aware form allows output rows to vanish.
References
S. Fisk, Polynomials, roots, and interlacing, 2006, Chapter 3, develops matrices preserving interlacing. P. Brändén gives the exact nonnegative polynomial characterization in “Unimodality, log-concavity, real-rootedness and beyond,” Handbook of Enumerative Combinatorics, 2015, Theorem 7.8.5. See the matrix criterion on symmetricfunctions.com.
≔ Definitions
A polynomial matrix acting on a sequence
def matPolyAction (G : List (List ℝ[X])) (fs : List ℝ[X]) : List ℝ[X] :=
G.map (fun row => (row.zipWith (· * ·) fs).sum)
2 × 2 interlacing condition
def Has2x2InterlacingProperty (a b c d : ℝ[X]) : Prop :=
∀ (s t : ℝ), 0 < s → 0 < t →
StrictInterl ((C s * X + C t) * b + d) ((C s * X + C t) * a + c)
2 × 2 interlacing condition, allowing zeros
def Has2x2InterlacingProperty0 (a b c d : ℝ[X]) : Prop :=
∀ (s t : ℝ), 0 < s → 0 < t →
Interl ((C s * X + C t) * b + d) ((C s * X + C t) * a + c)
⊢ Theorems
Such matrices preserve interlacing sequences
theorem preserves_interlacing_sequences :
∀ {n : Nat} (_hn : 0 < n) (G : List (List ℝ[X]))
(hG_rect : ∀ row ∈ G, row.length = n)
(_hG_nonneg : ∀ row ∈ G, ∀ p ∈ row, HasNonnegCoeffs p)
(_hG_affine : ∀ (i₁ i₂ : Fin G.length) (j₁ j₂ : Fin n),
i₁ ≤ i₂ → j₁ ≤ j₂ →
Has2x2InterlacingProperty
((G.get i₁).get ⟨j₁, by simp_all⟩)
((G.get i₁).get ⟨j₂, by simp_all⟩)
((G.get i₂).get ⟨j₁, by simp_all⟩)
((G.get i₂).get ⟨j₂, by simp_all⟩))
(fs : List ℝ[X]) (_hfs_len : fs.length = n)
(_hfs : IsInterlacingSeqNonneg fs),
IsInterlacingSeqNonneg (matPolyAction G fs)
The same, allowing zero rows
theorem preserves_interlacing_sequences_zeroAware :
∀ {n : Nat} (G : List (List ℝ[X]))
(hG_rect : ∀ row ∈ G, row.length = n)
(_hG_nonneg : ∀ row ∈ G, ∀ p ∈ row, HasNonnegCoeffs p)
(_hG_affine : ∀ (i₁ i₂ : Fin G.length) (j₁ j₂ : Fin n),
i₁ ≤ i₂ → j₁ ≤ j₂ →
Has2x2InterlacingProperty0
((G.get i₁).get ⟨j₁, by simp_all⟩)
((G.get i₁).get ⟨j₂, by simp_all⟩)
((G.get i₂).get ⟨j₁, by simp_all⟩)
((G.get i₂).get ⟨j₂, by simp_all⟩))
(fs : List ℝ[X]) (_hfs_len : fs.length = n)
(_hfs : IsInterlacingSeqNonneg fs),
IsInterlacingSeq0Nonneg (matPolyAction G fs)
Lean source RealRooted/Challenges/MatrixInterlacing.lean at revision 5827550b.