Theorem: Algebra.trace_trace_of_basis
File: Mathlib/RingTheory/Trace.lean

tactic: haveI := Classical.decEq ι
state_before: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
⊢ (trace R S) ((trace S T) x) = (trace R T) x
state_after: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this : DecidableEq ι
⊢ (trace R S) ((trace S T) x) = (trace R T) x

tactic: haveI := Classical.decEq κ
state_before: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this : DecidableEq ι
⊢ (trace R S) ((trace S T) x) = (trace R T) x
state_after: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this✝ : DecidableEq ι
this : DecidableEq κ
⊢ (trace R S) ((trace S T) x) = (trace R T) x

tactic: cases nonempty_fintype ι
state_before: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this✝ : DecidableEq ι
this : DecidableEq κ
⊢ (trace R S) ((trace S T) x) = (trace R T) x
state_after: case intro
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this✝ : DecidableEq ι
this : DecidableEq κ
val✝ : Fintype ι
⊢ (trace R S) ((trace S T) x) = (trace R T) x

tactic: cases nonempty_fintype κ
state_before: case intro
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this✝ : DecidableEq ι
this : DecidableEq κ
val✝ : Fintype ι
⊢ (trace R S) ((trace S T) x) = (trace R T) x
state_after: case intro.intro
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this✝ : DecidableEq ι
this : DecidableEq κ
val✝¹ : Fintype ι
val✝ : Fintype κ
⊢ (trace R S) ((trace S T) x) = (trace R T) x

tactic: rw [trace_eq_matrix_trace (b.smul c), trace_eq_matrix_trace b, trace_eq_matrix_trace c,
  Matrix.trace, Matrix.trace, Matrix.trace, ← Finset.univ_product_univ, Finset.sum_product]
state_before: case intro.intro
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this✝ : DecidableEq ι
this : DecidableEq κ
val✝¹ : Fintype ι
val✝ : Fintype κ
⊢ (trace R S) ((trace S T) x) = (trace R T) x
state_after: case intro.intro
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this✝ : DecidableEq ι
this : DecidableEq κ
val✝¹ : Fintype ι
val✝ : Fintype κ
⊢ ∑ i : ι, ((leftMulMatrix b) (∑ i : κ, ((leftMulMatrix c) x).diag i)).diag i =
    ∑ x_1 : ι, ∑ y : κ, ((leftMulMatrix (b.smul c)) x).diag (x_1, y)

tactic: refine Finset.sum_congr rfl fun i _ ↦ ?_
state_before: case intro.intro
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this✝ : DecidableEq ι
this : DecidableEq κ
val✝¹ : Fintype ι
val✝ : Fintype κ
⊢ ∑ i : ι, ((leftMulMatrix b) (∑ i : κ, ((leftMulMatrix c) x).diag i)).diag i =
    ∑ x_1 : ι, ∑ y : κ, ((leftMulMatrix (b.smul c)) x).diag (x_1, y)
state_after: case intro.intro
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this✝ : DecidableEq ι
this : DecidableEq κ
val✝¹ : Fintype ι
val✝ : Fintype κ
i : ι
x✝ : i ∈ Finset.univ
⊢ ((leftMulMatrix b) (∑ i : κ, ((leftMulMatrix c) x).diag i)).diag i =
    ∑ y : κ, ((leftMulMatrix (b.smul c)) x).diag (i, y)

tactic: simp only [AlgHom.map_sum, smul_leftMulMatrix, Finset.sum_apply,
  Matrix.diag, Finset.sum_apply
    i (Finset.univ : Finset κ) fun y => leftMulMatrix b (leftMulMatrix c x y y)]
state_before: case intro.intro
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹² : CommRing R
inst✝¹¹ : CommRing S
inst✝¹⁰ : CommRing T
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R T
K : Type u_4
L : Type u_5
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Algebra K L
ι✝ κ✝ : Type w
inst✝⁴ : Fintype ι✝
b✝ : Basis ι✝ R S
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
ι : Type u_6
κ : Type u_7
inst✝¹ : Finite ι
inst✝ : Finite κ
b : Basis ι R S
c : Basis κ S T
x : T
this✝ : DecidableEq ι
this : DecidableEq κ
val✝¹ : Fintype ι
val✝ : Fintype κ
i : ι
x✝ : i ∈ Finset.univ
⊢ ((leftMulMatrix b) (∑ i : κ, ((leftMulMatrix c) x).diag i)).diag i =
    ∑ y : κ, ((leftMulMatrix (b.smul c)) x).diag (i, y)
state_after: no goals