Theorem: Matrix.Pivot.exists_list_transvec_mul_mul_list_transvec_eq_diagonal_aux
File: Mathlib/LinearAlgebra/Matrix/Transvection.lean

tactic: induction' hn : Fintype.card n with r IH generalizing n M
state_before: n✝ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁷ : Field 𝕜
inst✝⁶ : DecidableEq n✝
inst✝⁵ : DecidableEq p
inst✝⁴ : CommRing R
r : ℕ
M✝ : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜
inst✝³ : Fintype n✝
inst✝² : Fintype p
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
⊢ ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D

tactic: refine' ⟨List.nil, List.nil, fun _ => 1, _⟩
state_before: case zero
n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r : ℕ
M✝¹ : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.zero
⊢ ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D

tactic: ext (i j)
state_before: case zero
n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r : ℕ
M✝¹ : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.zero
⊢ List.prod (List.map toMatrix []) ⬝ M ⬝ List.prod (List.map toMatrix []) = diagonal fun x => 1

tactic: rw [Fintype.card_eq_zero_iff] at hn
state_before: case zero.a.h
n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r : ℕ
M✝¹ : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.zero
i j : n
⊢ (List.prod (List.map toMatrix []) ⬝ M ⬝ List.prod (List.map toMatrix [])) i j = diagonal (fun x => 1) i j

tactic: exact hn.elim' i
state_before: case zero.a.h
n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r : ℕ
M✝¹ : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : IsEmpty n
i j : n
⊢ (List.prod (List.map toMatrix []) ⬝ M ⬝ List.prod (List.map toMatrix [])) i j = diagonal (fun x => 1) i j

tactic: have e : n ≃ Sum (Fin r) Unit := by
  refine' Fintype.equivOfCardEq _
  rw [hn]
  rw [@Fintype.card_sum (Fin r) Unit _ _]
  simp
state_before: case succ
n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r✝ : ℕ
M✝¹ : Matrix (Fin r✝ ⊕ Unit) (Fin r✝ ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
r : ℕ
IH :
  ∀ (n : Type) [inst : Fintype n] [inst_1 : DecidableEq n] (M : Matrix n n 𝕜),
    Fintype.card n = r → ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.succ r
⊢ ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D

tactic: apply reindex_exists_list_transvec_mul_mul_list_transvec_eq_diagonal M e
state_before: case succ
n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r✝ : ℕ
M✝¹ : Matrix (Fin r✝ ⊕ Unit) (Fin r✝ ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
r : ℕ
IH :
  ∀ (n : Type) [inst : Fintype n] [inst_1 : DecidableEq n] (M : Matrix n n 𝕜),
    Fintype.card n = r → ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.succ r
e : n ≃ Fin r ⊕ Unit
⊢ ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D

tactic: apply
  exists_list_transvec_mul_mul_list_transvec_eq_diagonal_induction fun N =>
    IH (Fin r) N (by simp)
state_before: case succ
n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r✝ : ℕ
M✝¹ : Matrix (Fin r✝ ⊕ Unit) (Fin r✝ ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
r : ℕ
IH :
  ∀ (n : Type) [inst : Fintype n] [inst_1 : DecidableEq n] (M : Matrix n n 𝕜),
    Fintype.card n = r → ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.succ r
e : n ≃ Fin r ⊕ Unit
⊢ ∃ L L' D, List.prod (List.map toMatrix L) ⬝ ↑(reindexAlgEquiv 𝕜 e) M ⬝ List.prod (List.map toMatrix L') = diagonal D

tactic: refine' Fintype.equivOfCardEq _
state_before: n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r✝ : ℕ
M✝¹ : Matrix (Fin r✝ ⊕ Unit) (Fin r✝ ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
r : ℕ
IH :
  ∀ (n : Type) [inst : Fintype n] [inst_1 : DecidableEq n] (M : Matrix n n 𝕜),
    Fintype.card n = r → ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.succ r
⊢ n ≃ Fin r ⊕ Unit

tactic: rw [hn]
state_before: n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r✝ : ℕ
M✝¹ : Matrix (Fin r✝ ⊕ Unit) (Fin r✝ ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
r : ℕ
IH :
  ∀ (n : Type) [inst : Fintype n] [inst_1 : DecidableEq n] (M : Matrix n n 𝕜),
    Fintype.card n = r → ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.succ r
⊢ Fintype.card n = Fintype.card (Fin r ⊕ Unit)

tactic: rw [@Fintype.card_sum (Fin r) Unit _ _]
state_before: n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r✝ : ℕ
M✝¹ : Matrix (Fin r✝ ⊕ Unit) (Fin r✝ ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
r : ℕ
IH :
  ∀ (n : Type) [inst : Fintype n] [inst_1 : DecidableEq n] (M : Matrix n n 𝕜),
    Fintype.card n = r → ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.succ r
⊢ Nat.succ r = Fintype.card (Fin r ⊕ Unit)

tactic: simp
state_before: n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r✝ : ℕ
M✝¹ : Matrix (Fin r✝ ⊕ Unit) (Fin r✝ ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
r : ℕ
IH :
  ∀ (n : Type) [inst : Fintype n] [inst_1 : DecidableEq n] (M : Matrix n n 𝕜),
    Fintype.card n = r → ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.succ r
⊢ Nat.succ r = Fintype.card (Fin r) + Fintype.card Unit

tactic: simp
state_before: n✝¹ : Type ?u.315793
p : Type ?u.315796
R : Type u₂
𝕜 : Type u_1
inst✝⁹ : Field 𝕜
inst✝⁸ : DecidableEq n✝¹
inst✝⁷ : DecidableEq p
inst✝⁶ : CommRing R
r✝ : ℕ
M✝¹ : Matrix (Fin r✝ ⊕ Unit) (Fin r✝ ⊕ Unit) 𝕜
inst✝⁵ : Fintype n✝¹
inst✝⁴ : Fintype p
n✝ : Type
inst✝³ : Fintype n✝
inst✝² : DecidableEq n✝
M✝ : Matrix n✝ n✝ 𝕜
x✝ : ℕ
hn✝ : Fintype.card n✝ = x✝
r : ℕ
IH :
  ∀ (n : Type) [inst : Fintype n] [inst_1 : DecidableEq n] (M : Matrix n n 𝕜),
    Fintype.card n = r → ∃ L L' D, List.prod (List.map toMatrix L) ⬝ M ⬝ List.prod (List.map toMatrix L') = diagonal D
n : Type
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n 𝕜
hn : Fintype.card n = Nat.succ r
e : n ≃ Fin r ⊕ Unit
N : Matrix (Fin r) (Fin r) 𝕜
⊢ Fintype.card (Fin r) = r