[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Type u_2
inst✝⁹ : AddCommGroup M✝
inst✝⁸ : Module R M✝
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝³ : CommRing A
m : Type u_6
n : Type u_7
inst✝² : Fintype m
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M N : Matrix n n A
⊢ det (M * N) = det (N * M)
[PROOFSTEP]
rw [det_mul, det_mul, mul_comm]
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M✝ : Type u_2
inst✝¹⁰ : AddCommGroup M✝
inst✝⁹ : Module R M✝
M'✝ : Type u_3
inst✝⁸ : AddCommGroup M'✝
inst✝⁷ : Module R M'✝
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁴ : CommRing A
m : Type u_6
n : Type u_7
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : DecidableEq m
inst✝ : DecidableEq n
M : Matrix n m A
N M' : Matrix m n A
hMM' : M * M' = 1
hM'M : M' * M = 1
⊢ det (M * N) = det (N * M)
[PROOFSTEP]
nontriviality A
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M✝ : Type u_2
inst✝¹⁰ : AddCommGroup M✝
inst✝⁹ : Module R M✝
M'✝ : Type u_3
inst✝⁸ : AddCommGroup M'✝
inst✝⁷ : Module R M'✝
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁴ : CommRing A
m : Type u_6
n : Type u_7
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : DecidableEq m
inst✝ : DecidableEq n
M : Matrix n m A
N M' : Matrix m n A
hMM' : M * M' = 1
hM'M : M' * M = 1
✝ : Nontrivial A
⊢ det (M * N) = det (N * M)
[PROOFSTEP]
let e := indexEquivOfInv hMM' hM'M
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M✝ : Type u_2
inst✝¹⁰ : AddCommGroup M✝
inst✝⁹ : Module R M✝
M'✝ : Type u_3
inst✝⁸ : AddCommGroup M'✝
inst✝⁷ : Module R M'✝
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M✝
A : Type u_5
inst✝⁴ : CommRing A
m : Type u_6
n : Type u_7
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : DecidableEq m
inst✝ : DecidableEq n
M : Matrix n m A
N M' : Matrix m n A
hMM' : M * M' = 1
hM'M : M' * M = 1
✝ : Nontrivial A
e : n ≃ m := indexEquivOfInv hMM' hM'M
⊢ det (M * N) = det (N * M)
[PROOFSTEP]
rw [← det_submatrix_equiv_self e, ← submatrix_mul_equiv _ _ _ (Equiv.refl n) _, det_comm, submatrix_mul_equiv,
  Equiv.coe_refl, submatrix_id_id]
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M✝ : Type u_2
inst✝¹⁰ : AddCommGroup M✝
inst✝⁹ : Module R M✝
M'✝ : Type u_3
inst✝⁸ : AddCommGroup M'✝
inst✝⁷ : Module R M'✝
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁴ : CommRing A
m : Type u_6
n : Type u_7
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : DecidableEq m
inst✝ : DecidableEq n
M : Matrix m n A
M' : Matrix n m A
N : Matrix n n A
hMM' : M * M' = 1
hM'M : M' * M = 1
⊢ det (M * N * M') = det N
[PROOFSTEP]
rw [← det_comm' hM'M hMM', ← Matrix.mul_assoc, hM'M, Matrix.one_mul]
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq κ
b : Basis ι A M
c : Basis κ A M
f : M →ₗ[A] M
⊢ det (↑(toMatrix b b) f) = det (↑(toMatrix c c) f)
[PROOFSTEP]
rw [← linearMap_toMatrix_mul_basis_toMatrix c b c, ← basis_toMatrix_mul_linearMap_toMatrix b c b,
  Matrix.det_conj_of_mul_eq_one]
[GOAL]
case hMM'
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq κ
b : Basis ι A M
c : Basis κ A M
f : M →ₗ[A] M
⊢ Basis.toMatrix c ↑b * Basis.toMatrix b ↑c = 1
[PROOFSTEP]
rw [Basis.toMatrix_mul_toMatrix, Basis.toMatrix_self]
[GOAL]
case hM'M
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq κ
b : Basis ι A M
c : Basis κ A M
f : M →ₗ[A] M
⊢ Basis.toMatrix b ↑c * Basis.toMatrix c ↑b = 1
[PROOFSTEP]
rw [Basis.toMatrix_mul_toMatrix, Basis.toMatrix_self]
[GOAL]
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
κ : Type u_6
inst✝ : Fintype κ
b : Basis ι A M
f : M →ₗ[A] M
⊢ ↑(detAux (Trunc.mk b)) f = det (↑(toMatrix b b) f)
[PROOFSTEP]
rw [detAux]
[GOAL]
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
κ : Type u_6
inst✝ : Fintype κ
b : Basis ι A M
f : M →ₗ[A] M
⊢ ↑(Trunc.lift (fun b => MonoidHom.comp detMonoidHom ↑(toMatrixAlgEquiv b))
          (_ :
            ∀ (b c : Basis ι A M),
              (fun b => MonoidHom.comp detMonoidHom ↑(toMatrixAlgEquiv b)) b =
                (fun b => MonoidHom.comp detMonoidHom ↑(toMatrixAlgEquiv b)) c)
          (Trunc.mk b))
      f =
    det (↑(toMatrix b b) f)
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
ι' : Type u_7
inst✝¹ : Fintype ι'
inst✝ : DecidableEq ι'
tb : Trunc (Basis ι A M)
b' : Basis ι' A M
f : M →ₗ[A] M
⊢ ↑(detAux tb) f = det (↑(toMatrix b' b') f)
[PROOFSTEP]
induction tb using Trunc.induction_on with
| h b => rw [detAux_def', det_toMatrix_eq_det_toMatrix b b']
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
ι' : Type u_7
inst✝¹ : Fintype ι'
inst✝ : DecidableEq ι'
tb : Trunc (Basis ι A M)
b' : Basis ι' A M
f : M →ₗ[A] M
⊢ ↑(detAux tb) f = det (↑(toMatrix b' b') f)
[PROOFSTEP]
induction tb using Trunc.induction_on with
| h b => rw [detAux_def', det_toMatrix_eq_det_toMatrix b b']
[GOAL]
case h
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
ι' : Type u_7
inst✝¹ : Fintype ι'
inst✝ : DecidableEq ι'
b' : Basis ι' A M
f : M →ₗ[A] M
b : Basis ι A M
⊢ ↑(detAux (Trunc.mk b)) f = det (↑(toMatrix b' b') f)
[PROOFSTEP]

| h b => rw [detAux_def', det_toMatrix_eq_det_toMatrix b b']
[GOAL]
case h
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
ι' : Type u_7
inst✝¹ : Fintype ι'
inst✝ : DecidableEq ι'
b' : Basis ι' A M
f : M →ₗ[A] M
b : Basis ι A M
⊢ ↑(detAux (Trunc.mk b)) f = det (↑(toMatrix b' b') f)
[PROOFSTEP]
rw [detAux_def', det_toMatrix_eq_det_toMatrix b b']
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
⊢ ↑LinearMap.det =
    ↑(if H : ∃ s, Nonempty (Basis { x // x ∈ s } A M) then
        detAux (Trunc.mk (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose H } A M))))
      else 1)
[PROOFSTEP]
ext
[GOAL]
case h
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
x✝ : M →ₗ[A] M
⊢ ↑LinearMap.det x✝ =
    ↑(if H : ∃ s, Nonempty (Basis { x // x ∈ s } A M) then
          detAux (Trunc.mk (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose H } A M))))
        else 1)
      x✝
[PROOFSTEP]
rw [LinearMap.det_def]
[GOAL]
case h
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
x✝ : M →ₗ[A] M
⊢ ↑(if H : ∃ s, Nonempty (Basis { x // x ∈ s } A M) then
          detAux (Trunc.mk (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose H } A M))))
        else 1)
      x✝ =
    ↑(if H : ∃ s, Nonempty (Basis { x // x ∈ s } A M) then
          detAux (Trunc.mk (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose H } A M))))
        else 1)
      x✝
[PROOFSTEP]
split_ifs
[GOAL]
case pos
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
x✝ : M →ₗ[A] M
h✝ : ∃ s, Nonempty (Basis { x // x ∈ s } A M)
⊢ ↑(detAux (Trunc.mk (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose h✝ } A M))))) x✝ =
    ↑(detAux (Trunc.mk (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose h✝ } A M))))) x✝
[PROOFSTEP]
congr
  -- use the correct `DecidableEq` instance
[GOAL]
case neg
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
x✝ : M →ₗ[A] M
h✝ : ¬∃ s, Nonempty (Basis { x // x ∈ s } A M)
⊢ ↑1 x✝ = ↑1 x✝
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
s : Finset M
b : Basis { x // x ∈ s } A M
f : M →ₗ[A] M
⊢ ↑LinearMap.det f = det (↑(toMatrix b b) f)
[PROOFSTEP]
have : ∃ s : Finset M, Nonempty (Basis s A M) := ⟨s, ⟨b⟩⟩
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
s : Finset M
b : Basis { x // x ∈ s } A M
f : M →ₗ[A] M
this : ∃ s, Nonempty (Basis { x // x ∈ s } A M)
⊢ ↑LinearMap.det f = det (↑(toMatrix b b) f)
[PROOFSTEP]
rw [LinearMap.coe_det, dif_pos, detAux_def'' _ b]
[GOAL]
case hc
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
s : Finset M
b : Basis { x // x ∈ s } A M
f : M →ₗ[A] M
this : ∃ s, Nonempty (Basis { x // x ∈ s } A M)
⊢ ∃ s, Nonempty (Basis { x // x ∈ s } A M)
[PROOFSTEP]
assumption
[GOAL]
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
κ : Type u_6
inst✝ : Fintype κ
b : Basis ι A M
f : M →ₗ[A] M
⊢ det (↑(toMatrix b b) f) = ↑LinearMap.det f
[PROOFSTEP]
haveI := Classical.decEq M
[GOAL]
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
κ : Type u_6
inst✝ : Fintype κ
b : Basis ι A M
f : M →ₗ[A] M
this : DecidableEq M
⊢ det (↑(toMatrix b b) f) = ↑LinearMap.det f
[PROOFSTEP]
rw [det_eq_det_toMatrix_of_finset b.reindexFinsetRange]
  -- Porting note: moved out of `rw` due to error
    -- typeclass instance problem is stuck, it is often due to metavariables `DecidableEq ?m.628881`
[GOAL]
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
κ : Type u_6
inst✝ : Fintype κ
b : Basis ι A M
f : M →ₗ[A] M
this : DecidableEq M
⊢ det (↑(toMatrix b b) f) = det (↑(toMatrix (Basis.reindexFinsetRange b) (Basis.reindexFinsetRange b)) f)
[PROOFSTEP]
apply det_toMatrix_eq_det_toMatrix b
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι✝ : Type u_4
inst✝⁶ : DecidableEq ι✝
inst✝⁵ : Fintype ι✝
e : Basis ι✝ R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
ι : Type u_7
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
f : (ι → A) →ₗ[A] ι → A
⊢ det (↑toMatrix' f) = ↑LinearMap.det f
[PROOFSTEP]
simp [← toMatrix_eq_toMatrix']
[GOAL]
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
κ : Type u_6
inst✝ : Fintype κ
b : Basis ι R M
f : Matrix ι ι R
⊢ ↑LinearMap.det (↑(toLin b b) f) = det f
[PROOFSTEP]
rw [← LinearMap.det_toMatrix b, LinearMap.toMatrix_toLin]
[GOAL]
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
κ : Type u_6
inst✝ : Fintype κ
f : Matrix ι ι R
⊢ ↑LinearMap.det (↑toLin' f) = det f
[PROOFSTEP]
simp only [← toLin_eq_toLin', det_toLin]
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
P : A → Prop
f : M →ₗ[A] M
hb : ∀ (s : Finset M) (b : Basis { x // x ∈ s } A M), P (det (↑(toMatrix b b) f))
h1 : P 1
⊢ P (↑LinearMap.det f)
[PROOFSTEP]
rw [LinearMap.det_def]
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
P : A → Prop
f : M →ₗ[A] M
hb : ∀ (s : Finset M) (b : Basis { x // x ∈ s } A M), P (det (↑(toMatrix b b) f))
h1 : P 1
⊢ P
    (↑(if H : ∃ s, Nonempty (Basis { x // x ∈ s } A M) then
          detAux (Trunc.mk (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose H } A M))))
        else 1)
      f)
[PROOFSTEP]
split_ifs with h
[GOAL]
case pos
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
P : A → Prop
f : M →ₗ[A] M
hb : ∀ (s : Finset M) (b : Basis { x // x ∈ s } A M), P (det (↑(toMatrix b b) f))
h1 : P 1
h : ∃ s, Nonempty (Basis { x // x ∈ s } A M)
⊢ P (↑(detAux (Trunc.mk (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose h } A M))))) f)
[PROOFSTEP]
convert hb _ h.choose_spec.some
[GOAL]
case h.e'_1
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
P : A → Prop
f : M →ₗ[A] M
hb : ∀ (s : Finset M) (b : Basis { x // x ∈ s } A M), P (det (↑(toMatrix b b) f))
h1 : P 1
h : ∃ s, Nonempty (Basis { x // x ∈ s } A M)
⊢ ↑(detAux (Trunc.mk (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose h } A M))))) f =
    det
      (↑(toMatrix (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose h } A M)))
            (Nonempty.some (_ : Nonempty (Basis { x // x ∈ Exists.choose h } A M))))
        f)
[PROOFSTEP]
convert detAux_def'' (Trunc.mk h.choose_spec.some) h.choose_spec.some f
[GOAL]
case neg
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : DecidableEq M
P : A → Prop
f : M →ₗ[A] M
hb : ∀ (s : Finset M) (b : Basis { x // x ∈ s } A M), P (det (↑(toMatrix b b) f))
h1 : P 1
h : ¬∃ s, Nonempty (Basis { x // x ∈ s } A M)
⊢ P (↑1 f)
[PROOFSTEP]
exact h1
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
c : 𝕜
f : M →ₗ[𝕜] M
⊢ ↑LinearMap.det (c • f) = c ^ FiniteDimensional.finrank 𝕜 M * ↑LinearMap.det f
[PROOFSTEP]
by_cases H : ∃ s : Finset M, Nonempty (Basis s 𝕜 M)
[GOAL]
case pos
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
c : 𝕜
f : M →ₗ[𝕜] M
H : ∃ s, Nonempty (Basis { x // x ∈ s } 𝕜 M)
⊢ ↑LinearMap.det (c • f) = c ^ FiniteDimensional.finrank 𝕜 M * ↑LinearMap.det f
[PROOFSTEP]
have : FiniteDimensional 𝕜 M := by
  rcases H with ⟨s, ⟨hs⟩⟩
  exact FiniteDimensional.of_fintype_basis hs
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
c : 𝕜
f : M →ₗ[𝕜] M
H : ∃ s, Nonempty (Basis { x // x ∈ s } 𝕜 M)
⊢ FiniteDimensional 𝕜 M
[PROOFSTEP]
rcases H with ⟨s, ⟨hs⟩⟩
[GOAL]
case intro.intro
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
c : 𝕜
f : M →ₗ[𝕜] M
s : Finset M
hs : Basis { x // x ∈ s } 𝕜 M
⊢ FiniteDimensional 𝕜 M
[PROOFSTEP]
exact FiniteDimensional.of_fintype_basis hs
[GOAL]
case pos
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
c : 𝕜
f : M →ₗ[𝕜] M
H : ∃ s, Nonempty (Basis { x // x ∈ s } 𝕜 M)
this : FiniteDimensional 𝕜 M
⊢ ↑LinearMap.det (c • f) = c ^ FiniteDimensional.finrank 𝕜 M * ↑LinearMap.det f
[PROOFSTEP]
simp only [← det_toMatrix (FiniteDimensional.finBasis 𝕜 M), LinearEquiv.map_smul, Fintype.card_fin, Matrix.det_smul]
[GOAL]
case neg
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
c : 𝕜
f : M →ₗ[𝕜] M
H : ¬∃ s, Nonempty (Basis { x // x ∈ s } 𝕜 M)
⊢ ↑LinearMap.det (c • f) = c ^ FiniteDimensional.finrank 𝕜 M * ↑LinearMap.det f
[PROOFSTEP]
classical
have : FiniteDimensional.finrank 𝕜 M = 0 := finrank_eq_zero_of_not_exists_basis H
simp [coe_det, H, this]
[GOAL]
case neg
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
c : 𝕜
f : M →ₗ[𝕜] M
H : ¬∃ s, Nonempty (Basis { x // x ∈ s } 𝕜 M)
⊢ ↑LinearMap.det (c • f) = c ^ FiniteDimensional.finrank 𝕜 M * ↑LinearMap.det f
[PROOFSTEP]
have : FiniteDimensional.finrank 𝕜 M = 0 := finrank_eq_zero_of_not_exists_basis H
[GOAL]
case neg
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
c : 𝕜
f : M →ₗ[𝕜] M
H : ¬∃ s, Nonempty (Basis { x // x ∈ s } 𝕜 M)
this : FiniteDimensional.finrank 𝕜 M = 0
⊢ ↑LinearMap.det (c • f) = c ^ FiniteDimensional.finrank 𝕜 M * ↑LinearMap.det f
[PROOFSTEP]
simp [coe_det, H, this]
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι✝ : Type u_4
inst✝⁶ : DecidableEq ι✝
inst✝⁵ : Fintype ι✝
e : Basis ι✝ R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
ι : Type u_7
inst✝¹ : Finite ι
inst✝ : Nonempty ι
b : Basis ι A M
⊢ ↑LinearMap.det 0 = 0
[PROOFSTEP]
haveI := Classical.decEq ι
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι✝ : Type u_4
inst✝⁶ : DecidableEq ι✝
inst✝⁵ : Fintype ι✝
e : Basis ι✝ R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
ι : Type u_7
inst✝¹ : Finite ι
inst✝ : Nonempty ι
b : Basis ι A M
this : DecidableEq ι
⊢ ↑LinearMap.det 0 = 0
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι✝ : Type u_4
inst✝⁶ : DecidableEq ι✝
inst✝⁵ : Fintype ι✝
e : Basis ι✝ R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
ι : Type u_7
inst✝¹ : Finite ι
inst✝ : Nonempty ι
b : Basis ι A M
this : DecidableEq ι
val✝ : Fintype ι
⊢ ↑LinearMap.det 0 = 0
[PROOFSTEP]
rwa [← det_toMatrix b, LinearEquiv.map_zero, det_zero]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
⊢ ↑LinearMap.det 0 = 0 ^ FiniteDimensional.finrank 𝕜 M
[PROOFSTEP]
simp only [← zero_smul 𝕜 (1 : M →ₗ[𝕜] M), det_smul, mul_one, MonoidHom.map_one]
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : Subsingleton M
f : M →ₗ[R] M
⊢ ↑LinearMap.det f = 1
[PROOFSTEP]
have b : Basis (Fin 0) R M := Basis.empty M
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : Subsingleton M
f : M →ₗ[R] M
b : Basis (Fin 0) R M
⊢ ↑LinearMap.det f = 1
[PROOFSTEP]
rw [← f.det_toMatrix b]
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
κ : Type u_6
inst✝¹ : Fintype κ
inst✝ : Subsingleton M
f : M →ₗ[R] M
b : Basis (Fin 0) R M
⊢ det (↑(toMatrix b b) f) = 1
[PROOFSTEP]
exact Matrix.det_isEmpty
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
h : FiniteDimensional.finrank 𝕜 M = 0
f : M →ₗ[𝕜] M
⊢ ↑LinearMap.det f = 1
[PROOFSTEP]
classical
refine' @LinearMap.det_cases M _ 𝕜 _ _ _ (fun t => t = 1) f _ rfl
intro s b
have : IsEmpty s := by
  rw [← Fintype.card_eq_zero_iff]
  exact (FiniteDimensional.finrank_eq_card_basis b).symm.trans h
exact Matrix.det_isEmpty
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
h : FiniteDimensional.finrank 𝕜 M = 0
f : M →ₗ[𝕜] M
⊢ ↑LinearMap.det f = 1
[PROOFSTEP]
refine' @LinearMap.det_cases M _ 𝕜 _ _ _ (fun t => t = 1) f _ rfl
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
h : FiniteDimensional.finrank 𝕜 M = 0
f : M →ₗ[𝕜] M
⊢ ∀ (s : Finset M) (b : Basis { x // x ∈ s } 𝕜 M), (fun t => t = 1) (det (↑(toMatrix b b) f))
[PROOFSTEP]
intro s b
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
h : FiniteDimensional.finrank 𝕜 M = 0
f : M →ₗ[𝕜] M
s : Finset M
b : Basis { x // x ∈ s } 𝕜 M
⊢ det (↑(toMatrix b b) f) = 1
[PROOFSTEP]
have : IsEmpty s := by
  rw [← Fintype.card_eq_zero_iff]
  exact (FiniteDimensional.finrank_eq_card_basis b).symm.trans h
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
h : FiniteDimensional.finrank 𝕜 M = 0
f : M →ₗ[𝕜] M
s : Finset M
b : Basis { x // x ∈ s } 𝕜 M
⊢ IsEmpty { x // x ∈ s }
[PROOFSTEP]
rw [← Fintype.card_eq_zero_iff]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
h : FiniteDimensional.finrank 𝕜 M = 0
f : M →ₗ[𝕜] M
s : Finset M
b : Basis { x // x ∈ s } 𝕜 M
⊢ Fintype.card { x // x ∈ s } = 0
[PROOFSTEP]
exact (FiniteDimensional.finrank_eq_card_basis b).symm.trans h
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
M✝ : Type u_2
inst✝¹¹ : AddCommGroup M✝
inst✝¹⁰ : Module R M✝
M' : Type u_3
inst✝⁹ : AddCommGroup M'
inst✝⁸ : Module R M'
ι : Type u_4
inst✝⁷ : DecidableEq ι
inst✝⁶ : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝⁵ : CommRing A
inst✝⁴ : Module A M✝
κ : Type u_6
inst✝³ : Fintype κ
𝕜 : Type u_7
inst✝² : Field 𝕜
M : Type u_8
inst✝¹ : AddCommGroup M
inst✝ : Module 𝕜 M
h : FiniteDimensional.finrank 𝕜 M = 0
f : M →ₗ[𝕜] M
s : Finset M
b : Basis { x // x ∈ s } 𝕜 M
this : IsEmpty { x // x ∈ s }
⊢ det (↑(toMatrix b b) f) = 1
[PROOFSTEP]
exact Matrix.det_isEmpty
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
⊢ ↑LinearMap.det (comp (↑e) (comp f ↑(LinearEquiv.symm e))) = ↑LinearMap.det f
[PROOFSTEP]
classical
by_cases H : ∃ s : Finset M, Nonempty (Basis s A M)
· rcases H with ⟨s, ⟨b⟩⟩
  rw [← det_toMatrix b f, ← det_toMatrix (b.map e), toMatrix_comp (b.map e) b (b.map e), toMatrix_comp (b.map e) b b, ←
    Matrix.mul_assoc, Matrix.det_conj_of_mul_eq_one]
  · rw [← toMatrix_comp, LinearEquiv.comp_coe, e.symm_trans_self, LinearEquiv.refl_toLinearMap, toMatrix_id]
  · rw [← toMatrix_comp, LinearEquiv.comp_coe, e.self_trans_symm, LinearEquiv.refl_toLinearMap, toMatrix_id]
· have H' : ¬∃ t : Finset N, Nonempty (Basis t A N) :=
    by
    contrapose! H
    rcases H with ⟨s, ⟨b⟩⟩
    exact ⟨_, ⟨(b.map e.symm).reindexFinsetRange⟩⟩
  simp only [coe_det, H, H', MonoidHom.one_apply, dif_neg]
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
⊢ ↑LinearMap.det (comp (↑e) (comp f ↑(LinearEquiv.symm e))) = ↑LinearMap.det f
[PROOFSTEP]
by_cases H : ∃ s : Finset M, Nonempty (Basis s A M)
[GOAL]
case pos
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
H : ∃ s, Nonempty (Basis { x // x ∈ s } A M)
⊢ ↑LinearMap.det (comp (↑e) (comp f ↑(LinearEquiv.symm e))) = ↑LinearMap.det f
[PROOFSTEP]
rcases H with ⟨s, ⟨b⟩⟩
[GOAL]
case pos.intro.intro
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
s : Finset M
b : Basis { x // x ∈ s } A M
⊢ ↑LinearMap.det (comp (↑e) (comp f ↑(LinearEquiv.symm e))) = ↑LinearMap.det f
[PROOFSTEP]
rw [← det_toMatrix b f, ← det_toMatrix (b.map e), toMatrix_comp (b.map e) b (b.map e), toMatrix_comp (b.map e) b b, ←
  Matrix.mul_assoc, Matrix.det_conj_of_mul_eq_one]
[GOAL]
case pos.intro.intro.hMM'
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
s : Finset M
b : Basis { x // x ∈ s } A M
⊢ ↑(toMatrix b (Basis.map b e)) ↑e * ↑(toMatrix (Basis.map b e) b) ↑(LinearEquiv.symm e) = 1
[PROOFSTEP]
rw [← toMatrix_comp, LinearEquiv.comp_coe, e.symm_trans_self, LinearEquiv.refl_toLinearMap, toMatrix_id]
[GOAL]
case pos.intro.intro.hM'M
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
s : Finset M
b : Basis { x // x ∈ s } A M
⊢ ↑(toMatrix (Basis.map b e) b) ↑(LinearEquiv.symm e) * ↑(toMatrix b (Basis.map b e)) ↑e = 1
[PROOFSTEP]
rw [← toMatrix_comp, LinearEquiv.comp_coe, e.self_trans_symm, LinearEquiv.refl_toLinearMap, toMatrix_id]
[GOAL]
case neg
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
H : ¬∃ s, Nonempty (Basis { x // x ∈ s } A M)
⊢ ↑LinearMap.det (comp (↑e) (comp f ↑(LinearEquiv.symm e))) = ↑LinearMap.det f
[PROOFSTEP]
have H' : ¬∃ t : Finset N, Nonempty (Basis t A N) := by
  contrapose! H
  rcases H with ⟨s, ⟨b⟩⟩
  exact ⟨_, ⟨(b.map e.symm).reindexFinsetRange⟩⟩
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
H : ¬∃ s, Nonempty (Basis { x // x ∈ s } A M)
⊢ ¬∃ t, Nonempty (Basis { x // x ∈ t } A N)
[PROOFSTEP]
contrapose! H
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
H : ∃ t, Nonempty (Basis { x // x ∈ t } A N)
⊢ ∃ s, Nonempty (Basis { x // x ∈ s } A M)
[PROOFSTEP]
rcases H with ⟨s, ⟨b⟩⟩
[GOAL]
case intro.intro
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
s : Finset N
b : Basis { x // x ∈ s } A N
⊢ ∃ s, Nonempty (Basis { x // x ∈ s } A M)
[PROOFSTEP]
exact ⟨_, ⟨(b.map e.symm).reindexFinsetRange⟩⟩
[GOAL]
case neg
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
N : Type u_7
inst✝¹ : AddCommGroup N
inst✝ : Module A N
f : M →ₗ[A] M
e : M ≃ₗ[A] N
H : ¬∃ s, Nonempty (Basis { x // x ∈ s } A M)
H' : ¬∃ t, Nonempty (Basis { x // x ∈ t } A N)
⊢ ↑LinearMap.det (comp (↑e) (comp f ↑(LinearEquiv.symm e))) = ↑LinearMap.det f
[PROOFSTEP]
simp only [coe_det, H, H', MonoidHom.one_apply, dif_neg]
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A✝ : Type u_5
inst✝⁴ : CommRing A✝
inst✝³ : Module A✝ M
κ : Type u_6
inst✝² : Fintype κ
A : Type u_7
inst✝¹ : CommRing A
inst✝ : Module A M
f : M →ₗ[A] M
hf : IsUnit f
⊢ IsUnit (↑LinearMap.det f)
[PROOFSTEP]
obtain ⟨g, hg⟩ : ∃ g, f.comp g = 1 := hf.exists_right_inv
[GOAL]
case intro
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A✝ : Type u_5
inst✝⁴ : CommRing A✝
inst✝³ : Module A✝ M
κ : Type u_6
inst✝² : Fintype κ
A : Type u_7
inst✝¹ : CommRing A
inst✝ : Module A M
f : M →ₗ[A] M
hf : IsUnit f
g : M →ₗ[A] M
hg : comp f g = 1
⊢ IsUnit (↑LinearMap.det f)
[PROOFSTEP]
have : LinearMap.det f * LinearMap.det g = 1 := by simp only [← LinearMap.det_comp, hg, MonoidHom.map_one]
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A✝ : Type u_5
inst✝⁴ : CommRing A✝
inst✝³ : Module A✝ M
κ : Type u_6
inst✝² : Fintype κ
A : Type u_7
inst✝¹ : CommRing A
inst✝ : Module A M
f : M →ₗ[A] M
hf : IsUnit f
g : M →ₗ[A] M
hg : comp f g = 1
⊢ ↑LinearMap.det f * ↑LinearMap.det g = 1
[PROOFSTEP]
simp only [← LinearMap.det_comp, hg, MonoidHom.map_one]
[GOAL]
case intro
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A✝ : Type u_5
inst✝⁴ : CommRing A✝
inst✝³ : Module A✝ M
κ : Type u_6
inst✝² : Fintype κ
A : Type u_7
inst✝¹ : CommRing A
inst✝ : Module A M
f : M →ₗ[A] M
hf : IsUnit f
g : M →ₗ[A] M
hg : comp f g = 1
this : ↑LinearMap.det f * ↑LinearMap.det g = 1
⊢ IsUnit (↑LinearMap.det f)
[PROOFSTEP]
exact isUnit_of_mul_eq_one _ _ this
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f ≠ 1
⊢ FiniteDimensional 𝕜 M
[PROOFSTEP]
by_cases H : ∃ s : Finset M, Nonempty (Basis s 𝕜 M)
[GOAL]
case pos
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f ≠ 1
H : ∃ s, Nonempty (Basis { x // x ∈ s } 𝕜 M)
⊢ FiniteDimensional 𝕜 M
[PROOFSTEP]
rcases H with ⟨s, ⟨hs⟩⟩
[GOAL]
case pos.intro.intro
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f ≠ 1
s : Finset M
hs : Basis { x // x ∈ s } 𝕜 M
⊢ FiniteDimensional 𝕜 M
[PROOFSTEP]
exact FiniteDimensional.of_fintype_basis hs
[GOAL]
case neg
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f ≠ 1
H : ¬∃ s, Nonempty (Basis { x // x ∈ s } 𝕜 M)
⊢ FiniteDimensional 𝕜 M
[PROOFSTEP]
classical simp [LinearMap.coe_det, H] at hf
[GOAL]
case neg
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f ≠ 1
H : ¬∃ s, Nonempty (Basis { x // x ∈ s } 𝕜 M)
⊢ FiniteDimensional 𝕜 M
[PROOFSTEP]
simp [LinearMap.coe_det, H] at hf
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f = 0
⊢ range f < ⊤
[PROOFSTEP]
have : FiniteDimensional 𝕜 M := by simp [f.finiteDimensional_of_det_ne_one, hf]
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f = 0
⊢ FiniteDimensional 𝕜 M
[PROOFSTEP]
simp [f.finiteDimensional_of_det_ne_one, hf]
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f = 0
this : FiniteDimensional 𝕜 M
⊢ range f < ⊤
[PROOFSTEP]
contrapose hf
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
this : FiniteDimensional 𝕜 M
hf : ¬range f < ⊤
⊢ ¬↑LinearMap.det f = 0
[PROOFSTEP]
simp only [lt_top_iff_ne_top, Classical.not_not, ← isUnit_iff_range_eq_top] at hf
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
this : FiniteDimensional 𝕜 M
hf : IsUnit f
⊢ ¬↑LinearMap.det f = 0
[PROOFSTEP]
exact isUnit_iff_ne_zero.1 (f.isUnit_det hf)
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f = 0
⊢ ⊥ < ker f
[PROOFSTEP]
have : FiniteDimensional 𝕜 M := by simp [f.finiteDimensional_of_det_ne_one, hf]
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f = 0
⊢ FiniteDimensional 𝕜 M
[PROOFSTEP]
simp [f.finiteDimensional_of_det_ne_one, hf]
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f = 0
this : FiniteDimensional 𝕜 M
⊢ ⊥ < ker f
[PROOFSTEP]
contrapose hf
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
this : FiniteDimensional 𝕜 M
hf : ¬⊥ < ker f
⊢ ¬↑LinearMap.det f = 0
[PROOFSTEP]
simp only [bot_lt_iff_ne_bot, Classical.not_not, ← isUnit_iff_ker_eq_bot] at hf
[GOAL]
R : Type u_1
inst✝¹¹ : CommRing R
M : Type u_2
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
M' : Type u_3
inst✝⁸ : AddCommGroup M'
inst✝⁷ : Module R M'
ι : Type u_4
inst✝⁶ : DecidableEq ι
inst✝⁵ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Module A M
κ : Type u_6
inst✝² : Fintype κ
𝕜 : Type u_7
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M →ₗ[𝕜] M
this : FiniteDimensional 𝕜 M
hf : IsUnit f
⊢ ¬↑LinearMap.det f = 0
[PROOFSTEP]
exact isUnit_iff_ne_zero.1 (f.isUnit_det hf)
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e✝ : Basis ι R M
f : M ≃ₗ[R] M
e : M ≃ₗ[R] M'
⊢ ↑LinearEquiv.det (trans (trans (symm e) f) e) = ↑LinearEquiv.det f
[PROOFSTEP]
rw [← Units.eq_iff, coe_det, coe_det, ← comp_coe, ← comp_coe, LinearMap.det_conj]
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
f : M ≃ₗ[A] M
⊢ ↑LinearMap.det ↑f * ↑LinearMap.det ↑(symm f) = 1
[PROOFSTEP]
simp [← LinearMap.det_comp]
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
f : M ≃ₗ[A] M
⊢ ↑LinearMap.det ↑(symm f) * ↑LinearMap.det ↑f = 1
[PROOFSTEP]
simp [← LinearMap.det_comp]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : M ≃ₗ[R] M'
v : Basis ι R M
v' : Basis ι R M'
⊢ IsUnit (det (↑(toMatrix v v') ↑f))
[PROOFSTEP]
apply isUnit_det_of_left_inverse
[GOAL]
case h
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : M ≃ₗ[R] M'
v : Basis ι R M
v' : Basis ι R M'
⊢ ?B * ↑(toMatrix v v') ↑f = 1
case B
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : M ≃ₗ[R] M'
v : Basis ι R M
v' : Basis ι R M'
⊢ Matrix ι ι R
[PROOFSTEP]
simpa using (LinearMap.toMatrix_comp v v' v f.symm f).symm
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
𝕜 : Type u_5
inst✝¹ : Field 𝕜
inst✝ : Module 𝕜 M
f : M ≃ₗ[𝕜] M
⊢ ↑LinearMap.det ↑(symm f) = (↑LinearMap.det ↑f)⁻¹
[PROOFSTEP]
field_simp [IsUnit.ne_zero f.isUnit_det']
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : M →ₗ[R] M'
v : Basis ι R M
v' : Basis ι R M'
h : IsUnit (det (↑(toMatrix v v') f))
x : M
⊢ ↑(↑(toLin v' v) (↑(toMatrix v v') f)⁻¹) (↑f x) = ↑(↑(toLin v v) ((↑(toMatrix v v') f)⁻¹ * ↑(toMatrix v v') f)) x
[PROOFSTEP]
rw [toLin_mul v v' v, toLin_toMatrix, LinearMap.comp_apply]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : M →ₗ[R] M'
v : Basis ι R M
v' : Basis ι R M'
h : IsUnit (det (↑(toMatrix v v') f))
x : M
⊢ ↑(↑(toLin v v) ((↑(toMatrix v v') f)⁻¹ * ↑(toMatrix v v') f)) x = x
[PROOFSTEP]
simp [h]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : M →ₗ[R] M'
v : Basis ι R M
v' : Basis ι R M'
h : IsUnit (det (↑(toMatrix v v') f))
x : M'
⊢ ↑f (↑(↑(toLin v' v) (↑(toMatrix v v') f)⁻¹) x) = ↑(↑(toLin v' v') (↑(toMatrix v v') f * (↑(toMatrix v v') f)⁻¹)) x
[PROOFSTEP]
rw [toLin_mul v' v v', LinearMap.comp_apply, toLin_toMatrix v v']
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : M →ₗ[R] M'
v : Basis ι R M
v' : Basis ι R M'
h : IsUnit (det (↑(toMatrix v v') f))
x : M'
⊢ ↑(↑(toLin v' v') (↑(toMatrix v v') f * (↑(toMatrix v v') f)⁻¹)) x = x
[PROOFSTEP]
simp [h]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : M →ₗ[R] M'
v : Basis ι R M
v' : Basis ι R M'
h : IsUnit (det (↑(toMatrix v v') f))
⊢ ↑(ofIsUnitDet h) = f
[PROOFSTEP]
ext x
[GOAL]
case h
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : M →ₗ[R] M'
v : Basis ι R M
v' : Basis ι R M'
h : IsUnit (det (↑(toMatrix v v') f))
x : M
⊢ ↑↑(ofIsUnitDet h) x = ↑f x
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Type u_2
inst✝⁹ : AddCommGroup M✝
inst✝⁸ : Module R M✝
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M✝
𝕜 : Type u_5
inst✝³ : Field 𝕜
M : Type u_6
inst✝² : AddCommGroup M
inst✝¹ : Module 𝕜 M
inst✝ : FiniteDimensional 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f ≠ 0
⊢ IsUnit (det (↑(toMatrix (FiniteDimensional.finBasis 𝕜 M) (FiniteDimensional.finBasis 𝕜 M)) f))
[PROOFSTEP]
rw [LinearMap.det_toMatrix]
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Type u_2
inst✝⁹ : AddCommGroup M✝
inst✝⁸ : Module R M✝
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e : Basis ι R M✝
𝕜 : Type u_5
inst✝³ : Field 𝕜
M : Type u_6
inst✝² : AddCommGroup M
inst✝¹ : Module 𝕜 M
inst✝ : FiniteDimensional 𝕜 M
f : M →ₗ[𝕜] M
hf : ↑LinearMap.det f ≠ 0
⊢ IsUnit (↑LinearMap.det f)
[PROOFSTEP]
exact isUnit_iff_ne_zero.2 hf
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e✝ : Basis ι R M
e : M ≃ₗ[R] M
f f' : M →ₗ[R] M
h : ∀ (x : M), ↑f x = ↑f' (↑e x)
⊢ Associated (↑LinearMap.det f) (↑LinearMap.det f')
[PROOFSTEP]
suffices Associated (LinearMap.det (f' ∘ₗ ↑e)) (LinearMap.det f')
  by
  convert this using 2
  ext x
  exact h x
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e✝ : Basis ι R M
e : M ≃ₗ[R] M
f f' : M →ₗ[R] M
h : ∀ (x : M), ↑f x = ↑f' (↑e x)
this : Associated (↑LinearMap.det (comp f' ↑e)) (↑LinearMap.det f')
⊢ Associated (↑LinearMap.det f) (↑LinearMap.det f')
[PROOFSTEP]
convert this using 2
[GOAL]
case h.e'_3.h.e'_6
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e✝ : Basis ι R M
e : M ≃ₗ[R] M
f f' : M →ₗ[R] M
h : ∀ (x : M), ↑f x = ↑f' (↑e x)
this : Associated (↑LinearMap.det (comp f' ↑e)) (↑LinearMap.det f')
⊢ f = comp f' ↑e
[PROOFSTEP]
ext x
[GOAL]
case h.e'_3.h.e'_6.h
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e✝ : Basis ι R M
e : M ≃ₗ[R] M
f f' : M →ₗ[R] M
h : ∀ (x : M), ↑f x = ↑f' (↑e x)
this : Associated (↑LinearMap.det (comp f' ↑e)) (↑LinearMap.det f')
x : M
⊢ ↑f x = ↑(comp f' ↑e) x
[PROOFSTEP]
exact h x
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e✝ : Basis ι R M
e : M ≃ₗ[R] M
f f' : M →ₗ[R] M
h : ∀ (x : M), ↑f x = ↑f' (↑e x)
⊢ Associated (↑LinearMap.det (comp f' ↑e)) (↑LinearMap.det f')
[PROOFSTEP]
rw [← mul_one (LinearMap.det f'), LinearMap.det_comp]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e✝ : Basis ι R M
e : M ≃ₗ[R] M
f f' : M →ₗ[R] M
h : ∀ (x : M), ↑f x = ↑f' (↑e x)
⊢ Associated (↑LinearMap.det f' * ↑LinearMap.det ↑e) (↑LinearMap.det f' * 1)
[PROOFSTEP]
exact Associated.mul_left _ (associated_one_iff_isUnit.mpr e.isUnit_det')
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e✝ : Basis ι R M
N : Type u_5
inst✝¹ : AddCommGroup N
inst✝ : Module R N
f : N →ₗ[R] M
e e' : M ≃ₗ[R] N
⊢ Associated (↑LinearMap.det (comp f ↑e)) (↑LinearMap.det (comp f ↑e'))
[PROOFSTEP]
refine' LinearMap.associated_det_of_eq_comp (e.trans e'.symm) _ _ _
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e✝ : Basis ι R M
N : Type u_5
inst✝¹ : AddCommGroup N
inst✝ : Module R N
f : N →ₗ[R] M
e e' : M ≃ₗ[R] N
⊢ ∀ (x : M), ↑(comp f ↑e) x = ↑(comp f ↑e') (↑(LinearEquiv.trans e (LinearEquiv.symm e')) x)
[PROOFSTEP]
intro x
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e✝ : Basis ι R M
N : Type u_5
inst✝¹ : AddCommGroup N
inst✝ : Module R N
f : N →ₗ[R] M
e e' : M ≃ₗ[R] N
x : M
⊢ ↑(comp f ↑e) x = ↑(comp f ↑e') (↑(LinearEquiv.trans e (LinearEquiv.symm e')) x)
[PROOFSTEP]
simp only [LinearMap.comp_apply, LinearEquiv.coe_coe, LinearEquiv.trans_apply, LinearEquiv.apply_symm_apply]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
⊢ ∀ [inst : DecidableEq ι] (m : ι → M) (i : ι) (x y : M),
    (fun v => Matrix.det (toMatrix e v)) (update m i (x + y)) =
      (fun v => Matrix.det (toMatrix e v)) (update m i x) + (fun v => Matrix.det (toMatrix e v)) (update m i y)
[PROOFSTEP]
intro inst v i x y
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
inst : DecidableEq ι
v : ι → M
i : ι
x y : M
⊢ (fun v => Matrix.det (toMatrix e v)) (update v i (x + y)) =
    (fun v => Matrix.det (toMatrix e v)) (update v i x) + (fun v => Matrix.det (toMatrix e v)) (update v i y)
[PROOFSTEP]
cases Subsingleton.elim inst ‹_›
[GOAL]
case refl
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
inst : DecidableEq ι
v : ι → M
i : ι
x y : M
⊢ (fun v => Matrix.det (toMatrix e v)) (update v i (x + y)) =
    (fun v => Matrix.det (toMatrix e v)) (update v i x) + (fun v => Matrix.det (toMatrix e v)) (update v i y)
[PROOFSTEP]
simp only [e.toMatrix_update, LinearEquiv.map_add, Finsupp.coe_add]
  -- Porting note: was `exact det_update_column_add _ _ _ _`
[GOAL]
case refl
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
inst : DecidableEq ι
v : ι → M
i : ι
x y : M
⊢ Matrix.det (updateColumn (toMatrix e v) i (↑(↑e.repr x) + ↑(↑e.repr y))) =
    Matrix.det (updateColumn (toMatrix e v) i ↑(↑e.repr x)) + Matrix.det (updateColumn (toMatrix e v) i ↑(↑e.repr y))
[PROOFSTEP]
convert det_updateColumn_add (e.toMatrix v) i (e.repr x) (e.repr y)
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
⊢ ∀ [inst : DecidableEq ι] (m : ι → M) (i : ι) (c : R) (x : M),
    (fun v => Matrix.det (toMatrix e v)) (update m i (c • x)) = c • (fun v => Matrix.det (toMatrix e v)) (update m i x)
[PROOFSTEP]
intro inst u i c x
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
inst : DecidableEq ι
u : ι → M
i : ι
c : R
x : M
⊢ (fun v => Matrix.det (toMatrix e v)) (update u i (c • x)) = c • (fun v => Matrix.det (toMatrix e v)) (update u i x)
[PROOFSTEP]
cases Subsingleton.elim inst ‹_›
[GOAL]
case refl
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
inst : DecidableEq ι
u : ι → M
i : ι
c : R
x : M
⊢ (fun v => Matrix.det (toMatrix e v)) (update u i (c • x)) = c • (fun v => Matrix.det (toMatrix e v)) (update u i x)
[PROOFSTEP]
simp only [e.toMatrix_update, Algebra.id.smul_eq_mul, LinearEquiv.map_smul]
  -- Porting note: was `apply det_update_column_smul`
[GOAL]
case refl
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
inst : DecidableEq ι
u : ι → M
i : ι
c : R
x : M
⊢ Matrix.det (updateColumn (toMatrix e u) i ↑(c • ↑e.repr x)) =
    c * Matrix.det (updateColumn (toMatrix e u) i ↑(↑e.repr x))
[PROOFSTEP]
convert det_updateColumn_smul (e.toMatrix u) i c (e.repr x)
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
⊢ ∀ (v : ι → M) (i j : ι),
    v i = v j →
      i ≠ j →
        MultilinearMap.toFun
            { toFun := fun v => Matrix.det (toMatrix e v),
              map_add' :=
                (_ :
                  ∀ [inst : DecidableEq ι] (v : ι → M) (i : ι) (x y : M),
                    (fun v => Matrix.det (toMatrix e v)) (update v i (x + y)) =
                      (fun v => Matrix.det (toMatrix e v)) (update v i x) +
                        (fun v => Matrix.det (toMatrix e v)) (update v i y)),
              map_smul' :=
                (_ :
                  ∀ [inst : DecidableEq ι] (u : ι → M) (i : ι) (c : R) (x : M),
                    (fun v => Matrix.det (toMatrix e v)) (update u i (c • x)) =
                      c • (fun v => Matrix.det (toMatrix e v)) (update u i x)) }
            v =
          0
[PROOFSTEP]
intro v i j h hij
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
i j : ι
h : v i = v j
hij : i ≠ j
⊢ MultilinearMap.toFun
      { toFun := fun v => Matrix.det (toMatrix e v),
        map_add' :=
          (_ :
            ∀ [inst : DecidableEq ι] (v : ι → M) (i : ι) (x y : M),
              (fun v => Matrix.det (toMatrix e v)) (update v i (x + y)) =
                (fun v => Matrix.det (toMatrix e v)) (update v i x) +
                  (fun v => Matrix.det (toMatrix e v)) (update v i y)),
        map_smul' :=
          (_ :
            ∀ [inst : DecidableEq ι] (u : ι → M) (i : ι) (c : R) (x : M),
              (fun v => Matrix.det (toMatrix e v)) (update u i (c • x)) =
                c • (fun v => Matrix.det (toMatrix e v)) (update u i x)) }
      v =
    0
[PROOFSTEP]
simp only
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
i j : ι
h : v i = v j
hij : i ≠ j
⊢ Matrix.det (toMatrix e v) = 0
[PROOFSTEP]
rw [← Function.update_eq_self i v, h, ← det_transpose, e.toMatrix_update, ← updateRow_transpose, ←
  e.toMatrix_transpose_apply]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
i j : ι
h : v i = v j
hij : i ≠ j
⊢ Matrix.det (updateRow (toMatrix e v)ᵀ i ((toMatrix e v)ᵀ j)) = 0
[PROOFSTEP]
apply det_zero_of_row_eq hij
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
i j : ι
h : v i = v j
hij : i ≠ j
⊢ updateRow (toMatrix e v)ᵀ i ((toMatrix e v)ᵀ j) i = updateRow (toMatrix e v)ᵀ i ((toMatrix e v)ᵀ j) j
[PROOFSTEP]
rw [updateRow_ne hij.symm, updateRow_self]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
⊢ ↑(det e) ↑e = 1
[PROOFSTEP]
simp [e.det_apply]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type u_3
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
ι : Type u_4
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
e : Basis ι R M
inst✝ : IsEmpty ι
⊢ det e = AlternatingMap.constOfIsEmpty R M ι 1
[PROOFSTEP]
ext v
[GOAL]
case H
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type u_3
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
ι : Type u_4
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
e : Basis ι R M
inst✝ : IsEmpty ι
v : ι → M
⊢ ↑(det e) v = ↑(AlternatingMap.constOfIsEmpty R M ι 1) v
[PROOFSTEP]
exact Matrix.det_isEmpty
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type u_3
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
ι : Type u_4
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
e : Basis ι R M
inst✝ : Nontrivial R
h : det e = 0
⊢ False
[PROOFSTEP]
simpa [h] using e.det_self
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
⊢ LinearIndependent R v ∧ span R (Set.range v) = ⊤ ↔ IsUnit (↑(Basis.det e) v)
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
⊢ LinearIndependent R v ∧ span R (Set.range v) = ⊤ → IsUnit (↑(Basis.det e) v)
[PROOFSTEP]
rintro ⟨hli, hspan⟩
[GOAL]
case mp.intro
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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)
[PROOFSTEP]
set v' := Basis.mk hli hspan.ge
[GOAL]
case mp.intro
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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)
[PROOFSTEP]
rw [e.det_apply]
[GOAL]
case mp.intro
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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))
[PROOFSTEP]
convert LinearEquiv.isUnit_det (LinearEquiv.refl R M) v' e using 2
[GOAL]
case h.e'_3.h.e'_6
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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)
[PROOFSTEP]
ext i j
[GOAL]
case h.e'_3.h.e'_6.a.h
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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
[PROOFSTEP]
simp
[GOAL]
case mpr
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
⊢ IsUnit (↑(Basis.det e) v) → LinearIndependent R v ∧ span R (Set.range v) = ⊤
[PROOFSTEP]
intro h
[GOAL]
case mpr
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
v : ι → M
h : IsUnit (↑(Basis.det e) v)
⊢ LinearIndependent R v ∧ span R (Set.range v) = ⊤
[PROOFSTEP]
rw [Basis.det_apply, Basis.toMatrix_eq_toMatrix_constr] at h
[GOAL]
case mpr
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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) = ⊤
[PROOFSTEP]
set v' := Basis.map e (LinearEquiv.ofIsUnitDet h) with v'_def
[GOAL]
case mpr
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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) = ⊤
[PROOFSTEP]
have : ⇑v' = v := by
  ext i
  rw [v'_def, Basis.map_apply, LinearEquiv.ofIsUnitDet_apply, e.constr_basis]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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
[PROOFSTEP]
ext i
[GOAL]
case h
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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
[PROOFSTEP]
rw [v'_def, Basis.map_apply, LinearEquiv.ofIsUnitDet_apply, e.constr_basis]
[GOAL]
case mpr
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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) = ⊤
[PROOFSTEP]
rw [← this]
[GOAL]
case mpr
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
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') = ⊤
[PROOFSTEP]
exact ⟨v'.linearIndependent, v'.span_eq⟩
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : AlternatingMap R M R ι
⊢ f = ↑f ↑e • Basis.det e
[PROOFSTEP]
refine' Basis.ext_alternating e fun i h => _
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : AlternatingMap R M R ι
i : ι → ι
h : Injective i
⊢ (↑f fun i_1 => ↑e (i i_1)) = ↑(↑f ↑e • Basis.det e) fun i_1 => ↑e (i i_1)
[PROOFSTEP]
let σ : Equiv.Perm ι := Equiv.ofBijective i (Finite.injective_iff_bijective.1 h)
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : AlternatingMap R M R ι
i : ι → ι
h : Injective i
σ : Equiv.Perm ι := Equiv.ofBijective i (_ : Bijective i)
⊢ (↑f fun i_1 => ↑e (i i_1)) = ↑(↑f ↑e • Basis.det e) fun i_1 => ↑e (i i_1)
[PROOFSTEP]
change f (e ∘ σ) = (f e • e.det) (e ∘ σ)
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
M : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type u_3
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
ι : Type u_4
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
e : Basis ι R M
f : AlternatingMap R M R ι
i : ι → ι
h : Injective i
σ : Equiv.Perm ι := Equiv.ofBijective i (_ : Bijective i)
⊢ ↑f (↑e ∘ ↑σ) = ↑(↑f ↑e • Basis.det e) (↑e ∘ ↑σ)
[PROOFSTEP]
simp [AlternatingMap.map_perm, Basis.det_self]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type u_3
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
ι✝ : Type u_4
inst✝² : DecidableEq ι✝
inst✝¹ : Fintype ι✝
e✝ : Basis ι✝ R M
ι : Type u_5
inst✝ : Finite ι
e : Basis ι R M
f : AlternatingMap R M R ι
h : ↑f ↑e = 0
⊢ f = 0
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type u_3
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
ι✝ : Type u_4
inst✝² : DecidableEq ι✝
inst✝¹ : Fintype ι✝
e✝ : Basis ι✝ R M
ι : Type u_5
inst✝ : Finite ι
e : Basis ι R M
f : AlternatingMap R M R ι
h : ↑f ↑e = 0
val✝ : Fintype ι
⊢ f = 0
[PROOFSTEP]
letI := Classical.decEq ι
[GOAL]
case intro
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type u_3
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
ι✝ : Type u_4
inst✝² : DecidableEq ι✝
inst✝¹ : Fintype ι✝
e✝ : Basis ι✝ R M
ι : Type u_5
inst✝ : Finite ι
e : Basis ι R M
f : AlternatingMap R M R ι
h : ↑f ↑e = 0
val✝ : Fintype ι
this : DecidableEq ι := Classical.decEq ι
⊢ f = 0
[PROOFSTEP]
simpa [h] using f.eq_smul_basis_det e
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
e : Basis ι A M
f : M →ₗ[A] M
v : ι → M
⊢ ↑(det e) (↑f ∘ v) = ↑LinearMap.det f * ↑(det e) v
[PROOFSTEP]
rw [Basis.det_apply, Basis.det_apply, ← f.det_toMatrix e, ← Matrix.det_mul, e.toMatrix_eq_toMatrix_constr (f ∘ v),
  e.toMatrix_eq_toMatrix_constr v, ← toMatrix_comp, e.constr_comp]
[GOAL]
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
inst✝ : Module A M'
b : Basis ι A M
b' : Basis ι A M'
f : M →ₗ[A] M'
⊢ ↑(det b') (↑f ∘ ↑b) = ↑LinearMap.det (LinearMap.comp f ↑(Basis.equiv b' b (Equiv.refl ι)))
[PROOFSTEP]
rw [Basis.det_apply, ← LinearMap.det_toMatrix b', LinearMap.toMatrix_comp _ b, Matrix.det_mul,
  LinearMap.toMatrix_basis_equiv, Matrix.det_one, mul_one]
[GOAL]
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
inst✝ : Module A M'
b : Basis ι A M
b' : Basis ι A M'
f : M →ₗ[A] M'
⊢ Matrix.det (toMatrix b' (↑f ∘ ↑b)) = Matrix.det (↑(LinearMap.toMatrix b b') f)
[PROOFSTEP]
congr 1
[GOAL]
case e_M
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
inst✝ : Module A M'
b : Basis ι A M
b' : Basis ι A M'
f : M →ₗ[A] M'
⊢ toMatrix b' (↑f ∘ ↑b) = ↑(LinearMap.toMatrix b b') f
[PROOFSTEP]
ext i j
[GOAL]
case e_M.a.h
R : Type u_1
inst✝⁹ : CommRing R
M : Type u_2
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
M' : Type u_3
inst✝⁶ : AddCommGroup M'
inst✝⁵ : Module R M'
ι : Type u_4
inst✝⁴ : DecidableEq ι
inst✝³ : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝² : CommRing A
inst✝¹ : Module A M
inst✝ : Module A M'
b : Basis ι A M
b' : Basis ι A M'
f : M →ₗ[A] M'
i j : ι
⊢ toMatrix b' (↑f ∘ ↑b) i j = ↑(LinearMap.toMatrix b b') f i j
[PROOFSTEP]
rw [Basis.toMatrix_apply, LinearMap.toMatrix_apply, Function.comp_apply]
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
ι' : Type u_6
inst✝¹ : Fintype ι'
inst✝ : DecidableEq ι'
b : Basis ι R M
v : ι' → M
e : ι ≃ ι'
⊢ ↑(det (reindex b e)) v = ↑(det b) (v ∘ ↑e)
[PROOFSTEP]
rw [Basis.det_apply, Basis.toMatrix_reindex', det_reindexAlgEquiv, Basis.det_apply]
[GOAL]
R : Type u_1
inst✝¹⁰ : CommRing R
M : Type u_2
inst✝⁹ : AddCommGroup M
inst✝⁸ : Module R M
M' : Type u_3
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
ι : Type u_4
inst✝⁵ : DecidableEq ι
inst✝⁴ : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝³ : CommRing A
inst✝² : Module A M
ι' : Type u_6
inst✝¹ : Fintype ι'
inst✝ : DecidableEq ι'
b : Basis ι R M
v : ι → M
e : ι' ≃ ι
⊢ ↑(det (reindex b e.symm)) (v ∘ ↑e) = ↑(det b) v
[PROOFSTEP]
rw [Basis.det_reindex, Function.comp.assoc, e.self_comp_symm, Function.comp.right_id]
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
b : Basis ι R M
f : M ≃ₗ[R] M'
v : ι → M'
⊢ ↑(det (Basis.map b f)) v = ↑(det b) (↑(LinearEquiv.symm f) ∘ v)
[PROOFSTEP]
rw [Basis.det_apply, Basis.toMatrix_map, Basis.det_apply]
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
⊢ Basis.det (basisFun R ι) = detRowAlternating
[PROOFSTEP]
ext M
[GOAL]
case H
R : Type u_1
inst✝⁸ : CommRing R
M✝ : Type u_2
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M✝
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M✝
M : ι → ι → R
⊢ ↑(Basis.det (basisFun R ι)) M = ↑detRowAlternating M
[PROOFSTEP]
rw [Basis.det_apply, Basis.coePiBasisFun.toMatrix_eq_transpose, det_transpose]
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
v : ι → M
hli : LinearIndependent R v
hsp : ⊤ ≤ span R (Set.range v)
i : ι
⊢ ↑(det e) v • coord (Basis.mk hli hsp) i = MultilinearMap.toLinearMap (↑(det e)) v i
[PROOFSTEP]
apply (Basis.mk hli hsp).ext
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
v : ι → M
hli : LinearIndependent R v
hsp : ⊤ ≤ span R (Set.range v)
i : ι
⊢ ∀ (i_1 : ι),
    ↑(↑(det e) v • coord (Basis.mk hli hsp) i) (↑(Basis.mk hli hsp) i_1) =
      ↑(MultilinearMap.toLinearMap (↑(det e)) v i) (↑(Basis.mk hli hsp) i_1)
[PROOFSTEP]
intro k
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
v : ι → M
hli : LinearIndependent R v
hsp : ⊤ ≤ span R (Set.range v)
i k : ι
⊢ ↑(↑(det e) v • coord (Basis.mk hli hsp) i) (↑(Basis.mk hli hsp) k) =
    ↑(MultilinearMap.toLinearMap (↑(det e)) v i) (↑(Basis.mk hli hsp) k)
[PROOFSTEP]
rcases eq_or_ne k i with (rfl | hik)
[GOAL]
case inl
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
v : ι → M
hli : LinearIndependent R v
hsp : ⊤ ≤ span R (Set.range v)
k : ι
⊢ ↑(↑(det e) v • coord (Basis.mk hli hsp) k) (↑(Basis.mk hli hsp) k) =
    ↑(MultilinearMap.toLinearMap (↑(det e)) v k) (↑(Basis.mk hli hsp) k)
[PROOFSTEP]
simp only [Algebra.id.smul_eq_mul, Basis.coe_mk, LinearMap.smul_apply, LinearMap.coe_mk,
  MultilinearMap.toLinearMap_apply]
[GOAL]
case inr
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
v : ι → M
hli : LinearIndependent R v
hsp : ⊤ ≤ span R (Set.range v)
i k : ι
hik : k ≠ i
⊢ ↑(↑(det e) v • coord (Basis.mk hli hsp) i) (↑(Basis.mk hli hsp) k) =
    ↑(MultilinearMap.toLinearMap (↑(det e)) v i) (↑(Basis.mk hli hsp) k)
[PROOFSTEP]
simp only [Algebra.id.smul_eq_mul, Basis.coe_mk, LinearMap.smul_apply, LinearMap.coe_mk,
  MultilinearMap.toLinearMap_apply]
[GOAL]
case inl
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
v : ι → M
hli : LinearIndependent R v
hsp : ⊤ ≤ span R (Set.range v)
k : ι
⊢ ↑(det e) v * ↑(coord (Basis.mk hli hsp) k) (v k) = ↑↑(det e) (update v k (v k))
[PROOFSTEP]
rw [Basis.mk_coord_apply_eq, mul_one, update_eq_self]
[GOAL]
case inl
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
v : ι → M
hli : LinearIndependent R v
hsp : ⊤ ≤ span R (Set.range v)
k : ι
⊢ ↑(det e) v = ↑↑(det e) v
[PROOFSTEP]
congr
[GOAL]
case inr
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
v : ι → M
hli : LinearIndependent R v
hsp : ⊤ ≤ span R (Set.range v)
i k : ι
hik : k ≠ i
⊢ ↑(det e) v * ↑(coord (Basis.mk hli hsp) i) (v k) = ↑↑(det e) (update v i (v k))
[PROOFSTEP]
rw [Basis.mk_coord_apply_ne hik, mul_zero, eq_comm]
[GOAL]
case inr
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
v : ι → M
hli : LinearIndependent R v
hsp : ⊤ ≤ span R (Set.range v)
i k : ι
hik : k ≠ i
⊢ ↑↑(det e) (update v i (v k)) = 0
[PROOFSTEP]
exact e.det.map_eq_zero_of_eq _ (by simp [hik, Function.update_apply]) hik
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
v : ι → M
hli : LinearIndependent R v
hsp : ⊤ ≤ span R (Set.range v)
i k : ι
hik : k ≠ i
⊢ update v i (v k) k = update v i (v k) i
[PROOFSTEP]
simp [hik, Function.update_apply]
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
e : Basis ι R M
w : ι → Rˣ
⊢ det (unitsSMul e w) = ↑(∏ i : ι, w i)⁻¹ • det e
[PROOFSTEP]
ext f
[GOAL]
case H
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
e : Basis ι R M
w : ι → Rˣ
f : ι → M
⊢ ↑(det (unitsSMul e w)) f = ↑(↑(∏ i : ι, w i)⁻¹ • det e) f
[PROOFSTEP]
change (Matrix.det fun i j => (e.unitsSMul w).repr (f j) i) = (↑(∏ i, w i)⁻¹ : R) • Matrix.det fun i j => e.repr (f j) i
[GOAL]
case H
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
e : Basis ι R M
w : ι → Rˣ
f : ι → M
⊢ (Matrix.det fun i j => ↑(↑(unitsSMul e w).repr (f j)) i) =
    ↑(∏ i : ι, w i)⁻¹ • Matrix.det fun i j => ↑(↑e.repr (f j)) i
[PROOFSTEP]
simp only [e.repr_unitsSMul]
[GOAL]
case H
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
e : Basis ι R M
w : ι → Rˣ
f : ι → M
⊢ (Matrix.det fun i j => (w i)⁻¹ • ↑(↑e.repr (f j)) i) = ↑(∏ i : ι, w i)⁻¹ • Matrix.det fun i j => ↑(↑e.repr (f j)) i
[PROOFSTEP]
convert Matrix.det_mul_column (fun i => (↑(w i)⁻¹ : R)) fun i j => e.repr (f j) i
[GOAL]
case h.e'_3.h.e'_1
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
e : Basis ι R M
w : ι → Rˣ
f : ι → M
⊢ ↑(∏ i : ι, w i)⁻¹ = ∏ i : ι, ↑(w i)⁻¹
[PROOFSTEP]
simp only [← Finset.prod_inv_distrib]
  -- Porting note: was `simp [← Finset.prod_inv_distrib]`
[GOAL]
case h.e'_3.h.e'_1
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e✝ : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
e : Basis ι R M
w : ι → Rˣ
f : ι → M
⊢ ↑(∏ x : ι, (w x)⁻¹) = ∏ i : ι, ↑(w i)⁻¹
[PROOFSTEP]
norm_cast
[GOAL]
R : Type u_1
inst✝⁸ : CommRing R
M : Type u_2
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type u_3
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
ι : Type u_4
inst✝³ : DecidableEq ι
inst✝² : Fintype ι
e : Basis ι R M
A : Type u_5
inst✝¹ : CommRing A
inst✝ : Module A M
w : ι → Rˣ
⊢ ↑(det e) ↑(unitsSMul e w) = ∏ i : ι, ↑(w i)
[PROOFSTEP]
simp [Basis.det_apply]