File: Mathlib/FieldTheory/NormalClosure.lean

full_name: IsNormalClosure.adjoin_rootSet
code: /-- `L/F` is a normal closure of `K/F` if the minimal polynomial of every element of `K` over `F`
  splits in `L`, and `L` is generated by roots of such minimal polynomials over `F`.
  (Since the minimal polynomial of a transcendental element is 0,
  the normal closure of `K/F` is the same as the normal closure over `F`
  of the algebraic closure of `F` in `K`.) -/
class IsNormalClosure : Prop where
  splits (x : K) : (minpoly F x).Splits (algebraMap F L)
  adjoin_rootSet : ⨆ x : K, adjoin F ((minpoly F x).rootSet L) = ⊤
goal: ⨆ x, IntermediateField.adjoin F ((minpoly F x).rootSet L) = ⊤

full_name: IsNormalClosure
code: /-- `L/F` is a normal closure of `K/F` if the minimal polynomial of every element of `K` over `F`
  splits in `L`, and `L` is generated by roots of such minimal polynomials over `F`.
  (Since the minimal polynomial of a transcendental element is 0,
  the normal closure of `K/F` is the same as the normal closure over `F`
  of the algebraic closure of `F` in `K`.) -/
class IsNormalClosure : Prop where
  splits (x : K) : (minpoly F x).Splits (algebraMap F L)
  adjoin_rootSet : ⨆ x : K, adjoin F ((minpoly F x).rootSet L) = ⊤
goal: Prop

full_name: IsNormalClosure.splits
code: /-- `L/F` is a normal closure of `K/F` if the minimal polynomial of every element of `K` over `F`
  splits in `L`, and `L` is generated by roots of such minimal polynomials over `F`.
  (Since the minimal polynomial of a transcendental element is 0,
  the normal closure of `K/F` is the same as the normal closure over `F`
  of the algebraic closure of `F` in `K`.) -/
class IsNormalClosure : Prop where
  splits (x : K) : (minpoly F x).Splits (algebraMap F L)
  adjoin_rootSet : ⨆ x : K, adjoin F ((minpoly F x).rootSet L) = ⊤
goal: Polynomial.Splits (algebraMap F L) (minpoly F x)

full_name: normalClosure
code: /-- The normal closure of `K/F` in `L/F`. -/
noncomputable def normalClosure : IntermediateField F L 
goal: IntermediateField F L

full_name: normalClosure_def
code: lemma normalClosure_def : normalClosure F K L = ⨆ f : K →ₐ[F] L, f.fieldRange 
goal: normalClosure F K L = ⨆ f, f.fieldRange

full_name: IsNormalClosure.normal
code: /-- A normal closure is always normal. -/
lemma IsNormalClosure.normal [h : IsNormalClosure F K L] : Normal F L 
goal: Normal F L

full_name: normalClosure_le_iff
code: lemma normalClosure_le_iff {K' : IntermediateField F L} :
    normalClosure F K L ≤ K' ↔ ∀ f : K →ₐ[F] L, f.fieldRange ≤ K' 
goal: normalClosure F K L ≤ K' ↔ ∀ (f : K →ₐ[F] L), f.fieldRange ≤ K'

full_name: AlgHom.fieldRange_le_normalClosure
code: lemma AlgHom.fieldRange_le_normalClosure (f : K →ₐ[F] L) : f.fieldRange ≤ normalClosure F K L 
goal: f.fieldRange ≤ normalClosure F K L

full_name: Algebra.IsAlgebraic.normalClosure_le_iSup_adjoin
code: lemma normalClosure_le_iSup_adjoin :
    normalClosure F K L ≤ ⨆ x : K, IntermediateField.adjoin F ((minpoly F x).rootSet L) 
goal: normalClosure F K L ≤ ⨆ x, IntermediateField.adjoin F ((minpoly F x).rootSet L)

full_name: Algebra.IsAlgebraic.normalClosure_eq_iSup_adjoin_of_splits
code: lemma normalClosure_eq_iSup_adjoin_of_splits :
    normalClosure F K L = ⨆ x : K, IntermediateField.adjoin F ((minpoly F x).rootSet L) 
goal: normalClosure F K L = ⨆ x, IntermediateField.adjoin F ((minpoly F x).rootSet L)

full_name: Algebra.IsAlgebraic.isNormalClosure_iff
code: /-- If `K/F` is algebraic, the "generated by roots" condition in IsNormalClosure can be replaced
  by "generated by images of embeddings". -/
lemma isNormalClosure_iff : IsNormalClosure F K L ↔
    (∀ x : K, (minpoly F x).Splits (algebraMap F L)) ∧ normalClosure F K L = ⊤ 
goal: IsNormalClosure F K L ↔ (∀ (x : K), Polynomial.Splits (algebraMap F L) (minpoly F x)) ∧ normalClosure F K L = ⊤

full_name: Algebra.IsAlgebraic.isNormalClosure_normalClosure
code: /-- `normalClosure F K L` is a valid normal closure if `K/F` is algebraic
  and all minimal polynomials of `K/F` splits in `L/F`. -/
lemma isNormalClosure_normalClosure : IsNormalClosure F K (normalClosure F K L) 
goal: IsNormalClosure F K ↥(normalClosure F K L)

full_name: IsNormalClosure.lift
code: /-- A normal closure of `K/F` embeds into any `L/F`
  where the minimal polynomials of `K/F` splits. -/
noncomputable def IsNormalClosure.lift [h : IsNormalClosure F K L] {L'} [Field L'] [Algebra F L']
    (splits : ∀ x : K, (minpoly F x).Splits (algebraMap F L')) : L →ₐ[F] L' 
goal: L →ₐ[F] L'

full_name: IsNormalClosure.equiv
code: /-- Normal closures of `K/F` are unique up to F-algebra isomorphisms. -/
noncomputable def IsNormalClosure.equiv {L'} [Field L'] [Algebra F L']
    [h : IsNormalClosure F K L] [h' : IsNormalClosure F K L'] : L ≃ₐ[F] L' 
goal: L ≃ₐ[F] L'

full_name: isNormalClosure_normalClosure
code: instance isNormalClosure_normalClosure [ne : Nonempty (K →ₐ[F] L)] [h : Normal F L] :
    IsNormalClosure F K (normalClosure F K L) 
goal: IsNormalClosure F K ↥(normalClosure F K L)

full_name: normalClosure_eq_iSup_adjoin'
code: theorem normalClosure_eq_iSup_adjoin' [ne : Nonempty (K →ₐ[F] L)] [h : Normal F L] :
    normalClosure F K L = ⨆ x : K, adjoin F ((minpoly F x).rootSet L) 
goal: normalClosure F K L = ⨆ x, IntermediateField.adjoin F ((minpoly F x).rootSet L)

full_name: normalClosure_eq_iSup_adjoin
code: theorem normalClosure_eq_iSup_adjoin [Algebra K L] [IsScalarTower F K L] [Normal F L] :
    normalClosure F K L = ⨆ x : K, adjoin F ((minpoly F x).rootSet L) 
goal: normalClosure F K L = ⨆ x, IntermediateField.adjoin F ((minpoly F x).rootSet L)

full_name: normalClosure.algHomEquiv
code: /-- All `F`-`AlgHom`s from `K` to `L` factor through the normal closure of `K/F` in `L/F`. -/
noncomputable def algHomEquiv : (K →ₐ[F] normalClosure F K L) ≃ (K →ₐ[F] L) 
goal: (K →ₐ[F] ↥(normalClosure F K L)) ≃ (K →ₐ[F] L)

full_name: normalClosure.normal
code: instance normal [h : Normal F L] : Normal F (normalClosure F K L) 
goal: Normal F ↥(normalClosure F K L)

full_name: normalClosure.is_finiteDimensional
code: instance is_finiteDimensional [FiniteDimensional F K] :
    FiniteDimensional F (normalClosure F K L) 
goal: FiniteDimensional F ↥(normalClosure F K L)

full_name: normalClosure.algebra
code: noncomputable instance algebra :
    Algebra K (normalClosure F K L) 
goal: Algebra K ↥(normalClosure F K L)

full_name: normalClosure.instIsScalarTowerSubtypeMemIntermediateField
code: instance : IsScalarTower F K (normalClosure F K L) 
goal: IsScalarTower F K ↥(normalClosure F K L)

full_name: normalClosure.instIsScalarTowerSubtypeMemIntermediateField_1
code: instance : IsScalarTower K (normalClosure F K L) L 
goal: IsScalarTower K (↥(normalClosure F K L)) L

full_name: normalClosure.restrictScalars_eq
code: lemma restrictScalars_eq :
    (toAlgHom K (normalClosure F K L) L).fieldRange.restrictScalars F = normalClosure F K L 
goal: IntermediateField.restrictScalars F (IsScalarTower.toAlgHom K (↥(normalClosure F K L)) L).fieldRange =
  normalClosure F K L

full_name: Algebra.IsAlgebraic.algHomEmbeddingOfSplits
code: /-- An extension `L/F` in which every minimal polynomial of `K/F` splits is maximal with respect
  to `F`-embeddings of `K`, in the sense that `K →ₐ[F] L` achieves maximal cardinality.
  We construct an explicit injective function from an arbitrary `K →ₐ[F] L'` into `K →ₐ[F] L`,
  using an embedding of `normalClosure F K L'` into `L`. -/
noncomputable def Algebra.IsAlgebraic.algHomEmbeddingOfSplits [Algebra.IsAlgebraic F K]
    (h : ∀ x : K, (minpoly F x).Splits (algebraMap F L)) (L' : Type*) [Field L'] [Algebra F L'] :
    (K →ₐ[F] L') ↪ (K →ₐ[F] L) 
goal: (K →ₐ[F] L') ↪ K →ₐ[F] L

full_name: IntermediateField.le_normalClosure
code: lemma le_normalClosure : K ≤ normalClosure F K L 
goal: K ≤ normalClosure F (↥K) L

full_name: IntermediateField.normalClosure_of_normal
code: lemma normalClosure_of_normal [Normal F K] : normalClosure F K L = K 
goal: normalClosure F (↥K) L = K

full_name: IntermediateField.normalClosure_def'
code: lemma normalClosure_def' : normalClosure F K L = ⨆ f : L →ₐ[F] L, K.map f 
goal: normalClosure F (↥K) L = ⨆ f, IntermediateField.map f K

full_name: IntermediateField.normalClosure_def''
code: lemma normalClosure_def'' : normalClosure F K L = ⨆ f : L ≃ₐ[F] L, K.map f 
goal: normalClosure F (↥K) L = ⨆ f, IntermediateField.map (↑f) K

full_name: IntermediateField.normalClosure_mono
code: lemma normalClosure_mono (h : K ≤ K') : normalClosure F K L ≤ normalClosure F K' L 
goal: normalClosure F (↥K) L ≤ normalClosure F (↥K') L

full_name: IntermediateField.closureOperator_isClosed
code: /-- `normalClosure` as a `ClosureOperator`. -/
@[simps]
noncomputable def closureOperator : ClosureOperator (IntermediateField F L) 
goal: (IntermediateField.closureOperator F L).IsClosed x = (normalClosure F (↥x) L = x)

full_name: IntermediateField.closureOperator
code: /-- `normalClosure` as a `ClosureOperator`. -/
@[simps]
noncomputable def closureOperator : ClosureOperator (IntermediateField F L) 
goal: ClosureOperator (IntermediateField F L)

full_name: IntermediateField.closureOperator_apply
code: /-- `normalClosure` as a `ClosureOperator`. -/
@[simps]
noncomputable def closureOperator : ClosureOperator (IntermediateField F L) 
goal: (IntermediateField.closureOperator F L) K = normalClosure F (↥K) L

full_name: IntermediateField.normal_iff_normalClosure_eq
code: lemma normal_iff_normalClosure_eq : Normal F K ↔ normalClosure F K L = K 
goal: Normal F ↥K ↔ normalClosure F (↥K) L = K

full_name: IntermediateField.normal_iff_normalClosure_le
code: lemma normal_iff_normalClosure_le : Normal F K ↔ normalClosure F K L ≤ K 
goal: Normal F ↥K ↔ normalClosure F (↥K) L ≤ K

full_name: IntermediateField.normal_iff_forall_fieldRange_le
code: lemma normal_iff_forall_fieldRange_le : Normal F K ↔ ∀ σ : K →ₐ[F] L, σ.fieldRange ≤ K 
goal: Normal F ↥K ↔ ∀ (σ : ↥K →ₐ[F] L), σ.fieldRange ≤ K

full_name: IntermediateField.normal_iff_forall_map_le
code: lemma normal_iff_forall_map_le : Normal F K ↔ ∀ σ : L →ₐ[F] L, K.map σ ≤ K 
goal: Normal F ↥K ↔ ∀ (σ : L →ₐ[F] L), IntermediateField.map σ K ≤ K

full_name: IntermediateField.normal_iff_forall_map_le'
code: lemma normal_iff_forall_map_le' : Normal F K ↔ ∀ σ : L ≃ₐ[F] L, K.map ↑σ ≤ K 
goal: Normal F ↥K ↔ ∀ (σ : L ≃ₐ[F] L), IntermediateField.map (↑σ) K ≤ K

full_name: IntermediateField.normal_iff_forall_fieldRange_eq
code: lemma normal_iff_forall_fieldRange_eq : Normal F K ↔ ∀ σ : K →ₐ[F] L, σ.fieldRange = K 
goal: Normal F ↥K ↔ ∀ (σ : ↥K →ₐ[F] L), σ.fieldRange = K

full_name: IntermediateField.normal_iff_forall_map_eq
code: lemma normal_iff_forall_map_eq : Normal F K ↔ ∀ σ : L →ₐ[F] L, K.map σ = K 
goal: Normal F ↥K ↔ ∀ (σ : L →ₐ[F] L), IntermediateField.map σ K = K

full_name: IntermediateField.normal_iff_forall_map_eq'
code: lemma normal_iff_forall_map_eq' : Normal F K ↔ ∀ σ : L ≃ₐ[F] L, K.map ↑σ = K 
goal: Normal F ↥K ↔ ∀ (σ : L ≃ₐ[F] L), IntermediateField.map (↑σ) K = K