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

Proof steps:
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✝⁶ : Module.Free R M
inst✝⁵ : Module.Finite R M
inst✝⁴ : Module.Free R N
inst✝³ : Module.Finite R N
inst✝² : Module.Free R P
inst✝¹ : Module.Finite R P
inst✝ : IsReduced R
f g : Module.End R M
μ : R
h_comm : Commute f g
hg : IsNilpotent (g - (algebraMap R (Module.End R M)) μ)
⊢ (trace R M) (f ∘ₗ g) = μ * (trace R M) f
state_after: 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✝⁶ : Module.Free R M
inst✝⁵ : Module.Finite R M
inst✝⁴ : Module.Free R N
inst✝³ : Module.Finite R N
inst✝² : Module.Free R P
inst✝¹ : Module.Finite R P
inst✝ : IsReduced R
f g : Module.End R M
μ : R
h_comm : Commute f g
n : Module.End R M := g - (algebraMap R (Module.End R M)) μ
hg : IsNilpotent n
⊢ (trace R M) (f ∘ₗ g) = μ * (trace R M) f
tactic: set n := g - algebraMap R _ μ
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✝⁶ : Module.Free R M
inst✝⁵ : Module.Finite R M
inst✝⁴ : Module.Free R N
inst✝³ : Module.Finite R N
inst✝² : Module.Free R P
inst✝¹ : Module.Finite R P
inst✝ : IsReduced R
f g : Module.End R M
μ : R
h_comm : Commute f g
n : Module.End R M := g - (algebraMap R (Module.End R M)) μ
hg : IsNilpotent n
⊢ (trace R M) (f ∘ₗ g) = μ * (trace R M) f
state_after: 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✝⁶ : Module.Free R M
inst✝⁵ : Module.Finite R M
inst✝⁴ : Module.Free R N
inst✝³ : Module.Finite R N
inst✝² : Module.Free R P
inst✝¹ : Module.Finite R P
inst✝ : IsReduced R
f g : Module.End R M
μ : R
h_comm : Commute f g
n : Module.End R M := g - (algebraMap R (Module.End R M)) μ
hg : (trace R M) (f ∘ₗ n) = 0
⊢ (trace R M) (f ∘ₗ g) = μ * (trace R M) f
tactic: replace hg : trace R M (f ∘ₗ n) = 0 := by
    rw [← isNilpotent_iff_eq_zero, ← mul_eq_comp]
    refine isNilpotent_trace_of_isNilpotent (Commute.isNilpotent_mul_right ?_ hg)
    exact h_comm.sub_right (Algebra.commute_algebraMap_right μ f)
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✝⁶ : Module.Free R M
inst✝⁵ : Module.Finite R M
inst✝⁴ : Module.Free R N
inst✝³ : Module.Finite R N
inst✝² : Module.Free R P
inst✝¹ : Module.Finite R P
inst✝ : IsReduced R
f g : Module.End R M
μ : R
h_comm : Commute f g
n : Module.End R M := g - (algebraMap R (Module.End R M)) μ
hg : (trace R M) (f ∘ₗ n) = 0
⊢ (trace R M) (f ∘ₗ g) = μ * (trace R M) f
state_after: 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✝⁶ : Module.Free R M
inst✝⁵ : Module.Finite R M
inst✝⁴ : Module.Free R N
inst✝³ : Module.Finite R N
inst✝² : Module.Free R P
inst✝¹ : Module.Finite R P
inst✝ : IsReduced R
f g : Module.End R M
μ : R
h_comm : Commute f g
n : Module.End R M := g - (algebraMap R (Module.End R M)) μ
hg : (trace R M) (f ∘ₗ n) = 0
hμ : g = (algebraMap R (Module.End R M)) μ + n
⊢ (trace R M) (f ∘ₗ g) = μ * (trace R M) f
tactic: have hμ : g = algebraMap R _ μ + n := eq_add_of_sub_eq' rfl
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✝⁶ : Module.Free R M
inst✝⁵ : Module.Finite R M
inst✝⁴ : Module.Free R N
inst✝³ : Module.Finite R N
inst✝² : Module.Free R P
inst✝¹ : Module.Finite R P
inst✝ : IsReduced R
f g : Module.End R M
μ : R
h_comm : Commute f g
n : Module.End R M := g - (algebraMap R (Module.End R M)) μ
hg : (trace R M) (f ∘ₗ n) = 0
hμ : g = (algebraMap R (Module.End R M)) μ + n
⊢ (trace R M) (f ∘ₗ g) = μ * (trace R M) f
state_after: 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✝⁶ : Module.Free R M
inst✝⁵ : Module.Finite R M
inst✝⁴ : Module.Free R N
inst✝³ : Module.Finite R N
inst✝² : Module.Free R P
inst✝¹ : Module.Finite R P
inst✝ : IsReduced R
f g : Module.End R M
μ : R
h_comm : Commute f g
n : Module.End R M := g - (algebraMap R (Module.End R M)) μ
hg : (trace R M) (f ∘ₗ n) = 0
hμ : g = (algebraMap R (Module.End R M)) μ + n
this : f ∘ₗ (algebraMap R (M →ₗ[R] M)) μ = μ • f
⊢ (trace R M) (f ∘ₗ g) = μ * (trace R M) f
tactic: have : f ∘ₗ algebraMap R _ μ = μ • f := by ext; simp
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✝⁶ : Module.Free R M
inst✝⁵ : Module.Finite R M
inst✝⁴ : Module.Free R N
inst✝³ : Module.Finite R N
inst✝² : Module.Free R P
inst✝¹ : Module.Finite R P
inst✝ : IsReduced R
f g : Module.End R M
μ : R
h_comm : Commute f g
n : Module.End R M := g - (algebraMap R (Module.End R M)) μ
hg : (trace R M) (f ∘ₗ n) = 0
hμ : g = (algebraMap R (Module.End R M)) μ + n
this : f ∘ₗ (algebraMap R (M →ₗ[R] M)) μ = μ • f
⊢ (trace R M) (f ∘ₗ g) = μ * (trace R M) f
state_after: no goals
tactic: rw [hμ, comp_add, map_add, hg, add_zero, this, LinearMap.map_smul, smul_eq_mul]