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

tactic: cases nonempty_fintype ι
state_before: R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
⊢ trace R M ∘ₗ dualTensorHom R M M = contractLeft R M
state_after: case intro
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
⊢ 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_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
⊢ trace R M ∘ₗ dualTensorHom R M M = contractLeft R M
state_after: case intro
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
⊢ ∀ (i : ι × ι),
    (trace R M ∘ₗ dualTensorHom R M M) ((b.dualBasis.tensorProduct b) i) =
      (contractLeft R M) ((b.dualBasis.tensorProduct b) i)

tactic: rintro ⟨i, j⟩
state_before: case intro
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
⊢ ∀ (i : ι × ι),
    (trace R M ∘ₗ dualTensorHom R M M) ((b.dualBasis.tensorProduct b) i) =
      (contractLeft R M) ((b.dualBasis.tensorProduct b) i)
state_after: case intro.mk
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
⊢ (trace R M ∘ₗ dualTensorHom R M M) ((b.dualBasis.tensorProduct b) (i, j)) =
    (contractLeft R M) ((b.dualBasis.tensorProduct b) (i, j))

tactic: simp only [Function.comp_apply, Basis.tensorProduct_apply, Basis.coe_dualBasis, coe_comp]
state_before: case intro.mk
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
⊢ (trace R M ∘ₗ dualTensorHom R M M) ((b.dualBasis.tensorProduct b) (i, j)) =
    (contractLeft R M) ((b.dualBasis.tensorProduct b) (i, j))
state_after: case intro.mk
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
⊢ (trace R M) ((dualTensorHom R M M) (b.coord i ⊗ₜ[R] b j)) = (contractLeft R M) (b.coord i ⊗ₜ[R] b j)

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

tactic: by_cases hij : i = j
state_before: case intro.mk
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
⊢ (stdBasisMatrix j i 1).trace = (contractLeft R M) (b.coord i ⊗ₜ[R] b j)
state_after: case pos
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
hij : i = j
⊢ (stdBasisMatrix j i 1).trace = (contractLeft R M) (b.coord i ⊗ₜ[R] b j)

case neg
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
hij : ¬i = j
⊢ (stdBasisMatrix j i 1).trace = (contractLeft R M) (b.coord i ⊗ₜ[R] b j)

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

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

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

tactic: simp
state_before: case pos
R : Type u_1
inst✝⁷ : CommRing R
M : Type u_2
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
N : Type u_3
P : Type u_4
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
ι : Type u_5
inst✝ : Finite ι
b : Basis ι R M
val✝ : Fintype ι
i j : ι
hij : i = j
⊢ (stdBasisMatrix j j 1).trace = (contractLeft R M) (b.coord j ⊗ₜ[R] b j)
state_after: no goals