Theorem: Module.End.IsSemisimple.of_mem_adjoin_pair
File: Mathlib/LinearAlgebra/Semisimple.lean

tactic: let R := K[X] ⧸ Ideal.span {minpoly K f}
state_before: R : Type u_1
M : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
⊢ a.IsSemisimple

tactic: let S := AdjoinRoot ((minpoly K g).map <| algebraMap K R)
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
⊢ a.IsSemisimple

tactic: have : Finite K R :=
  (AdjoinRoot.powerBasis' <| minpoly.monic <| Algebra.IsIntegral.isIntegral f).finite
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this : Finite K R
⊢ a.IsSemisimple

tactic: have : Finite R S :=
  (AdjoinRoot.powerBasis' <| (minpoly.monic <| Algebra.IsIntegral.isIntegral g).map _).finite
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this : Finite K R
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝ : Finite K R
this : Finite R S
⊢ a.IsSemisimple

tactic: have : IsScalarTower K R S := .of_algebraMap_eq fun _ ↦ rfl
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝ : Finite K R
this : Finite R S
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝¹ : Finite K R
this✝ : Finite R S
this : IsScalarTower K R S
⊢ a.IsSemisimple

tactic: have : Finite K S := .trans R S
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝¹ : Finite K R
this✝ : Finite R S
this : IsScalarTower K R S
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝² : Finite K R
this✝¹ : Finite R S
this✝ : IsScalarTower K R S
this : Finite K S
⊢ a.IsSemisimple

tactic: have : IsArtinianRing R := .of_finite K R
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝² : Finite K R
this✝¹ : Finite R S
this✝ : IsScalarTower K R S
this : Finite K S
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝³ : Finite K R
this✝² : Finite R S
this✝¹ : IsScalarTower K R S
this✝ : Finite K S
this : IsArtinianRing R
⊢ a.IsSemisimple

tactic: have : IsReduced R := (Ideal.isRadical_iff_quotient_reduced _).mp <|
  span_minpoly_eq_annihilator K f ▸ hf.annihilator_isRadical
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝³ : Finite K R
this✝² : Finite R S
this✝¹ : IsScalarTower K R S
this✝ : Finite K S
this : IsArtinianRing R
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁴ : Finite K R
this✝³ : Finite R S
this✝² : IsScalarTower K R S
this✝¹ : Finite K S
this✝ : IsArtinianRing R
this : IsReduced R
⊢ a.IsSemisimple

tactic: have : IsReduced S := by
  simp_rw [S, AdjoinRoot, ← Ideal.isRadical_iff_quotient_reduced, ← isRadical_iff_span_singleton]
  exact (PerfectField.separable_iff_squarefree.mpr hg.minpoly_squarefree).map.squarefree.isRadical
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁴ : Finite K R
this✝³ : Finite R S
this✝² : IsScalarTower K R S
this✝¹ : Finite K S
this✝ : IsArtinianRing R
this : IsReduced R
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
⊢ a.IsSemisimple

tactic: let φ : S →ₐ[K] End K M := Ideal.Quotient.liftₐ _ (eval₂AlgHom' (Ideal.Quotient.liftₐ _ (aeval f)
  fun a ↦ ?_) g ?_) ((Ideal.span_singleton_le_iff_mem _).mpr ?_ : _ ≤ RingHom.ker _)
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
⊢ a.IsSemisimple
state_after: case refine_4
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ?refine_2) ⋯
⊢ a.IsSemisimple

case refine_1
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a✝ : End K M
ha : a✝ ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
a : K[X]
⊢ a ∈ Ideal.span {minpoly K f} → (aeval f) a = 0

case refine_2
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
⊢ ∀ (a : R), Commute ((Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) a) g

case refine_3
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
⊢ map (algebraMap K R) (minpoly K g) ∈
    RingHom.ker (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ?refine_2)

tactic: rotate_left 1
state_before: case refine_4
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ?refine_2) ⋯
⊢ a.IsSemisimple

case refine_1
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a✝ : End K M
ha : a✝ ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
a : K[X]
⊢ a ∈ Ideal.span {minpoly K f} → (aeval f) a = 0

case refine_2
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
⊢ ∀ (a : R), Commute ((Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) a) g

case refine_3
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
⊢ map (algebraMap K R) (minpoly K g) ∈
    RingHom.ker (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ?refine_2)
state_after: case refine_1
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a✝ : End K M
ha : a✝ ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
a : K[X]
⊢ a ∈ Ideal.span {minpoly K f} → (aeval f) a = 0

case refine_2
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
⊢ ∀ (a : R), Commute ((Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) a) g

case refine_3
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
⊢ map (algebraMap K R) (minpoly K g) ∈
    RingHom.ker (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ?refine_2)

case refine_4
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ?refine_2) ⋯
⊢ a.IsSemisimple

tactic: obtain ⟨p, rfl⟩ := (AlgHom.mem_range _).mp (this ha)
state_before: case refine_4
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁶ : Finite K R
this✝⁵ : Finite R S
this✝⁴ : IsScalarTower K R S
this✝³ : Finite K S
this✝² : IsArtinianRing R
this✝¹ : IsReduced R
this✝ : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯) ⋯
this : Algebra.adjoin K {f, g} ≤ φ.range
⊢ a.IsSemisimple
state_after: case refine_4.intro
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁶ : Finite K R
this✝⁵ : Finite R S
this✝⁴ : IsScalarTower K R S
this✝³ : Finite K S
this✝² : IsArtinianRing R
this✝¹ : IsReduced R
this✝ : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯) ⋯
this : Algebra.adjoin K {f, g} ≤ φ.range
p : S
ha : φ p ∈ Algebra.adjoin K {f, g}
⊢ (φ p).IsSemisimple

tactic: refine isSemisimple_of_squarefree_aeval_eq_zero
  ((minpoly.isRadical K p).squarefree <| minpoly.ne_zero <| .of_finite K p) ?_
state_before: case refine_4.intro
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁶ : Finite K R
this✝⁵ : Finite R S
this✝⁴ : IsScalarTower K R S
this✝³ : Finite K S
this✝² : IsArtinianRing R
this✝¹ : IsReduced R
this✝ : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯) ⋯
this : Algebra.adjoin K {f, g} ≤ φ.range
p : S
ha : φ p ∈ Algebra.adjoin K {f, g}
⊢ (φ p).IsSemisimple
state_after: case refine_4.intro
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁶ : Finite K R
this✝⁵ : Finite R S
this✝⁴ : IsScalarTower K R S
this✝³ : Finite K S
this✝² : IsArtinianRing R
this✝¹ : IsReduced R
this✝ : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯) ⋯
this : Algebra.adjoin K {f, g} ≤ φ.range
p : S
ha : φ p ∈ Algebra.adjoin K {f, g}
⊢ (aeval (φ p)) (minpoly K p) = 0

tactic: rw [aeval_algHom, φ.comp_apply, minpoly.aeval, φ.map_zero]
state_before: case refine_4.intro
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁶ : Finite K R
this✝⁵ : Finite R S
this✝⁴ : IsScalarTower K R S
this✝³ : Finite K S
this✝² : IsArtinianRing R
this✝¹ : IsReduced R
this✝ : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯) ⋯
this : Algebra.adjoin K {f, g} ≤ φ.range
p : S
ha : φ p ∈ Algebra.adjoin K {f, g}
⊢ (aeval (φ p)) (minpoly K p) = 0
state_after: no goals

tactic: simp_rw [S, AdjoinRoot, ← Ideal.isRadical_iff_quotient_reduced, ← isRadical_iff_span_singleton]
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁴ : Finite K R
this✝³ : Finite R S
this✝² : IsScalarTower K R S
this✝¹ : Finite K S
this✝ : IsArtinianRing R
this : IsReduced R
⊢ IsReduced S
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁴ : Finite K R
this✝³ : Finite R S
this✝² : IsScalarTower K R S
this✝¹ : Finite K S
this✝ : IsArtinianRing R
this : IsReduced R
⊢ IsRadical (map (algebraMap K R) (minpoly K g))

tactic: exact (PerfectField.separable_iff_squarefree.mpr hg.minpoly_squarefree).map.squarefree.isRadical
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁴ : Finite K R
this✝³ : Finite R S
this✝² : IsScalarTower K R S
this✝¹ : Finite K S
this✝ : IsArtinianRing R
this : IsReduced R
⊢ IsRadical (map (algebraMap K R) (minpoly K g))
state_after: no goals

tactic: rw [Ideal.span, ← minpoly.ker_aeval_eq_span_minpoly]
state_before: case refine_1
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a✝ : End K M
ha : a✝ ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
a : K[X]
⊢ a ∈ Ideal.span {minpoly K f} → (aeval f) a = 0
state_after: case refine_1
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a✝ : End K M
ha : a✝ ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
a : K[X]
⊢ a ∈ RingHom.ker (aeval f) → (aeval f) a = 0

tactic: exact id
state_before: case refine_1
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a✝ : End K M
ha : a✝ ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
a : K[X]
⊢ a ∈ RingHom.ker (aeval f) → (aeval f) a = 0
state_after: no goals

tactic: rintro ⟨p⟩
state_before: case refine_2
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
⊢ ∀ (a : R), Commute ((Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) a) g
state_after: case refine_2.mk
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
a✝ : R
p : K[X]
⊢ Commute ((Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) (Quot.mk Setoid.r p)) g

tactic: simp [R, Algebra.commute_algebraMap_left]
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
a✝ : R
p : K[X]
k : K
⊢ Commute ((Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) (Quot.mk Setoid.r (C k))) g
state_after: no goals

tactic: simpa using hp.add_left hq
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
a✝ : R
p✝ p q : K[X]
hp : Commute ((Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) (Quot.mk Setoid.r p)) g
hq : Commute ((Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) (Quot.mk Setoid.r q)) g
⊢ Commute ((Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) (Quot.mk Setoid.r (p + q))) g
state_after: no goals

tactic: simpa only [RingHom.mem_ker, eval₂AlgHom'_apply, eval₂_map, AlgHom.comp_algebraMap_of_tower]
  using minpoly.aeval K g
state_before: case refine_3
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
⊢ map (algebraMap K R) (minpoly K g) ∈
    RingHom.ker (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯)
state_after: no goals

tactic: rintro (hx | hx) <;> rw [hx]
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯) ⋯
x : End K M
⊢ x ∈ {f, g} → x ∈ ↑φ.range
state_after: case inl
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯) ⋯
x : End K M
hx : x = f
⊢ f ∈ ↑φ.range

case inr
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯) ⋯
x : End K M
hx : x ∈ {g}
⊢ g ∈ ↑φ.range

tactic: exact ⟨AdjoinRoot.of _ (AdjoinRoot.root _), (eval₂_C _ _).trans (aeval_X f)⟩
state_before: case inl
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯) ⋯
x : End K M
hx : x = f
⊢ f ∈ ↑φ.range
state_after: no goals

tactic: exact ⟨AdjoinRoot.root _, eval₂_X _ _⟩
state_before: case inr
R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝⁵ : Finite K R
this✝⁴ : Finite R S
this✝³ : IsScalarTower K R S
this✝² : Finite K S
this✝¹ : IsArtinianRing R
this✝ : IsReduced R
this : IsReduced S
φ : S →ₐ[K] End K M :=
  Ideal.Quotient.liftₐ (Ideal.span {map (algebraMap K R) (minpoly K g)})
    (eval₂AlgHom' (Ideal.Quotient.liftₐ (Ideal.span {minpoly K f}) (aeval f) ⋯) g ⋯) ⋯
x : End K M
hx : x ∈ {g}
⊢ g ∈ ↑φ.range
state_after: no goals