From 58284b3b8d3816d9ac4a0e266b61ef1c0e91aaf6 Mon Sep 17 00:00:00 2001 From: Egor M Date: Tue, 25 Aug 2026 22:37:59 +0300 Subject: [PATCH 1/2] feat(Chapter_32): lattice paths and determinants Add proofs of the Lindstrom-Gessel-Viennot lemma and Binet-Cauchy determinant formula. Fix a mistake in the blueprint (Theorem 32.2 was just a copy of Lemma 32.1). --- FormalBook/Ch32/BinetCauchy.lean | 297 ++++++++++ FormalBook/Ch32/WDigraph.lean | 445 +++++++++++++++ FormalBook/Chapter_32.lean | 840 +++++++++++++++++++++++++++- blueprint/src/chapter/chapter32.tex | 13 +- blueprint/src/print.pdf | Bin 387397 -> 388475 bytes 5 files changed, 1567 insertions(+), 28 deletions(-) create mode 100644 FormalBook/Ch32/BinetCauchy.lean create mode 100644 FormalBook/Ch32/WDigraph.lean diff --git a/FormalBook/Ch32/BinetCauchy.lean b/FormalBook/Ch32/BinetCauchy.lean new file mode 100644 index 0000000..76d8e28 --- /dev/null +++ b/FormalBook/Ch32/BinetCauchy.lean @@ -0,0 +1,297 @@ +import LindstromGesselViennot.WDigraph +import LindstromGesselViennot.Main + +set_option linter.style.header false +/-! +# Binet-Cauchy formula + +In this file we state and prove Binet-Cauchy formula for the determinant of +product of two rectangular matrices. + +## Main results + +- `binet_cauchy`: Binet-Cauchy formula. +-/ + +lemma eq_zero_or_eq_one_or_ge_two (n : ℕ) : n = 0 ∨ n = 1 ∨ n ≥ 2 := by + grind + +lemma fin_inj_image_card {α : Type*} [LinearOrder α] {k : ℕ} {f : Fin k → α} + (h : Function.Injective f) : (Finset.univ.image f).card = k := by + rw [Finset.card_image_of_injective _ h, Finset.card_univ, Fintype.card_fin] + +universe u + +variable {R : Type u} [CommRing R] +variable (r s : ℕ) +variable (P : Matrix (Fin r) (Fin s) R) (Q : Matrix (Fin s) (Fin r) R) + +abbrev V := (Fin r) ⊕ (Fin s) ⊕ (Fin r) + +abbrev A : Fin r → V r s := Sum3.in₀ +abbrev B : Fin s → V r s := Sum3.in₁ +abbrev C : Fin r → V r s := Sum3.in₂ + +def G : WDigraph (V r s) R := + { weight := fun i j => match i, j with + | Sum3.in₀ i, Sum3.in₁ j => some (P i j) + | Sum3.in₁ i, Sum3.in₂ j => some (Q i j) + | _, _ => none } + +lemma G_adj_AB (i : Fin r) (j : Fin s) : (G r s P Q).Adj (A r s i) (B r s j) := + by rfl + +@[simp] +lemma G_weight_AB (i : Fin r) (j : Fin s) : (G r s P Q).weight (A r s i) (B r s + j) = P i j := by rfl + +lemma G_adj_BC (i : Fin s) (j : Fin r) : (G r s P Q).Adj (B r s i) (C r s j) := + by rfl + +@[simp] +lemma G_weight_BC (i : Fin s) (j : Fin r) : (G r s P Q).weight (B r s i) (C r s + j) = Q i j := by rfl + +lemma G_walk_CC_aux (i : Fin r) (j : Fin r) + (p : (G r s P Q).Walk (Sum.inr (Sum.inr i)) (C r s j)) : i = j := by + cases p with + | nil => rfl + | @cons _ x _ hx px => + rcases x with _ | _ | _ <;> simp [G, WDigraph.Adj] at hx + +lemma G_walk_CC (i : Fin r) (j : Fin r) + (p : (G r s P Q).Walk (Sum.inr (Sum.inr i)) (C r s j)) : + p = (WDigraph.Walk.nil (u := C r s j)).copy + (G_walk_CC_aux r s P Q i j p ▸ (Eq.refl _)) (Eq.refl _) := by + cases p with + | nil => rfl + | @cons _ x _ hx px => + rcases x with _ | _ | _ <;> simp [G, WDigraph.Adj] at hx + +def f (i j : Fin r) (k : Fin s) : + (G r s P Q).Walk (A r s i) (C r s j) := + WDigraph.Walk.cons (G_adj_AB r s P Q i k) + (WDigraph.Walk.cons (G_adj_BC r s P Q k j) WDigraph.Walk.nil) + +lemma f_bij (i : Fin r) (j : Fin r) : + Function.Bijective (f r s P Q i j) := by + constructor + · intro _ _ h + simp [f, B] at h + grind + · intro p + cases p with | @cons _ x _ hx px + rcases x with _ | x | _ + · simp [WDigraph.Adj, G] at hx + · use x + simp only [f, B] + cases px with | @cons _ y _ hy py + rcases y with _ | _ | y + · simp [WDigraph.Adj, G] at hy + · simp [WDigraph.Adj, G] at hy + · simp [G_walk_CC r s P Q y j py, C, G_walk_CC_aux r s P Q y j py] + · simp [WDigraph.Adj, G] at hx + +open Classical in +lemma f_bijInv (i j : Fin r) (p : (G r s P Q).Walk (A r s i) (C r s j)) : + B r s (Fintype.bijInv (f_bij r s P Q i j) p) = p.getVert 1 := by + rcases Function.Bijective.surjective (f_bij r s P Q i j) p with ⟨k, hk⟩ + rw [← hk, Fintype.leftInverse_bijInv] + simp [f] + +open path_system + +def preF (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) : + path_system (G r s P Q) (A r s) (C r s) := + ⟨p.2.2 * p.2.1, fun i => f r s P Q i ((p.2.2 * p.2.1) i) ((p.1 ∘ p.2.1) i)⟩ + +lemma preF_length + (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) (i : Fin r) : + ((preF r s P Q p).2 i).length = 2 := by + simp [preF, f] + +@[simp] +lemma preF_zero (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) + (i : Fin r) : ((preF r s P Q p).2 i).getVert 0 = A r s i := by + simp [preF] + +@[simp] +lemma preF_one (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) + (i : Fin r) : ((preF r s P Q p).2 i).getVert 1 = B r s ((p.1 ∘ p.2.1) i) := by + simp [preF, f] + +lemma preF_two (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) + (i : Fin r) {k : ℕ} (hk : k ≥ 2) : + ((preF r s P Q p).2 i).getVert k = C r s ((p.2.2 * p.2.1) i) := by + have h : ((preF r s P Q p).2 i).length ≤ k := by + simp only [preF_length r s P Q p i, hk] + rw [WDigraph.Walk.getVert_of_ge_length _ h] + simp [preF] + +lemma preF_vertex_disjoint (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × + Equiv.Perm (Fin r)) : VertexDisjoint (G r s P Q) (A r s) (C r s) + (preF r s P Q p) := by + intro i j h' + rw [WDigraph.Walk.Intersecting] + push Not + intro ki kj + rcases eq_zero_or_eq_one_or_ge_two ki with rfl | rfl | hi <;> + rcases eq_zero_or_eq_one_or_ge_two kj with rfl | rfl | hj <;> + simp only [Function.comp_apply, preF_one, WDigraph.Walk.getVert_zero, ne_eq] + any_goals rw [preF_two r s P Q p i hi] + any_goals rw [preF_two r s P Q p j hj] + all_goals simp [A, B, C] <;> grind [RelEmbedding.injective p.1, + Equiv.injective p.2.1, Equiv.injective p.2.2] + +def F := Subtype.coind (preF r s P Q) (preF_vertex_disjoint r s P Q) + +open Classical in +lemma F_bij : Function.Bijective (F r s P Q) := by + constructor + · apply Subtype.coind_injective + intro p q h + simp only [preF, Sigma.mk.injEq] at h + rcases h with ⟨h1, h2⟩ + rw [h1] at h2 + have h3 : p.1 ∘ p.2.1 = q.1 ∘ q.2.1 := by + funext i + exact Function.Bijective.injective (f_bij r s P Q i _) + (congrFun (eq_of_heq h2) i) + have h4 : Finset.univ.image p.1 = Finset.univ.image q.1 := by + calc + _ = Finset.univ.image (p.1 ∘ p.2.1) := by + rw [← Finset.image_image, Finset.image_univ_equiv] + _ = Finset.univ.image (q.1 ∘ q.2.1) := by rw [h3] + _ = Finset.univ.image q.1 := by + rw [← Finset.image_image, Finset.image_univ_equiv] + have h5 : p.1 = q.1 := by + calc + _ = (Finset.univ.image p.1).orderEmbOfFin + (fin_inj_image_card (RelEmbedding.injective p.1)) := by + rw [← Finset.orderEmbOfFin_unique' + (fin_inj_image_card (RelEmbedding.injective p.1)) + (f := p.1) (by simp)] + _ = (Finset.univ.image q.1).orderEmbOfFin + (fin_inj_image_card (RelEmbedding.injective q.1)) := by + rw! [h4]; rfl + _ = q.1 := by + rw [← Finset.orderEmbOfFin_unique' + (fin_inj_image_card (RelEmbedding.injective q.1)) + (f := q.1) (by simp)] + rw [h5] at h3 + replace h3 := DFunLike.coe_fn_eq.mp (Function.Injective.comp_left + (RelEmbedding.injective q.1) h3) + rw [h3] at h1 + replace h1 := (mul_left_inj q.2.1).mp h1 + grind + · rintro ⟨q, hq⟩ + let e := fun i => Fintype.bijInv (f_bij r s P Q i (q.1 i)) (q.2 i) + have he : Function.Injective e := by + intro i j h + simp only [e] at h + contrapose! hq + rw [VertexDisjoint]; push Not + use i, j + refine ⟨hq, ?_⟩ + rw [WDigraph.Walk.Intersecting] + use 1, 1 + rw [← f_bijInv, ← f_bijInv, h] + let p1 := Finset.orderEmbOfFin _ (fin_inj_image_card he) + let p21 : Equiv.Perm (Fin r) := { + toFun := fun i => (Finset.orderIsoOfFin _ (fin_inj_image_card he)).symm + ⟨e i, by simp⟩ + invFun := fun i => Function.Injective.invOfMemRange he + ⟨(Finset.orderIsoOfFin _ (fin_inj_image_card he) i), by + apply mem_image_univ_iff_mem_range.mp; simp⟩ + left_inv := by simp [Function.LeftInverse] + right_inv := by + rw [Function.RightInverse, Function.LeftInverse] + intro i + rcases Finset.mem_image.mp (((Finset.image e Finset.univ).orderIsoOfFin + (fin_inj_image_card he)) i).prop with ⟨j, _, hj⟩ + rw! [← hj, Function.Injective.right_inv_of_invOfMemRange, hj] + simp [-Finset.coe_orderIsoOfFin_apply] } + use ⟨p1, p21, q.1 * p21.symm⟩ + simp only [F, Subtype.coind, preF, Equiv.Perm.coe_mul, Subtype.mk.injEq] + apply Sigma.ext + · simp [pull_end] + grind + · simp only [Equiv.Perm.coe_mul, Function.comp_assoc] + rw [Equiv.symm_comp_self, Function.comp_id, heq_eq_eq] + ext i + simp [← Finset.coe_orderIsoOfFin_apply, Equiv.coe_fn_mk, p1, p21, e, + Function.RightInverse.eq (Fintype.rightInverse_bijInv (f_bij r s P Q i + (q.1 i)))] + +lemma F_weight (Z : Fin r ↪o Fin s) (σ τ : Equiv.Perm (Fin r)) : + (F r s P Q (Z, σ, τ)).val.weight = + (∏ (j : Fin r), (Q (Z j) (τ j))) * ∏ (i : Fin r), (P i (Z (σ i))) := by + simp [F, Subtype.coind, preF, f, weight, path_collection.weight, + Finset.prod_mul_distrib, Fintype.prod_equiv σ + (fun x ↦ Q (Z (σ x)) (τ (σ x))) + (fun x ↦ Q (Z x) (τ x)) (congrFun rfl)] + +lemma F_sign (Z : Fin r ↪o Fin s) (σ τ : Equiv.Perm (Fin r)) : + (F r s P Q (Z, σ, τ)).val.sign = τ.sign * σ.sign := by + simp [F, preF, f, sign] + +lemma G_walk_C {i : Fin r} {v : V r s} (p : (G r s P Q).Walk (C r s i) v) : + p.length = 0 := by + cases p with + | nil => simp + | cons e _ => simp [G, WDigraph.Adj] at e + +lemma G_walk_B {i : Fin s} {v : V r s} (p : (G r s P Q).Walk (B r s i) v) : + p.length ≤ 1 := by + cases p with + | nil => simp + | @cons _ w _ e q => + match w with + | Sum.inr (Sum.inr _) => simp [G_walk_C] + | Sum.inr (Sum.inl _) => simp [G, WDigraph.Adj] at e + | Sum.inl _ => simp [G, WDigraph.Adj] at e + +lemma G_walk_A {i : Fin r} {v : V r s} (p : (G r s P Q).Walk (A r s i) v) : + p.length ≤ 2 := by + cases p with + | nil => simp + | @cons _ w _ e q => + match w with + | Sum.inr (Sum.inr _) => simp [G, WDigraph.Adj] at e + | Sum.inr (Sum.inl _) => simp [G_walk_B] + | Sum.inl _ => simp [G, WDigraph.Adj] at e + +instance : WDigraph.Walk.PathFinite (G r s P Q) := by + apply WDigraph.Walk.path_finite_of_bounded_length (k := 3) + intro u + match u with + | Sum.inr (Sum.inr _) => simp [G_walk_C] + | Sum.inr (Sum.inl _) => grind [G_walk_B] + | Sum.inl _ => grind [G_walk_A] + +lemma path_matrix_G_eq_PQ : path_matrix (G r s P Q) (A r s) (C r s) = + P * Q := by + ext i j + rw [path_matrix, Matrix.mul_apply]; dsimp + rw [← Function.Bijective.sum_comp (f_bij r s P Q i j)] + congr; funext + rw! [f, WDigraph.Walk.weight, WDigraph.Walk.weight, G_weight_AB, G_weight_BC] + simp [mul_comm] + rfl + +open Classical in +theorem binet_cauchy : Matrix.det (P * Q) = + ∑ (Z : Fin r ↪o Fin s), (Matrix.det (P.submatrix id Z)) * + (Matrix.det (Q.submatrix Z id)) := by + rw [← path_matrix_G_eq_PQ, lindstrom_gessel_viennot, + ← Finset.sum_subtype_eq_sum_filter, Finset.subtype_univ, + ← Function.Bijective.sum_comp (F_bij r s P Q), Fintype.sum_prod_type] + congr; funext Z + rw [Fintype.sum_prod_type, ← Matrix.det_transpose] + nth_rw 2 [← Matrix.det_transpose] + simp only [Matrix.det_apply, Matrix.submatrix, id_eq, Matrix.transpose, + Matrix.of_apply, Fintype.sum_mul_sum] + congr; funext σ + congr; funext τ + rw [F_weight, F_sign, mul_smul_mul_comm, mul_comm] + diff --git a/FormalBook/Ch32/WDigraph.lean b/FormalBook/Ch32/WDigraph.lean new file mode 100644 index 0000000..2211092 --- /dev/null +++ b/FormalBook/Ch32/WDigraph.lean @@ -0,0 +1,445 @@ +/- +Copyright 2026 Egor Morozov. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Egor Morozov +-/ +import Mathlib.Algebra.Order.Ring.Star +import Mathlib.Analysis.Normed.Ring.Lemmas +import Mathlib.Data.Int.Star +import Mathlib.Tactic.DepRewrite + +/-! +# Basic facts about weighted directed graphs + +This is an auxiliary file for Chapter 32. + +## Implementation notes + +In mathlib, the API for walks is developed only for undirected unweighted +graphs. In this file we define weighted directed graphs and prove basic facts +about them in a way similar to Mathlib.Combinatorics.SimpleGraph.Basic and +Mathlib.Combinatorics.SimpleGraph.Walk. It also contains few lemmas missing in +mathlib (such as `take_append_of_le_length`). This file should be removed as +soon as relevant framework appear in mathlib. +-/ +universe u v + +structure WDigraph (V : Type u) (R : Type v) [CommRing R] where + weight : V → V → Option R + +variable {V : Type u} +variable {R : Type v} [CommRing R] +variable (G : WDigraph V R) + +namespace WDigraph + +def Adj (u v : V) : Prop := (G.weight u v).isSome + +inductive Walk : V → V → Type u + | nil {u : V} : Walk u u + | cons {u v w : V} (h : G.Adj u v) (p : Walk v w) : Walk u w + deriving DecidableEq + +namespace Walk + +class PathFinite : Prop where + fin_walks : ∀ (u v : V), Finite (G.Walk u v) + +instance {u v : V} [h : PathFinite G] : Finite (G.Walk u v) := h.fin_walks u v + +noncomputable instance {u v : V} [PathFinite G] : + Fintype (G.Walk u v) := Fintype.ofFinite _ + +variable {G} + +protected def copy {u v u' v'} (p : G.Walk u v) (hu : u = u') (hv : v = v') : + G.Walk u' v' := hu ▸ hv ▸ p + +@[simp] +theorem copy_heq_left {u v u'} (p : G.Walk u v) (hu : u = u') : + p ≍ p.copy hu (Eq.refl v) := by + subst hu + rw [heq_eq_eq] + rfl + +@[simp] +theorem copy_heq_right {u v v'} (p : G.Walk u v) (hv : v = v') : + p ≍ p.copy (Eq.refl u) hv := by + subst hv + rw [heq_eq_eq] + rfl + +@[simp] +theorem copy_rfl_rfl {u v} (p : G.Walk u v) : p.copy rfl rfl = p := rfl + +@[simp] +theorem copy_nil {u u'} (hu : u = u') : (Walk.nil : G.Walk u u).copy hu hu = + Walk.nil := by + subst_vars + rfl + +theorem copy_cons {u v w u' w'} (h : G.Adj u v) (p : G.Walk v w) (hu : u = u') + (hw : w = w') : (Walk.cons h p).copy hu hw = Walk.cons (hu ▸ h) + (p.copy rfl hw) := by + subst_vars + rfl + +lemma copy_move {u v u' v'} {p : G.Walk u v} {p' : G.Walk u' v'} + {hu : u = u'} {hv : v = v'} : + p.copy hu hv = p' ↔ p = p'.copy hu.symm hv.symm := by + subst_vars + simp + +@[simp] +theorem copy_copy {u v u' v' u'' v''} (p : G.Walk u v) + (hu : u = u') (hv : v = v') (hu' : u' = u'') (hv' : v' = v'') : + (p.copy hu hv).copy hu' hv' = p.copy (hu.trans hu') (hv.trans hv') := by + subst_vars + rfl + +def length {u v} : G.Walk u v → ℕ + | nil => 0 + | cons _ q => q.length.succ + +@[simp] +theorem length_nil {u : V} : (nil : G.Walk u u).length = 0 := rfl + +@[simp] +theorem length_cons {u v w : V} (h : G.Adj u v) (p : G.Walk v w) : + (cons h p).length = p.length + 1 := rfl + +@[simp] +theorem length_copy {u v u' v'} (p : G.Walk u v) (hu : u = u') (hv : v = v') : + (p.copy hu hv).length = p.length := by + subst_vars + rfl + +theorem eq_nil_of_length_eq_zero {u : V} {p : G.Walk u u} (h : p.length = 0) : + p = nil := by + cases p <;> simp_all + +lemma eq_nil_of_length_eq_zero'_aux {u v : V} {p : G.Walk u v} (h : p.length = 0) : + u = v := by + cases p <;> simp_all + +lemma eq_nil_of_length_eq_zero' {u v : V} {p : G.Walk u v} (h : p.length = 0) : + p = nil.copy (Eq.refl u) (eq_nil_of_length_eq_zero'_aux h) := by + cases p + · simp + · simp at h + +def getVert {u v : V} : G.Walk u v → ℕ → V + | nil, _ => u + | cons _ _, 0 => u + | cons _ q, n + 1 => q.getVert n + +@[simp] +theorem getVert_zero {u v} (w : G.Walk u v) : w.getVert 0 = u := + by cases w <;> rfl + +@[simp] +theorem getVert_nil (u : V) {i : ℕ} : (@nil _ _ _ G u).getVert i = u := rfl + +@[simp] lemma getVert_copy {u v w x : V} (p : G.Walk u v) (i : ℕ) (h : u = w) (h' : v = x) : + (p.copy h h').getVert i = p.getVert i := by + subst_vars + rfl + +theorem getVert_of_ge_length {u v} (w : G.Walk u v) {i : ℕ} + (hi : w.length ≤ i) : w.getVert i = v := by + induction w generalizing i with + | nil => rfl + | cons _ _ ih => + cases i + · cases hi + · exact ih (Nat.succ_le_succ_iff.1 hi) + +@[simp] +theorem getVert_length {u v} (w : G.Walk u v) : w.getVert w.length = v := + w.getVert_of_ge_length rfl.le + +@[simp] +lemma getVert_cons_succ {u v w n} (p : G.Walk v w) (h : G.Adj u v) : + (p.cons h).getVert (n + 1) = p.getVert n := rfl + +def Intersecting {u₁ v₁ u₂ v₂ : V} (p₁ : G.Walk u₁ v₁) + (p₂ : G.Walk u₂ v₂) : Prop := + ∃ (k₁ k₂ : ℕ), p₁.getVert k₁ = p₂.getVert k₂ + +def weight {u v : V} : G.Walk u v → R + | nil => 1 + | @cons _ _ _ _ u v _ h p => p.weight * ((G.weight u v).get h) + +@[simp] +theorem nil_weight {u} : (Walk.nil : G.Walk u u).weight = 1 := by rfl + +@[simp] +theorem cons_weight {u v w} (p : G.Walk v w) (h : G.Adj u v) : + (p.cons h).weight = p.weight * ((G.weight u v).get h) := by rfl + +def append {u v w : V} : G.Walk u v → G.Walk v w → G.Walk u w + | nil, q => q + | cons h p, q => cons h (p.append q) + +@[simp] +theorem copy_weight {u v u' v'} (p : G.Walk u v) (hu : u = u') (hv : v = v') : + (p.copy hu hv).weight = p.weight := by + subst hu hv + rw [copy_rfl_rfl] + +@[simp] +theorem cons_append {u v w x : V} (h : G.Adj u v) (p : G.Walk v w) + (q : G.Walk w x) : (cons h p).append q = cons h (p.append q) := rfl + +@[simp] +theorem nil_append {u v : V} (p : G.Walk u v) : nil.append p = p := + rfl + +@[simp] +theorem append_nil {u v : V} (p : G.Walk u v) : p.append nil = p := by + induction p with + | nil => rw [nil_append] + | cons _ _ ih => rw [cons_append, ih] + +theorem cons_nil_append {u v w : V} (h : G.Adj u v) (p : G.Walk v w) : + (cons h nil).append p = cons h p := rfl + +theorem getVert_append {u v w : V} (p : G.Walk u v) (q : G.Walk v w) (i : ℕ) : + (p.append q).getVert i = if i ≤ p.length then p.getVert i else q.getVert (i - p.length) := by + induction p generalizing i with + | nil => simp_all + | cons _ _ ih => cases i <;> simp [getVert, ih] + +@[simp] +theorem length_append {u v w : V} (p : G.Walk u v) (q : G.Walk v w) : + (p.append q).length = p.length + q.length := by + induction p with + | nil => simp + | cons _ _ ih => simp [ih, add_comm, add_assoc] + +theorem append_assoc {u v w x : V} (p : G.Walk u v) (q : G.Walk v w) + (r : G.Walk w x) : p.append (q.append r) = (p.append q).append r := by + induction p with + | nil => simp only [nil_append] + | cons _ _ ih => simp only [cons_append, ih] + +@[simp] +theorem append_copy_copy {u v w u' v' w'} (p : G.Walk u v) (q : G.Walk v w) + (hu : u = u') (hv : v = v') (hw : w = w') : + (p.copy hu hv).append (q.copy hv hw) = (p.append q).copy hu hw := by + subst_vars + rfl + +@[simp] +theorem append_copy_copy' {u v v₁ v₂ w u' w'} + (p : G.Walk u v₁) (q : G.Walk v₂ w) (hu : u = u') (hv₁ : v₁ = v) + (hv₂ : v₂ = v) (hw : w = w') : + (p.copy hu hv₁).append (q.copy hv₂ hw) = (p.append (q.copy (Eq.trans hv₂ + hv₁.symm) rfl)).copy hu hw := by + subst_vars + rfl + +theorem weight_append {u v w} (p : G.Walk u v) (q : G.Walk v w) : + (p.append q).weight = p.weight * q.weight := by + induction p with + | nil => simp + | cons _ _ h => simp [h q]; ring + +def iterLoop {u : V} (p : G.Walk u u) (k : ℕ) : G.Walk u u := + match k with + | 0 => .nil + | Nat.succ k => (iterLoop p k).append p + +theorem iterLoop_length {u : V} (p : G.Walk u u) (k : ℕ) : + (p.iterLoop k).length = k * p.length := by + induction k with + | zero => simp [iterLoop] + | succ _ h => rw [iterLoop, length_append, h]; linarith + +def take {u v : V} (p : G.Walk u v) (k : ℕ) : G.Walk u (p.getVert k) := + match p, k with + | .nil, _ => .nil + | .cons _ _, 0 => nil.copy rfl (getVert_zero _).symm + | .cons h q, (k + 1) => .cons h (q.take k) + +@[simp] +theorem take_zero {u v : V} (p : G.Walk u v) : p.take 0 = + nil.copy rfl (getVert_zero _).symm := by + cases p <;> simp [take] + +@[simp] +lemma take_length {u v : V} (p : G.Walk u v) (n : ℕ) : + (p.take n).length = n ⊓ p.length := by + induction p generalizing n with + | nil => simp [take] + | cons => cases n <;> simp_all [take] + +@[simp] +lemma take_getVert {u v : V} (p : G.Walk u v) (n m : ℕ) : + (p.take n).getVert m = p.getVert (n ⊓ m) := by + induction p generalizing n m with + | nil => simp [take] + | cons => cases n <;> cases m <;> simp_all [take] + +def drop {u v : V} (p : G.Walk u v) (k : ℕ) : G.Walk (p.getVert k) v := + match p, k with + | .nil, _ => .nil + | .cons e q, 0 => .cons e q + | .cons _ q, (k + 1) => q.drop k + +lemma drop_zero {u v} (p : G.Walk u v) : + p.drop 0 = p.copy (getVert_zero p).symm rfl := by + cases p <;> simp [drop]; rfl + +@[simp] +lemma drop_length {u v : V} (p : G.Walk u v) (n : ℕ) : + (p.drop n).length = p.length - n := by + induction p generalizing n with + | nil => simp [drop] + | cons => cases n <;> simp_all [drop]; rfl + +@[simp] +lemma drop_getVert {u v : V} (p : G.Walk u v) (n m : ℕ) : + (p.drop n).getVert m = p.getVert (n + m) := by + induction p generalizing n with + | nil => simp [drop] + | cons => cases n <;> simp_all [drop, add_right_comm]; rfl + +@[simp] +theorem append_take_drop_eq {u v : V} (p : G.Walk u v) (n : ℕ) : + (p.take n).append (p.drop n) = p := by + induction n generalizing p u with + | zero => rw [take_zero, drop_zero, append_copy_copy, append]; rfl + | succ _ ih => cases p with + | nil => simp [take, drop] + | cons _ r => simp [take, drop, ih r] + +lemma take_append_of_le_length_aux {u v w : V} {p : G.Walk u v} + {q : G.Walk v w} {n : ℕ} (h : n ≤ p.length) : p.getVert n = + (p.append q).getVert n := by + rw [getVert_append, ite_eq_left h] + +theorem take_append_of_le_length {u v w : V} {p : G.Walk u v} (q : G.Walk v w) + {n : ℕ} (h : n ≤ p.length) : (p.append q).take n = + (p.take n).copy rfl (take_append_of_le_length_aux h) := by + induction n generalizing u p with + | zero => simp [take_zero] + | succ n ih => cases p with + | nil => grind [length_nil] + | cons e r => + have hn : n ≤ r.length := by grind [length_cons] + rw! [cons_append, take, take, ih hn] + exact (copy_cons e (r.take n) _ _).symm + +lemma drop_append_of_ge_length_aux {u v w : V} (p : G.Walk u v) + (q : G.Walk v w) (n : ℕ) (h : p.length ≤ n) : + q.getVert (n - p.length) = (p.append q).getVert n := by + rw [getVert_append] + rcases eq_or_lt_of_le' h with h | h <;> simp [h] + +theorem drop_append_of_ge_length {u v w : V} (p : G.Walk u v) (q : G.Walk v w) + (n : ℕ) (h : p.length ≤ n) : (p.append q).drop n = + (q.drop (n - p.length)).copy (drop_append_of_ge_length_aux _ _ _ h) rfl := by + induction p generalizing n with + | nil => rw! [append, length_nil, Nat.sub_zero]; rfl + | cons _ r ih => + rw [length_cons] at h + have hn1 : n = n - 1 + 1 := by grind + have hn2 : r.length ≤ n - 1 := by grind + rw! [append, hn1, drop, ih _ _ hn2, length_cons, add_comm r.length 1, + Nat.sub_add_eq, Nat.add_sub_cancel]; rfl + +theorem take_of_le_length {u v : V} (p : G.Walk u v) (n : ℕ) + (h : p.length ≤ n) : + p.take n = p.copy rfl (getVert_of_ge_length p h).symm := by + induction p generalizing n with + | nil => simp [take] + | cons _ q ih => + rw [length_cons] at h + have hn1 : n = n - 1 + 1 := by grind + have hn2 : q.length ≤ n - 1 := by grind + rw! [hn1, take, ih (n - 1) hn2, copy_cons]; rfl + +theorem acyclic_of_path_finite {u v : V} [hG : PathFinite G] (p : G.Walk u v) + (i j : ℕ) (hne : i ≠ j) (hij : i < p.length ∨ j < p.length) : + p.getVert i ≠ p.getVert j := by + wlog hlt : i < j generalizing i j + · push Not at hlt + symm + exact this j i hne.symm (Or.symm hij) (lt_of_le_of_ne hlt hne.symm) + have hi : i < p.length := Or.elim hij id (fun h ↦ lt_trans hlt h) + by_contra h + let w := p.getVert i + let q : G.Walk w w := ((p.drop i).take (j - i)).copy rfl + (by rw [drop_getVert, Nat.add_sub_cancel' (le_of_lt hlt), ← h]) + have hq : q.length > 0 := by + rw [length_copy, take_length, drop_length] + exact Nat.lt_min.mpr ⟨Nat.sub_pos_of_lt hlt, Nat.sub_pos_of_lt hi⟩ + let f (n : ℕ) : G.Walk w w := q.iterLoop n + have hf : Function.Injective f := by + intro n m hnm + replace hnm : (f n).length = (f m).length := by rw [hnm] + rw [iterLoop_length, iterLoop_length] at hnm + exact Nat.mul_right_cancel hq hnm + exact (Infinite.of_injective f hf).not_finite (hG.fin_walks w w) + +theorem finite_paths_of_fixed_length [Finite V] (k : ℕ) : + ∀ (u v : V), Finite { p : G.Walk u v // p.length = k } := by + induction k with + | zero => + intro u v + suffices _ : Fintype { p : G.Walk u v // p.length = 0 } from + Finite.of_fintype _ + by_cases h : u = v + · let S : Finset { p : G.Walk u v // p.length = 0 } := + singleton ⟨(@nil _ _ _ G u).copy (Eq.refl u) h, by simp⟩ + exact { + elems := S + complete := by + rintro ⟨_, hp⟩ + apply Finset.mem_singleton.mpr + simp [eq_nil_of_length_eq_zero' hp] } + · exact { + elems := {} + complete := by + rintro ⟨p, hp⟩ + exfalso + exact h (eq_nil_of_length_eq_zero'_aux hp) } + | succ k hk => + intro u v + let := hk u v + let f : { x : (w : V) × { p : G.Walk w v // p.length = k} // G.Adj u x.1 } → + G.Walk u v := fun x => cons x.prop x.val.2 + let P : G.Walk u v → Prop := fun p => p.length = k + 1 + have hf : ∀ x, P (f x) := by + intro x + simp [P, f, x.val.2.prop] + let f' := Subtype.coind f hf + have hf' : Function.Surjective f' := by + rintro ⟨p, hp⟩ + cases p with + | nil => simp [P] at hp + | @cons _ w _ e q => + have hq : q.length = k := by + simp only [length_cons, add_right_cancel_iff, P] at hp + exact hp + use ⟨⟨w, ⟨q, hq⟩⟩, e⟩ + simp [f', Subtype.coind, f] + apply Finite.of_surjective f' hf' + +theorem path_finite_of_bounded_length {k : ℕ} [Finite V] + (h : ∀ (u v : V) (p : G.Walk u v), p.length < k) : PathFinite G := by + refine { fin_walks := ?_ } + intro u v + let length' := Subtype.coind (@length _ _ _ G u v) (p := fun n => n < k) + (h u v) + apply (Equiv.finite_iff (f := (Equiv.sigmaFiberEquiv length').symm)).mpr + suffices _ : ∀ (y : { n // n < k }), Finite { x // length' x = y } from + Finite.instSigma + rintro ⟨_, _⟩ + simp only [Subtype.coind, Subtype.mk.injEq, length'] + apply finite_paths_of_fixed_length + +end Walk +end WDigraph + diff --git a/FormalBook/Chapter_32.lean b/FormalBook/Chapter_32.lean index 5b288e6..b1450a7 100644 --- a/FormalBook/Chapter_32.lean +++ b/FormalBook/Chapter_32.lean @@ -1,33 +1,827 @@ /- -Copyright 2022 Moritz Firsching. All rights reserved. +Copyright 2026 Egor Morozov. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. -Authors: Moritz Firsching, Christopher Schmidt +Authors: Egor Morozov -/ -import Mathlib.Tactic -/- -import data.rel -import data.list.defs -import data.matrix.basic -import data.fintype.card +import FormalBook.Ch32.WDigraph +import Mathlib.Algebra.Lie.OfAssociative +import Mathlib.LinearAlgebra.Matrix.Determinant.Basic +/-! +# Lattice paths and determinants + +## Main results -import logic.equiv.defs -import group_theory.perm.sign +- `lindstrom_gessel_viennot`: the Lindstrom-Gessel-Viennot lemma +- `binet_cauchy`: Binet-Cauchy determinant formula -import set_theory.zfc.basic +## TODO -import linear_algebra.matrix.determinant +- Nonnegativity of binomial determinants -/ -open BigOperators -/-! -# Lattice paths and determinants -## TODO +universe u v - - Lemma - - proof - - Theorem - - proof +section LindstromGesselViennot + +variable {V : Type u} +variable {R : Type v} [CommRing R] +variable (G : WDigraph V R) + +open WDigraph +open Walk + +variable {n : ℕ} +abbrev path_collection (A B : Fin n → V) := (i : Fin n) → G.Walk (A i) (B i) + +namespace path_collection + +variable {A B : Fin n → V} (P : path_collection G A B) +variable {G} + +def weight := ∏ (i : Fin n), (P i).weight + +def copy {B' : Fin n → V} (h : B = B') : path_collection G A B' := h ▸ P + +lemma copy_eq {B' : Fin n → V} (h : B = B') (i : Fin n) : + P.copy h i = (P i).copy rfl (congrFun h i) := by + subst h + rw [copy_rfl_rfl] + rfl + +@[ext] +structure intersection where + i : Fin n + j : Fin n + ki : ℕ + kj : ℕ + hne : i ≠ j + heq : (P i).getVert ki = (P j).getVert kj + +def to_prod (I : intersection P) : Fin n ×ₗ ℕ ×ₗ Fin n ×ₗ ℕ := + toLex (I.i, toLex (I.ki, toLex (I.j, I.kj))) + +lemma to_prod_inj : Function.Injective (to_prod P) := by + intro X Y h + simp [to_prod] at h + ext1 <;> tauto + +instance : LinearOrder (intersection P) := LinearOrder.lift' + (to_prod P) (to_prod_inj P) + +instance instWellFoundedLT : WellFoundedLT (intersection P) where + wf := InvImage.wf (to_prod P) wellFounded_lt + +noncomputable section + +variable [Nonempty (intersection P)] + +def X := (WellFoundedLT.toOrderBot (h := instWellFoundedLT P)).bot + +lemma not_lt_X (I : intersection P) : ¬I < X P := by + simp [X, not_lt_bot] + +lemma X_ki_le_length : (X P).ki ≤ (P (X P).i).length := by + by_contra! h + let I : P.intersection := + { i := (X P).i + j := (X P).j + ki := (P (X P).i).length + kj := (X P).kj + hne := (X P).hne + heq := by + rw [← (X P).heq, getVert_of_ge_length _ (le_refl _), + getVert_of_ge_length _ (le_of_lt h)] } + have hI : I < X P := by + change to_prod P I < to_prod P (X P) + simpa [to_prod, Prod.Lex.toLex_lt_toLex, I] + exact not_lt_X _ _ hI + +lemma X_kj_le_length : (X P).kj ≤ (P (X P).j).length := by + by_contra! h + let I : P.intersection := + { i := (X P).i + j := (X P).j + ki := (X P).ki + kj := (P (X P).j).length + hne := (X P).hne + heq := by + rw [(X P).heq, getVert_of_ge_length _ (le_refl _), + getVert_of_ge_length _ (le_of_lt h)] } + have hI : I < X P := by + change to_prod P I < to_prod P (X P) + simpa [to_prod, Prod.Lex.toLex_lt_toLex, I] + exact not_lt_X _ _ hI + +@[grind →] +lemma X_i_lt_j : (X P).i < (X P).j := by + by_contra! h + replace h : (X P).j < (X P).i := lt_of_le_of_ne h (X P).hne.symm + let I : P.intersection := + { i := (X P).j + j := (X P).i + ki := (X P).kj + kj := (X P).ki + hne := (X P).hne.symm + heq := (X P).heq.symm } + have hI : I < X P := by + change to_prod P I < to_prod P (X P) + simp_all [to_prod, Prod.Lex.toLex_lt_toLex, I] + exact not_lt_X _ _ hI + +lemma X_i_ne_j : (X P).i ≠ (X P).j := ne_of_lt (X_i_lt_j P) + +def swap : path_collection G A (B ∘ Equiv.swap (X P).i (X P).j) := fun l => + if hi : l = (X P).i then + ((P l).take (X P).ki).append + (((P (X P).j).drop (X P).kj).copy (hi ▸ (X P).heq.symm) (by simp [hi])) + else if hj : l = (X P).j then + ((P l).take (X P).kj).append + (((P (X P).i).drop (X P).ki).copy (hj ▸ (X P).heq) (by simp [hj])) + else (P l).copy rfl (by simp [Equiv.swap_apply_of_ne_of_ne hi hj]) + +lemma swap_i : swap P (X P).i = + ((P (X P).i).take (X P).ki).append + (((P (X P).j).drop (X P).kj).copy (X P).heq.symm (by simp)) := by + rw [swap, dite_eq_left rfl] + +lemma swap_j : swap P (X P).j = + ((P (X P).j).take (X P).kj).append + (((P (X P).i).drop (X P).ki).copy (X P).heq (by simp)) := by + rw [swap, dite_eq_right ((X P).hne.symm), dite_eq_left rfl] + +lemma swap_ne (l : Fin n) (hi : l ≠ (X P).i) (hj : l ≠ (X P).j) : + swap P l = (P l).copy rfl (by simp [Equiv.swap_apply_of_ne_of_ne hi hj]) := + by rw [swap, dite_eq_right hi, dite_eq_right hj] + +lemma swap_weight : P.swap.weight = P.weight := by + rw [weight, ← Finset.mul_prod_erase _ _ (Finset.mem_univ (X P).i), + ← Finset.mul_prod_erase _ _ (Finset.mem_erase.mpr + ⟨(X_i_ne_j P).symm, Finset.mem_univ _⟩), ← mul_assoc] + have aux (a b c d : R) : a * b * (c * d) = a * d * (c * b) := by ring + rw [swap_i, weight_append, swap_j, weight_append, aux] + simp only [copy_weight, ← weight_append, append_take_drop_eq] + rw [Finset.prod_congr (g := fun i ↦ (P i).weight) rfl] + · rw [weight, ← Finset.mul_prod_erase _ _ (Finset.mem_univ (X P).i), + ← Finset.mul_prod_erase _ _ (Finset.mem_erase.mpr + ⟨(X_i_ne_j P).symm, Finset.mem_univ _⟩), ← mul_assoc] + · intro l _ + rw [swap_ne P l, copy_weight] <;> grind + +def Y : intersection (swap P) := + { i := (X P).i + j := (X P).j + ki := (X P).ki + kj := (X P).kj + hne := (X P).hne + heq := by simp [swap, (X P).hne.symm, getVert_append, + X_ki_le_length P, X_kj_le_length P, (X P).heq] } + +instance instNonemptySwap : Nonempty (intersection (swap P)) := + Nonempty.intro (Y P) + +lemma X_swap_le_Y : to_prod _ (X (swap P)) ≤ to_prod _ (Y P) := by + change (X (swap P)) ≤ (Y P) + simp only [X] + --it is not clear why simp only [X, bot_le] does not work + let instOrderBot : OrderBot P.swap.intersection := + (WellFoundedLT.toOrderBot (h := instWellFoundedLT _)) + exact @bot_le _ _ _ (Y P) + +def Z_i : Fin n := + if (X (swap P)).i = (X P).i ∧ (X (swap P)).ki > (X P).ki then (X P).j else + if (X (swap P)).i = (X P).j ∧ (X (swap P)).ki > (X P).kj then (X P).i else + (X (swap P)).i + +def Z_j : Fin n := + if (X (swap P)).j = (X P).i ∧ (X (swap P)).kj > (X P).ki then (X P).j else + if (X (swap P)).j = (X P).j ∧ (X (swap P)).kj > (X P).kj then (X P).i else + (X (swap P)).j + +def Z_ki : ℕ := + if (X (swap P)).i = (X P).i ∧ (X (swap P)).ki > (X P).ki then + (X P).kj + ((X (swap P)).ki - (X P).ki) else + if (X (swap P)).i = (X P).j ∧ (X (swap P)).ki > (X P).kj then + (X P).ki + ((X (swap P)).ki - (X P).kj) else + (X (swap P)).ki + +def Z_kj : ℕ := + if (X (swap P)).j = (X P).i ∧ (X (swap P)).kj > (X P).ki then + (X P).kj + ((X (swap P)).kj - (X P).ki) else + if (X (swap P)).j = (X P).j ∧ (X (swap P)).kj > (X P).kj then + (X P).ki + ((X (swap P)).kj - (X P).kj) else + (X (swap P)).kj + +lemma Z_i_getVert : (P (Z_i P)).getVert (Z_ki P) = + (swap P (X (swap P)).i).getVert + (X (swap P)).ki := by + rw [swap] + split_ifs with hi hj <;> rw [Z_i, Z_ki] + case neg => grind [getVert_copy] + all_goals rw [getVert_append, take_length, getVert_copy, drop_getVert, + take_getVert] + · grind [X_ki_le_length, (X P).hne] + · grind [X_kj_le_length, (X P).hne] + +lemma Z_j_getVert : (P (Z_j P)).getVert (Z_kj P) = + (swap P (X (swap P)).j).getVert + (X (swap P)).kj := by + rw [swap] + split_ifs with hi hj <;> rw [Z_j, Z_kj] + case neg => grind [getVert_copy] + all_goals rw [getVert_append, take_length, getVert_copy, drop_getVert, + take_getVert] + · grind [X_ki_le_length, (X P).hne] + · grind [X_kj_le_length, (X P).hne] + +lemma Z_getVert : (P (Z_i P)).getVert (Z_ki P) = + (P (Z_j P)).getVert (Z_kj P) := by + rw [Z_i_getVert, Z_j_getVert, (X (swap P)).heq] + +def Z (hne : Z_i P ≠ Z_j P) : intersection P := + { i := Z_i P + j := Z_j P + ki := Z_ki P + kj := Z_kj P + hne := hne + heq := Z_getVert P } + +lemma not_Z_le_X (hne : Z_i P ≠ Z_j P) : ¬to_prod P (Z P hne) < to_prod P (X P) + := by + change ¬Z P hne < X P + simp [X, not_lt_bot] + +lemma swap_i_eq : (X (swap P)).i = (X P).i := by + apply eq_of_le_of_ge + · change (X (swap P)).i ≤ (Y P).i + have := X_swap_le_Y P + simp only [to_prod, Prod.Lex.toLex_le_toLex] at this + grind + · by_contra! h + have hZi : Z_i P = (X (swap P)).i := by + unfold Z_i + grind [X_i_lt_j] + have hne : Z_i P ≠ Z_j P := by + unfold Z_j + grind [X_i_lt_j] + apply not_Z_le_X P hne + simp [to_prod, Prod.Lex.toLex_lt_toLex, Z, hZi, h] + +variable [PathFinite G] + +lemma swap_ki_eq : (X (swap P)).ki = (X P).ki := by + apply eq_of_le_of_ge + · change (X (swap P)).ki ≤ (Y P).ki + have := X_swap_le_Y P + simp only [to_prod, Prod.Lex.toLex_le_toLex, swap_i_eq, Y] at * + grind + · by_contra! h + have hZi : Z_i P = (X P).i := by + rw [Z_i, swap_i_eq] + grind + have hZki : Z_ki P = (X (swap P)).ki := by + rw [Z_ki, swap_i_eq] + grind + by_cases! hj : (X (swap P)).j = (X P).j ∧ (X (swap P)).kj > (X P).kj + · have hZj : Z_j P = (X P).i := by + rw [Z_j] + grind + have : Z_kj P = (X P).ki + ((X (swap P)).kj - (X P).kj) := by + rw [Z_kj] + grind + refine acyclic_of_path_finite (P (Z_i P)) (Z_ki P) (Z_kj P) ?_ ?_ ?_ + · omega + · rw [hZki, hZi] + left + exact lt_of_lt_of_le h (X_ki_le_length P) + · conv_rhs => rw [Eq.trans hZi hZj.symm] + exact Z_getVert P + · have hne : Z_i P ≠ Z_j P := by + unfold Z_i Z_j + grind + apply not_Z_le_X P hne + simp [to_prod, Prod.Lex.toLex_lt_toLex, Z, hZi, hZki, h] + +lemma Z_i_eq : Z_i P = (X P).i := by + unfold Z_i + rw [swap_i_eq, swap_ki_eq] + grind + +lemma Z_ki_eq : Z_ki P = (X P).ki := by + unfold Z_ki + rw [swap_i_eq, swap_ki_eq] + grind + +lemma swap_j_eq : (X (swap P)).j = (X P).j := by + apply eq_of_le_of_ge + · change (X (swap P)).j ≤ (Y P).j + have := X_swap_le_Y P + simp only [to_prod, Prod.Lex.toLex_le_toLex, swap_i_eq, swap_ki_eq, Y] at * + grind + · by_contra! h + have aux : (X P).i ≠ (X (swap P)).j := by + conv_lhs => rw [← swap_i_eq] + exact X_i_ne_j (swap P) + have hZj : Z_j P = (X (swap P)).j := by + unfold Z_j + grind + have hne : Z_i P ≠ Z_j P := by + rw [Z_i_eq, hZj] + exact aux + apply not_Z_le_X P hne + simp [to_prod, Prod.Lex.toLex_lt_toLex, Z, Z_i_eq, Z_ki_eq, hZj, h] + +lemma swap_kj_eq : (X (swap P)).kj = (X P).kj := by + apply eq_of_le_of_ge + · change (X (swap P)).kj ≤ (Y P).kj + have := X_swap_le_Y P + simp only [to_prod, Prod.Lex.toLex_le_toLex, swap_i_eq, swap_ki_eq, + swap_j_eq, Y] at * + grind + · by_contra! h + have hZj : Z_j P = (X P).j := by + rw [Z_j, swap_j_eq] + grind + have hZkj : Z_kj P = (X (swap P)).kj := by + rw [Z_kj, swap_j_eq] + grind + have hne : Z_i P ≠ Z_j P := by + rw [Z_i_eq, hZj] + exact (X P).hne + apply not_Z_le_X P hne + simp [to_prod, Prod.Lex.toLex_lt_toLex, Z, Z_i_eq, Z_ki_eq, hZj, hZkj, h] + +lemma swap_B_eq : B = (B ∘ ⇑(Equiv.swap (X P).i (X P).j)) ∘ + ⇑(Equiv.swap (X (swap P)).i (X (swap P)).j) := by + rw [swap_i_eq, swap_j_eq] + exact (Equiv.comp_symm_eq _ _ _).mp rfl + +lemma swap_i_take_aux : (P (X P).i).getVert (X P).ki = + (swap P (X (swap P)).i).getVert (X (swap P)).ki := by + rw [swap_i_eq, swap_ki_eq, swap_i, getVert_append, ite_eq_left, + take_getVert, min_self] + rw [take_length, min_eq_left (X_ki_le_length P)] + +lemma swap_i_take : (swap P (X (swap P)).i).take (X (swap P)).ki = + ((P (X P).i).take (X P).ki).copy + (congrArg _ (swap_i_eq P).symm) (swap_i_take_aux P) := by + rw! [swap_i_eq, swap_ki_eq, swap_i, take_append_of_le_length, + take_of_le_length ((P (X P).i).take (X P).ki), copy_copy] + · rfl + all_goals rw [take_length, min_eq_left (X_ki_le_length P)] + +lemma swap_j_take_aux : (P (X P).j).getVert (X P).kj = + (swap P (X (swap P)).j).getVert (X (swap P)).kj := by + rw [swap_j_eq, swap_kj_eq, swap_j, getVert_append, ite_eq_left, + take_getVert, min_self] + rw [take_length, min_eq_left (X_kj_le_length P)] + +lemma swap_j_take : (swap P (X (swap P)).j).take (X (swap P)).kj = + ((P (X P).j).take (X P).kj).copy + (congrArg _ (swap_j_eq P).symm) (swap_j_take_aux P) := by + rw! [swap_j_eq, swap_kj_eq, swap_j, take_append_of_le_length, + take_of_le_length ((P (X P).j).take (X P).kj), copy_copy] + · rfl + all_goals rw [take_length, min_eq_left (X_kj_le_length P)] + +lemma swap_i_drop_aux : (P (X P).j).getVert (X P).kj = + (swap P (X (swap P)).i).getVert (X (swap P)).ki := by + rw! [swap_i_eq, swap_ki_eq, swap_i, getVert_append, ite_eq_left, + take_getVert, min_self, (X P).heq] + · rfl + all_goals rw [take_length, min_eq_left (X_ki_le_length P)] + +lemma swap_i_drop : (swap P (X (swap P)).i).drop (X (swap P)).ki = + ((P (X P).j).drop (X P).kj).copy (swap_i_drop_aux P) + (by simp [swap_i_eq]) := by + rw! [swap_i_eq, swap_ki_eq, swap_i, drop_append_of_ge_length, take_length, + min_eq_left (X_ki_le_length P), Nat.sub_self, drop_zero, + copy_copy, copy_copy] + · rfl + all_goals rw [take_length, min_eq_left (X_ki_le_length P)] + +lemma swap_j_drop_aux : (P (X P).i).getVert (X P).ki = + (swap P (X (swap P)).j).getVert (X (swap P)).kj := by + rw! [swap_j_eq, swap_kj_eq, swap_j, getVert_append, ite_eq_left, + take_getVert, min_self, (X P).heq] + · rfl + all_goals rw [take_length, min_eq_left (X_kj_le_length P)] + +lemma swap_j_drop : (swap P (X (swap P)).j).drop (X (swap P)).kj = + ((P (X P).i).drop (X P).ki).copy (swap_j_drop_aux P) + (by simp [swap_j_eq]) := by + rw! [swap_j_eq, swap_kj_eq, swap_j, drop_append_of_ge_length, take_length, + min_eq_left (X_kj_le_length P), Nat.sub_self, drop_zero, + copy_copy, copy_copy] + · rfl + all_goals rw [take_length, min_eq_left (X_kj_le_length P)] + +lemma swap_swap : swap (swap P) = P.copy (swap_B_eq P) := by + ext l + rw [swap] + split_ifs with hi hj + · subst hi + rw [swap_i_take, swap_j_drop, copy_copy, append_copy_copy, + append_take_drop_eq, path_collection.copy_eq] + rw! [swap_i_eq] + rfl + · subst hj + rw [swap_j_take, swap_i_drop, copy_copy, append_copy_copy, + append_take_drop_eq, path_collection.copy_eq] + rw! [swap_j_eq] + rfl + · rw [swap_i_eq] at hi + rw [swap_j_eq] at hj + rw [swap_ne P l hi hj, copy_copy, path_collection.copy_eq] + +end +end path_collection + +open path_collection + +abbrev path_system (A B : Fin n → V) := + (σ : Equiv.Perm (Fin n)) × path_collection G A (B ∘ σ) + +namespace path_system + +variable (A B : Fin n → V) (P : path_system G A B) + +abbrev NonemptyIntersection := Nonempty P.2.intersection +abbrev VertexDisjoint := ∀ (i j : Fin n), i ≠ j → ¬Intersecting (P.2 i) (P.2 j) + +lemma vertex_disjoint_iff_nonempty_intersection : ∀ (P : path_system G A B), + ¬VertexDisjoint G A B P ↔ NonemptyIntersection G A B P := by + intro P + unfold VertexDisjoint + push Not + constructor <;> intro h + · rcases h with ⟨i, j, hne, hdis⟩ + rw [Intersecting] at hdis + rcases hdis with ⟨ki, kj, heq⟩ + exact Nonempty.intro + { i := i + j := j + ki := ki + kj := kj + hne := hne + heq := heq } + · exact ⟨(X P.2).i, (X P.2).j, (X P.2).hne, (X P.2).ki, (X P.2).kj, + (X P.2).heq⟩ + +def sign : ℤˣ := Equiv.Perm.sign P.1 +def weight : R := P.2.weight + +noncomputable section + +variable (P : Subtype (NonemptyIntersection G A B)) + +instance : NonemptyIntersection G A B P := P.prop + +def swap : Subtype (NonemptyIntersection G A B) := + ⟨⟨P.val.1 * (Equiv.swap P.val.2.X.i P.val.2.X.j), P.val.2.swap⟩, by + simp only [NonemptyIntersection, Equiv.Perm.coe_mul] + exact Nonempty.intro (path_collection.Y P.val.2)⟩ + +lemma swap_sign : (swap G A B P).val.sign = -P.val.sign := by + simp [sign, swap, P.val.2.X_i_ne_j] + +lemma swap_weight : (swap G A B P).val.weight = P.val.weight := by + simp [weight, swap, path_collection.swap_weight] + +lemma swap_inv [PathFinite G] : Function.Involutive (swap G A B) := by + rw [Function.Involutive.eq_1] + intro P + rw [swap]; ext l + · simp [swap, swap_i_eq, swap_j_eq] + · simp [swap, swap_swap, copy] + +end +end path_system + +open path_system + +variable [PathFinite G] + +noncomputable def path_matrix (A B : Fin n → V) := + Matrix.of (fun i j => ∑ (p : G.Walk (A i) (B j)), p.weight) + +lemma det_path_matrix_eq_sum (A B : Fin n → V) : + (path_matrix G A B).det = ∑ (P : path_system G A B), P.sign • P.weight := by + rw [← Matrix.det_transpose, Matrix.det_apply, path_matrix, Matrix.transpose] + simp_rw [Matrix.of_apply, Finset.prod_univ_sum, Fintype.piFinset_univ, + sign, path_system.weight, Fintype.sum_sigma, Finset.smul_sum] + rfl + +open Classical in +lemma sum_not_path_disjoint_eq_zero (A B : Fin n → V) : + ∑ (P : path_system G A B) with ¬VertexDisjoint G A B P, + P.sign • P.weight = 0 := by + rw [Finset.filter_congr (q := NonemptyIntersection G A B)] + · let g (P : path_system G A B) (h : P ∈ Finset.filter + (NonemptyIntersection G A B) Finset.univ) : path_system G A B := + (path_system.swap G A B ⟨P, by simp_all⟩).val + refine Finset.sum_involution g ?_ ?_ ?_ ?_ <;> intro P h <;> subst g <;> + let := (Finset.mem_filter.mp h).2 + · simp [swap_sign, path_system.swap_weight] + · intro _ + have : P.1 * Equiv.swap P.2.X.i P.2.X.j ≠ P.1 := by + simp [path_collection.X_i_ne_j] + grind [path_system.swap, Sigma.ext] + · simp [NonemptyIntersection, path_system.swap, instNonemptySwap P.2] + · simp [swap_inv G A B ⟨P, _⟩] + · intro P _ + exact vertex_disjoint_iff_nonempty_intersection G A B P + +open Classical in +theorem lindstrom_gessel_viennot (A B : Fin n → V) : + (path_matrix G A B).det = ∑ (P : path_system G A B) with + VertexDisjoint G A B P, P.sign • P.weight := by + rw [det_path_matrix_eq_sum, + ← Finset.sum_filter_add_sum_filter_not _ (VertexDisjoint G A B) _, + sum_not_path_disjoint_eq_zero, add_zero] + +end LindstromGesselViennot + +section BinetCauchy + +lemma eq_zero_or_eq_one_or_ge_two (n : ℕ) : n = 0 ∨ n = 1 ∨ n ≥ 2 := by + grind + +lemma fin_inj_image_card {α : Type*} [LinearOrder α] {k : ℕ} {f : Fin k → α} + (h : Function.Injective f) : (Finset.univ.image f).card = k := by + rw [Finset.card_image_of_injective _ h, Finset.card_univ, Fintype.card_fin] + +variable {R : Type v} [CommRing R] +variable (r s : ℕ) +variable (P : Matrix (Fin r) (Fin s) R) (Q : Matrix (Fin s) (Fin r) R) + +abbrev V := (Fin r) ⊕ (Fin s) ⊕ (Fin r) + +abbrev A : Fin r → V r s := Sum3.in₀ +abbrev B : Fin s → V r s := Sum3.in₁ +abbrev C : Fin r → V r s := Sum3.in₂ + +def G : WDigraph (V r s) R := + { weight := fun i j => match i, j with + | Sum3.in₀ i, Sum3.in₁ j => some (P i j) + | Sum3.in₁ i, Sum3.in₂ j => some (Q i j) + | _, _ => none } + +lemma G_adj_AB (i : Fin r) (j : Fin s) : (G r s P Q).Adj (A r s i) (B r s j) := + by rfl + +@[simp] +lemma G_weight_AB (i : Fin r) (j : Fin s) : (G r s P Q).weight (A r s i) (B r s + j) = P i j := by rfl + +lemma G_adj_BC (i : Fin s) (j : Fin r) : (G r s P Q).Adj (B r s i) (C r s j) := + by rfl + +@[simp] +lemma G_weight_BC (i : Fin s) (j : Fin r) : (G r s P Q).weight (B r s i) (C r s + j) = Q i j := by rfl + +lemma G_walk_CC_aux (i : Fin r) (j : Fin r) + (p : (G r s P Q).Walk (Sum.inr (Sum.inr i)) (C r s j)) : i = j := by + cases p with + | nil => rfl + | @cons _ x _ hx px => + rcases x with _ | _ | _ <;> simp [G, WDigraph.Adj] at hx + +lemma G_walk_CC (i : Fin r) (j : Fin r) + (p : (G r s P Q).Walk (Sum.inr (Sum.inr i)) (C r s j)) : + p = (WDigraph.Walk.nil (u := C r s j)).copy + (G_walk_CC_aux r s P Q i j p ▸ (Eq.refl _)) (Eq.refl _) := by + cases p with + | nil => rfl + | @cons _ x _ hx px => + rcases x with _ | _ | _ <;> simp [G, WDigraph.Adj] at hx + +def f (i j : Fin r) (k : Fin s) : + (G r s P Q).Walk (A r s i) (C r s j) := + WDigraph.Walk.cons (G_adj_AB r s P Q i k) + (WDigraph.Walk.cons (G_adj_BC r s P Q k j) WDigraph.Walk.nil) + +lemma f_bij (i : Fin r) (j : Fin r) : + Function.Bijective (f r s P Q i j) := by + constructor + · intro _ _ h + simp [f, B] at h + grind + · intro p + cases p with | @cons _ x _ hx px + rcases x with _ | x | _ + · simp [WDigraph.Adj, G] at hx + · use x + simp only [f, B] + cases px with | @cons _ y _ hy py + rcases y with _ | _ | y + · simp [WDigraph.Adj, G] at hy + · simp [WDigraph.Adj, G] at hy + · simp [G_walk_CC r s P Q y j py, C, G_walk_CC_aux r s P Q y j py] + · simp [WDigraph.Adj, G] at hx + +open Classical in +lemma f_bijInv (i j : Fin r) (p : (G r s P Q).Walk (A r s i) (C r s j)) : + B r s (Fintype.bijInv (f_bij r s P Q i j) p) = p.getVert 1 := by + rcases Function.Bijective.surjective (f_bij r s P Q i j) p with ⟨k, hk⟩ + rw [← hk, Fintype.leftInverse_bijInv] + simp [f] + +open path_system + +def preF (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) : + path_system (G r s P Q) (A r s) (C r s) := + ⟨p.2.2 * p.2.1, fun i => f r s P Q i ((p.2.2 * p.2.1) i) ((p.1 ∘ p.2.1) i)⟩ + +lemma preF_length + (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) (i : Fin r) : + ((preF r s P Q p).2 i).length = 2 := by + simp [preF, f] + +@[simp] +lemma preF_zero (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) + (i : Fin r) : ((preF r s P Q p).2 i).getVert 0 = A r s i := by + simp [preF] + +@[simp] +lemma preF_one (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) + (i : Fin r) : ((preF r s P Q p).2 i).getVert 1 = B r s ((p.1 ∘ p.2.1) i) := by + simp [preF, f] + +lemma preF_two (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) + (i : Fin r) {k : ℕ} (hk : k ≥ 2) : + ((preF r s P Q p).2 i).getVert k = C r s ((p.2.2 * p.2.1) i) := by + have h : ((preF r s P Q p).2 i).length ≤ k := by + simp only [preF_length r s P Q p i, hk] + rw [WDigraph.Walk.getVert_of_ge_length _ h] + simp [preF] + +lemma preF_vertex_disjoint (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × + Equiv.Perm (Fin r)) : VertexDisjoint (G r s P Q) (A r s) (C r s) + (preF r s P Q p) := by + intro i j h' + rw [WDigraph.Walk.Intersecting] + push Not + intro ki kj + rcases eq_zero_or_eq_one_or_ge_two ki with rfl | rfl | hi <;> + rcases eq_zero_or_eq_one_or_ge_two kj with rfl | rfl | hj <;> + simp only [Function.comp_apply, preF_one, WDigraph.Walk.getVert_zero, ne_eq] + any_goals rw [preF_two r s P Q p i hi] + any_goals rw [preF_two r s P Q p j hj] + all_goals simp [A, B, C] <;> grind [RelEmbedding.injective p.1, + Equiv.injective p.2.1, Equiv.injective p.2.2] + +def F := Subtype.coind (preF r s P Q) (preF_vertex_disjoint r s P Q) + +open Classical in +lemma F_bij : Function.Bijective (F r s P Q) := by + constructor + · apply Subtype.coind_injective + intro p q h + simp only [preF, Sigma.mk.injEq] at h + rcases h with ⟨h1, h2⟩ + rw [h1] at h2 + have h3 : p.1 ∘ p.2.1 = q.1 ∘ q.2.1 := by + funext i + exact Function.Bijective.injective (f_bij r s P Q i _) + (congrFun (eq_of_heq h2) i) + have h4 : Finset.univ.image p.1 = Finset.univ.image q.1 := by + calc + _ = Finset.univ.image (p.1 ∘ p.2.1) := by + rw [← Finset.image_image, Finset.image_univ_equiv] + _ = Finset.univ.image (q.1 ∘ q.2.1) := by rw [h3] + _ = Finset.univ.image q.1 := by + rw [← Finset.image_image, Finset.image_univ_equiv] + have h5 : p.1 = q.1 := by + calc + _ = (Finset.univ.image p.1).orderEmbOfFin + (fin_inj_image_card (RelEmbedding.injective p.1)) := by + rw [← Finset.orderEmbOfFin_unique' + (fin_inj_image_card (RelEmbedding.injective p.1)) + (f := p.1) (by simp)] + _ = (Finset.univ.image q.1).orderEmbOfFin + (fin_inj_image_card (RelEmbedding.injective q.1)) := by + rw! [h4]; rfl + _ = q.1 := by + rw [← Finset.orderEmbOfFin_unique' + (fin_inj_image_card (RelEmbedding.injective q.1)) + (f := q.1) (by simp)] + rw [h5] at h3 + replace h3 := DFunLike.coe_fn_eq.mp (Function.Injective.comp_left + (RelEmbedding.injective q.1) h3) + rw [h3] at h1 + replace h1 := (mul_left_inj q.2.1).mp h1 + grind + · rintro ⟨q, hq⟩ + let e := fun i => Fintype.bijInv (f_bij r s P Q i (q.1 i)) (q.2 i) + have he : Function.Injective e := by + intro i j h + simp only [e] at h + contrapose! hq + rw [VertexDisjoint]; push Not + use i, j + refine ⟨hq, ?_⟩ + rw [WDigraph.Walk.Intersecting] + use 1, 1 + rw [← f_bijInv, ← f_bijInv, h] + let p1 := Finset.orderEmbOfFin _ (fin_inj_image_card he) + let p21 : Equiv.Perm (Fin r) := { + toFun := fun i => (Finset.orderIsoOfFin _ (fin_inj_image_card he)).symm + ⟨e i, by simp⟩ + invFun := fun i => Function.Injective.invOfMemRange he + ⟨(Finset.orderIsoOfFin _ (fin_inj_image_card he) i), by + apply mem_image_univ_iff_mem_range.mp; simp⟩ + left_inv := by simp [Function.LeftInverse] + right_inv := by + rw [Function.RightInverse, Function.LeftInverse] + intro i + rcases Finset.mem_image.mp (((Finset.image e Finset.univ).orderIsoOfFin + (fin_inj_image_card he)) i).prop with ⟨j, _, hj⟩ + rw! [← hj, Function.Injective.right_inv_of_invOfMemRange, hj] + simp [-Finset.coe_orderIsoOfFin_apply] } + use ⟨p1, p21, q.1 * p21.symm⟩ + simp only [F, Subtype.coind, preF, Equiv.Perm.coe_mul, Subtype.mk.injEq] + apply Sigma.ext + · simp [pull_end] + grind + · simp only [Equiv.Perm.coe_mul, Function.comp_assoc] + rw [Equiv.symm_comp_self, Function.comp_id, heq_eq_eq] + ext i + simp [← Finset.coe_orderIsoOfFin_apply, Equiv.coe_fn_mk, p1, p21, e, + Function.RightInverse.eq (Fintype.rightInverse_bijInv (f_bij r s P Q i + (q.1 i)))] + +lemma F_weight (Z : Fin r ↪o Fin s) (σ τ : Equiv.Perm (Fin r)) : + (F r s P Q (Z, σ, τ)).val.weight = + (∏ (j : Fin r), (Q (Z j) (τ j))) * ∏ (i : Fin r), (P i (Z (σ i))) := by + simp [F, Subtype.coind, preF, f, weight, path_collection.weight, + Finset.prod_mul_distrib, Fintype.prod_equiv σ + (fun x ↦ Q (Z (σ x)) (τ (σ x))) + (fun x ↦ Q (Z x) (τ x)) (congrFun rfl)] + +lemma F_sign (Z : Fin r ↪o Fin s) (σ τ : Equiv.Perm (Fin r)) : + (F r s P Q (Z, σ, τ)).val.sign = τ.sign * σ.sign := by + simp [F, preF, f, sign] + +lemma G_walk_C {i : Fin r} {v : V r s} (p : (G r s P Q).Walk (C r s i) v) : + p.length = 0 := by + cases p with + | nil => simp + | cons e _ => simp [G, WDigraph.Adj] at e + +lemma G_walk_B {i : Fin s} {v : V r s} (p : (G r s P Q).Walk (B r s i) v) : + p.length ≤ 1 := by + cases p with + | nil => simp + | @cons _ w _ e q => + match w with + | Sum.inr (Sum.inr _) => simp [G_walk_C] + | Sum.inr (Sum.inl _) => simp [G, WDigraph.Adj] at e + | Sum.inl _ => simp [G, WDigraph.Adj] at e + +lemma G_walk_A {i : Fin r} {v : V r s} (p : (G r s P Q).Walk (A r s i) v) : + p.length ≤ 2 := by + cases p with + | nil => simp + | @cons _ w _ e q => + match w with + | Sum.inr (Sum.inr _) => simp [G, WDigraph.Adj] at e + | Sum.inr (Sum.inl _) => simp [G_walk_B] + | Sum.inl _ => simp [G, WDigraph.Adj] at e + +instance : WDigraph.Walk.PathFinite (G r s P Q) := by + apply WDigraph.Walk.path_finite_of_bounded_length (k := 3) + intro u + match u with + | Sum.inr (Sum.inr _) => simp [G_walk_C] + | Sum.inr (Sum.inl _) => grind [G_walk_B] + | Sum.inl _ => grind [G_walk_A] + +lemma path_matrix_G_eq_PQ : path_matrix (G r s P Q) (A r s) (C r s) = + P * Q := by + ext i j + rw [path_matrix, Matrix.mul_apply]; dsimp + rw [← Function.Bijective.sum_comp (f_bij r s P Q i j)] + congr; funext + rw! [f, WDigraph.Walk.weight, WDigraph.Walk.weight, G_weight_AB, G_weight_BC] + simp [mul_comm] + rfl + +open Classical in +theorem binet_cauchy : Matrix.det (P * Q) = + ∑ (Z : Fin r ↪o Fin s), (Matrix.det (P.submatrix id Z)) * + (Matrix.det (Q.submatrix Z id)) := by + rw [← path_matrix_G_eq_PQ, lindstrom_gessel_viennot, + ← Finset.sum_subtype_eq_sum_filter, Finset.subtype_univ, + ← Function.Bijective.sum_comp (F_bij r s P Q), Fintype.sum_prod_type] + congr; funext Z + rw [Fintype.sum_prod_type, ← Matrix.det_transpose] + nth_rw 2 [← Matrix.det_transpose] + simp only [Matrix.det_apply, Matrix.submatrix, id_eq, Matrix.transpose, + Matrix.of_apply, Fintype.sum_mul_sum] + congr; funext σ + congr; funext τ + rw [F_weight, F_sign, mul_smul_mul_comm, mul_comm] + +end BinetCauchy - There is a lengthy attempt to at this chapter version of the lean3 version here: -https://github.com/mo271/FormalBook/blob/92f57b44cbbc1cd02ca77994efe8d8e6de050a19/src/chapters/32_Lattice_paths_and_determinants.lean --/ diff --git a/blueprint/src/chapter/chapter32.tex b/blueprint/src/chapter/chapter32.tex index 5d03830..cd97fdf 100644 --- a/blueprint/src/chapter/chapter32.tex +++ b/blueprint/src/chapter/chapter32.tex @@ -2,7 +2,9 @@ \chapter{Lattice paths and determinants} \begin{lemma} \label{ch32lemma} - Let $G = (V, E)$ be a finite weighted acyclic directed graph, $A = \{A_1, \dots, A_n\}$ and $\mathcal{B} = \{B_1, \dots, B_n\}$ two $n$-sets of vertices, and $M$ the path matrix from $A$ to $\mathcal{B}$. Then + Let $G = (V, E)$ be a finite weighted acyclic directed graph, $\mathcal{A} = + \{A_1, \dots, A_n\}$ and $\mathcal{B} = \{B_1, \dots, B_n\}$ two $n$-sets of + vertices, and $M$ the path matrix from $\mathcal{A}$ to $\mathcal{B}$. Then \[ \det M = \sum_{\mathcal{P} \text{ vertex-disjoint path system}} \text{sign}(\mathcal{P}) \, w(\mathcal{P}). \tag{3} \] @@ -13,12 +15,13 @@ \chapter{Lattice paths and determinants} \begin{theorem} \label{ch32theorem} - Let $G = (V, E)$ be a finite weighted acyclic directed graph, - $A = \{A_1, \dots, A_n\}$ and $\mathcal{B} = \{B_1, \dots, B_n\}$ - two $n$-sets of vertices, and $M$ the path matrix from $A$ to $\mathcal{B}$. Then + If $P$ is an $r\times s$ matrix and $Q$ an $s\times r$ matrix, $r\le s$, then \[ - \det M = \sum_{\mathcal{P} \text{ vertex-disjoint path system}} \text{sign}(\mathcal{P}) \, w(\mathcal{P}). \tag{3} + \det(PQ) = \sum_{\mathcal Z}(\det P_{\mathcal Z})(\det Q_{\mathcal Z}), \] + where $P_{\mathcal Z}$ is the $r\times r$ submatrix of $P$ with column-set + $\mathcal Z$, and $Q_{\mathcal Z}$ the $r\times r$ submatrix of $Q$ with + corresponding rows $\mathcal Z$. \end{theorem} \begin{proof} \uses{ch32lemma} diff --git a/blueprint/src/print.pdf b/blueprint/src/print.pdf index 5e9a9b4a6db52de38078186d891ad99a9c3854d9..40fc2b75366f1a234beaf179c665ab14ce45ff74 100644 GIT binary patch delta 73519 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 Date: Tue, 25 Aug 2026 23:03:48 +0300 Subject: [PATCH 2/2] refactor: remove an obsolete file The file Ch32/BinetCauchy.lean is a part of Chapter_32.lean and presents by mistake. It must be removed. --- FormalBook/Ch32/BinetCauchy.lean | 297 ------------------------------- 1 file changed, 297 deletions(-) delete mode 100644 FormalBook/Ch32/BinetCauchy.lean diff --git a/FormalBook/Ch32/BinetCauchy.lean b/FormalBook/Ch32/BinetCauchy.lean deleted file mode 100644 index 76d8e28..0000000 --- a/FormalBook/Ch32/BinetCauchy.lean +++ /dev/null @@ -1,297 +0,0 @@ -import LindstromGesselViennot.WDigraph -import LindstromGesselViennot.Main - -set_option linter.style.header false -/-! -# Binet-Cauchy formula - -In this file we state and prove Binet-Cauchy formula for the determinant of -product of two rectangular matrices. - -## Main results - -- `binet_cauchy`: Binet-Cauchy formula. --/ - -lemma eq_zero_or_eq_one_or_ge_two (n : ℕ) : n = 0 ∨ n = 1 ∨ n ≥ 2 := by - grind - -lemma fin_inj_image_card {α : Type*} [LinearOrder α] {k : ℕ} {f : Fin k → α} - (h : Function.Injective f) : (Finset.univ.image f).card = k := by - rw [Finset.card_image_of_injective _ h, Finset.card_univ, Fintype.card_fin] - -universe u - -variable {R : Type u} [CommRing R] -variable (r s : ℕ) -variable (P : Matrix (Fin r) (Fin s) R) (Q : Matrix (Fin s) (Fin r) R) - -abbrev V := (Fin r) ⊕ (Fin s) ⊕ (Fin r) - -abbrev A : Fin r → V r s := Sum3.in₀ -abbrev B : Fin s → V r s := Sum3.in₁ -abbrev C : Fin r → V r s := Sum3.in₂ - -def G : WDigraph (V r s) R := - { weight := fun i j => match i, j with - | Sum3.in₀ i, Sum3.in₁ j => some (P i j) - | Sum3.in₁ i, Sum3.in₂ j => some (Q i j) - | _, _ => none } - -lemma G_adj_AB (i : Fin r) (j : Fin s) : (G r s P Q).Adj (A r s i) (B r s j) := - by rfl - -@[simp] -lemma G_weight_AB (i : Fin r) (j : Fin s) : (G r s P Q).weight (A r s i) (B r s - j) = P i j := by rfl - -lemma G_adj_BC (i : Fin s) (j : Fin r) : (G r s P Q).Adj (B r s i) (C r s j) := - by rfl - -@[simp] -lemma G_weight_BC (i : Fin s) (j : Fin r) : (G r s P Q).weight (B r s i) (C r s - j) = Q i j := by rfl - -lemma G_walk_CC_aux (i : Fin r) (j : Fin r) - (p : (G r s P Q).Walk (Sum.inr (Sum.inr i)) (C r s j)) : i = j := by - cases p with - | nil => rfl - | @cons _ x _ hx px => - rcases x with _ | _ | _ <;> simp [G, WDigraph.Adj] at hx - -lemma G_walk_CC (i : Fin r) (j : Fin r) - (p : (G r s P Q).Walk (Sum.inr (Sum.inr i)) (C r s j)) : - p = (WDigraph.Walk.nil (u := C r s j)).copy - (G_walk_CC_aux r s P Q i j p ▸ (Eq.refl _)) (Eq.refl _) := by - cases p with - | nil => rfl - | @cons _ x _ hx px => - rcases x with _ | _ | _ <;> simp [G, WDigraph.Adj] at hx - -def f (i j : Fin r) (k : Fin s) : - (G r s P Q).Walk (A r s i) (C r s j) := - WDigraph.Walk.cons (G_adj_AB r s P Q i k) - (WDigraph.Walk.cons (G_adj_BC r s P Q k j) WDigraph.Walk.nil) - -lemma f_bij (i : Fin r) (j : Fin r) : - Function.Bijective (f r s P Q i j) := by - constructor - · intro _ _ h - simp [f, B] at h - grind - · intro p - cases p with | @cons _ x _ hx px - rcases x with _ | x | _ - · simp [WDigraph.Adj, G] at hx - · use x - simp only [f, B] - cases px with | @cons _ y _ hy py - rcases y with _ | _ | y - · simp [WDigraph.Adj, G] at hy - · simp [WDigraph.Adj, G] at hy - · simp [G_walk_CC r s P Q y j py, C, G_walk_CC_aux r s P Q y j py] - · simp [WDigraph.Adj, G] at hx - -open Classical in -lemma f_bijInv (i j : Fin r) (p : (G r s P Q).Walk (A r s i) (C r s j)) : - B r s (Fintype.bijInv (f_bij r s P Q i j) p) = p.getVert 1 := by - rcases Function.Bijective.surjective (f_bij r s P Q i j) p with ⟨k, hk⟩ - rw [← hk, Fintype.leftInverse_bijInv] - simp [f] - -open path_system - -def preF (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) : - path_system (G r s P Q) (A r s) (C r s) := - ⟨p.2.2 * p.2.1, fun i => f r s P Q i ((p.2.2 * p.2.1) i) ((p.1 ∘ p.2.1) i)⟩ - -lemma preF_length - (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) (i : Fin r) : - ((preF r s P Q p).2 i).length = 2 := by - simp [preF, f] - -@[simp] -lemma preF_zero (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) - (i : Fin r) : ((preF r s P Q p).2 i).getVert 0 = A r s i := by - simp [preF] - -@[simp] -lemma preF_one (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) - (i : Fin r) : ((preF r s P Q p).2 i).getVert 1 = B r s ((p.1 ∘ p.2.1) i) := by - simp [preF, f] - -lemma preF_two (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × Equiv.Perm (Fin r)) - (i : Fin r) {k : ℕ} (hk : k ≥ 2) : - ((preF r s P Q p).2 i).getVert k = C r s ((p.2.2 * p.2.1) i) := by - have h : ((preF r s P Q p).2 i).length ≤ k := by - simp only [preF_length r s P Q p i, hk] - rw [WDigraph.Walk.getVert_of_ge_length _ h] - simp [preF] - -lemma preF_vertex_disjoint (p : (Fin r ↪o Fin s) × Equiv.Perm (Fin r) × - Equiv.Perm (Fin r)) : VertexDisjoint (G r s P Q) (A r s) (C r s) - (preF r s P Q p) := by - intro i j h' - rw [WDigraph.Walk.Intersecting] - push Not - intro ki kj - rcases eq_zero_or_eq_one_or_ge_two ki with rfl | rfl | hi <;> - rcases eq_zero_or_eq_one_or_ge_two kj with rfl | rfl | hj <;> - simp only [Function.comp_apply, preF_one, WDigraph.Walk.getVert_zero, ne_eq] - any_goals rw [preF_two r s P Q p i hi] - any_goals rw [preF_two r s P Q p j hj] - all_goals simp [A, B, C] <;> grind [RelEmbedding.injective p.1, - Equiv.injective p.2.1, Equiv.injective p.2.2] - -def F := Subtype.coind (preF r s P Q) (preF_vertex_disjoint r s P Q) - -open Classical in -lemma F_bij : Function.Bijective (F r s P Q) := by - constructor - · apply Subtype.coind_injective - intro p q h - simp only [preF, Sigma.mk.injEq] at h - rcases h with ⟨h1, h2⟩ - rw [h1] at h2 - have h3 : p.1 ∘ p.2.1 = q.1 ∘ q.2.1 := by - funext i - exact Function.Bijective.injective (f_bij r s P Q i _) - (congrFun (eq_of_heq h2) i) - have h4 : Finset.univ.image p.1 = Finset.univ.image q.1 := by - calc - _ = Finset.univ.image (p.1 ∘ p.2.1) := by - rw [← Finset.image_image, Finset.image_univ_equiv] - _ = Finset.univ.image (q.1 ∘ q.2.1) := by rw [h3] - _ = Finset.univ.image q.1 := by - rw [← Finset.image_image, Finset.image_univ_equiv] - have h5 : p.1 = q.1 := by - calc - _ = (Finset.univ.image p.1).orderEmbOfFin - (fin_inj_image_card (RelEmbedding.injective p.1)) := by - rw [← Finset.orderEmbOfFin_unique' - (fin_inj_image_card (RelEmbedding.injective p.1)) - (f := p.1) (by simp)] - _ = (Finset.univ.image q.1).orderEmbOfFin - (fin_inj_image_card (RelEmbedding.injective q.1)) := by - rw! [h4]; rfl - _ = q.1 := by - rw [← Finset.orderEmbOfFin_unique' - (fin_inj_image_card (RelEmbedding.injective q.1)) - (f := q.1) (by simp)] - rw [h5] at h3 - replace h3 := DFunLike.coe_fn_eq.mp (Function.Injective.comp_left - (RelEmbedding.injective q.1) h3) - rw [h3] at h1 - replace h1 := (mul_left_inj q.2.1).mp h1 - grind - · rintro ⟨q, hq⟩ - let e := fun i => Fintype.bijInv (f_bij r s P Q i (q.1 i)) (q.2 i) - have he : Function.Injective e := by - intro i j h - simp only [e] at h - contrapose! hq - rw [VertexDisjoint]; push Not - use i, j - refine ⟨hq, ?_⟩ - rw [WDigraph.Walk.Intersecting] - use 1, 1 - rw [← f_bijInv, ← f_bijInv, h] - let p1 := Finset.orderEmbOfFin _ (fin_inj_image_card he) - let p21 : Equiv.Perm (Fin r) := { - toFun := fun i => (Finset.orderIsoOfFin _ (fin_inj_image_card he)).symm - ⟨e i, by simp⟩ - invFun := fun i => Function.Injective.invOfMemRange he - ⟨(Finset.orderIsoOfFin _ (fin_inj_image_card he) i), by - apply mem_image_univ_iff_mem_range.mp; simp⟩ - left_inv := by simp [Function.LeftInverse] - right_inv := by - rw [Function.RightInverse, Function.LeftInverse] - intro i - rcases Finset.mem_image.mp (((Finset.image e Finset.univ).orderIsoOfFin - (fin_inj_image_card he)) i).prop with ⟨j, _, hj⟩ - rw! [← hj, Function.Injective.right_inv_of_invOfMemRange, hj] - simp [-Finset.coe_orderIsoOfFin_apply] } - use ⟨p1, p21, q.1 * p21.symm⟩ - simp only [F, Subtype.coind, preF, Equiv.Perm.coe_mul, Subtype.mk.injEq] - apply Sigma.ext - · simp [pull_end] - grind - · simp only [Equiv.Perm.coe_mul, Function.comp_assoc] - rw [Equiv.symm_comp_self, Function.comp_id, heq_eq_eq] - ext i - simp [← Finset.coe_orderIsoOfFin_apply, Equiv.coe_fn_mk, p1, p21, e, - Function.RightInverse.eq (Fintype.rightInverse_bijInv (f_bij r s P Q i - (q.1 i)))] - -lemma F_weight (Z : Fin r ↪o Fin s) (σ τ : Equiv.Perm (Fin r)) : - (F r s P Q (Z, σ, τ)).val.weight = - (∏ (j : Fin r), (Q (Z j) (τ j))) * ∏ (i : Fin r), (P i (Z (σ i))) := by - simp [F, Subtype.coind, preF, f, weight, path_collection.weight, - Finset.prod_mul_distrib, Fintype.prod_equiv σ - (fun x ↦ Q (Z (σ x)) (τ (σ x))) - (fun x ↦ Q (Z x) (τ x)) (congrFun rfl)] - -lemma F_sign (Z : Fin r ↪o Fin s) (σ τ : Equiv.Perm (Fin r)) : - (F r s P Q (Z, σ, τ)).val.sign = τ.sign * σ.sign := by - simp [F, preF, f, sign] - -lemma G_walk_C {i : Fin r} {v : V r s} (p : (G r s P Q).Walk (C r s i) v) : - p.length = 0 := by - cases p with - | nil => simp - | cons e _ => simp [G, WDigraph.Adj] at e - -lemma G_walk_B {i : Fin s} {v : V r s} (p : (G r s P Q).Walk (B r s i) v) : - p.length ≤ 1 := by - cases p with - | nil => simp - | @cons _ w _ e q => - match w with - | Sum.inr (Sum.inr _) => simp [G_walk_C] - | Sum.inr (Sum.inl _) => simp [G, WDigraph.Adj] at e - | Sum.inl _ => simp [G, WDigraph.Adj] at e - -lemma G_walk_A {i : Fin r} {v : V r s} (p : (G r s P Q).Walk (A r s i) v) : - p.length ≤ 2 := by - cases p with - | nil => simp - | @cons _ w _ e q => - match w with - | Sum.inr (Sum.inr _) => simp [G, WDigraph.Adj] at e - | Sum.inr (Sum.inl _) => simp [G_walk_B] - | Sum.inl _ => simp [G, WDigraph.Adj] at e - -instance : WDigraph.Walk.PathFinite (G r s P Q) := by - apply WDigraph.Walk.path_finite_of_bounded_length (k := 3) - intro u - match u with - | Sum.inr (Sum.inr _) => simp [G_walk_C] - | Sum.inr (Sum.inl _) => grind [G_walk_B] - | Sum.inl _ => grind [G_walk_A] - -lemma path_matrix_G_eq_PQ : path_matrix (G r s P Q) (A r s) (C r s) = - P * Q := by - ext i j - rw [path_matrix, Matrix.mul_apply]; dsimp - rw [← Function.Bijective.sum_comp (f_bij r s P Q i j)] - congr; funext - rw! [f, WDigraph.Walk.weight, WDigraph.Walk.weight, G_weight_AB, G_weight_BC] - simp [mul_comm] - rfl - -open Classical in -theorem binet_cauchy : Matrix.det (P * Q) = - ∑ (Z : Fin r ↪o Fin s), (Matrix.det (P.submatrix id Z)) * - (Matrix.det (Q.submatrix Z id)) := by - rw [← path_matrix_G_eq_PQ, lindstrom_gessel_viennot, - ← Finset.sum_subtype_eq_sum_filter, Finset.subtype_univ, - ← Function.Bijective.sum_comp (F_bij r s P Q), Fintype.sum_prod_type] - congr; funext Z - rw [Fintype.sum_prod_type, ← Matrix.det_transpose] - nth_rw 2 [← Matrix.det_transpose] - simp only [Matrix.det_apply, Matrix.submatrix, id_eq, Matrix.transpose, - Matrix.of_apply, Fintype.sum_mul_sum] - congr; funext σ - congr; funext τ - rw [F_weight, F_sign, mul_smul_mul_comm, mul_comm] -