Theorem: Matrix.nondegenerate_iff_det_ne_zero
File: Mathlib/LinearAlgebra/Matrix/ToLinearEquiv.lean

tactic: rw [ne_eq, ← exists_vecMul_eq_zero_iff]
state_before: n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ M.Nondegenerate ↔ M.det ≠ 0
state_after: n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ M.Nondegenerate ↔ ¬∃ v, v ≠ 0 ∧ v ᵥ* M = 0

tactic: push_neg
state_before: n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ M.Nondegenerate ↔ ¬∃ v, v ≠ 0 ∧ v ᵥ* M = 0
state_after: n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ M.Nondegenerate ↔ ∀ (v : n → A), v ≠ 0 → v ᵥ* M ≠ 0

tactic: constructor
state_before: n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ M.Nondegenerate ↔ ∀ (v : n → A), v ≠ 0 → v ᵥ* M ≠ 0
state_after: case mp
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ M.Nondegenerate → ∀ (v : n → A), v ≠ 0 → v ᵥ* M ≠ 0

case mpr
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ (∀ (v : n → A), v ≠ 0 → v ᵥ* M ≠ 0) → M.Nondegenerate

tactic: intro hM v hv hMv
state_before: case mp
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ M.Nondegenerate → ∀ (v : n → A), v ≠ 0 → v ᵥ* M ≠ 0
state_after: case mp
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
hM : M.Nondegenerate
v : n → A
hv : v ≠ 0
hMv : v ᵥ* M = 0
⊢ False

tactic: obtain ⟨w, hwMv⟩ := hM.exists_not_ortho_of_ne_zero hv
state_before: case mp
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
hM : M.Nondegenerate
v : n → A
hv : v ≠ 0
hMv : v ᵥ* M = 0
⊢ False
state_after: case mp.intro
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
hM : M.Nondegenerate
v : n → A
hv : v ≠ 0
hMv : v ᵥ* M = 0
w : n → A
hwMv : v ⬝ᵥ M *ᵥ w ≠ 0
⊢ False

tactic: simp [dotProduct_mulVec, hMv, zero_dotProduct, ne_eq, not_true] at hwMv
state_before: case mp.intro
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
hM : M.Nondegenerate
v : n → A
hv : v ≠ 0
hMv : v ᵥ* M = 0
w : n → A
hwMv : v ⬝ᵥ M *ᵥ w ≠ 0
⊢ False
state_after: no goals

tactic: intro h v hv
state_before: case mpr
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ (∀ (v : n → A), v ≠ 0 → v ᵥ* M ≠ 0) → M.Nondegenerate
state_after: case mpr
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
h : ∀ (v : n → A), v ≠ 0 → v ᵥ* M ≠ 0
v : n → A
hv : ∀ (w : n → A), v ⬝ᵥ M *ᵥ w = 0
⊢ v = 0

tactic: refine not_imp_not.mp (h v) (funext fun i => ?_)
state_before: case mpr
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
h : ∀ (v : n → A), v ≠ 0 → v ᵥ* M ≠ 0
v : n → A
hv : ∀ (w : n → A), v ⬝ᵥ M *ᵥ w = 0
⊢ v = 0
state_after: case mpr
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
h : ∀ (v : n → A), v ≠ 0 → v ᵥ* M ≠ 0
v : n → A
hv : ∀ (w : n → A), v ⬝ᵥ M *ᵥ w = 0
i : n
⊢ (v ᵥ* M) i = 0 i

tactic: simpa only [dotProduct_mulVec, dotProduct_single, mul_one] using hv (Pi.single i 1)
state_before: case mpr
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
h : ∀ (v : n → A), v ≠ 0 → v ᵥ* M ≠ 0
v : n → A
hv : ∀ (w : n → A), v ⬝ᵥ M *ᵥ w = 0
i : n
⊢ (v ᵥ* M) i = 0 i
state_after: no goals