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

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
⊢ (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: 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)
⊢ (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: 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
⊢ (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
⊢ (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: rw [restrict_comp, trace_comp_eq_mul_of_commute_of_isNilpotent μ h_comm
  (f.isNilpotent_restrict_iSup_sub_algebraMap μ), hg, mul_zero]
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: 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)
this : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
⊢ (trace R M) (g ∘ₗ f) = 0
state_after: no goals

tactic: have hds := DirectSum.isInternal_submodule_of_independent_of_iSup_eq_top
  f.independent_genEigenspace hf
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)
this : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 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)
this : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
hds : IsInternal fun μ => ⨆ k, (f.genEigenspace μ) k
⊢ (trace R M) (g ∘ₗ f) = 0

tactic: have h_fin : {μ | ⨆ k, f.genEigenspace μ k ≠ ⊥}.Finite :=
  CompleteLattice.WellFounded.finite_ne_bot_of_independent
    (isNoetherian_iff_wellFounded.mp inferInstance) f.independent_genEigenspace
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)
this : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
hds : IsInternal fun μ => ⨆ 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)
this : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
hds : IsInternal fun μ => ⨆ k, (f.genEigenspace μ) k
h_fin : {μ | ⨆ k, (f.genEigenspace μ) k ≠ ⊥}.Finite
⊢ (trace R M) (g ∘ₗ f) = 0

tactic: 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)
this : ∀ (μ : R), (trace R ↥(⨆ k, (f.genEigenspace μ) k)) ((g ∘ₗ f).restrict ⋯) = 0
hds : IsInternal fun μ => ⨆ k, (f.genEigenspace μ) k
h_fin : {μ | ⨆ k, (f.genEigenspace μ) k ≠ ⊥}.Finite
⊢ (trace R M) (g ∘ₗ f) = 0
state_after: no goals