Module docstring
{"# Normal field extensions
In this file we define normal field extensions.
Main Definitions
Normal F KwhereKis a field extension ofF. "}
{"# Normal field extensions
In this file we define normal field extensions.
Normal F K where K is a field extension of F.
"}Normal
structure
extends Algebra.IsAlgebraic F K
/-- Typeclass for normal field extensions: an algebraic extension of fields `K/F` is *normal*
if the minimal polynomial of every element `x` in `K` splits in `K`, i.e. every `F`-conjugate
of `x` is in `K`. -/
@[stacks 09HM]
class Normal : Prop extends Algebra.IsAlgebraic F K where
splits' (x : K) : Splits (algebraMap F K) (minpoly F x)
Normal.isIntegral
theorem
(_ : Normal F K) (x : K) : IsIntegral F x
theorem Normal.isIntegral (_ : Normal F K) (x : K) : IsIntegral F x :=
Algebra.IsIntegral.isIntegral x
Normal.splits
theorem
(_ : Normal F K) (x : K) : Splits (algebraMap F K) (minpoly F x)
theorem Normal.splits (_ : Normal F K) (x : K) : Splits (algebraMap F K) (minpoly F x) :=
Normal.splits' x
normal_iff
theorem
: Normal F K ↔ ∀ x : K, IsIntegral F x ∧ Splits (algebraMap F K) (minpoly F x)
Normal.out
theorem
: Normal F K → ∀ x : K, IsIntegral F x ∧ Splits (algebraMap F K) (minpoly F x)
theorem Normal.out : Normal F K → ∀ x : K, IsIntegralIsIntegral F x ∧ Splits (algebraMap F K) (minpoly F x) :=
normal_iff.1
normal_self
instance
: Normal F F
instance normal_self : Normal F F where
isAlgebraic := fun _ => isIntegral_algebraMap.isAlgebraic
splits' := fun x => (minpoly.eq_X_sub_C' x).symm ▸ splits_X_sub_C _
Normal.tower_top_of_normal
theorem
[h : Normal F E] : Normal K E
@[stacks 09HN]
theorem Normal.tower_top_of_normal [h : Normal F E] : Normal K E :=
normal_iff.2 fun x => by
obtain ⟨hx, hhx⟩ := h.out x
rw [algebraMap_eq F K E] at hhx
exact
⟨hx.tower_top,
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)⟩
AlgHom.normal_bijective
theorem
[h : Normal F E] (ϕ : E →ₐ[F] K) : Function.Bijective ϕ
theorem AlgHom.normal_bijective [h : Normal F E] (ϕ : E →ₐ[F] K) : Function.Bijective ϕ :=
h.toIsAlgebraic.bijective_of_isScalarTower' ϕ
Normal.of_algEquiv
theorem
[h : Normal F E] (f : E ≃ₐ[F] E') : Normal F E'
theorem Normal.of_algEquiv [h : Normal F E] (f : E ≃ₐ[F] E') : Normal F E' := by
rw [normal_iff] at h ⊢
intro x; specialize h (f.symm x)
rw [← f.apply_symm_apply x, minpoly.algEquiv_eq, ← f.toAlgHom.comp_algebraMap]
exact ⟨h.1.map f, splits_comp_of_splits _ _ h.2⟩
AlgEquiv.transfer_normal
theorem
(f : E ≃ₐ[F] E') : Normal F E ↔ Normal F E'
theorem AlgEquiv.transfer_normal (f : E ≃ₐ[F] E') : NormalNormal F E ↔ Normal F E' :=
⟨fun _ ↦ Normal.of_algEquiv f, fun _ ↦ Normal.of_algEquiv f.symm⟩
IntermediateField.restrictScalars_normal
theorem
{E : IntermediateField K L} : Normal F (E.restrictScalars F) ↔ Normal F E
@[simp]
theorem restrictScalars_normal {E : IntermediateField K L} :
NormalNormal F (E.restrictScalars F) ↔ Normal F E :=
Iff.rfl
AlgHom.restrictNormalAux
definition
[h : Normal F E] : (toAlgHom F E K₁).range →ₐ[F] (toAlgHom F E K₂).range
/-- Restrict algebra homomorphism to image of normal subfield -/
def AlgHom.restrictNormalAux [h : Normal F E] :
(toAlgHom F E K₁).range →ₐ[F] (toAlgHom F E K₂).range where
toFun x :=
⟨ϕ x, by
suffices (toAlgHom F E K₁).range.map ϕ ≤ _ by exact this ⟨x, Subtype.mem x, rfl⟩
rintro x ⟨y, ⟨z, hy⟩, hx⟩
rw [← hx, ← hy]
apply minpoly.mem_range_of_degree_eq_one E
refine
Or.resolve_left (h.splits z).def (minpoly.ne_zero (h.isIntegral z)) (minpoly.irreducible ?_)
(minpoly.dvd E _ (by simp [aeval_algHom_apply]))
simp only [AlgHom.toRingHom_eq_coe, AlgHom.coe_toRingHom]
suffices IsIntegral F _ by exact this.tower_top
exact ((h.isIntegral z).map <| toAlgHom F E K₁).map ϕ⟩
map_zero' := Subtype.ext (map_zero _)
map_one' := Subtype.ext (map_one _)
map_add' x y := Subtype.ext <| by simp
map_mul' x y := Subtype.ext <| by simp
commutes' x := Subtype.ext (ϕ.commutes x)
AlgHom.restrictNormal
definition
[Normal F E] : E →ₐ[F] E
/-- Restrict algebra homomorphism to normal subfield. -/
@[stacks 0BME "Part 1"]
def AlgHom.restrictNormal [Normal F E] : E →ₐ[F] E :=
((AlgEquiv.ofInjectiveField (IsScalarTower.toAlgHom F E K₂)).symm.toAlgHom.comp
(ϕ.restrictNormalAux E)).comp
(AlgEquiv.ofInjectiveField (IsScalarTower.toAlgHom F E K₁)).toAlgHom
AlgHom.restrictNormal'
definition
[Normal F E] : E ≃ₐ[F] E
/-- Restrict algebra homomorphism to normal subfield (`AlgEquiv` version) -/
def AlgHom.restrictNormal' [Normal F E] : E ≃ₐ[F] E :=
AlgEquiv.ofBijective (AlgHom.restrictNormal ϕ E) (AlgHom.normal_bijective F E E _)
AlgHom.restrictNormal_commutes
theorem
[Normal F E] (x : E) : algebraMap E K₂ (ϕ.restrictNormal E x) = ϕ (algebraMap E K₁ x)
@[simp]
theorem AlgHom.restrictNormal_commutes [Normal F E] (x : E) :
algebraMap E K₂ (ϕ.restrictNormal E x) = ϕ (algebraMap E K₁ x) :=
Subtype.ext_iff.mp
(AlgEquiv.apply_symm_apply (AlgEquiv.ofInjectiveField (IsScalarTower.toAlgHom F E K₂))
(ϕ.restrictNormalAux E ⟨IsScalarTower.toAlgHom F E K₁ x, x, rfl⟩))
AlgHom.restrictNormal_comp
theorem
[Normal F E] : (ψ.restrictNormal E).comp (ϕ.restrictNormal E) = (ψ.comp ϕ).restrictNormal E
theorem AlgHom.restrictNormal_comp [Normal F E] :
(ψ.restrictNormal E).comp (ϕ.restrictNormal E) = (ψ.comp ϕ).restrictNormal E :=
AlgHom.ext fun _ =>
(algebraMap E K₃).injective (by simp only [AlgHom.comp_apply, AlgHom.restrictNormal_commutes])
AlgEquiv.restrictNormal
definition
[Normal F E] : E ≃ₐ[F] E
/-- Restrict algebra isomorphism to a normal subfield -/
def AlgEquiv.restrictNormal [Normal F E] : E ≃ₐ[F] E :=
AlgHom.restrictNormal' χ.toAlgHom E
AlgEquiv.restrictNormal_commutes
theorem
[Normal F E] (x : E) : algebraMap E K₂ (χ.restrictNormal E x) = χ (algebraMap E K₁ x)
@[simp]
theorem AlgEquiv.restrictNormal_commutes [Normal F E] (x : E) :
algebraMap E K₂ (χ.restrictNormal E x) = χ (algebraMap E K₁ x) :=
χ.toAlgHom.restrictNormal_commutes E x
AlgEquiv.restrictNormal_trans
theorem
[Normal F E] : (χ.trans ω).restrictNormal E = (χ.restrictNormal E).trans (ω.restrictNormal E)
theorem AlgEquiv.restrictNormal_trans [Normal F E] :
(χ.trans ω).restrictNormal E = (χ.restrictNormal E).trans (ω.restrictNormal E) :=
AlgEquiv.ext fun _ =>
(algebraMap E K₃).injective
(by simp only [AlgEquiv.trans_apply, AlgEquiv.restrictNormal_commutes])
AlgEquiv.restrictNormalHom
definition
[Normal F E] : (K₁ ≃ₐ[F] K₁) →* E ≃ₐ[F] E
/-- Restriction to a normal subfield as a group homomorphism -/
def AlgEquiv.restrictNormalHom [Normal F E] : (K₁ ≃ₐ[F] K₁) →* E ≃ₐ[F] E :=
MonoidHom.mk' (fun χ => χ.restrictNormal E) fun ω χ => χ.restrictNormal_trans ω E
AlgEquiv.restrictNormalHom_apply
theorem
(L : IntermediateField F K₁) [Normal F L] (σ : (K₁ ≃ₐ[F] K₁)) (x : L) : restrictNormalHom L σ x = σ x
lemma AlgEquiv.restrictNormalHom_apply (L : IntermediateField F K₁) [Normal F L]
(σ : (K₁ ≃ₐ[F] K₁)) (x : L) : restrictNormalHom L σ x = σ x :=
AlgEquiv.restrictNormal_commutes σ L x
Normal.algHomEquivAut
definition
[Normal F E] : (E →ₐ[F] K₁) ≃ E ≃ₐ[F] E
/-- If `K₁/E/F` is a tower of fields with `E/F` normal then `AlgHom.restrictNormal'` is an
equivalence. -/
@[simps, stacks 0BR4]
def Normal.algHomEquivAut [Normal F E] : (E →ₐ[F] K₁) ≃ E ≃ₐ[F] E where
toFun σ := AlgHom.restrictNormal' σ E
invFun σ := (IsScalarTower.toAlgHom F E K₁).comp σ.toAlgHom
left_inv σ := by
ext
simp [AlgHom.restrictNormal']
right_inv σ := by
ext
simp only [AlgHom.restrictNormal', AlgEquiv.toAlgHom_eq_coe, AlgEquiv.coe_ofBijective]
apply FaithfulSMul.algebraMap_injective E K₁
rw [AlgHom.restrictNormal_commutes]
simp
AlgEquiv.restrictNormalHom_id
theorem
(F K : Type*) [Field F] [Field K] [Algebra F K] [Normal F K] : AlgEquiv.restrictNormalHom K = MonoidHom.id (K ≃ₐ[F] K)
/-- The group homomorphism given by restricting an algebra isomorphism to itself
is the identity map. -/
@[simp]
theorem AlgEquiv.restrictNormalHom_id (F K : Type*)
[Field F] [Field K] [Algebra F K] [Normal F K] :
AlgEquiv.restrictNormalHom K = MonoidHom.id (K ≃ₐ[F] K) := by
ext f x
dsimp only [restrictNormalHom, MonoidHom.mk'_apply, MonoidHom.id_apply]
apply (algebraMap K K).injective
rw [AlgEquiv.restrictNormal_commutes]
simp only [Algebra.id.map_eq_id, RingHom.id_apply]
IsScalarTower.AlgEquiv.restrictNormalHom_comp
theorem
(F K₁ K₂ K₃ : Type*) [Field F] [Field K₁] [Field K₂] [Field K₃] [Algebra F K₁] [Algebra F K₂] [Algebra F K₃]
[Algebra K₁ K₂] [Algebra K₁ K₃] [Algebra K₂ K₃] [IsScalarTower F K₁ K₃] [IsScalarTower F K₁ K₂]
[IsScalarTower F K₂ K₃] [IsScalarTower K₁ K₂ K₃] [Normal F K₁] [Normal F K₂] :
AlgEquiv.restrictNormalHom K₁ =
(AlgEquiv.restrictNormalHom K₁).comp (AlgEquiv.restrictNormalHom (F := F) (K₁ := K₃) K₂)
/-- In a scalar tower `K₃/K₂/K₁/F` with `K₁` and `K₂` are normal over `F`, the group homomorphism
given by the restriction of algebra isomorphisms of `K₃` to `K₁` is equal to the composition of
the group homomorphism given by the restricting an algebra isomorphism of `K₃` to `K₂` and
the group homomorphism given by the restricting an algebra isomorphism of `K₂` to `K₁` -/
theorem AlgEquiv.restrictNormalHom_comp (F K₁ K₂ K₃ : Type*)
[Field F] [Field K₁] [Field K₂] [Field K₃]
[Algebra F K₁] [Algebra F K₂] [Algebra F K₃] [Algebra K₁ K₂] [Algebra K₁ K₃] [Algebra K₂ K₃]
[IsScalarTower F K₁ K₃] [IsScalarTower F K₁ K₂] [IsScalarTower F K₂ K₃] [IsScalarTower K₁ K₂ K₃]
[Normal F K₁] [Normal F K₂] :
AlgEquiv.restrictNormalHom K₁ =
(AlgEquiv.restrictNormalHom K₁).comp
(AlgEquiv.restrictNormalHom (F := F) (K₁ := K₃) K₂) := by
ext f x
apply (algebraMap K₁ K₃).injective
rw [IsScalarTower.algebraMap_eq K₁ K₂ K₃]
simp only [AlgEquiv.restrictNormalHom, MonoidHom.mk'_apply, RingHom.coe_comp, Function.comp_apply,
← algebraMap_apply, AlgEquiv.restrictNormal_commutes, MonoidHom.coe_comp]
IsScalarTower.AlgEquiv.restrictNormalHom_comp_apply
theorem
(K₁ K₂ : Type*) {F K₃ : Type*} [Field F] [Field K₁] [Field K₂] [Field K₃] [Algebra F K₁] [Algebra F K₂] [Algebra F K₃]
[Algebra K₁ K₂] [Algebra K₁ K₃] [Algebra K₂ K₃] [IsScalarTower F K₁ K₃] [IsScalarTower F K₁ K₂]
[IsScalarTower F K₂ K₃] [IsScalarTower K₁ K₂ K₃] [Normal F K₁] [Normal F K₂] (f : K₃ ≃ₐ[F] K₃) :
AlgEquiv.restrictNormalHom K₁ f = (AlgEquiv.restrictNormalHom K₁) (AlgEquiv.restrictNormalHom K₂ f)
theorem AlgEquiv.restrictNormalHom_comp_apply (K₁ K₂ : Type*) {F K₃ : Type*}
[Field F] [Field K₁] [Field K₂] [Field K₃]
[Algebra F K₁] [Algebra F K₂] [Algebra F K₃] [Algebra K₁ K₂] [Algebra K₁ K₃] [Algebra K₂ K₃]
[IsScalarTower F K₁ K₃] [IsScalarTower F K₁ K₂] [IsScalarTower F K₂ K₃] [IsScalarTower K₁ K₂ K₃]
[Normal F K₁] [Normal F K₂] (f : K₃ ≃ₐ[F] K₃) :
AlgEquiv.restrictNormalHom K₁ f =
(AlgEquiv.restrictNormalHom K₁) (AlgEquiv.restrictNormalHom K₂ f) := by
rw [IsScalarTower.AlgEquiv.restrictNormalHom_comp F K₁ K₂ K₃, MonoidHom.comp_apply]