Theorem: Matrix.nondegenerate_of_det_ne_zero
File: Mathlib/LinearAlgebra/Matrix/Nondegenerate.lean

tactic: intro v hv
state_before: m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
⊢ Nondegenerate M

tactic: ext i
state_before: m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
hv : ∀ (w : m → A), v ⬝ᵥ mulVec M w = 0
⊢ v = 0

tactic: specialize hv (M.cramer (Pi.single i 1))
state_before: case h
m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
hv : ∀ (w : m → A), v ⬝ᵥ mulVec M w = 0
i : m
⊢ v i = OfNat.ofNat 0 i

tactic: refine' (mul_eq_zero.mp _).resolve_right hM
state_before: case h
m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
i : m
hv : v ⬝ᵥ mulVec M (↑(cramer M) (Pi.single i 1)) = 0
⊢ v i = OfNat.ofNat 0 i

tactic: convert hv
state_before: case h
m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
i : m
hv : v ⬝ᵥ mulVec M (↑(cramer M) (Pi.single i 1)) = 0
⊢ v i * det M = 0

tactic: simp only [mulVec_cramer M (Pi.single i 1), dotProduct, Pi.smul_apply, smul_eq_mul]
state_before: case h.e'_2
m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
i : m
hv : v ⬝ᵥ mulVec M (↑(cramer M) (Pi.single i 1)) = 0
⊢ v i * det M = v ⬝ᵥ mulVec M (↑(cramer M) (Pi.single i 1))

tactic: rw [Finset.sum_eq_single i, Pi.single_eq_same, mul_one]
state_before: case h.e'_2
m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
i : m
hv : v ⬝ᵥ mulVec M (↑(cramer M) (Pi.single i 1)) = 0
⊢ v i * det M = Finset.sum Finset.univ fun x => v x * (det M * Pi.single i 1 x)

tactic: intro j _ hj
state_before: case h.e'_2.h₀
m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
i : m
hv : v ⬝ᵥ mulVec M (↑(cramer M) (Pi.single i 1)) = 0
⊢ ∀ (b : m), b ∈ Finset.univ → b ≠ i → v b * (det M * Pi.single i 1 b) = 0

tactic: simp [hj]
state_before: case h.e'_2.h₀
m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
i : m
hv : v ⬝ᵥ mulVec M (↑(cramer M) (Pi.single i 1)) = 0
j : m
a✝ : j ∈ Finset.univ
hj : j ≠ i
⊢ v j * (det M * Pi.single i 1 j) = 0

tactic: intros
state_before: case h.e'_2.h₁
m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
i : m
hv : v ⬝ᵥ mulVec M (↑(cramer M) (Pi.single i 1)) = 0
⊢ ¬i ∈ Finset.univ → v i * (det M * Pi.single i 1 i) = 0

tactic: have := Finset.mem_univ i
state_before: case h.e'_2.h₁
m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
i : m
hv : v ⬝ᵥ mulVec M (↑(cramer M) (Pi.single i 1)) = 0
a✝ : ¬i ∈ Finset.univ
⊢ v i * (det M * Pi.single i 1 i) = 0

tactic: contradiction
state_before: case h.e'_2.h₁
m : Type u_1
R : Type ?u.4064
A : Type u_2
inst✝⁴ : Fintype m
inst✝³ : CommRing R
inst✝² : CommRing A
inst✝¹ : IsDomain A
inst✝ : DecidableEq m
M : Matrix m m A
hM : det M ≠ 0
v : m → A
i : m
hv : v ⬝ᵥ mulVec M (↑(cramer M) (Pi.single i 1)) = 0
a✝ : ¬i ∈ Finset.univ
this : i ∈ Finset.univ
⊢ v i * (det M * Pi.single i 1 i) = 0