Theorem: LinearMap.trace_comp_eq_zero_of_commute_of_trace_restrict_eq_zero
File: Mathlib/Algebra/DirectSum/LinearMap.lean

Proof steps:
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
N : ι → Submodule R M
inst✝⁶ : DecidableEq ι
h : IsInternal N
inst✝⁵ : ∀ (i : ι), Module.Finite R ↥(N i)
inst✝⁴ : ∀ (i : ι), Module.Free R ↥(N i)
inst✝³ : IsDomain R
inst✝² : IsPrincipalIdealRing R
inst✝¹ : Module.Free R M
inst✝ : Module.Finite R M
f g : Module.End R M
h_comm : Commute f g
hf : ⨆ μ, ⨆ k, (f.genEigenspace μ) k = ⊤
hg : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) (restrict g ⋯) = 0
⊢ (trace R M) (g ∘ₗ f) = 0
state_after: ι : Type u_1
R : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
N : ι → Submodule R M
inst✝⁶ : DecidableEq ι
h : IsInternal N
inst✝⁵ : ∀ (i : ι), Module.Finite R ↥(N i)
inst✝⁴ : ∀ (i : ι), Module.Free R ↥(N i)
inst✝³ : IsDomain R
inst✝² : IsPrincipalIdealRing R
inst✝¹ : Module.Free R M
inst✝ : Module.Finite R M
f g : Module.End R M
h_comm : Commute f g
hf : ⨆ μ, ⨆ k, (f.genEigenspace μ) k = ⊤
hg : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) (restrict g ⋯) = 0
hfg : ∀ (μ : R), MapsTo ⇑(g ∘ₗ f) ↑(⨆ k, (f.genEigenspace μ) k) ↑(⨆ k, (f.genEigenspace μ) k)
⊢ (trace R M) (g ∘ₗ f) = 0
tactic: have hfg : ∀ μ,
      MapsTo (g ∘ₗ f) ↑(⨆ k, f.genEigenspace μ k) ↑(⨆ k, f.genEigenspace μ k) :=
    fun μ ↦ (f.mapsTo_iSup_genEigenspace_of_comm h_comm μ).comp
      (f.mapsTo_iSup_genEigenspace_of_comm rfl μ)
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
N : ι → Submodule R M
inst✝⁶ : DecidableEq ι
h : IsInternal N
inst✝⁵ : ∀ (i : ι), Module.Finite R ↥(N i)
inst✝⁴ : ∀ (i : ι), Module.Free R ↥(N i)
inst✝³ : IsDomain R
inst✝² : IsPrincipalIdealRing R
inst✝¹ : Module.Free R M
inst✝ : Module.Finite R M
f g : Module.End R M
h_comm : Commute f g
hf : ⨆ μ, ⨆ k, (f.genEigenspace μ) k = ⊤
hg : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) (restrict g ⋯) = 0
hfg : ∀ (μ : R), MapsTo ⇑(g ∘ₗ f) ↑(⨆ k, (f.genEigenspace μ) k) ↑(⨆ k, (f.genEigenspace μ) k)
⊢ (trace R M) (g ∘ₗ f) = 0
state_after: ι : Type u_1
R : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
N : ι → Submodule R M
inst✝⁶ : DecidableEq ι
h : IsInternal N
inst✝⁵ : ∀ (i : ι), Module.Finite R ↥(N i)
inst✝⁴ : ∀ (i : ι), Module.Free R ↥(N i)
inst✝³ : IsDomain R
inst✝² : IsPrincipalIdealRing R
inst✝¹ : Module.Free R M
inst✝ : Module.Finite R M
f g : Module.End R M
h_comm : Commute f g
hf : ⨆ μ, ⨆ k, (f.genEigenspace μ) k = ⊤
hg : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) (restrict g ⋯) = 0
hfg : ∀ (μ : R), MapsTo ⇑(g ∘ₗ f) ↑(⨆ k, (f.genEigenspace μ) k) ↑(⨆ k, (f.genEigenspace μ) k)
⊢ ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
tactic: suffices ∀ μ, trace R _ ((g ∘ₗ f).restrict (hfg μ)) = 0 by
    classical
    have hds := DirectSum.isInternal_submodule_of_independent_of_iSup_eq_top
      f.independent_genEigenspace hf
    have h_fin : {μ | ⨆ k, f.genEigenspace μ k ≠ ⊥}.Finite :=
      CompleteLattice.WellFounded.finite_ne_bot_of_independent
        (isNoetherian_iff_wellFounded.mp inferInstance) f.independent_genEigenspace
    simp [trace_eq_sum_trace_restrict' hds h_fin hfg, this]
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
N : ι → Submodule R M
inst✝⁶ : DecidableEq ι
h : IsInternal N
inst✝⁵ : ∀ (i : ι), Module.Finite R ↥(N i)
inst✝⁴ : ∀ (i : ι), Module.Free R ↥(N i)
inst✝³ : IsDomain R
inst✝² : IsPrincipalIdealRing R
inst✝¹ : Module.Free R M
inst✝ : Module.Finite R M
f g : Module.End R M
h_comm : Commute f g
hf : ⨆ μ, ⨆ k, (f.genEigenspace μ) k = ⊤
hg : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) (restrict g ⋯) = 0
hfg : ∀ (μ : R), MapsTo ⇑(g ∘ₗ f) ↑(⨆ k, (f.genEigenspace μ) k) ↑(⨆ k, (f.genEigenspace μ) k)
⊢ ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
state_after: ι : Type u_1
R : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
N : ι → Submodule R M
inst✝⁶ : DecidableEq ι
h : IsInternal N
inst✝⁵ : ∀ (i : ι), Module.Finite R ↥(N i)
inst✝⁴ : ∀ (i : ι), Module.Free R ↥(N i)
inst✝³ : IsDomain R
inst✝² : IsPrincipalIdealRing R
inst✝¹ : Module.Free R M
inst✝ : Module.Finite R M
f g : Module.End R M
h_comm : Commute f g
hf : ⨆ μ, ⨆ k, (f.genEigenspace μ) k = ⊤
hg : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) (restrict g ⋯) = 0
hfg : ∀ (μ : R), MapsTo ⇑(g ∘ₗ f) ↑(⨆ k, (f.genEigenspace μ) k) ↑(⨆ k, (f.genEigenspace μ) k)
μ : R
⊢ (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
tactic: intro μ
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
N : ι → Submodule R M
inst✝⁶ : DecidableEq ι
h : IsInternal N
inst✝⁵ : ∀ (i : ι), Module.Finite R ↥(N i)
inst✝⁴ : ∀ (i : ι), Module.Free R ↥(N i)
inst✝³ : IsDomain R
inst✝² : IsPrincipalIdealRing R
inst✝¹ : Module.Free R M
inst✝ : Module.Finite R M
f g : Module.End R M
h_comm : Commute f g
hf : ⨆ μ, ⨆ k, (f.genEigenspace μ) k = ⊤
hg : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) (restrict g ⋯) = 0
hfg : ∀ (μ : R), MapsTo ⇑(g ∘ₗ f) ↑(⨆ k, (f.genEigenspace μ) k) ↑(⨆ k, (f.genEigenspace μ) k)
μ : R
⊢ (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
state_after: ι : Type u_1
R : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
N : ι → Submodule R M
inst✝⁶ : DecidableEq ι
h : IsInternal N
inst✝⁵ : ∀ (i : ι), Module.Finite R ↥(N i)
inst✝⁴ : ∀ (i : ι), Module.Free R ↥(N i)
inst✝³ : IsDomain R
inst✝² : IsPrincipalIdealRing R
inst✝¹ : Module.Free R M
inst✝ : Module.Finite R M
f g : Module.End R M
h_comm✝ : Commute f g
hf : ⨆ μ, ⨆ k, (f.genEigenspace μ) k = ⊤
hg : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) (restrict g ⋯) = 0
hfg : ∀ (μ : R), MapsTo ⇑(g ∘ₗ f) ↑(⨆ k, (f.genEigenspace μ) k) ↑(⨆ k, (f.genEigenspace μ) k)
μ : R
h_comm : Commute (restrict g ⋯) (restrict f ⋯)
⊢ (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
tactic: replace h_comm : Commute (g.restrict (f.mapsTo_iSup_genEigenspace_of_comm h_comm μ))
      (f.restrict (f.mapsTo_iSup_genEigenspace_of_comm rfl μ)) :=
    restrict_commute h_comm.symm _ _
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
N : ι → Submodule R M
inst✝⁶ : DecidableEq ι
h : IsInternal N
inst✝⁵ : ∀ (i : ι), Module.Finite R ↥(N i)
inst✝⁴ : ∀ (i : ι), Module.Free R ↥(N i)
inst✝³ : IsDomain R
inst✝² : IsPrincipalIdealRing R
inst✝¹ : Module.Free R M
inst✝ : Module.Finite R M
f g : Module.End R M
h_comm✝ : Commute f g
hf : ⨆ μ, ⨆ k, (f.genEigenspace μ) k = ⊤
hg : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) (restrict g ⋯) = 0
hfg : ∀ (μ : R), MapsTo ⇑(g ∘ₗ f) ↑(⨆ k, (f.genEigenspace μ) k) ↑(⨆ k, (f.genEigenspace μ) k)
μ : R
h_comm : Commute (restrict g ⋯) (restrict f ⋯)
⊢ (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
state_after: no goals
tactic: rw [restrict_comp, trace_comp_eq_mul_of_commute_of_isNilpotent μ h_comm
    (f.isNilpotent_restrict_iSup_sub_algebraMap μ), hg, mul_zero]