Theorem: is_basis_iff_det
File: Mathlib/LinearAlgebra/Determinant.lean

tactic: constructor
state_before: R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
⊢ LinearIndependent R v ∧ span R (Set.range v) = ⊤ ↔ IsUnit (↑(Basis.det e) v)

tactic: rintro ⟨hli, hspan⟩
state_before: case mp
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
⊢ LinearIndependent R v ∧ span R (Set.range v) = ⊤ → IsUnit (↑(Basis.det e) v)

tactic: set v' := Basis.mk hli hspan.ge
state_before: case mp.intro
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
hli : LinearIndependent R v
hspan : span R (Set.range v) = ⊤
⊢ IsUnit (↑(Basis.det e) v)

tactic: rw [e.det_apply]
state_before: case mp.intro
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
hli : LinearIndependent R v
hspan : span R (Set.range v) = ⊤
v' : Basis ι R M := Basis.mk hli (_ : ⊤ ≤ span R (Set.range v))
⊢ IsUnit (↑(Basis.det e) v)

tactic: convert LinearEquiv.isUnit_det (LinearEquiv.refl R M) v' e using 2
state_before: case mp.intro
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
hli : LinearIndependent R v
hspan : span R (Set.range v) = ⊤
v' : Basis ι R M := Basis.mk hli (_ : ⊤ ≤ span R (Set.range v))
⊢ IsUnit (det (Basis.toMatrix e v))

tactic: ext (i j)
state_before: case h.e'_3.h.e'_6
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
hli : LinearIndependent R v
hspan : span R (Set.range v) = ⊤
v' : Basis ι R M := Basis.mk hli (_ : ⊤ ≤ span R (Set.range v))
⊢ Basis.toMatrix e v = ↑(toMatrix v' e) ↑(LinearEquiv.refl R M)

tactic: simp
state_before: case h.e'_3.h.e'_6.a.h
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
hli : LinearIndependent R v
hspan : span R (Set.range v) = ⊤
v' : Basis ι R M := Basis.mk hli (_ : ⊤ ≤ span R (Set.range v))
i j : ι
⊢ Basis.toMatrix e v i j = ↑(toMatrix v' e) (↑(LinearEquiv.refl R M)) i j

tactic: intro h
state_before: case mpr
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
⊢ IsUnit (↑(Basis.det e) v) → LinearIndependent R v ∧ span R (Set.range v) = ⊤

tactic: rw [Basis.det_apply, Basis.toMatrix_eq_toMatrix_constr] at h
state_before: case mpr
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
h : IsUnit (↑(Basis.det e) v)
⊢ LinearIndependent R v ∧ span R (Set.range v) = ⊤

tactic: set v' := Basis.map e (LinearEquiv.ofIsUnitDet h) with v'_def
state_before: case mpr
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
h : IsUnit (det (↑(toMatrix e e) (↑(Basis.constr e ℕ) v)))
⊢ LinearIndependent R v ∧ span R (Set.range v) = ⊤

tactic: have : ⇑v' = v := by
  ext i
  rw [v'_def, Basis.map_apply, LinearEquiv.ofIsUnitDet_apply, e.constr_basis]
state_before: case mpr
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
h : IsUnit (det (↑(toMatrix e e) (↑(Basis.constr e ℕ) v)))
v' : Basis ι R M := Basis.map e (LinearEquiv.ofIsUnitDet h)
v'_def : v' = Basis.map e (LinearEquiv.ofIsUnitDet h)
⊢ LinearIndependent R v ∧ span R (Set.range v) = ⊤

tactic: rw [← this]
state_before: case mpr
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
h : IsUnit (det (↑(toMatrix e e) (↑(Basis.constr e ℕ) v)))
v' : Basis ι R M := Basis.map e (LinearEquiv.ofIsUnitDet h)
v'_def : v' = Basis.map e (LinearEquiv.ofIsUnitDet h)
this : ↑v' = v
⊢ LinearIndependent R v ∧ span R (Set.range v) = ⊤

tactic: exact ⟨v'.linearIndependent, v'.span_eq⟩
state_before: case mpr
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
h : IsUnit (det (↑(toMatrix e e) (↑(Basis.constr e ℕ) v)))
v' : Basis ι R M := Basis.map e (LinearEquiv.ofIsUnitDet h)
v'_def : v' = Basis.map e (LinearEquiv.ofIsUnitDet h)
this : ↑v' = v
⊢ LinearIndependent R ↑v' ∧ span R (Set.range ↑v') = ⊤

tactic: ext i
state_before: R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
h : IsUnit (det (↑(toMatrix e e) (↑(Basis.constr e ℕ) v)))
v' : Basis ι R M := Basis.map e (LinearEquiv.ofIsUnitDet h)
v'_def : v' = Basis.map e (LinearEquiv.ofIsUnitDet h)
⊢ ↑v' = v

tactic: rw [v'_def, Basis.map_apply, LinearEquiv.ofIsUnitDet_apply, e.constr_basis]
state_before: case h
R : Type u_2
inst✝⁶ : CommRing R
M : Type u_3
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type ?u.2551624
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_1
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
h : IsUnit (det (↑(toMatrix e e) (↑(Basis.constr e ℕ) v)))
v' : Basis ι R M := Basis.map e (LinearEquiv.ofIsUnitDet h)
v'_def : v' = Basis.map e (LinearEquiv.ofIsUnitDet h)
i : ι
⊢ ↑v' i = v i