Theorem: Matrix.adjugate_diagonal
File: Mathlib/LinearAlgebra/Matrix/Adjugate.lean

tactic: ext i j
state_before: m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
⊢ (diagonal v).adjugate = diagonal fun i => ∏ j ∈ univ.erase i, v j
state_after: case a
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
⊢ (diagonal v).adjugate i j = diagonal (fun i => ∏ j ∈ univ.erase i, v j) i j

tactic: simp only [adjugate_def, cramer_apply, diagonal_transpose, of_apply]
state_before: case a
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
⊢ (diagonal v).adjugate i j = diagonal (fun i => ∏ j ∈ univ.erase i, v j) i j
state_after: case a
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
⊢ ((diagonal v).updateColumn j (Pi.single i 1)).det = diagonal (fun i => ∏ j ∈ univ.erase i, v j) i j

tactic: obtain rfl | hij := eq_or_ne i j
state_before: case a
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
⊢ ((diagonal v).updateColumn j (Pi.single i 1)).det = diagonal (fun i => ∏ j ∈ univ.erase i, v j) i j
state_after: case a.inl
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i : n
⊢ ((diagonal v).updateColumn i (Pi.single i 1)).det = diagonal (fun i => ∏ j ∈ univ.erase i, v j) i i

case a.inr
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
hij : i ≠ j
⊢ ((diagonal v).updateColumn j (Pi.single i 1)).det = diagonal (fun i => ∏ j ∈ univ.erase i, v j) i j

tactic: rw [diagonal_apply_eq, diagonal_updateColumn_single, det_diagonal,
  prod_update_of_mem (Finset.mem_univ _), sdiff_singleton_eq_erase, one_mul]
state_before: case a.inl
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i : n
⊢ ((diagonal v).updateColumn i (Pi.single i 1)).det = diagonal (fun i => ∏ j ∈ univ.erase i, v j) i i
state_after: no goals

tactic: rw [diagonal_apply_ne _ hij]
state_before: case a.inr
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
hij : i ≠ j
⊢ ((diagonal v).updateColumn j (Pi.single i 1)).det = diagonal (fun i => ∏ j ∈ univ.erase i, v j) i j
state_after: case a.inr
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
hij : i ≠ j
⊢ ((diagonal v).updateColumn j (Pi.single i 1)).det = 0

tactic: refine det_eq_zero_of_row_eq_zero j fun k => ?_
state_before: case a.inr
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
hij : i ≠ j
⊢ ((diagonal v).updateColumn j (Pi.single i 1)).det = 0
state_after: case a.inr
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
hij : i ≠ j
k : n
⊢ (diagonal v).updateColumn j (Pi.single i 1) j k = 0

tactic: obtain rfl | hjk := eq_or_ne k j
state_before: case a.inr
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
hij : i ≠ j
k : n
⊢ (diagonal v).updateColumn j (Pi.single i 1) j k = 0
state_after: case a.inr.inl
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i k : n
hij : i ≠ k
⊢ (diagonal v).updateColumn k (Pi.single i 1) k k = 0

case a.inr.inr
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
hij : i ≠ j
k : n
hjk : k ≠ j
⊢ (diagonal v).updateColumn j (Pi.single i 1) j k = 0

tactic: rw [updateColumn_self, Pi.single_eq_of_ne' hij]
state_before: case a.inr.inl
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i k : n
hij : i ≠ k
⊢ (diagonal v).updateColumn k (Pi.single i 1) k k = 0
state_after: no goals

tactic: rw [updateColumn_ne hjk, diagonal_apply_ne' _ hjk]
state_before: case a.inr.inr
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
v : n → α
i j : n
hij : i ≠ j
k : n
hjk : k ≠ j
⊢ (diagonal v).updateColumn j (Pi.single i 1) j k = 0
state_after: no goals