Theorem: Normal.of_isSplittingField
File: Mathlib/FieldTheory/Normal.lean

tactic: rcases eq_or_ne p 0 with (rfl | hp)
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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

tactic: refine' normal_iff.2 fun x => _
state_before: case inr
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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

tactic: have hFE : FiniteDimensional F E := IsSplittingField.finiteDimensional E p
state_before: case inr
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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)

tactic: have Hx : IsIntegral F x := isIntegral_of_noetherian (IsNoetherian.iff_fg.2 hFE) x
state_before: case inr
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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)

tactic: refine' ⟨Hx, Or.inr _⟩
state_before: case inr
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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)

tactic: rintro q q_irred ⟨r, hr⟩
state_before: case inr
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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

tactic: let D := AdjoinRoot q
state_before: case inr.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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

tactic: haveI := Fact.mk q_irred
state_before: case inr.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := AdjoinRoot q
⊢ degree q = 1

tactic: let pbED := AdjoinRoot.powerBasis q_irred.ne_zero
state_before: case inr.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := AdjoinRoot q
this : Fact (Irreducible q)
⊢ degree q = 1

tactic: haveI : FiniteDimensional E D := PowerBasis.finiteDimensional pbED
state_before: case inr.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := AdjoinRoot q
this : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
⊢ degree q = 1

tactic: have finrankED : FiniteDimensional.finrank E D = q.natDegree := by
  rw [PowerBasis.finrank pbED, AdjoinRoot.powerBasis_dim]
state_before: case inr.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := AdjoinRoot q
this✝ : Fact (Irreducible q)
pbED : PowerBasis E (AdjoinRoot q) := AdjoinRoot.powerBasis (_ : q ≠ 0)
this : FiniteDimensional E D
⊢ degree q = 1

tactic: haveI : FiniteDimensional F D := FiniteDimensional.trans F E D
state_before: case inr.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: rsuffices ⟨ϕ⟩ : Nonempty (D →ₐ[F] E)
state_before: case inr.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: let C := AdjoinRoot (minpoly F x)
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: haveI Hx_irred := Fact.mk (minpoly.irreducible Hx)
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: 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, MulZeroClass.zero_mul]
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: letI : Algebra C D :=
  RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F D) (AdjoinRoot.root q) heval)
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: letI : Algebra C E := RingHom.toAlgebra (AdjoinRoot.lift (algebraMap F E) x (minpoly.aeval F x))
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: haveI : IsScalarTower F C D := of_algebraMap_eq fun y => (AdjoinRoot.lift_of heval).symm
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: haveI : IsScalarTower F C E := by
  refine' of_algebraMap_eq fun y => (AdjoinRoot.lift_of _).symm
rw [← aeval_def, minpoly.aeval]
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: suffices Nonempty (D →ₐ[C] E) by exact Nonempty.map (AlgHom.restrictScalars F) this
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: let S : Set D := ((p.map (algebraMap F E)).roots.map (algebraMap E D)).toFinset
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: rw [← IntermediateField.toSubalgebra_le_toSubalgebra, IntermediateField.top_toSubalgebra]
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: apply ge_trans (IntermediateField.algebra_adjoin_le_adjoin C S)
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: 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)
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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 ≥ ⊤

tactic: change Subalgebra.restrictScalars F (Algebra.adjoin C
  (((p.map (algebraMap F E)).roots.map (algebraMap E D)).toFinset : Set D)) = _
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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})

tactic: rw [← Finset.image_toFinset, Finset.coe_image]
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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})

tactic: apply
  Eq.trans
    (Algebra.adjoin_res_eq_adjoin_res F E C D hFEp.adjoin_roots AdjoinRoot.adjoinRoot_eq_top)
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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})

tactic: rw [Set.image_singleton, RingHom.algebraMap_toAlgebra, AdjoinRoot.lift_root]
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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})

tactic: have := hFEp.adjoin_roots
state_before: case inl
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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

tactic: simp only [Polynomial.map_zero, roots_zero, Multiset.toFinset_zero, Finset.coe_empty,
  Algebra.adjoin_empty] at this
state_before: case inl
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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 ↑(Multiset.toFinset (roots (map (algebraMap F E) 0))) = ⊤
⊢ Normal F E

tactic: exact
  Normal.of_algEquiv
    (AlgEquiv.ofBijective (Algebra.ofId F E) (Algebra.bijective_algebraMap_iff.2 this.symm))
state_before: case inl
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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

tactic: rw [PowerBasis.finrank pbED, AdjoinRoot.powerBasis_dim]
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: change degree q = ↑(1 : ℕ)
state_before: case inr.intro.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: rw [degree_eq_iff_natDegree_eq q_irred.ne_zero, ← finrankED]
state_before: case inr.intro.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: have nat_lemma : ∀ a b c : ℕ, a * b = c → c ≤ a → 0 < c → b = 1 := by
  intro a b c h1 h2 h3
  nlinarith
state_before: case inr.intro.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: 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
state_before: case inr.intro.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: intro a b c h1 h2 h3
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: nlinarith
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: rw [algebraMap_eq F E D, ← eval₂_map, hr, AdjoinRoot.algebraMap_eq, eval₂_mul,
  AdjoinRoot.eval₂_root, MulZeroClass.zero_mul]
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: refine' of_algebraMap_eq fun y => (AdjoinRoot.lift_of _).symm
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: rw [← aeval_def, minpoly.aeval]
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: exact Nonempty.map (AlgHom.restrictScalars F) this
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: refine' IntermediateField.algHom_mk_adjoin_splits' (top_le_iff.mp this) fun y hy => _
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: rcases Multiset.mem_map.mp (Multiset.mem_toFinset.mp hy) with ⟨z, hz1, hz2⟩
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: have Hz : IsIntegral F z := isIntegral_of_noetherian (IsNoetherian.iff_fg.2 hFE) z
state_before: case intro.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: use
  show IsIntegral C y from
    isIntegral_of_noetherian (IsNoetherian.iff_fg.2 (FiniteDimensional.right F C D)) y
state_before: case intro.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: apply splits_of_splits_of_dvd (algebraMap C E) (map_ne_zero (minpoly.ne_zero Hz))
state_before: case intro.intro
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: rw [splits_map_iff, ← algebraMap_eq F C E]
state_before: case intro.intro.hf
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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.151496 (minpoly F z))

tactic: 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)))
state_before: case intro.intro.hf
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: apply minpoly.dvd
state_before: case intro.intro.hgf
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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)

tactic: 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]
state_before: case intro.intro.hgf.hp
F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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

tactic: rw [AdjoinRoot.adjoinRoot_eq_top, Subalgebra.restrictScalars_top, ←
  @Subalgebra.restrictScalars_top F C] at this
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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 ≥ ⊤

tactic: exact top_le_iff.mpr (Subalgebra.restrictScalars_injective F this)
state_before: F : Type u_1
K : Type ?u.87123
inst✝¹¹ : Field F
inst✝¹⁰ : Field K
inst✝⁹ : Algebra F K
E : Type u_2
inst✝⁸ : Field E
inst✝⁷ : Algebra F E
inst✝⁶ : Algebra K E
inst✝⁵ : IsScalarTower F K E
E' : Type ?u.87603
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_2 := 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 ≥ ⊤