Theorem: normalClosure.restrictScalars_eq_iSup_adjoin
File: Mathlib/FieldTheory/Normal.lean

tactic: refine' le_antisymm (iSup_le _) (iSup_le fun x => adjoin_le_iff.mpr fun y hy => _)
state_before: F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
⊢ restrictScalars F (normalClosure F K L) = ⨆ (x : K), adjoin F (rootSet (minpoly F x) L)

tactic: rintro f _ ⟨x, rfl⟩
state_before: case refine'_1
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
⊢ ∀ (i : K →ₐ[F] L), AlgHom.fieldRange i ≤ ⨆ (x : K), adjoin F (rootSet (minpoly F x) L)

tactic: refine'
  le_iSup (fun x => adjoin F ((minpoly F x).rootSet L)) x
    (subset_adjoin F ((minpoly F x).rootSet L) _)
state_before: case refine'_1.intro
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
f : K →ₐ[F] L
x : K
⊢ ↑↑f x ∈ ⨆ (x : K), adjoin F (rootSet (minpoly F x) L)

tactic: rw [mem_rootSet_of_ne, AlgHom.toRingHom_eq_coe, AlgHom.coe_toRingHom,
  Polynomial.aeval_algHom_apply, minpoly.aeval, map_zero]
state_before: case refine'_1.intro
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
f : K →ₐ[F] L
x : K
⊢ ↑↑f x ∈ rootSet (minpoly F x) L

tactic: exact
  minpoly.ne_zero
    ((isIntegral_algebraMap_iff (algebraMap K L).injective).mp
      (h.isIntegral (algebraMap K L x)))
state_before: case refine'_1.intro.hp
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
f : K →ₐ[F] L
x : K
⊢ minpoly F x ≠ 0

tactic: rw [Polynomial.rootSet, Finset.mem_coe, Multiset.mem_toFinset] at hy
state_before: case refine'_2
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ rootSet (minpoly F x) L
⊢ y ∈ ↑(restrictScalars F (normalClosure F K L))

tactic: let g :=
  (algHomAdjoinIntegralEquiv F
        ((isIntegral_algebraMap_iff (algebraMap K L).injective).mp
          (h.isIntegral (algebraMap K L x)))).symm
    ⟨y, hy⟩
state_before: case refine'_2
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x))
⊢ y ∈ ↑(restrictScalars F (normalClosure F K L))

tactic: refine'
  le_iSup (fun f : K →ₐ[F] L => f.fieldRange)
    ((g.liftNormal L).comp (IsScalarTower.toAlgHom F K L))
    ⟨x, (g.liftNormal_commutes L (AdjoinSimple.gen F x)).trans _⟩
state_before: case refine'_2
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x))
g : (fun x_1 => { x_2 // x_2 ∈ F⟮x⟯ } →ₐ[F] L) { val := y, property := hy } :=
  ↑(algHomAdjoinIntegralEquiv F (_ : IsIntegral F x)).symm { val := y, property := hy }
⊢ y ∈ ↑(restrictScalars F (normalClosure F K L))

tactic: rw [Algebra.id.map_eq_id, RingHom.id_apply]
state_before: case refine'_2
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x))
g : (fun x_1 => { x_2 // x_2 ∈ F⟮x⟯ } →ₐ[F] L) { val := y, property := hy } :=
  ↑(algHomAdjoinIntegralEquiv F (_ : IsIntegral F x)).symm { val := y, property := hy }
⊢ ↑(algebraMap L L) (↑g (AdjoinSimple.gen F x)) = y

tactic: apply PowerBasis.lift_gen
state_before: case refine'_2
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x))
g : (fun x_1 => { x_2 // x_2 ∈ F⟮x⟯ } →ₐ[F] L) { val := y, property := hy } :=
  ↑(algHomAdjoinIntegralEquiv F (_ : IsIntegral F x)).symm { val := y, property := hy }
⊢ ↑g (AdjoinSimple.gen F x) = y

tactic: change aeval y (minpoly F (AdjoinSimple.gen F x)) = 0
state_before: case refine'_2.hy
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x))
g : (fun x_1 => { x_2 // x_2 ∈ F⟮x⟯ } →ₐ[F] L) { val := y, property := hy } :=
  ↑(algHomAdjoinIntegralEquiv F (_ : IsIntegral F x)).symm { val := y, property := hy }
⊢ ↑(aeval
          ↑(↑(Equiv.subtypeEquiv (Equiv.refl L)
                    (_ :
                      ∀ (x_1 : L),
                        ↑(aeval x_1) (minpoly F (adjoin.powerBasis (_ : IsIntegral F x)).gen) = 0 ↔
                          ↑(Equiv.refl L) x_1 ∈
                            roots
                              (Polynomial.map (algebraMap F L)
                                (minpoly F (adjoin.powerBasis (_ : IsIntegral F x)).gen)))).symm
              (↑(Equiv.subtypeEquiv (Equiv.refl L)
                      (_ :
                        ∀ (x_1 : L),
                          x_1 ∈
                              roots
                                (Polynomial.map (algebraMap F L)
                                  (minpoly F (adjoin.powerBasis (_ : IsIntegral F x)).gen)) ↔
                            ↑(Equiv.refl L) x_1 ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x)))).symm
                { val := y, property := hy })))
      (minpoly F (adjoin.powerBasis (_ : IsIntegral F x)).gen) =
    0

tactic: suffices : minpoly F (AdjoinSimple.gen F x) = minpoly F x
state_before: case refine'_2.hy
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x))
g : (fun x_1 => { x_2 // x_2 ∈ F⟮x⟯ } →ₐ[F] L) { val := y, property := hy } :=
  ↑(algHomAdjoinIntegralEquiv F (_ : IsIntegral F x)).symm { val := y, property := hy }
⊢ ↑(aeval y) (minpoly F (AdjoinSimple.gen F x)) = 0

tactic: . exact this ▸ aeval_eq_zero_of_mem_rootSet (Multiset.mem_toFinset.mpr hy)
state_before: case refine'_2.hy
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x))
g : (fun x_1 => { x_2 // x_2 ∈ F⟮x⟯ } →ₐ[F] L) { val := y, property := hy } :=
  ↑(algHomAdjoinIntegralEquiv F (_ : IsIntegral F x)).symm { val := y, property := hy }
this : minpoly F (AdjoinSimple.gen F x) = minpoly F x
⊢ ↑(aeval y) (minpoly F (AdjoinSimple.gen F x)) = 0

case this
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x))
g : (fun x_1 => { x_2 // x_2 ∈ F⟮x⟯ } →ₐ[F] L) { val := y, property := hy } :=
  ↑(algHomAdjoinIntegralEquiv F (_ : IsIntegral F x)).symm { val := y, property := hy }
⊢ minpoly F (AdjoinSimple.gen F x) = minpoly F x

tactic: exact minpoly_gen ((isIntegral_algebraMap_iff (algebraMap K L).injective).mp
  (h.isIntegral (algebraMap K L x)))
state_before: case this
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x))
g : (fun x_1 => { x_2 // x_2 ∈ F⟮x⟯ } →ₐ[F] L) { val := y, property := hy } :=
  ↑(algHomAdjoinIntegralEquiv F (_ : IsIntegral F x)).symm { val := y, property := hy }
⊢ minpoly F (AdjoinSimple.gen F x) = minpoly F x

tactic: exact this ▸ aeval_eq_zero_of_mem_rootSet (Multiset.mem_toFinset.mpr hy)
state_before: case refine'_2.hy
F : Type u_1
K : Type u_3
inst✝¹⁴ : Field F
inst✝¹³ : Field K
inst✝¹² : Algebra F K
K₁ : Type ?u.556058
K₂ : Type ?u.556061
K₃ : Type ?u.556064
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₃
inst✝⁴ : Algebra F K
L : Type u_2
inst✝³ : Field L
inst✝² : Algebra F L
inst✝¹ : Algebra K L
inst✝ : IsScalarTower F K L
h : Normal F L
x : K
y : L
hy : y ∈ roots (Polynomial.map (algebraMap F L) (minpoly F x))
g : (fun x_1 => { x_2 // x_2 ∈ F⟮x⟯ } →ₐ[F] L) { val := y, property := hy } :=
  ↑(algHomAdjoinIntegralEquiv F (_ : IsIntegral F x)).symm { val := y, property := hy }
this : minpoly F (AdjoinSimple.gen F x) = minpoly F x
⊢ ↑(aeval y) (minpoly F (AdjoinSimple.gen F x)) = 0