Theorem: LinearMap.trace_eq_contract_of_basis
File: Mathlib/LinearAlgebra/Trace.lean

tactic: cases nonempty_fintype ι
state_before: R : Type u_2
inst✝⁵ : CommRing R
M : Type u_3
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.321532
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
⊢ comp (trace R M) (dualTensorHom R M M) = contractLeft R M

tactic: apply Basis.ext (Basis.tensorProduct (Basis.dualBasis b) b)
state_before: case intro
R : Type u_2
inst✝⁵ : CommRing R
M : Type u_3
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.321532
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
⊢ comp (trace R M) (dualTensorHom R M M) = contractLeft R M

tactic: rintro ⟨i, j⟩
state_before: case intro
R : Type u_2
inst✝⁵ : CommRing R
M : Type u_3
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.321532
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
⊢ ∀ (i : ι × ι),
    ↑(comp (trace R M) (dualTensorHom R M M)) (↑(Basis.tensorProduct (Basis.dualBasis b) b) i) =
      ↑(contractLeft R M) (↑(Basis.tensorProduct (Basis.dualBasis b) b) i)

tactic: simp only [Function.comp_apply, Basis.tensorProduct_apply, Basis.coe_dualBasis, coe_comp]
state_before: case intro.mk
R : Type u_2
inst✝⁵ : CommRing R
M : Type u_3
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.321532
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
⊢ ↑(comp (trace R M) (dualTensorHom R M M)) (↑(Basis.tensorProduct (Basis.dualBasis b) b) (i, j)) =
    ↑(contractLeft R M) (↑(Basis.tensorProduct (Basis.dualBasis b) b) (i, j))

tactic: rw [trace_eq_matrix_trace R b, toMatrix_dualTensorHom]
state_before: case intro.mk
R : Type u_2
inst✝⁵ : CommRing R
M : Type u_3
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.321532
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
⊢ ↑(trace R M) (↑(dualTensorHom R M M) (Basis.coord b i ⊗ₜ[R] ↑b j)) = ↑(contractLeft R M) (Basis.coord b i ⊗ₜ[R] ↑b j)

tactic: by_cases hij : i = j
state_before: case intro.mk
R : Type u_2
inst✝⁵ : CommRing R
M : Type u_3
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.321532
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
⊢ Matrix.trace (stdBasisMatrix j i 1) = ↑(contractLeft R M) (Basis.coord b i ⊗ₜ[R] ↑b j)

tactic: rw [Matrix.StdBasisMatrix.trace_zero j i (1 : R) hij]
state_before: case neg
R : Type u_2
inst✝⁵ : CommRing R
M : Type u_3
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.321532
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
hij : ¬i = j
⊢ Matrix.trace (stdBasisMatrix j i 1) = ↑(contractLeft R M) (Basis.coord b i ⊗ₜ[R] ↑b j)

tactic: simp [Finsupp.single_eq_pi_single, hij]
state_before: case neg
R : Type u_2
inst✝⁵ : CommRing R
M : Type u_3
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.321532
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
hij : ¬i = j
⊢ 0 = ↑(contractLeft R M) (Basis.coord b i ⊗ₜ[R] ↑b j)

tactic: rw [hij]
state_before: case pos
R : Type u_2
inst✝⁵ : CommRing R
M : Type u_3
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.321532
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
hij : i = j
⊢ Matrix.trace (stdBasisMatrix j i 1) = ↑(contractLeft R M) (Basis.coord b i ⊗ₜ[R] ↑b j)

tactic: simp
state_before: case pos
R : Type u_2
inst✝⁵ : CommRing R
M : Type u_3
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.321532
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u_1
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
hij : i = j
⊢ Matrix.trace (stdBasisMatrix j j 1) = ↑(contractLeft R M) (Basis.coord b j ⊗ₜ[R] ↑b j)