[GOAL]
F : Type u_1
K : Type u_2
inst✝³ : Field F
inst✝² : Field K
inst✝¹ : Algebra F K
h : Normal F K
inst✝ : FiniteDimensional F K
⊢ ∃ p, IsSplittingField F K p
[PROOFSTEP]
let s := Basis.ofVectorSpace F K
[GOAL]
F : Type u_1
K : Type u_2
inst✝³ : Field F
inst✝² : Field K
inst✝¹ : Algebra F K
h : Normal F K
inst✝ : FiniteDimensional F K
s : Basis (↑(Basis.ofVectorSpaceIndex F K)) F K := Basis.ofVectorSpace F K
⊢ ∃ p, IsSplittingField F K p
[PROOFSTEP]
refine' ⟨∏ x, minpoly F (s x), splits_prod _ fun x _ => h.splits (s x), Subalgebra.toSubmodule.injective _⟩
[GOAL]
F : Type u_1
K : Type u_2
inst✝³ : Field F
inst✝² : Field K
inst✝¹ : Algebra F K
h : Normal F K
inst✝ : FiniteDimensional F K
s : Basis (↑(Basis.ofVectorSpaceIndex F K)) F K := Basis.ofVectorSpace F K
⊢ ↑Subalgebra.toSubmodule (Algebra.adjoin F (rootSet (∏ x : ↑(Basis.ofVectorSpaceIndex F K), minpoly F (↑s x)) K)) =
    ↑Subalgebra.toSubmodule ⊤
[PROOFSTEP]
rw [Algebra.top_toSubmodule, eq_top_iff, ← s.span_eq, Submodule.span_le, Set.range_subset_iff]
[GOAL]
F : Type u_1
K : Type u_2
inst✝³ : Field F
inst✝² : Field K
inst✝¹ : Algebra F K
h : Normal F K
inst✝ : FiniteDimensional F K
s : Basis (↑(Basis.ofVectorSpaceIndex F K)) F K := Basis.ofVectorSpace F K
⊢ ∀ (y : ↑(Basis.ofVectorSpaceIndex F K)),
    ↑s y ∈
      ↑(↑Subalgebra.toSubmodule
          (Algebra.adjoin F (rootSet (∏ x : ↑(Basis.ofVectorSpaceIndex F K), minpoly F (↑s x)) K)))
[PROOFSTEP]
refine' fun x =>
  Algebra.subset_adjoin
    (Multiset.mem_toFinset.mpr <|
      (mem_roots <| mt (Polynomial.map_eq_zero <| algebraMap F K).1 <| Finset.prod_ne_zero_iff.2 fun x _ => _).2 _)
[GOAL]
case refine'_1
F : Type u_1
K : Type u_2
inst✝³ : Field F
inst✝² : Field K
inst✝¹ : Algebra F K
h : Normal F K
inst✝ : FiniteDimensional F K
s : Basis (↑(Basis.ofVectorSpaceIndex F K)) F K := Basis.ofVectorSpace F K
x✝¹ x : ↑(Basis.ofVectorSpaceIndex F K)
x✝ : x ∈ Finset.univ
⊢ minpoly F (↑s x) ≠ 0
[PROOFSTEP]
exact minpoly.ne_zero (h.isIntegral (s x))
[GOAL]
case refine'_2
F : Type u_1
K : Type u_2
inst✝³ : Field F
inst✝² : Field K
inst✝¹ : Algebra F K
h : Normal F K
inst✝ : FiniteDimensional F K
s : Basis (↑(Basis.ofVectorSpaceIndex F K)) F K := Basis.ofVectorSpace F K
x : ↑(Basis.ofVectorSpaceIndex F K)
⊢ IsRoot (map (algebraMap F K) (∏ x : ↑(Basis.ofVectorSpaceIndex F K), minpoly F (↑s x))) (↑s x)
[PROOFSTEP]
rw [IsRoot.def, eval_map, ← aeval_def, AlgHom.map_prod]
[GOAL]
case refine'_2
F : Type u_1
K : Type u_2
inst✝³ : Field F
inst✝² : Field K
inst✝¹ : Algebra F K
h : Normal F K
inst✝ : FiniteDimensional F K
s : Basis (↑(Basis.ofVectorSpaceIndex F K)) F K := Basis.ofVectorSpace F K
x : ↑(Basis.ofVectorSpaceIndex F K)
⊢ ∏ x_1 : ↑(Basis.ofVectorSpaceIndex F K), ↑(aeval (↑s x)) (minpoly F (↑s x_1)) = 0
[PROOFSTEP]
exact Finset.prod_eq_zero (Finset.mem_univ _) (minpoly.aeval _ _)
[GOAL]
F : Type u_1
K : Type u_2
inst✝⁶ : Field F
inst✝⁵ : Field K
inst✝⁴ : Algebra F K
E : Type u_3
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Algebra K E
inst✝ : IsScalarTower F K E
h : Normal F E
x : E
⊢ IsIntegral K x ∧ Splits (algebraMap K E) (minpoly K x)
[PROOFSTEP]
cases' h.out x with hx hhx
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝⁶ : Field F
inst✝⁵ : Field K
inst✝⁴ : Algebra F K
E : Type u_3
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Algebra K E
inst✝ : IsScalarTower F K E
h : Normal F E
x : E
hx : IsIntegral F x
hhx : Splits (algebraMap F E) (minpoly F x)
⊢ IsIntegral K x ∧ Splits (algebraMap K E) (minpoly K x)
[PROOFSTEP]
rw [algebraMap_eq F K E] at hhx 
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝⁶ : Field F
inst✝⁵ : Field K
inst✝⁴ : Algebra F K
E : Type u_3
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Algebra K E
inst✝ : IsScalarTower F K E
h : Normal F E
x : E
hx : IsIntegral F x
hhx : Splits (RingHom.comp (algebraMap K E) (algebraMap F K)) (minpoly F x)
⊢ IsIntegral K x ∧ Splits (algebraMap K E) (minpoly K x)
[PROOFSTEP]
exact
  ⟨isIntegral_of_isScalarTower hx,
    Polynomial.splits_of_splits_of_dvd (algebraMap K E) (Polynomial.map_ne_zero (minpoly.ne_zero hx))
      ((Polynomial.splits_map_iff (algebraMap F K) (algebraMap K E)).mpr hhx) (minpoly.dvd_map_of_isScalarTower F K x)⟩
[GOAL]
F : Type u_1
K : Type u_2
inst✝⁶ : Field F
inst✝⁵ : Field K
inst✝⁴ : Algebra F K
E : Type u_3
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Algebra K E
inst✝ : IsScalarTower F K E
h : Normal F E
ϕ : E →ₐ[F] K
x : K
⊢ ∃ a, ↑ϕ a = x
[PROOFSTEP]
letI : Algebra E K := ϕ.toRingHom.toAlgebra
[GOAL]
F : Type u_1
K : Type u_2
inst✝⁶ : Field F
inst✝⁵ : Field K
inst✝⁴ : Algebra F K
E : Type u_3
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Algebra K E
inst✝ : IsScalarTower F K E
h : Normal F E
ϕ : E →ₐ[F] K
x : K
this : Algebra E K := RingHom.toAlgebra ↑ϕ
⊢ ∃ a, ↑ϕ a = x
[PROOFSTEP]
obtain ⟨h1, h2⟩ := h.out (algebraMap K E x)
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝⁶ : Field F
inst✝⁵ : Field K
inst✝⁴ : Algebra F K
E : Type u_3
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Algebra K E
inst✝ : IsScalarTower F K E
h : Normal F E
ϕ : E →ₐ[F] K
x : K
this : Algebra E K := RingHom.toAlgebra ↑ϕ
h1 : IsIntegral F (↑(algebraMap K E) x)
h2 : Splits (algebraMap F E) (minpoly F (↑(algebraMap K E) x))
⊢ ∃ a, ↑ϕ a = x
[PROOFSTEP]
cases'
  minpoly.mem_range_of_degree_eq_one E x
    (h2.def.resolve_left (minpoly.ne_zero h1)
      (minpoly.irreducible (isIntegral_of_isScalarTower ((isIntegral_algebraMap_iff (algebraMap K E).injective).mp h1)))
      (minpoly.dvd E x
        ((algebraMap K E).injective
          (by
            rw [RingHom.map_zero, aeval_map_algebraMap, ← aeval_algebraMap_apply]
            exact minpoly.aeval F (algebraMap K E x))))) with
  y hy
[GOAL]
F : Type u_1
K : Type u_2
inst✝⁶ : Field F
inst✝⁵ : Field K
inst✝⁴ : Algebra F K
E : Type u_3
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Algebra K E
inst✝ : IsScalarTower F K E
h : Normal F E
ϕ : E →ₐ[F] K
x : K
this : Algebra E K := RingHom.toAlgebra ↑ϕ
h1 : IsIntegral F (↑(algebraMap K E) x)
h2 : Splits (algebraMap F E) (minpoly F (↑(algebraMap K E) x))
⊢ ↑(algebraMap K E) (↑(aeval x) (map (algebraMap F E) (minpoly F (↑(algebraMap K E) x)))) = ↑(algebraMap K E) 0
[PROOFSTEP]
rw [RingHom.map_zero, aeval_map_algebraMap, ← aeval_algebraMap_apply]
[GOAL]
F : Type u_1
K : Type u_2
inst✝⁶ : Field F
inst✝⁵ : Field K
inst✝⁴ : Algebra F K
E : Type u_3
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Algebra K E
inst✝ : IsScalarTower F K E
h : Normal F E
ϕ : E →ₐ[F] K
x : K
this : Algebra E K := RingHom.toAlgebra ↑ϕ
h1 : IsIntegral F (↑(algebraMap K E) x)
h2 : Splits (algebraMap F E) (minpoly F (↑(algebraMap K E) x))
⊢ ↑(aeval (↑(algebraMap K E) x)) (minpoly F (↑(algebraMap K E) x)) = 0
[PROOFSTEP]
exact minpoly.aeval F (algebraMap K E x)
[GOAL]
case intro.intro
F : Type u_1
K : Type u_2
inst✝⁶ : Field F
inst✝⁵ : Field K
inst✝⁴ : Algebra F K
E : Type u_3
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Algebra K E
inst✝ : IsScalarTower F K E
h : Normal F E
ϕ : E →ₐ[F] K
x : K
this : Algebra E K := RingHom.toAlgebra ↑ϕ
h1 : IsIntegral F (↑(algebraMap K E) x)
h2 : Splits (algebraMap F E) (minpoly F (↑(algebraMap K E) x))
y : E
hy : ↑(algebraMap E K) y = x
⊢ ∃ a, ↑ϕ a = x
[PROOFSTEP]
exact ⟨y, hy⟩
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
h : Normal F E
f : E ≃ₐ[F] E'
x : E'
⊢ IsIntegral F x ∧ Splits (algebraMap F E') (minpoly F x)
[PROOFSTEP]
cases' h.out (f.symm x) with hx hhx
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
h : Normal F E
f : E ≃ₐ[F] E'
x : E'
hx : IsIntegral F (↑(AlgEquiv.symm f) x)
hhx : Splits (algebraMap F E) (minpoly F (↑(AlgEquiv.symm f) x))
⊢ IsIntegral F x ∧ Splits (algebraMap F E') (minpoly F x)
[PROOFSTEP]
have H := map_isIntegral f.toAlgHom hx
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
h : Normal F E
f : E ≃ₐ[F] E'
x : E'
hx : IsIntegral F (↑(AlgEquiv.symm f) x)
hhx : Splits (algebraMap F E) (minpoly F (↑(AlgEquiv.symm f) x))
H : IsIntegral F (↑↑f (↑(AlgEquiv.symm f) x))
⊢ IsIntegral F x ∧ Splits (algebraMap F E') (minpoly F x)
[PROOFSTEP]
simp [AlgEquiv.toAlgHom_eq_coe] at H 
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
h : Normal F E
f : E ≃ₐ[F] E'
x : E'
hx : IsIntegral F (↑(AlgEquiv.symm f) x)
hhx : Splits (algebraMap F E) (minpoly F (↑(AlgEquiv.symm f) x))
H : IsIntegral F x
⊢ IsIntegral F x ∧ Splits (algebraMap F E') (minpoly F x)
[PROOFSTEP]
use H
[GOAL]
case right
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
h : Normal F E
f : E ≃ₐ[F] E'
x : E'
hx : IsIntegral F (↑(AlgEquiv.symm f) x)
hhx : Splits (algebraMap F E) (minpoly F (↑(AlgEquiv.symm f) x))
H : IsIntegral F x
⊢ Splits (algebraMap F E') (minpoly F x)
[PROOFSTEP]
apply Polynomial.splits_of_splits_of_dvd (algebraMap F E') (minpoly.ne_zero hx)
[GOAL]
case right.hf
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
h : Normal F E
f : E ≃ₐ[F] E'
x : E'
hx : IsIntegral F (↑(AlgEquiv.symm f) x)
hhx : Splits (algebraMap F E) (minpoly F (↑(AlgEquiv.symm f) x))
H : IsIntegral F x
⊢ Splits (algebraMap F E') (minpoly F (↑(AlgEquiv.symm f) x))
[PROOFSTEP]
rw [← AlgHom.comp_algebraMap f.toAlgHom]
[GOAL]
case right.hf
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
h : Normal F E
f : E ≃ₐ[F] E'
x : E'
hx : IsIntegral F (↑(AlgEquiv.symm f) x)
hhx : Splits (algebraMap F E) (minpoly F (↑(AlgEquiv.symm f) x))
H : IsIntegral F x
⊢ Splits (RingHom.comp (↑↑f) (algebraMap F E)) (minpoly F (↑(AlgEquiv.symm f) x))
[PROOFSTEP]
exact Polynomial.splits_comp_of_splits (algebraMap F E) f.toAlgHom.toRingHom hhx
[GOAL]
case right.hgf
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
h : Normal F E
f : E ≃ₐ[F] E'
x : E'
hx : IsIntegral F (↑(AlgEquiv.symm f) x)
hhx : Splits (algebraMap F E) (minpoly F (↑(AlgEquiv.symm f) x))
H : IsIntegral F x
⊢ minpoly F x ∣ minpoly F (↑(AlgEquiv.symm f) x)
[PROOFSTEP]
apply minpoly.dvd _ _
[GOAL]
case right.hgf
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
h : Normal F E
f : E ≃ₐ[F] E'
x : E'
hx : IsIntegral F (↑(AlgEquiv.symm f) x)
hhx : Splits (algebraMap F E) (minpoly F (↑(AlgEquiv.symm f) x))
H : IsIntegral F x
⊢ ↑(aeval x) (minpoly F (↑(AlgEquiv.symm f) x)) = 0
[PROOFSTEP]
rw [← AddEquiv.map_eq_zero_iff f.symm.toAddEquiv]
[GOAL]
case right.hgf
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
h : Normal F E
f : E ≃ₐ[F] E'
x : E'
hx : IsIntegral F (↑(AlgEquiv.symm f) x)
hhx : Splits (algebraMap F E) (minpoly F (↑(AlgEquiv.symm f) x))
H : IsIntegral F x
⊢ ↑(AlgEquiv.toAddEquiv (AlgEquiv.symm f)) (↑(aeval x) (minpoly F (↑(AlgEquiv.symm f) x))) = 0
[PROOFSTEP]
exact Eq.trans (Polynomial.aeval_algHom_apply f.symm.toAlgHom x (minpoly F (f.symm x))).symm (minpoly.aeval _ _)
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
⊢ Normal F E
[PROOFSTEP]
rcases eq_or_ne p 0 with (rfl | hp)
[GOAL]
case inl
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
hFEp : IsSplittingField F E 0
⊢ Normal F E
[PROOFSTEP]
have := hFEp.adjoin_rootSet
[GOAL]
case inl
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
hFEp : IsSplittingField F E 0
this : Algebra.adjoin F (rootSet 0 E) = ⊤
⊢ Normal F E
[PROOFSTEP]
simp only [rootSet_zero, Algebra.adjoin_empty] at this 
[GOAL]
case inl
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
hFEp : IsSplittingField F E 0
this : ⊥ = ⊤
⊢ Normal F E
[PROOFSTEP]
exact Normal.of_algEquiv (AlgEquiv.ofBijective (Algebra.ofId F E) (Algebra.bijective_algebraMap_iff.2 this.symm))
[GOAL]
case inr
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
⊢ Normal F E
[PROOFSTEP]
refine' normal_iff.2 fun x => _
[GOAL]
case inr
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
⊢ IsIntegral F x ∧ Splits (algebraMap F E) (minpoly F x)
[PROOFSTEP]
have hFE : FiniteDimensional F E := IsSplittingField.finiteDimensional E p
[GOAL]
case inr
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
⊢ IsIntegral F x ∧ Splits (algebraMap F E) (minpoly F x)
[PROOFSTEP]
have Hx : IsIntegral F x := isIntegral_of_noetherian (IsNoetherian.iff_fg.2 hFE) x
[GOAL]
case inr
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
⊢ IsIntegral F x ∧ Splits (algebraMap F E) (minpoly F x)
[PROOFSTEP]
refine' ⟨Hx, Or.inr _⟩
[GOAL]
case inr
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
⊢ ∀ {g : E[X]}, Irreducible g → g ∣ map (algebraMap F E) (minpoly F x) → degree g = 1
[PROOFSTEP]
rintro q q_irred ⟨r, hr⟩
[GOAL]
case inr.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
⊢ degree q = 1
[PROOFSTEP]
let D := AdjoinRoot q
[GOAL]
case inr.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
⊢ degree q = 1
[PROOFSTEP]
haveI := Fact.mk q_irred
[GOAL]
case inr.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this : Fact (Irreducible q)
⊢ degree q = 1
[PROOFSTEP]
let pbED := AdjoinRoot.powerBasis q_irred.ne_zero
[GOAL]
case inr.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
⊢ degree q = 1
[PROOFSTEP]
haveI : FiniteDimensional E D := PowerBasis.finiteDimensional pbED
[GOAL]
case inr.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this : FiniteDimensional E D
⊢ degree q = 1
[PROOFSTEP]
have finrankED : FiniteDimensional.finrank E D = q.natDegree := by
  rw [PowerBasis.finrank pbED, AdjoinRoot.powerBasis_dim]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this : FiniteDimensional E D
⊢ FiniteDimensional.finrank E D = natDegree q
[PROOFSTEP]
rw [PowerBasis.finrank pbED, AdjoinRoot.powerBasis_dim]
[GOAL]
case inr.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
⊢ degree q = 1
[PROOFSTEP]
haveI : FiniteDimensional F D := FiniteDimensional.trans F E D
[GOAL]
case inr.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
⊢ degree q = 1
[PROOFSTEP]
rsuffices ⟨ϕ⟩ :
  Nonempty
    (D →ₐ[F] E)
      --Porting note: the `change` was `rw [← WithBot.coe_one]`
[GOAL]
case inr.intro.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
ϕ : D →ₐ[F] E
⊢ degree q = 1
[PROOFSTEP]
change degree q = ↑(1 : ℕ)
[GOAL]
case inr.intro.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
ϕ : D →ₐ[F] E
⊢ degree q = ↑1
[PROOFSTEP]
rw [degree_eq_iff_natDegree_eq q_irred.ne_zero, ← finrankED]
[GOAL]
case inr.intro.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
ϕ : D →ₐ[F] E
⊢ FiniteDimensional.finrank E D = 1
[PROOFSTEP]
have nat_lemma : ∀ a b c : ℕ, a * b = c → c ≤ a → 0 < c → b = 1 :=
  by
  intro a b c h1 h2 h3
  nlinarith
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
ϕ : D →ₐ[F] E
⊢ ∀ (a b c : ℕ), a * b = c → c ≤ a → 0 < c → b = 1
[PROOFSTEP]
intro a b c h1 h2 h3
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
ϕ : D →ₐ[F] E
a b c : ℕ
h1 : a * b = c
h2 : c ≤ a
h3 : 0 < c
⊢ b = 1
[PROOFSTEP]
nlinarith
[GOAL]
case inr.intro.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
ϕ : D →ₐ[F] E
nat_lemma : ∀ (a b c : ℕ), a * b = c → c ≤ a → 0 < c → b = 1
⊢ FiniteDimensional.finrank E D = 1
[PROOFSTEP]
exact
  nat_lemma _ _ _ (FiniteDimensional.finrank_mul_finrank F E D)
    (LinearMap.finrank_le_finrank_of_injective (show Function.Injective ϕ.toLinearMap from ϕ.toRingHom.injective))
    FiniteDimensional.finrank_pos
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
⊢ Nonempty (D →ₐ[F] E)
[PROOFSTEP]
let C := AdjoinRoot (minpoly F x)
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
⊢ Nonempty (D →ₐ[F] E)
[PROOFSTEP]
haveI Hx_irred :=
  Fact.mk
    (minpoly.irreducible Hx)
      -- Porting note: `heval` added since now Lean wants the proof explicitly in several places.
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
⊢ Nonempty (D →ₐ[F] E)
[PROOFSTEP]
have heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0 := by
  rw [algebraMap_eq F E D, ← eval₂_map, hr, AdjoinRoot.algebraMap_eq, eval₂_mul, AdjoinRoot.eval₂_root, zero_mul]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
⊢ eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
[PROOFSTEP]
rw [algebraMap_eq F E D, ← eval₂_map, hr, AdjoinRoot.algebraMap_eq, eval₂_mul, AdjoinRoot.eval₂_root, zero_mul]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝¹ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
⊢ Nonempty (D →ₐ[F] E)
[PROOFSTEP]
letI : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝² : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝¹ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
⊢ Nonempty (D →ₐ[F] E)
[PROOFSTEP]
letI : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (minpoly.aeval F x))
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝³ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝² : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝¹ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
⊢ Nonempty (D →ₐ[F] E)
[PROOFSTEP]
haveI : IsScalarTower F C D := of_algebraMap_eq fun y => (AdjoinRoot.lift_of heval).symm
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁴ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝³ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝² : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝¹ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this : IsScalarTower F C D
⊢ Nonempty (D →ₐ[F] E)
[PROOFSTEP]
haveI : IsScalarTower F C E :=
  by
  refine' of_algebraMap_eq fun y => (AdjoinRoot.lift_of _).symm
  rw [← aeval_def, minpoly.aeval]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁴ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝³ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝² : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝¹ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this : IsScalarTower F C D
⊢ IsScalarTower F C E
[PROOFSTEP]
refine' of_algebraMap_eq fun y => (AdjoinRoot.lift_of _).symm
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁴ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝³ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝² : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝¹ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this : IsScalarTower F C D
y : F
⊢ eval₂ (algebraMap F E) x (minpoly F x) = 0
[PROOFSTEP]
rw [← aeval_def, minpoly.aeval]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁵ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁴ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝³ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝² : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝¹ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝ : IsScalarTower F C D
this : IsScalarTower F C E
⊢ Nonempty (D →ₐ[F] E)
[PROOFSTEP]
suffices Nonempty (D →ₐ[C] E) by exact Nonempty.map (AlgHom.restrictScalars F) this
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
this : Nonempty (D →ₐ[C] E)
⊢ Nonempty (D →ₐ[F] E)
[PROOFSTEP]
exact Nonempty.map (AlgHom.restrictScalars F) this
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁵ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁴ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝³ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝² : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝¹ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝ : IsScalarTower F C D
this : IsScalarTower F C E
⊢ Nonempty (D →ₐ[C] E)
[PROOFSTEP]
let S : Set D := ((p.map (algebraMap F E)).roots.map (algebraMap E D)).toFinset
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁵ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁴ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝³ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝² : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝¹ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝ : IsScalarTower F C D
this : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
⊢ Nonempty (D →ₐ[C] E)
[PROOFSTEP]
suffices ⊤ ≤ IntermediateField.adjoin C S
  by
  refine' IntermediateField.algHom_mk_adjoin_splits' (top_le_iff.mp this) fun y hy => _
  rcases Multiset.mem_map.mp (Multiset.mem_toFinset.mp hy) with ⟨z, hz1, hz2⟩
  have Hz : IsIntegral F z := isIntegral_of_noetherian (IsNoetherian.iff_fg.2 hFE) z
  use show IsIntegral C y from isIntegral_of_noetherian (IsNoetherian.iff_fg.2 (FiniteDimensional.right F C D)) y
  apply splits_of_splits_of_dvd (algebraMap C E) (map_ne_zero (minpoly.ne_zero Hz))
  · rw [splits_map_iff, ← algebraMap_eq F C E]
    exact
      splits_of_splits_of_dvd _ hp hFEp.splits
        (minpoly.dvd F z (Eq.trans (eval₂_eq_eval_map _) ((mem_roots (map_ne_zero hp)).mp hz1)))
  · apply minpoly.dvd
    rw [← hz2, aeval_def, eval₂_map, ← algebraMap_eq F C D, algebraMap_eq F E D, ← hom_eval₂, ← aeval_def,
      minpoly.aeval F z, RingHom.map_zero]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this : ⊤ ≤ IntermediateField.adjoin C S
⊢ Nonempty (D →ₐ[C] E)
[PROOFSTEP]
refine' IntermediateField.algHom_mk_adjoin_splits' (top_le_iff.mp this) fun y hy => _
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this : ⊤ ≤ IntermediateField.adjoin C S
y : D
hy : y ∈ S
⊢ IsIntegral C y ∧ Splits (algebraMap C E) (minpoly C y)
[PROOFSTEP]
rcases Multiset.mem_map.mp (Multiset.mem_toFinset.mp hy) with ⟨z, hz1, hz2⟩
[GOAL]
case intro.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this : ⊤ ≤ IntermediateField.adjoin C S
y : D
hy : y ∈ S
z : E
hz1 : z ∈ roots (map (algebraMap F E) p)
hz2 : ↑(algebraMap E D) z = y
⊢ IsIntegral C y ∧ Splits (algebraMap C E) (minpoly C y)
[PROOFSTEP]
have Hz : IsIntegral F z := isIntegral_of_noetherian (IsNoetherian.iff_fg.2 hFE) z
[GOAL]
case intro.intro
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this : ⊤ ≤ IntermediateField.adjoin C S
y : D
hy : y ∈ S
z : E
hz1 : z ∈ roots (map (algebraMap F E) p)
hz2 : ↑(algebraMap E D) z = y
Hz : IsIntegral F z
⊢ IsIntegral C y ∧ Splits (algebraMap C E) (minpoly C y)
[PROOFSTEP]
use show IsIntegral C y from isIntegral_of_noetherian (IsNoetherian.iff_fg.2 (FiniteDimensional.right F C D)) y
[GOAL]
case right
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this : ⊤ ≤ IntermediateField.adjoin C S
y : D
hy : y ∈ S
z : E
hz1 : z ∈ roots (map (algebraMap F E) p)
hz2 : ↑(algebraMap E D) z = y
Hz : IsIntegral F z
⊢ Splits (algebraMap C E) (minpoly C y)
[PROOFSTEP]
apply splits_of_splits_of_dvd (algebraMap C E) (map_ne_zero (minpoly.ne_zero Hz))
[GOAL]
case right.hf
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this : ⊤ ≤ IntermediateField.adjoin C S
y : D
hy : y ∈ S
z : E
hz1 : z ∈ roots (map (algebraMap F E) p)
hz2 : ↑(algebraMap E D) z = y
Hz : IsIntegral F z
⊢ Splits (algebraMap C E) (map ?m.184453 (minpoly F z))
[PROOFSTEP]
rw [splits_map_iff, ← algebraMap_eq F C E]
[GOAL]
case right.hf
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this : ⊤ ≤ IntermediateField.adjoin C S
y : D
hy : y ∈ S
z : E
hz1 : z ∈ roots (map (algebraMap F E) p)
hz2 : ↑(algebraMap E D) z = y
Hz : IsIntegral F z
⊢ Splits (algebraMap F E) (minpoly F z)
[PROOFSTEP]
exact
  splits_of_splits_of_dvd _ hp hFEp.splits
    (minpoly.dvd F z (Eq.trans (eval₂_eq_eval_map _) ((mem_roots (map_ne_zero hp)).mp hz1)))
[GOAL]
case right.hgf
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this : ⊤ ≤ IntermediateField.adjoin C S
y : D
hy : y ∈ S
z : E
hz1 : z ∈ roots (map (algebraMap F E) p)
hz2 : ↑(algebraMap E D) z = y
Hz : IsIntegral F z
⊢ minpoly C y ∣ map (algebraMap F C) (minpoly F z)
[PROOFSTEP]
apply minpoly.dvd
[GOAL]
case right.hgf.hp
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this : ⊤ ≤ IntermediateField.adjoin C S
y : D
hy : y ∈ S
z : E
hz1 : z ∈ roots (map (algebraMap F E) p)
hz2 : ↑(algebraMap E D) z = y
Hz : IsIntegral F z
⊢ ↑(aeval y) (map (algebraMap F C) (minpoly F z)) = 0
[PROOFSTEP]
rw [← hz2, aeval_def, eval₂_map, ← algebraMap_eq F C D, algebraMap_eq F E D, ← hom_eval₂, ← aeval_def,
  minpoly.aeval F z, RingHom.map_zero]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁵ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁴ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝³ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝² : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝¹ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝ : IsScalarTower F C D
this : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
⊢ ⊤ ≤ IntermediateField.adjoin C S
[PROOFSTEP]
rw [← IntermediateField.toSubalgebra_le_toSubalgebra, IntermediateField.top_toSubalgebra]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁵ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁴ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝³ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝² : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝¹ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝ : IsScalarTower F C D
this : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
⊢ ⊤ ≤ (IntermediateField.adjoin C S).toSubalgebra
[PROOFSTEP]
apply ge_trans (IntermediateField.algebra_adjoin_le_adjoin C S)
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁵ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁴ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝³ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝² : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝¹ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝ : IsScalarTower F C D
this : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
⊢ Algebra.adjoin C S ≥ ⊤
[PROOFSTEP]
suffices (Algebra.adjoin C S).restrictScalars F = (Algebra.adjoin E {AdjoinRoot.root q}).restrictScalars F
  by
  rw [AdjoinRoot.adjoinRoot_eq_top, Subalgebra.restrictScalars_top, ← @Subalgebra.restrictScalars_top F C] at this 
  exact
    top_le_iff.mpr
      (Subalgebra.restrictScalars_injective F this)
        /- Porting note: the `change` was `dsimp only [S]`. This is the step that requires increasing
        `maxHeartbeats`. Using `set S ... with hS` doesn't work. -/
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this :
  Subalgebra.restrictScalars F (Algebra.adjoin C S) =
    Subalgebra.restrictScalars F (Algebra.adjoin E {AdjoinRoot.root q})
⊢ Algebra.adjoin C S ≥ ⊤
[PROOFSTEP]
rw [AdjoinRoot.adjoinRoot_eq_top, Subalgebra.restrictScalars_top, ← @Subalgebra.restrictScalars_top F C] at this 
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁶ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁵ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝⁴ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝³ : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝² : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝¹ : IsScalarTower F C D
this✝ : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
this : Subalgebra.restrictScalars F (Algebra.adjoin C S) = Subalgebra.restrictScalars F ⊤
⊢ Algebra.adjoin C S ≥ ⊤
[PROOFSTEP]
exact
  top_le_iff.mpr
    (Subalgebra.restrictScalars_injective F this)
      /- Porting note: the `change` was `dsimp only [S]`. This is the step that requires increasing
      `maxHeartbeats`. Using `set S ... with hS` doesn't work. -/
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁵ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁴ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝³ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝² : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝¹ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝ : IsScalarTower F C D
this : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
⊢ Subalgebra.restrictScalars F (Algebra.adjoin C S) =
    Subalgebra.restrictScalars F (Algebra.adjoin E {AdjoinRoot.root q})
[PROOFSTEP]
change
  Subalgebra.restrictScalars F
      (Algebra.adjoin C (((p.map (algebraMap F E)).roots.map (algebraMap E D)).toFinset : Set D)) =
    _
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁵ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁴ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝³ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝² : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝¹ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝ : IsScalarTower F C D
this : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
⊢ Subalgebra.restrictScalars F
      (Algebra.adjoin C ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))) =
    Subalgebra.restrictScalars F (Algebra.adjoin E {AdjoinRoot.root q})
[PROOFSTEP]
rw [← Finset.image_toFinset, Finset.coe_image]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁵ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁴ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝³ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝² : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝¹ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝ : IsScalarTower F C D
this : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
⊢ Subalgebra.restrictScalars F
      (Algebra.adjoin C (↑(algebraMap E D) '' ↑(Multiset.toFinset (roots (map (algebraMap F E) p))))) =
    Subalgebra.restrictScalars F (Algebra.adjoin E {AdjoinRoot.root q})
[PROOFSTEP]
apply Eq.trans (Algebra.adjoin_res_eq_adjoin_res F E C D hFEp.adjoin_rootSet AdjoinRoot.adjoinRoot_eq_top)
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_3
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type u_4
inst✝⁴ : Field F
inst✝³ : Field E
inst✝² : Algebra F E
inst✝¹ : Field E'
inst✝ : Algebra F E'
p : F[X]
hFEp : IsSplittingField F E p
hp : p ≠ 0
x : E
hFE : FiniteDimensional F E
Hx : IsIntegral F x
q : E[X]
q_irred : Irreducible q
r : E[X]
hr : map (algebraMap F E) (minpoly F x) = q * r
D : Type u_3 := AdjoinRoot q
this✝⁵ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this✝⁴ : FiniteDimensional E D
finrankED : FiniteDimensional.finrank E D = natDegree q
this✝³ : FiniteDimensional F D
C : Type u_1 := AdjoinRoot (minpoly F x)
Hx_irred : Fact (Irreducible (minpoly F x))
heval : eval₂ (algebraMap F D) (AdjoinRoot.root q) (minpoly F x) = 0
this✝² : Algebra C D := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
this✝¹ : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (_ : ↑(aeval x) (minpoly F x) = 0))
this✝ : IsScalarTower F C D
this : IsScalarTower F C E
S : Set D := ↑(Multiset.toFinset (Multiset.map (↑(algebraMap E D)) (roots (map (algebraMap F E) p))))
⊢ Subalgebra.restrictScalars F (Algebra.adjoin E (↑(algebraMap C D) '' {AdjoinRoot.root (minpoly F x)})) =
    Subalgebra.restrictScalars F (Algebra.adjoin E {AdjoinRoot.root q})
[PROOFSTEP]
rw [Set.image_singleton, RingHom.algebraMap_toAlgebra, AdjoinRoot.lift_root]
[GOAL]
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
⊢ Normal F { x // x ∈ ⨆ (i : ι), t i }
[PROOFSTEP]
refine' ⟨isAlgebraic_iSup fun i => (h i).1, fun x => _⟩
[GOAL]
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
⊢ Splits (algebraMap F { x // x ∈ ⨆ (i : ι), t i }) (minpoly F x)
[PROOFSTEP]
obtain ⟨s, hx⟩ := exists_finset_of_mem_supr'' (fun i => (h i).1) x.2
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
⊢ Splits (algebraMap F { x // x ∈ ⨆ (i : ι), t i }) (minpoly F x)
[PROOFSTEP]
let E : IntermediateField F K := ⨆ i ∈ s, adjoin F ((minpoly F (i.2 : _)).rootSet K)
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
⊢ Splits (algebraMap F { x // x ∈ ⨆ (i : ι), t i }) (minpoly F x)
[PROOFSTEP]
have hF : Normal F E :=
  by
  haveI : IsSplittingField F E (∏ i in s, minpoly F i.snd) :=
    by
    refine' isSplittingField_iSup _ fun i _ => adjoin_rootSet_isSplittingField _
    · exact Finset.prod_ne_zero_iff.mpr fun i _ => minpoly.ne_zero ((h i.1).isIntegral i.2)
    · exact Polynomial.splits_comp_of_splits _ (algebraMap (t i.1) K) ((h i.1).splits i.2)
  apply Normal.of_isSplittingField (∏ i in s, minpoly F i.2)
[GOAL]
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
⊢ Normal F { x // x ∈ E }
[PROOFSTEP]
haveI : IsSplittingField F E (∏ i in s, minpoly F i.snd) :=
  by
  refine' isSplittingField_iSup _ fun i _ => adjoin_rootSet_isSplittingField _
  · exact Finset.prod_ne_zero_iff.mpr fun i _ => minpoly.ne_zero ((h i.1).isIntegral i.2)
  · exact Polynomial.splits_comp_of_splits _ (algebraMap (t i.1) K) ((h i.1).splits i.2)
[GOAL]
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
⊢ IsSplittingField F { x // x ∈ E } (∏ i in s, minpoly F i.snd)
[PROOFSTEP]
refine' isSplittingField_iSup _ fun i _ => adjoin_rootSet_isSplittingField _
[GOAL]
case refine'_1
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
⊢ ∏ i in s, minpoly F i.snd ≠ 0
[PROOFSTEP]
exact Finset.prod_ne_zero_iff.mpr fun i _ => minpoly.ne_zero ((h i.1).isIntegral i.2)
[GOAL]
case refine'_2
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
i : (i : ι) × { x // x ∈ t i }
x✝ : i ∈ s
⊢ Splits (algebraMap F K) (minpoly F i.snd)
[PROOFSTEP]
exact Polynomial.splits_comp_of_splits _ (algebraMap (t i.1) K) ((h i.1).splits i.2)
[GOAL]
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
this : IsSplittingField F { x // x ∈ E } (∏ i in s, minpoly F i.snd)
⊢ Normal F { x // x ∈ E }
[PROOFSTEP]
apply Normal.of_isSplittingField (∏ i in s, minpoly F i.2)
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
hF : Normal F { x // x ∈ E }
⊢ Splits (algebraMap F { x // x ∈ ⨆ (i : ι), t i }) (minpoly F x)
[PROOFSTEP]
have hE : E ≤ ⨆ i, t i := by
  refine' iSup_le fun i => iSup_le fun _ => le_iSup_of_le i.1 _
  rw [adjoin_le_iff, ← image_rootSet ((h i.1).splits i.2) (t i.1).val]
  exact fun _ ⟨a, _, h⟩ => h ▸ a.2
[GOAL]
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
hF : Normal F { x // x ∈ E }
⊢ E ≤ ⨆ (i : ι), t i
[PROOFSTEP]
refine' iSup_le fun i => iSup_le fun _ => le_iSup_of_le i.1 _
[GOAL]
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
hF : Normal F { x // x ∈ E }
i : (i : ι) × { x // x ∈ t i }
x✝ : i ∈ s
⊢ adjoin F (rootSet (minpoly F i.snd) K) ≤ t i.fst
[PROOFSTEP]
rw [adjoin_le_iff, ← image_rootSet ((h i.1).splits i.2) (t i.1).val]
[GOAL]
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
hF : Normal F { x // x ∈ E }
i : (i : ι) × { x // x ∈ t i }
x✝ : i ∈ s
⊢ ↑(val (t i.fst)) '' rootSet (minpoly F i.snd) { x // x ∈ t i.fst } ≤ ↑(t i.fst)
[PROOFSTEP]
exact fun _ ⟨a, _, h⟩ => h ▸ a.2
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
hF : Normal F { x // x ∈ E }
hE : E ≤ ⨆ (i : ι), t i
⊢ Splits (algebraMap F { x // x ∈ ⨆ (i : ι), t i }) (minpoly F x)
[PROOFSTEP]
have := hF.splits ⟨x, hx⟩
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
hF : Normal F { x // x ∈ E }
hE : E ≤ ⨆ (i : ι), t i
this : Splits (algebraMap F { x // x ∈ E }) (minpoly F { val := ↑x, property := hx })
⊢ Splits (algebraMap F { x // x ∈ ⨆ (i : ι), t i }) (minpoly F x)
[PROOFSTEP]
rw [minpoly_eq, Subtype.coe_mk, ← minpoly_eq] at this 
[GOAL]
case intro
F : Type u_1
K : Type u_2
inst✝² : Field F
inst✝¹ : Field K
inst✝ : Algebra F K
ι : Type u_3
t : ι → IntermediateField F K
h : ∀ (i : ι), Normal F { x // x ∈ t i }
x : { x // x ∈ ⨆ (i : ι), t i }
s : Finset ((i : ι) × { x // x ∈ t i })
hx : ↑x ∈ ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
E : IntermediateField F K := ⨆ (i : (i : ι) × { x // x ∈ t i }) (_ : i ∈ s), adjoin F (rootSet (minpoly F i.snd) K)
hF : Normal F { x // x ∈ E }
hE : E ≤ ⨆ (i : ι), t i
this : Splits (algebraMap F { x // x ∈ E }) (minpoly F x)
⊢ Splits (algebraMap F { x // x ∈ ⨆ (i : ι), t i }) (minpoly F x)
[PROOFSTEP]
exact Polynomial.splits_comp_of_splits _ (inclusion hE).toRingHom this
[GOAL]
F : Type u_1
K : Type u_2
inst✝⁴ : Field F
inst✝³ : Field K
inst✝² : Algebra F K
E E' : IntermediateField F K
inst✝¹ : Normal F { x // x ∈ E }
inst✝ : Normal F { x // x ∈ E' }
⊢ ∀ (i : Bool), Normal F { x // x ∈ Bool.rec E' E i }
[PROOFSTEP]
intro i
[GOAL]
F : Type u_1
K : Type u_2
inst✝⁴ : Field F
inst✝³ : Field K
inst✝² : Algebra F K
E E' : IntermediateField F K
inst✝¹ : Normal F { x // x ∈ E }
inst✝ : Normal F { x // x ∈ E' }
i : Bool
⊢ Normal F { x // x ∈ Bool.rec E' E i }
[PROOFSTEP]
cases i
[GOAL]
case false
F : Type u_1
K : Type u_2
inst✝⁴ : Field F
inst✝³ : Field K
inst✝² : Algebra F K
E E' : IntermediateField F K
inst✝¹ : Normal F { x // x ∈ E }
inst✝ : Normal F { x // x ∈ E' }
⊢ Normal F { x // x ∈ Bool.rec E' E false }
[PROOFSTEP]
infer_instance
[GOAL]
case true
F : Type u_1
K : Type u_2
inst✝⁴ : Field F
inst✝³ : Field K
inst✝² : Algebra F K
E E' : IntermediateField F K
inst✝¹ : Normal F { x // x ∈ E }
inst✝ : Normal F { x // x ∈ E' }
⊢ Normal F { x // x ∈ Bool.rec E' E true }
[PROOFSTEP]
infer_instance
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
⊢ ↑ϕ ↑x ∈ AlgHom.range (toAlgHom F E K₂)
[PROOFSTEP]
suffices (toAlgHom F E K₁).range.map ϕ ≤ _ by exact this ⟨x, Subtype.mem x, rfl⟩
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
this : Subalgebra.map ϕ (AlgHom.range (toAlgHom F E K₁)) ≤ ?m.259090
⊢ ↑ϕ ↑x ∈ AlgHom.range (toAlgHom F E K₂)
[PROOFSTEP]
exact this ⟨x, Subtype.mem x, rfl⟩
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
⊢ Subalgebra.map ϕ (AlgHom.range (toAlgHom F E K₁)) ≤ AlgHom.range (toAlgHom F E K₂)
[PROOFSTEP]
rintro x ⟨y, ⟨z, hy⟩, hx⟩
[GOAL]
case intro.intro.intro
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x✝ : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
x : K₂
y : K₁
hx : ↑↑ϕ y = x
z : E
hy : ↑↑(toAlgHom F E K₁) z = y
⊢ x ∈ AlgHom.range (toAlgHom F E K₂)
[PROOFSTEP]
rw [← hx, ← hy]
[GOAL]
case intro.intro.intro
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x✝ : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
x : K₂
y : K₁
hx : ↑↑ϕ y = x
z : E
hy : ↑↑(toAlgHom F E K₁) z = y
⊢ ↑↑ϕ (↑↑(toAlgHom F E K₁) z) ∈ AlgHom.range (toAlgHom F E K₂)
[PROOFSTEP]
apply minpoly.mem_range_of_degree_eq_one E
[GOAL]
case intro.intro.intro.hx
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x✝ : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
x : K₂
y : K₁
hx : ↑↑ϕ y = x
z : E
hy : ↑↑(toAlgHom F E K₁) z = y
⊢ degree (minpoly E (↑↑ϕ (↑↑(toAlgHom F E K₁) z))) = 1
[PROOFSTEP]
refine'
  Or.resolve_left (h.splits z).def (minpoly.ne_zero (h.isIntegral z)) (minpoly.irreducible _)
    (minpoly.dvd E _ (by simp [aeval_algHom_apply]))
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x✝ : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
x : K₂
y : K₁
hx : ↑↑ϕ y = x
z : E
hy : ↑↑(toAlgHom F E K₁) z = y
⊢ ↑(aeval (↑↑ϕ (↑↑(toAlgHom F E K₁) z))) (map (algebraMap F E) (minpoly F z)) = 0
[PROOFSTEP]
simp [aeval_algHom_apply]
[GOAL]
case intro.intro.intro.hx
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x✝ : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
x : K₂
y : K₁
hx : ↑↑ϕ y = x
z : E
hy : ↑↑(toAlgHom F E K₁) z = y
⊢ IsIntegral E (↑↑ϕ (↑↑(toAlgHom F E K₁) z))
[PROOFSTEP]
simp only [AlgHom.toRingHom_eq_coe, AlgHom.coe_toRingHom]
[GOAL]
case intro.intro.intro.hx
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x✝ : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
x : K₂
y : K₁
hx : ↑↑ϕ y = x
z : E
hy : ↑↑(toAlgHom F E K₁) z = y
⊢ IsIntegral E (↑ϕ (↑(toAlgHom F E K₁) z))
[PROOFSTEP]
suffices IsIntegral F _ by exact isIntegral_of_isScalarTower this
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x✝ : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
x : K₂
y : K₁
hx : ↑↑ϕ y = x
z : E
hy : ↑↑(toAlgHom F E K₁) z = y
this : IsIntegral F ?m.268983
⊢ IsIntegral E (↑ϕ (↑(toAlgHom F E K₁) z))
[PROOFSTEP]
exact isIntegral_of_isScalarTower this
[GOAL]
case intro.intro.intro.hx
F : Type u_1
K : Type u_2
inst✝¹⁷ : Field F
inst✝¹⁶ : Field K
inst✝¹⁵ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁴ : Field F
inst✝¹³ : Field K₁
inst✝¹² : Field K₂
inst✝¹¹ : Field K₃
inst✝¹⁰ : Algebra F K₁
inst✝⁹ : Algebra F K₂
inst✝⁸ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁷ : Field E
inst✝⁶ : Algebra F E
inst✝⁵ : Algebra E K₁
inst✝⁴ : Algebra E K₂
inst✝³ : Algebra E K₃
inst✝² : IsScalarTower F E K₁
inst✝¹ : IsScalarTower F E K₂
inst✝ : IsScalarTower F E K₃
h : Normal F E
x✝ : { x // x ∈ AlgHom.range (toAlgHom F E K₁) }
x : K₂
y : K₁
hx : ↑↑ϕ y = x
z : E
hy : ↑↑(toAlgHom F E K₁) z = y
⊢ IsIntegral F (↑ϕ (↑(toAlgHom F E K₁) z))
[PROOFSTEP]
exact map_isIntegral ϕ (map_isIntegral (toAlgHom F E K₁) (h.isIntegral z))
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁸ : Field F
inst✝¹⁷ : Field K
inst✝¹⁶ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K₁
inst✝¹³ : Field K₂
inst✝¹² : Field K₃
inst✝¹¹ : Algebra F K₁
inst✝¹⁰ : Algebra F K₂
inst✝⁹ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra E K₁
inst✝⁵ : Algebra E K₂
inst✝⁴ : Algebra E K₃
inst✝³ : IsScalarTower F E K₁
inst✝² : IsScalarTower F E K₂
inst✝¹ : IsScalarTower F E K₃
inst✝ : Normal F E
x✝ : E
⊢ ↑(algebraMap E K₃) (↑(comp (restrictNormal ψ E) (restrictNormal ϕ E)) x✝) =
    ↑(algebraMap E K₃) (↑(restrictNormal (comp ψ ϕ) E) x✝)
[PROOFSTEP]
simp only [AlgHom.comp_apply, AlgHom.restrictNormal_commutes]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁹ : Field F
inst✝¹⁸ : Field K
inst✝¹⁷ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K₁
inst✝¹⁴ : Field K₂
inst✝¹³ : Field K₃
inst✝¹² : Algebra F K₁
inst✝¹¹ : Algebra F K₂
inst✝¹⁰ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E✝ : Type u_6
inst✝⁹ : Field E✝
inst✝⁸ : Algebra F E✝
inst✝⁷ : Algebra E✝ K₁
inst✝⁶ : Algebra E✝ K₂
inst✝⁵ : Algebra E✝ K₃
inst✝⁴ : IsScalarTower F E✝ K₁
inst✝³ : IsScalarTower F E✝ K₂
inst✝² : IsScalarTower F E✝ K₃
inst✝¹ : Algebra F K
E : IntermediateField F K
inst✝ : Normal F { x // x ∈ E }
f : { x // x ∈ E } →ₐ[F] K
⊢ fieldRange f = E
[PROOFSTEP]
letI : Algebra E E := Algebra.id E
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁹ : Field F
inst✝¹⁸ : Field K
inst✝¹⁷ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K₁
inst✝¹⁴ : Field K₂
inst✝¹³ : Field K₃
inst✝¹² : Algebra F K₁
inst✝¹¹ : Algebra F K₂
inst✝¹⁰ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E✝ : Type u_6
inst✝⁹ : Field E✝
inst✝⁸ : Algebra F E✝
inst✝⁷ : Algebra E✝ K₁
inst✝⁶ : Algebra E✝ K₂
inst✝⁵ : Algebra E✝ K₃
inst✝⁴ : IsScalarTower F E✝ K₁
inst✝³ : IsScalarTower F E✝ K₂
inst✝² : IsScalarTower F E✝ K₃
inst✝¹ : Algebra F K
E : IntermediateField F K
inst✝ : Normal F { x // x ∈ E }
f : { x // x ∈ E } →ₐ[F] K
this : Algebra { x // x ∈ E } { x // x ∈ E } := Algebra.id { x // x ∈ E }
⊢ fieldRange f = E
[PROOFSTEP]
let g := f.restrictNormal' E
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁹ : Field F
inst✝¹⁸ : Field K
inst✝¹⁷ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K₁
inst✝¹⁴ : Field K₂
inst✝¹³ : Field K₃
inst✝¹² : Algebra F K₁
inst✝¹¹ : Algebra F K₂
inst✝¹⁰ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E✝ : Type u_6
inst✝⁹ : Field E✝
inst✝⁸ : Algebra F E✝
inst✝⁷ : Algebra E✝ K₁
inst✝⁶ : Algebra E✝ K₂
inst✝⁵ : Algebra E✝ K₃
inst✝⁴ : IsScalarTower F E✝ K₁
inst✝³ : IsScalarTower F E✝ K₂
inst✝² : IsScalarTower F E✝ K₃
inst✝¹ : Algebra F K
E : IntermediateField F K
inst✝ : Normal F { x // x ∈ E }
f : { x // x ∈ E } →ₐ[F] K
this : Algebra { x // x ∈ E } { x // x ∈ E } := Algebra.id { x // x ∈ E }
g : { x // x ∈ E } ≃ₐ[F] { x // x ∈ E } := restrictNormal' f { x // x ∈ E }
⊢ fieldRange f = E
[PROOFSTEP]
rw [← show E.val.comp ↑g = f from FunLike.ext_iff.mpr (f.restrictNormal_commutes E), ←
  IntermediateField.AlgHom.map_fieldRange, IntermediateField.AlgEquiv.fieldRange_eq_top g, ←
  IntermediateField.AlgHom.fieldRange_eq_map, IntermediateField.fieldRange_val]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁸ : Field F
inst✝¹⁷ : Field K
inst✝¹⁶ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K₁
inst✝¹³ : Field K₂
inst✝¹² : Field K₃
inst✝¹¹ : Algebra F K₁
inst✝¹⁰ : Algebra F K₂
inst✝⁹ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra E K₁
inst✝⁵ : Algebra E K₂
inst✝⁴ : Algebra E K₃
inst✝³ : IsScalarTower F E K₁
inst✝² : IsScalarTower F E K₂
inst✝¹ : IsScalarTower F E K₃
inst✝ : Normal F E
x✝ : E
⊢ ↑(algebraMap E K₃) (↑(restrictNormal (trans χ ω) E) x✝) =
    ↑(algebraMap E K₃) (↑(trans (restrictNormal χ E) (restrictNormal ω E)) x✝)
[PROOFSTEP]
simp only [AlgEquiv.trans_apply, AlgEquiv.restrictNormal_commutes]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁸ : Field F
inst✝¹⁷ : Field K
inst✝¹⁶ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K₁
inst✝¹³ : Field K₂
inst✝¹² : Field K₃
inst✝¹¹ : Algebra F K₁
inst✝¹⁰ : Algebra F K₂
inst✝⁹ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra E K₁
inst✝⁵ : Algebra E K₂
inst✝⁴ : Algebra E K₃
inst✝³ : IsScalarTower F E K₁
inst✝² : IsScalarTower F E K₂
inst✝¹ : IsScalarTower F E K₃
inst✝ : Normal F E
σ : E →ₐ[F] K₁
⊢ (fun σ => AlgHom.comp (toAlgHom F E K₁) ↑σ) ((fun σ => AlgHom.restrictNormal' σ E) σ) = σ
[PROOFSTEP]
ext
[GOAL]
case H
F : Type u_1
K : Type u_2
inst✝¹⁸ : Field F
inst✝¹⁷ : Field K
inst✝¹⁶ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K₁
inst✝¹³ : Field K₂
inst✝¹² : Field K₃
inst✝¹¹ : Algebra F K₁
inst✝¹⁰ : Algebra F K₂
inst✝⁹ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra E K₁
inst✝⁵ : Algebra E K₂
inst✝⁴ : Algebra E K₃
inst✝³ : IsScalarTower F E K₁
inst✝² : IsScalarTower F E K₂
inst✝¹ : IsScalarTower F E K₃
inst✝ : Normal F E
σ : E →ₐ[F] K₁
x✝ : E
⊢ ↑((fun σ => AlgHom.comp (toAlgHom F E K₁) ↑σ) ((fun σ => AlgHom.restrictNormal' σ E) σ)) x✝ = ↑σ x✝
[PROOFSTEP]
simp [AlgHom.restrictNormal']
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁸ : Field F
inst✝¹⁷ : Field K
inst✝¹⁶ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K₁
inst✝¹³ : Field K₂
inst✝¹² : Field K₃
inst✝¹¹ : Algebra F K₁
inst✝¹⁰ : Algebra F K₂
inst✝⁹ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra E K₁
inst✝⁵ : Algebra E K₂
inst✝⁴ : Algebra E K₃
inst✝³ : IsScalarTower F E K₁
inst✝² : IsScalarTower F E K₂
inst✝¹ : IsScalarTower F E K₃
inst✝ : Normal F E
σ : E ≃ₐ[F] E
⊢ (fun σ => AlgHom.restrictNormal' σ E) ((fun σ => AlgHom.comp (toAlgHom F E K₁) ↑σ) σ) = σ
[PROOFSTEP]
ext
[GOAL]
case h
F : Type u_1
K : Type u_2
inst✝¹⁸ : Field F
inst✝¹⁷ : Field K
inst✝¹⁶ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K₁
inst✝¹³ : Field K₂
inst✝¹² : Field K₃
inst✝¹¹ : Algebra F K₁
inst✝¹⁰ : Algebra F K₂
inst✝⁹ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra E K₁
inst✝⁵ : Algebra E K₂
inst✝⁴ : Algebra E K₃
inst✝³ : IsScalarTower F E K₁
inst✝² : IsScalarTower F E K₂
inst✝¹ : IsScalarTower F E K₃
inst✝ : Normal F E
σ : E ≃ₐ[F] E
a✝ : E
⊢ ↑((fun σ => AlgHom.restrictNormal' σ E) ((fun σ => AlgHom.comp (toAlgHom F E K₁) ↑σ) σ)) a✝ = ↑σ a✝
[PROOFSTEP]
simp only [AlgHom.restrictNormal', AlgEquiv.toAlgHom_eq_coe, AlgEquiv.coe_ofBijective]
[GOAL]
case h
F : Type u_1
K : Type u_2
inst✝¹⁸ : Field F
inst✝¹⁷ : Field K
inst✝¹⁶ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K₁
inst✝¹³ : Field K₂
inst✝¹² : Field K₃
inst✝¹¹ : Algebra F K₁
inst✝¹⁰ : Algebra F K₂
inst✝⁹ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra E K₁
inst✝⁵ : Algebra E K₂
inst✝⁴ : Algebra E K₃
inst✝³ : IsScalarTower F E K₁
inst✝² : IsScalarTower F E K₂
inst✝¹ : IsScalarTower F E K₃
inst✝ : Normal F E
σ : E ≃ₐ[F] E
a✝ : E
⊢ ↑(AlgHom.restrictNormal (AlgHom.comp (toAlgHom F E K₁) ↑σ) E) a✝ = ↑σ a✝
[PROOFSTEP]
apply NoZeroSMulDivisors.algebraMap_injective E K₁
[GOAL]
case h.a
F : Type u_1
K : Type u_2
inst✝¹⁸ : Field F
inst✝¹⁷ : Field K
inst✝¹⁶ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K₁
inst✝¹³ : Field K₂
inst✝¹² : Field K₃
inst✝¹¹ : Algebra F K₁
inst✝¹⁰ : Algebra F K₂
inst✝⁹ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra E K₁
inst✝⁵ : Algebra E K₂
inst✝⁴ : Algebra E K₃
inst✝³ : IsScalarTower F E K₁
inst✝² : IsScalarTower F E K₂
inst✝¹ : IsScalarTower F E K₃
inst✝ : Normal F E
σ : E ≃ₐ[F] E
a✝ : E
⊢ ↑(algebraMap E K₁) (↑(AlgHom.restrictNormal (AlgHom.comp (toAlgHom F E K₁) ↑σ) E) a✝) = ↑(algebraMap E K₁) (↑σ a✝)
[PROOFSTEP]
rw [AlgHom.restrictNormal_commutes]
[GOAL]
case h.a
F : Type u_1
K : Type u_2
inst✝¹⁸ : Field F
inst✝¹⁷ : Field K
inst✝¹⁶ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K₁
inst✝¹³ : Field K₂
inst✝¹² : Field K₃
inst✝¹¹ : Algebra F K₁
inst✝¹⁰ : Algebra F K₂
inst✝⁹ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra E K₁
inst✝⁵ : Algebra E K₂
inst✝⁴ : Algebra E K₃
inst✝³ : IsScalarTower F E K₁
inst✝² : IsScalarTower F E K₂
inst✝¹ : IsScalarTower F E K₃
inst✝ : Normal F E
σ : E ≃ₐ[F] E
a✝ : E
⊢ ↑(AlgHom.comp (toAlgHom F E K₁) ↑σ) (↑(algebraMap E E) a✝) = ↑(algebraMap E K₁) (↑σ a✝)
[PROOFSTEP]
simp
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K
inst✝¹³ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹² : Field F
inst✝¹¹ : Field K₁
inst✝¹⁰ : Field K₂
inst✝⁹ : Field K₃
inst✝⁸ : Algebra F K₁
inst✝⁷ : Algebra F K₂
inst✝⁶ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
inst✝³ : Algebra K₁ E
inst✝² : Algebra K₂ E
inst✝¹ : IsScalarTower F K₁ E
inst✝ : IsScalarTower F K₂ E
h : Normal F E
x : E
x✝ : x ∈ Set.univ
⊢ Splits (algebraMap K₁ E) (map (algebraMap F K₁) (minpoly F x))
[PROOFSTEP]
rw [splits_map_iff, ← @IsScalarTower.algebraMap_eq _ _ _ _ _ _ (_) (_) (_)]
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁵ : Field F
inst✝¹⁴ : Field K
inst✝¹³ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹² : Field F
inst✝¹¹ : Field K₁
inst✝¹⁰ : Field K₂
inst✝⁹ : Field K₃
inst✝⁸ : Algebra F K₁
inst✝⁷ : Algebra F K₂
inst✝⁶ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
inst✝³ : Algebra K₁ E
inst✝² : Algebra K₂ E
inst✝¹ : IsScalarTower F K₁ E
inst✝ : IsScalarTower F K₂ E
h : Normal F E
x : E
x✝ : x ∈ Set.univ
⊢ Splits (algebraMap F E) (minpoly F x)
[PROOFSTEP]
exact (h.out x).2
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K
inst✝¹⁴ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹³ : Field F
inst✝¹² : Field K₁
inst✝¹¹ : Field K₂
inst✝¹⁰ : Field K₃
inst✝⁹ : Algebra F K₁
inst✝⁸ : Algebra F K₂
inst✝⁷ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁶ : Field E
inst✝⁵ : Algebra F E
inst✝⁴ : Algebra K₁ E
inst✝³ : Algebra K₂ E
inst✝² : IsScalarTower F K₁ E
inst✝¹ : IsScalarTower F K₂ E
inst✝ : Normal F K₁
h1 : IsSolvable (K₁ ≃ₐ[F] K₁)
h2 : IsSolvable (E ≃ₐ[K₁] E)
⊢ IsSolvable (E ≃ₐ[F] E)
[PROOFSTEP]
let f : (E ≃ₐ[K₁] E) →* E ≃ₐ[F] E :=
  { toFun := fun ϕ =>
      AlgEquiv.ofAlgHom (ϕ.toAlgHom.restrictScalars F) (ϕ.symm.toAlgHom.restrictScalars F)
        (AlgHom.ext fun x => ϕ.apply_symm_apply x) (AlgHom.ext fun x => ϕ.symm_apply_apply x)
    map_one' := AlgEquiv.ext fun _ => rfl
    map_mul' := fun _ _ => AlgEquiv.ext fun _ => rfl }
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K
inst✝¹⁴ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹³ : Field F
inst✝¹² : Field K₁
inst✝¹¹ : Field K₂
inst✝¹⁰ : Field K₃
inst✝⁹ : Algebra F K₁
inst✝⁸ : Algebra F K₂
inst✝⁷ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁶ : Field E
inst✝⁵ : Algebra F E
inst✝⁴ : Algebra K₁ E
inst✝³ : Algebra K₂ E
inst✝² : IsScalarTower F K₁ E
inst✝¹ : IsScalarTower F K₂ E
inst✝ : Normal F K₁
h1 : IsSolvable (K₁ ≃ₐ[F] K₁)
h2 : IsSolvable (E ≃ₐ[K₁] E)
f : (E ≃ₐ[K₁] E) →* E ≃ₐ[F] E :=
  {
    toOneHom :=
      {
        toFun := fun ϕ =>
          AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
            (_ :
              AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) = AlgHom.id F E)
            (_ :
              AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) = AlgHom.id F E),
        map_one' :=
          (_ :
            (fun ϕ =>
                  AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                    (_ :
                      AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                        AlgHom.id F E)
                    (_ :
                      AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) =
                        AlgHom.id F E))
                1 =
              1) },
    map_mul' :=
      (_ :
        ∀ (x x_1 : E ≃ₐ[K₁] E),
          OneHom.toFun
              {
                toFun := fun ϕ =>
                  AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                    (_ :
                      AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                        AlgHom.id F E)
                    (_ :
                      AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) =
                        AlgHom.id F E),
                map_one' :=
                  (_ :
                    (fun ϕ =>
                          AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                            (_ :
                              AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                                AlgHom.id F E)
                            (_ :
                              AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) =
                                AlgHom.id F E))
                        1 =
                      1) }
              (x * x_1) =
            OneHom.toFun
                {
                  toFun := fun ϕ =>
                    AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                      (_ :
                        AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                          AlgHom.id F E)
                      (_ :
                        AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) =
                          AlgHom.id F E),
                  map_one' :=
                    (_ :
                      (fun ϕ =>
                            AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ)
                              (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                              (_ :
                                AlgHom.comp (AlgHom.restrictScalars F ↑ϕ)
                                    (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                                  AlgHom.id F E)
                              (_ :
                                AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                                    (AlgHom.restrictScalars F ↑ϕ) =
                                  AlgHom.id F E))
                          1 =
                        1) }
                x *
              OneHom.toFun
                {
                  toFun := fun ϕ =>
                    AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                      (_ :
                        AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                          AlgHom.id F E)
                      (_ :
                        AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) =
                          AlgHom.id F E),
                  map_one' :=
                    (_ :
                      (fun ϕ =>
                            AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ)
                              (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                              (_ :
                                AlgHom.comp (AlgHom.restrictScalars F ↑ϕ)
                                    (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                                  AlgHom.id F E)
                              (_ :
                                AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                                    (AlgHom.restrictScalars F ↑ϕ) =
                                  AlgHom.id F E))
                          1 =
                        1) }
                x_1) }
⊢ IsSolvable (E ≃ₐ[F] E)
[PROOFSTEP]
refine'
  solvable_of_ker_le_range f (AlgEquiv.restrictNormalHom K₁) fun ϕ hϕ =>
    ⟨{ ϕ with commutes' := fun x => _ }, AlgEquiv.ext fun _ => rfl⟩
[GOAL]
F : Type u_1
K : Type u_2
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K
inst✝¹⁴ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹³ : Field F
inst✝¹² : Field K₁
inst✝¹¹ : Field K₂
inst✝¹⁰ : Field K₃
inst✝⁹ : Algebra F K₁
inst✝⁸ : Algebra F K₂
inst✝⁷ : Algebra F K₃
ϕ✝ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁶ : Field E
inst✝⁵ : Algebra F E
inst✝⁴ : Algebra K₁ E
inst✝³ : Algebra K₂ E
inst✝² : IsScalarTower F K₁ E
inst✝¹ : IsScalarTower F K₂ E
inst✝ : Normal F K₁
h1 : IsSolvable (K₁ ≃ₐ[F] K₁)
h2 : IsSolvable (E ≃ₐ[K₁] E)
f : (E ≃ₐ[K₁] E) →* E ≃ₐ[F] E :=
  {
    toOneHom :=
      {
        toFun := fun ϕ =>
          AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
            (_ :
              AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) = AlgHom.id F E)
            (_ :
              AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) = AlgHom.id F E),
        map_one' :=
          (_ :
            (fun ϕ =>
                  AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                    (_ :
                      AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                        AlgHom.id F E)
                    (_ :
                      AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) =
                        AlgHom.id F E))
                1 =
              1) },
    map_mul' :=
      (_ :
        ∀ (x x_1 : E ≃ₐ[K₁] E),
          OneHom.toFun
              {
                toFun := fun ϕ =>
                  AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                    (_ :
                      AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                        AlgHom.id F E)
                    (_ :
                      AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) =
                        AlgHom.id F E),
                map_one' :=
                  (_ :
                    (fun ϕ =>
                          AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                            (_ :
                              AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                                AlgHom.id F E)
                            (_ :
                              AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) =
                                AlgHom.id F E))
                        1 =
                      1) }
              (x * x_1) =
            OneHom.toFun
                {
                  toFun := fun ϕ =>
                    AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                      (_ :
                        AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                          AlgHom.id F E)
                      (_ :
                        AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) =
                          AlgHom.id F E),
                  map_one' :=
                    (_ :
                      (fun ϕ =>
                            AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ)
                              (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                              (_ :
                                AlgHom.comp (AlgHom.restrictScalars F ↑ϕ)
                                    (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                                  AlgHom.id F E)
                              (_ :
                                AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                                    (AlgHom.restrictScalars F ↑ϕ) =
                                  AlgHom.id F E))
                          1 =
                        1) }
                x *
              OneHom.toFun
                {
                  toFun := fun ϕ =>
                    AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                      (_ :
                        AlgHom.comp (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                          AlgHom.id F E)
                      (_ :
                        AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) (AlgHom.restrictScalars F ↑ϕ) =
                          AlgHom.id F E),
                  map_one' :=
                    (_ :
                      (fun ϕ =>
                            AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ)
                              (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                              (_ :
                                AlgHom.comp (AlgHom.restrictScalars F ↑ϕ)
                                    (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ)) =
                                  AlgHom.id F E)
                              (_ :
                                AlgHom.comp (AlgHom.restrictScalars F ↑(AlgEquiv.symm ϕ))
                                    (AlgHom.restrictScalars F ↑ϕ) =
                                  AlgHom.id F E))
                          1 =
                        1) }
                x_1) }
ϕ : E ≃ₐ[F] E
hϕ : ϕ ∈ MonoidHom.ker (AlgEquiv.restrictNormalHom K₁)
x : K₁
⊢ Equiv.toFun ϕ.toEquiv (↑(algebraMap K₁ E) x) = ↑(algebraMap K₁ E) x
[PROOFSTEP]
exact Eq.trans (ϕ.restrictNormal_commutes K₁ x).symm (congr_arg _ (AlgEquiv.ext_iff.mp hϕ x))
