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

tactic: constructor
state_before: R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
⊢ (∃ v x, mulVec M v = 0) ↔ det M = 0

tactic: rintro ⟨v, hv, mul_eq⟩
state_before: case mp
R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
⊢ (∃ v x, mulVec M v = 0) → det M = 0

tactic: contrapose! hv
state_before: case mp.intro.intro
R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
v : n → K
hv : v ≠ 0
mul_eq : mulVec M v = 0
⊢ det M = 0

tactic: exact eq_zero_of_mulVec_eq_zero hv mul_eq
state_before: case mp.intro.intro
R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
v : n → K
mul_eq : mulVec M v = 0
hv : det M ≠ 0
⊢ v = 0

tactic: contrapose!
state_before: case mpr
R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
⊢ det M = 0 → ∃ v x, mulVec M v = 0

tactic: intro h
state_before: case mpr
R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
⊢ (∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0) → det M ≠ 0

tactic: have : Function.Injective (Matrix.toLin' M) := by
  simpa only [← LinearMap.ker_eq_bot, ker_toLin'_eq_bot_iff, not_imp_not] using h
state_before: case mpr
R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
⊢ det M ≠ 0

tactic: have :
  M ⬝
      LinearMap.toMatrix'
        ((LinearEquiv.ofInjectiveEndo (Matrix.toLin' M) this).symm : (n → K) →ₗ[K] n → K) =
    1 := by
  refine' Matrix.toLin'.injective (LinearMap.ext fun v => _)
  rw [Matrix.toLin'_mul, Matrix.toLin'_one, Matrix.toLin'_toMatrix', LinearMap.comp_apply]
  exact (LinearEquiv.ofInjectiveEndo (Matrix.toLin' M) this).apply_symm_apply v
state_before: case mpr
R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
this : Function.Injective ↑(↑toLin' M)
⊢ det M ≠ 0

tactic: exact Matrix.det_ne_zero_of_right_inverse this
state_before: case mpr
R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
this✝ : Function.Injective ↑(↑toLin' M)
this : M ⬝ ↑toMatrix' ↑(LinearEquiv.symm (LinearEquiv.ofInjectiveEndo (↑toLin' M) this✝)) = 1
⊢ det M ≠ 0

tactic: simpa only [← LinearMap.ker_eq_bot, ker_toLin'_eq_bot_iff, not_imp_not] using h
state_before: R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
⊢ Function.Injective ↑(↑toLin' M)

tactic: refine' Matrix.toLin'.injective (LinearMap.ext fun v => _)
state_before: R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
this : Function.Injective ↑(↑toLin' M)
⊢ M ⬝ ↑toMatrix' ↑(LinearEquiv.symm (LinearEquiv.ofInjectiveEndo (↑toLin' M) this)) = 1

tactic: rw [Matrix.toLin'_mul, Matrix.toLin'_one, Matrix.toLin'_toMatrix', LinearMap.comp_apply]
state_before: R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
this : Function.Injective ↑(↑toLin' M)
v : n → K
⊢ ↑(↑toLin' (M ⬝ ↑toMatrix' ↑(LinearEquiv.symm (LinearEquiv.ofInjectiveEndo (↑toLin' M) this)))) v = ↑(↑toLin' 1) v

tactic: exact (LinearEquiv.ofInjectiveEndo (Matrix.toLin' M) this).apply_symm_apply v
state_before: R : Type ?u.157867
M✝ : Type ?u.157870
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
n : Type u_2
inst✝² : Fintype n
K : Type u_1
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
this : Function.Injective ↑(↑toLin' M)
v : n → K
⊢ ↑(↑toLin' M) (↑↑(LinearEquiv.symm (LinearEquiv.ofInjectiveEndo (↑toLin' M) this)) v) = ↑LinearMap.id v