Cauchy-Binet in Lean
Theorem.
${\det (AB) = \sum_{|I| = m} (\det A[\cdot, I]) (\det B[I, \cdot])}$
variable {R : Type*} [CommRing R]
variable {M N : Type} [Fintype M] [Fintype N] [DecidableEq M] [DecidableEq N]
[LinearOrder M] [LinearOrder N]
/-- Cauchy-Binet, https://en.wikipedia.org/wiki/Cauchy%E2%80%93Binet_formula -/
theorem Matrix.det_mul' (A : Matrix M N R) (B : Matrix N M R) :
det (A * B) = ∑ f : M ↪o N,
det (A.submatrix id f) * det (B.submatrix f id) := by
...
Cauchy-Binet in Lean
Many choices for "spelling" formalization
variable [Fintype M] ... [LinearOrder M] [LinearOrder N]
theorem Matrix.det_mul' (A : Matrix M N R) (B : Matrix N M R) :
det (A * B) = ∑ f : M ↪o N,
det (A.submatrix id f) * det (B.submatrix f id) := by
...
-
From Meta's autoformalizing textbooks project
theorem cauchyBinet {n m : ℕ}
(A : Matrix (Fin n) (Fin m) R) (B : Matrix (Fin m) (Fin n) R) :
(A * B).det = ∑ S ∈ (Finset.univ : Finset (Fin m)).powersetCard n,
if h : S.card = n then
(colsSubmatrix A S h).det * (rowsSubmatrix B S h).det
else 0 := by
...
Cauchy-Binet in Lean
Many choices for "spelling" formalization
theorem Matrix.det_mul' (A : Matrix M N R) (B : Matrix N M R) :
det (A * B) = ∑ f : M ↪o N,
det (A.submatrix id f) * det (B.submatrix f id) := by
...
/-! We prove the Cauchy–Binet formula in the "function form":
`det(A * B) = ∑ f : m → n, (∏ i, A i (f i)) * det(B.submatrix f id)`
and then restrict to injective functions.
... -/
theorem Matrix.det_mul_sum (A : Matrix m n R) (B : Matrix n m R) :
(A * B).det = ∑ f : m → n,
(∏ i, A i (f i)) * (B.submatrix f id).det := by
...
Cauchy-Binet: small case
-
Start with $2 \times 3$ matrices
variable {R : Type*} [CommRing R]
lemma det_mul_2_by_3 (A : Matrix (Fin 2) (Fin 3) R)
(B : Matrix (Fin 3) (Fin 2) R) :
det (A * B) = ∑ f : (Fin 2) ↪o (Fin 3),
det (A.submatrix id f) * det (B.submatrix f id) := by
...
Cauchy-Binet: small case
import Mathlib
open Matrix
lemma injec_2_3 : (Finset.univ : Finset ( Fin 2 ↪o Fin 3 )) =
{
OrderEmbedding.ofStrictMono ( ![0,1] ) ( by decide ),
OrderEmbedding.ofStrictMono ( ![0,2] ) ( by decide ),
OrderEmbedding.ofStrictMono ( ![1,2] ) ( by decide )
} := by
ext f
simp [Finset.mem_univ]
rcases f with ⟨ f, hf ⟩
rcases f with ⟨ f, hf ⟩
fin_cases f <;> simp +decide at hf ⊢
· left
ext i
fin_cases i <;> rfl
· right; left
ext i
fin_cases i <;> rfl;
· right; right
ext i
fin_cases i <;> rfl;
variable {R : Type*} [CommRing R]
lemma det_mul_2_by_3 (A : Matrix (Fin 2) (Fin 3) R)
(B : Matrix (Fin 3) (Fin 2) R) :
det (A * B) = ∑ f : (Fin 2) ↪o (Fin 3),
det (A.submatrix id f) * det (B.submatrix f id) := by
simp +decide [ Matrix.det_fin_two]
simp +decide [ Matrix.mul_apply, Fin.sum_univ_three ]
rw [ injec_2_3 ]
simp +decide ;
ring!;