Theorem: LinearMap.charpoly_toMatrix
File: Mathlib/LinearAlgebra/Charpoly/ToMatrix.lean

tactic: let A := toMatrix b b f
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: let b' := chooseBasis R M
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: let ι' := ChooseBasisIndex R M
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: let A' := toMatrix b' b' f
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: let e := Basis.indexEquiv b b'
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: let φ := reindexLinearEquiv R R e e
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: let φ₁ := reindexLinearEquiv R R e (Equiv.refl ι')
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: let φ₂ := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: let φ₃ := reindexLinearEquiv R R (Equiv.refl ι') e
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: let P := b.toMatrix b'
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: let Q := b'.toMatrix b
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: have hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1 := by
  rw [RingHom.mapMatrix_apply, RingHom.mapMatrix_apply, ← Matrix.map_mul,
    reindexLinearEquiv_mul R R, Basis.toMatrix_mul_toMatrix_flip,
    reindexLinearEquiv_one, ← RingHom.mapMatrix_apply, RingHom.map_one]
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ ((toMatrix b b) f).charpoly = f.charpoly

tactic: calc
  A.charpoly = (reindex e e A).charpoly := (charpoly_reindex _ _).symm
  _ = det (scalar ι' X - C.mapMatrix (φ A)) := rfl
  _ = det (scalar ι' X - C.mapMatrix (φ (P * A' * Q))) := by
    rw [basis_toMatrix_mul_linearMap_toMatrix_mul_basis_toMatrix]
  _ = det (scalar ι' X - C.mapMatrix (φ₁ P * φ₂ A' * φ₃ Q)) := by
    rw [reindexLinearEquiv_mul, reindexLinearEquiv_mul]
  _ = det (scalar ι' X - C.mapMatrix (φ₁ P) * C.mapMatrix A' * C.mapMatrix (φ₃ Q)) := by simp [φ₂]
  _ = det (scalar ι' X * C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) -
        C.mapMatrix (φ₁ P) * C.mapMatrix A' * C.mapMatrix (φ₃ Q)) := by
    rw [Matrix.mul_assoc ((scalar ι') X), hPQ, Matrix.mul_one]
  _ = det (C.mapMatrix (φ₁ P) * scalar ι' X * C.mapMatrix (φ₃ Q) -
        C.mapMatrix (φ₁ P) * C.mapMatrix A' * C.mapMatrix (φ₃ Q)) := by
    rw [scalar_commute _ commute_X]
  _ = det (C.mapMatrix (φ₁ P) * (scalar ι' X - C.mapMatrix A') * C.mapMatrix (φ₃ Q)) := by
    rw [← Matrix.sub_mul, ← Matrix.mul_sub]
  _ = det (C.mapMatrix (φ₁ P)) * det (scalar ι' X - C.mapMatrix A') * det (C.mapMatrix (φ₃ Q)) :=
    by rw [det_mul, det_mul]
  _ = det (C.mapMatrix (φ₁ P)) * det (C.mapMatrix (φ₃ Q)) * det (scalar ι' X - C.mapMatrix A') :=
    by ring
  _ = det (scalar ι' X - C.mapMatrix A') := by
    rw [← det_mul, hPQ, det_one, one_mul]
  _ = f.charpoly := rfl
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ ((toMatrix b b) f).charpoly = f.charpoly
state_after: no goals

tactic: rw [RingHom.mapMatrix_apply, RingHom.mapMatrix_apply, ← Matrix.map_mul,
  reindexLinearEquiv_mul R R, Basis.toMatrix_mul_toMatrix_flip,
  reindexLinearEquiv_one, ← RingHom.mapMatrix_apply, RingHom.map_one]
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
⊢ C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
state_after: no goals

tactic: rw [basis_toMatrix_mul_linearMap_toMatrix_mul_basis_toMatrix]
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ ((scalar ι') X - C.mapMatrix (φ A)).det = ((scalar ι') X - C.mapMatrix (φ (P * A' * Q))).det
state_after: no goals

tactic: rw [reindexLinearEquiv_mul, reindexLinearEquiv_mul]
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ ((scalar ι') X - C.mapMatrix (φ (P * A' * Q))).det = ((scalar ι') X - C.mapMatrix (φ₁ P * φ₂ A' * φ₃ Q)).det
state_after: no goals

tactic: simp [φ₂]
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ ((scalar ι') X - C.mapMatrix (φ₁ P * φ₂ A' * φ₃ Q)).det =
    ((scalar ι') X - C.mapMatrix (φ₁ P) * C.mapMatrix A' * C.mapMatrix (φ₃ Q)).det
state_after: no goals

tactic: rw [Matrix.mul_assoc ((scalar ι') X), hPQ, Matrix.mul_one]
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ ((scalar ι') X - C.mapMatrix (φ₁ P) * C.mapMatrix A' * C.mapMatrix (φ₃ Q)).det =
    ((scalar ι') X * C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) -
        C.mapMatrix (φ₁ P) * C.mapMatrix A' * C.mapMatrix (φ₃ Q)).det
state_after: no goals

tactic: rw [scalar_commute _ commute_X]
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ ((scalar ι') X * C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) -
        C.mapMatrix (φ₁ P) * C.mapMatrix A' * C.mapMatrix (φ₃ Q)).det =
    (C.mapMatrix (φ₁ P) * (scalar ι') X * C.mapMatrix (φ₃ Q) -
        C.mapMatrix (φ₁ P) * C.mapMatrix A' * C.mapMatrix (φ₃ Q)).det
state_after: no goals

tactic: rw [← Matrix.sub_mul, ← Matrix.mul_sub]
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ (C.mapMatrix (φ₁ P) * (scalar ι') X * C.mapMatrix (φ₃ Q) -
        C.mapMatrix (φ₁ P) * C.mapMatrix A' * C.mapMatrix (φ₃ Q)).det =
    (C.mapMatrix (φ₁ P) * ((scalar ι') X - C.mapMatrix A') * C.mapMatrix (φ₃ Q)).det
state_after: no goals

tactic: rw [det_mul, det_mul]
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ (C.mapMatrix (φ₁ P) * ((scalar ι') X - C.mapMatrix A') * C.mapMatrix (φ₃ Q)).det =
    (C.mapMatrix (φ₁ P)).det * ((scalar ι') X - C.mapMatrix A').det * (C.mapMatrix (φ₃ Q)).det
state_after: no goals

tactic: ring
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ (C.mapMatrix (φ₁ P)).det * ((scalar ι') X - C.mapMatrix A').det * (C.mapMatrix (φ₃ Q)).det =
    (C.mapMatrix (φ₁ P)).det * (C.mapMatrix (φ₃ Q)).det * ((scalar ι') X - C.mapMatrix A').det
state_after: no goals

tactic: rw [← det_mul, hPQ, det_one, one_mul]
state_before: R : Type u_1
M : Type u_2
M₁ : Type u_3
M₂ : Type u_4
inst✝¹⁵ : CommRing R
inst✝¹⁴ : Nontrivial R
inst✝¹³ : AddCommGroup M
inst✝¹² : Module R M
inst✝¹¹ : Module.Free R M
inst✝¹⁰ : Module.Finite R M
inst✝⁹ : AddCommGroup M₁
inst✝⁸ : Module R M₁
inst✝⁷ : Module.Finite R M₁
inst✝⁶ : Module.Free R M₁
inst✝⁵ : AddCommGroup M₂
inst✝⁴ : Module R M₂
inst✝³ : Module.Finite R M₂
inst✝² : Module.Free R M₂
f : M →ₗ[R] M
ι : Type w
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
b : Basis ι R M
A : Matrix ι ι R := (toMatrix b b) f
b' : Basis (ChooseBasisIndex R M) R M := chooseBasis R M
ι' : Type u_2 := ChooseBasisIndex R M
A' : Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := (toMatrix b' b') f
e : ι ≃ ChooseBasisIndex R M := b.indexEquiv b'
φ : Matrix ι ι R ≃ₗ[R] Matrix (ChooseBasisIndex R M) (ChooseBasisIndex R M) R := reindexLinearEquiv R R e e
φ₁ : Matrix ι ι' R ≃ₗ[R] Matrix (ChooseBasisIndex R M) ι' R := reindexLinearEquiv R R e (Equiv.refl ι')
φ₂ : Matrix ι' ι' R ≃ₗ[R] Matrix ι' ι' R := reindexLinearEquiv R R (Equiv.refl ι') (Equiv.refl ι')
φ₃ : Matrix ι' ι R ≃ₗ[R] Matrix ι' (ChooseBasisIndex R M) R := reindexLinearEquiv R R (Equiv.refl ι') e
P : Matrix ι (ChooseBasisIndex R M) R := b.toMatrix ⇑b'
Q : Matrix (ChooseBasisIndex R M) ι R := b'.toMatrix ⇑b
hPQ : C.mapMatrix (φ₁ P) * C.mapMatrix (φ₃ Q) = 1
⊢ (C.mapMatrix (φ₁ P)).det * (C.mapMatrix (φ₃ Q)).det * ((scalar ι') X - C.mapMatrix A').det =
    ((scalar ι') X - C.mapMatrix A').det
state_after: no goals