Module docstring
{"# Adjoining Elements to Fields
This file relates IntermediateField.adjoin to Algebra.adjoin.
"}
{"# Adjoining Elements to Fields
This file relates IntermediateField.adjoin to Algebra.adjoin.
"}
IntermediateField.algebra_adjoin_le_adjoin
theorem
: Algebra.adjoin F S ≤ (adjoin F S).toSubalgebra
theorem algebra_adjoin_le_adjoin : Algebra.adjoin F S ≤ (adjoin F S).toSubalgebra :=
Algebra.adjoin_le (subset_adjoin _ _)
IntermediateField.algebraAdjoinAdjoin.instAlgebraSubtypeMemSubalgebraAdjoinAdjoin
instance
: Algebra (Algebra.adjoin F S) (adjoin F S)
/-- `IntermediateField.adjoin` as an algebra over `Algebra.adjoin`. -/
scoped instance : Algebra (Algebra.adjoin F S) (adjoin F S) :=
(Subalgebra.inclusion <| algebra_adjoin_le_adjoin F S).toAlgebra
IntermediateField.algebraAdjoinAdjoin.instIsScalarTowerSubtypeMemSubalgebraAdjoinAdjoin
instance
(X) [SMul X F] [SMul X E] [IsScalarTower X F E] : IsScalarTower X (Algebra.adjoin F S) (adjoin F S)
scoped instance (X) [SMul X F] [SMul X E] [IsScalarTower X F E] :
IsScalarTower X (Algebra.adjoin F S) (adjoin F S) :=
Subalgebra.inclusion.isScalarTower_left (algebra_adjoin_le_adjoin F S) _
IntermediateField.algebraAdjoinAdjoin.instIsScalarTowerSubtypeMemSubalgebraAdjoinAdjoin_1
instance
(X) [MulAction E X] : IsScalarTower (Algebra.adjoin F S) (adjoin F S) X
scoped instance (X) [MulAction E X] : IsScalarTower (Algebra.adjoin F S) (adjoin F S) X :=
Subalgebra.inclusion.isScalarTower_right (algebra_adjoin_le_adjoin F S) _
IntermediateField.algebraAdjoinAdjoin.instFaithfulSMulSubtypeMemSubalgebraAdjoinAdjoin
instance
: FaithfulSMul (Algebra.adjoin F S) (adjoin F S)
scoped instance : FaithfulSMul (Algebra.adjoin F S) (adjoin F S) :=
Subalgebra.inclusion.faithfulSMul (algebra_adjoin_le_adjoin F S)
IntermediateField.algebraAdjoinAdjoin.instIsFractionRingSubtypeMemSubalgebraAdjoinAdjoin
instance
: IsFractionRing (Algebra.adjoin F S) (adjoin F S)
scoped instance : IsFractionRing (Algebra.adjoin F S) (adjoin F S) :=
.of_field _ _ fun ⟨_, h⟩ ↦ have ⟨x, hx, y, hy, eq⟩ := mem_adjoin_iff_div.mp h
⟨⟨x, hx⟩, ⟨y, hy⟩, Subtype.ext eq⟩
IntermediateField.algebraAdjoinAdjoin.instIsAlgebraicSubtypeMemSubalgebraAdjoinAdjoin
instance
: Algebra.IsAlgebraic (Algebra.adjoin F S) (adjoin F S)
scoped instance : Algebra.IsAlgebraic (Algebra.adjoin F S) (adjoin F S) :=
IsLocalization.isAlgebraic _ (nonZeroDivisors (Algebra.adjoin F S))
IntermediateField.adjoin_eq_algebra_adjoin
theorem
(inv_mem : ∀ x ∈ Algebra.adjoin F S, x⁻¹ ∈ Algebra.adjoin F S) : (adjoin F S).toSubalgebra = Algebra.adjoin F S
theorem adjoin_eq_algebra_adjoin (inv_mem : ∀ x ∈ Algebra.adjoin F S, x⁻¹ ∈ Algebra.adjoin F S) :
(adjoin F S).toSubalgebra = Algebra.adjoin F S :=
le_antisymm
(show adjoin F S ≤
{ Algebra.adjoin F S with
inv_mem' := inv_mem }
from adjoin_le_iff.mpr Algebra.subset_adjoin)
(algebra_adjoin_le_adjoin _ _)
IntermediateField.adjoin_eq_top_of_algebra
theorem
(hS : Algebra.adjoin F S = ⊤) : adjoin F S = ⊤
theorem adjoin_eq_top_of_algebra (hS : Algebra.adjoin F S = ⊤) : adjoin F S = ⊤ :=
top_le_iff.mp (hS.symm.trans_le <| algebra_adjoin_le_adjoin F S)
IntermediateField.AdjoinSimple.isIntegral_gen
theorem
: IsIntegral F (AdjoinSimple.gen F α) ↔ IsIntegral F α
@[simp]
theorem AdjoinSimple.isIntegral_gen : IsIntegralIsIntegral F (AdjoinSimple.gen F α) ↔ IsIntegral F α := by
conv_rhs => rw [← AdjoinSimple.algebraMap_gen F α]
rw [isIntegral_algebraMap_iff (algebraMap F⟮α⟯ E).injective]
IntermediateField.adjoin_algebraic_toSubalgebra
theorem
{S : Set E} (hS : ∀ x ∈ S, IsAlgebraic F x) : (IntermediateField.adjoin F S).toSubalgebra = Algebra.adjoin F S
theorem adjoin_algebraic_toSubalgebra {S : Set E} (hS : ∀ x ∈ S, IsAlgebraic F x) :
(IntermediateField.adjoin F S).toSubalgebra = Algebra.adjoin F S :=
adjoin_eq_algebra_adjoin _ _ fun _ ↦
(Algebra.IsIntegral.adjoin fun x hx ↦ (hS x hx).isIntegral).inv_mem
IntermediateField.adjoin_simple_toSubalgebra_of_integral
theorem
(hα : IsIntegral F α) : F⟮α⟯.toSubalgebra = Algebra.adjoin F { α }
theorem adjoin_simple_toSubalgebra_of_integral (hα : IsIntegral F α) :
F⟮α⟯.toSubalgebra = Algebra.adjoin F {α} := by
apply adjoin_algebraic_toSubalgebra
rintro x (rfl : x = α)
rwa [isAlgebraic_iff_isIntegral]
IntermediateField.le_sup_toSubalgebra
theorem
: E1.toSubalgebra ⊔ E2.toSubalgebra ≤ (E1 ⊔ E2).toSubalgebra
theorem le_sup_toSubalgebra : E1.toSubalgebra ⊔ E2.toSubalgebra ≤ (E1 ⊔ E2).toSubalgebra :=
sup_le (show E1 ≤ E1 ⊔ E2 from le_sup_left) (show E2 ≤ E1 ⊔ E2 from le_sup_right)
IntermediateField.sup_toSubalgebra_of_isAlgebraic_right
theorem
[Algebra.IsAlgebraic K E2] : (E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra
theorem sup_toSubalgebra_of_isAlgebraic_right [Algebra.IsAlgebraic K E2] :
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra := by
have : (adjoin E1 (E2 : Set L)).toSubalgebra = _ := adjoin_algebraic_toSubalgebra fun x h ↦
IsAlgebraic.tower_top E1 (isAlgebraic_iff.1
(Algebra.IsAlgebraic.isAlgebraic (⟨x, h⟩ : E2)))
apply_fun Subalgebra.restrictScalars K at this
rw [← restrictScalars_toSubalgebra, restrictScalars_adjoin] at this
-- TODO: rather than using `← coe_type_toSubalgera` here, perhaps we should restate another
-- version of `Algebra.restrictScalars_adjoin` for intermediate fields?
simp only [← coe_type_toSubalgebra] at this
rw [Algebra.restrictScalars_adjoin] at this
exact this
IntermediateField.sup_toSubalgebra_of_isAlgebraic_left
theorem
[Algebra.IsAlgebraic K E1] : (E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra
theorem sup_toSubalgebra_of_isAlgebraic_left [Algebra.IsAlgebraic K E1] :
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra := by
have := sup_toSubalgebra_of_isAlgebraic_right E2 E1
rwa [sup_comm (a := E1), sup_comm (a := E1.toSubalgebra)]
IntermediateField.sup_toSubalgebra_of_isAlgebraic
theorem
(halg : Algebra.IsAlgebraic K E1 ∨ Algebra.IsAlgebraic K E2) :
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra
/-- The compositum of two intermediate fields is equal to the compositum of them
as subalgebras, if one of them is algebraic over the base field. -/
theorem sup_toSubalgebra_of_isAlgebraic
(halg : Algebra.IsAlgebraicAlgebra.IsAlgebraic K E1 ∨ Algebra.IsAlgebraic K E2) :
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
halg.elim (fun _ ↦ sup_toSubalgebra_of_isAlgebraic_left E1 E2)
(fun _ ↦ sup_toSubalgebra_of_isAlgebraic_right E1 E2)
IntermediateField.sup_toSubalgebra_of_left
theorem
[FiniteDimensional K E1] : (E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra
theorem sup_toSubalgebra_of_left [FiniteDimensional K E1] :
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
sup_toSubalgebra_of_isAlgebraic_left E1 E2
IntermediateField.sup_toSubalgebra_of_right
theorem
[FiniteDimensional K E2] : (E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra
theorem sup_toSubalgebra_of_right [FiniteDimensional K E2] :
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
sup_toSubalgebra_of_isAlgebraic_right E1 E2
IntermediateField.adjoin_toSubalgebra_of_isAlgebraic
theorem
(L : IntermediateField F K) (halg : Algebra.IsAlgebraic F E ∨ Algebra.IsAlgebraic F L) :
(adjoin E (L : Set K)).toSubalgebra = Algebra.adjoin E (L : Set K)
/-- If `K / E / F` is a field extension tower, `L` is an intermediate field of `K / F`, such that
either `E / F` or `L / F` is algebraic, then `E(L) = E[L]`. -/
theorem adjoin_toSubalgebra_of_isAlgebraic (L : IntermediateField F K)
(halg : Algebra.IsAlgebraicAlgebra.IsAlgebraic F E ∨ Algebra.IsAlgebraic F L) :
(adjoin E (L : Set K)).toSubalgebra = Algebra.adjoin E (L : Set K) := by
let i := IsScalarTower.toAlgHom F E K
let E' := i.fieldRange
let i' : E ≃ₐ[F] E' := AlgEquiv.ofInjectiveField i
have hi : algebraMap E K = (algebraMap E' K) ∘ i' := by ext x; rfl
apply_fun _ using Subalgebra.restrictScalars_injective F
rw [← restrictScalars_toSubalgebra, restrictScalars_adjoin_of_algEquiv i' hi,
Algebra.restrictScalars_adjoin_of_algEquiv i' hi, restrictScalars_adjoin]
dsimp only [← E'.coe_type_toSubalgebra]
rw [Algebra.restrictScalars_adjoin F E'.toSubalgebra]
exact E'.sup_toSubalgebra_of_isAlgebraic L (halg.imp
(fun (_ : Algebra.IsAlgebraic F E) ↦ i'.isAlgebraic) id)
IntermediateField.adjoin_toSubalgebra_of_isAlgebraic_left
theorem
(L : IntermediateField F K) [halg : Algebra.IsAlgebraic F E] :
(adjoin E (L : Set K)).toSubalgebra = Algebra.adjoin E (L : Set K)
theorem adjoin_toSubalgebra_of_isAlgebraic_left (L : IntermediateField F K)
[halg : Algebra.IsAlgebraic F E] :
(adjoin E (L : Set K)).toSubalgebra = Algebra.adjoin E (L : Set K) :=
adjoin_toSubalgebra_of_isAlgebraic E L (Or.inl halg)
IntermediateField.adjoin_toSubalgebra_of_isAlgebraic_right
theorem
(L : IntermediateField F K) [halg : Algebra.IsAlgebraic F L] :
(adjoin E (L : Set K)).toSubalgebra = Algebra.adjoin E (L : Set K)
theorem adjoin_toSubalgebra_of_isAlgebraic_right (L : IntermediateField F K)
[halg : Algebra.IsAlgebraic F L] :
(adjoin E (L : Set K)).toSubalgebra = Algebra.adjoin E (L : Set K) :=
adjoin_toSubalgebra_of_isAlgebraic E L (Or.inr halg)
IntermediateField.fg_of_fg_toSubalgebra
theorem
(S : IntermediateField F E) (h : S.toSubalgebra.FG) : S.FG
theorem fg_of_fg_toSubalgebra (S : IntermediateField F E) (h : S.toSubalgebra.FG) : S.FG := by
obtain ⟨t, ht⟩ := h
exact ⟨t, (eq_adjoin_of_eq_algebra_adjoin _ _ _ ht.symm).symm⟩
IntermediateField.fg_of_noetherian
theorem
(S : IntermediateField F E) [IsNoetherian F E] : S.FG
theorem fg_of_noetherian (S : IntermediateField F E) [IsNoetherian F E] : S.FG :=
S.fg_of_fg_toSubalgebra S.toSubalgebra.fg_of_noetherian
IntermediateField.induction_on_adjoin
theorem
[FiniteDimensional F E] (P : IntermediateField F E → Prop) (base : P ⊥)
(ih : ∀ (K : IntermediateField F E) (x : E), P K → P (K⟮x⟯.restrictScalars F)) (K : IntermediateField F E) : P K
theorem induction_on_adjoin [FiniteDimensional F E] (P : IntermediateField F E → Prop)
(base : P ⊥) (ih : ∀ (K : IntermediateField F E) (x : E), P K → P (K⟮x⟯.restrictScalars F))
(K : IntermediateField F E) : P K :=
letI : IsNoetherian F E := IsNoetherian.iff_fg.2 inferInstance
induction_on_adjoin_fg P base ih K K.fg_of_noetherian
IsFractionRing.algHom_fieldRange_eq_of_comp_eq
theorem
(h : RingHom.comp f (algebraMap A K) = (g : A →+* L)) : f.fieldRange = IntermediateField.adjoin F g.range
/-- If `F` is a field, `A` is an `F`-algebra with fraction field `K`, `L` is a field,
`g : A →ₐ[F] L` lifts to `f : K →ₐ[F] L`,
then the image of `f` is the field generated by the image of `g`.
Note: this does not require `IsScalarTower F A K`. -/
theorem algHom_fieldRange_eq_of_comp_eq (h : RingHom.comp f (algebraMap A K) = (g : A →+* L)) :
f.fieldRange = IntermediateField.adjoin F g.range := by
apply IntermediateField.toSubfield_injective
simp_rw [AlgHom.fieldRange_toSubfield, IntermediateField.adjoin_toSubfield]
convert ringHom_fieldRange_eq_of_comp_eq h using 2
exact Set.union_eq_self_of_subset_left fun _ ⟨x, hx⟩ ↦ ⟨algebraMap F A x, by simp [← hx]⟩
IsFractionRing.algHom_fieldRange_eq_of_comp_eq_of_range_eq
theorem
(h : RingHom.comp f (algebraMap A K) = (g : A →+* L)) {s : Set L} (hs : g.range = Algebra.adjoin F s) :
f.fieldRange = IntermediateField.adjoin F s
/-- If `F` is a field, `A` is an `F`-algebra with fraction field `K`, `L` is a field,
`g : A →ₐ[F] L` lifts to `f : K →ₐ[F] L`,
`s` is a set such that the image of `g` is the subalgebra generated by `s`,
then the image of `f` is the intermediate field generated by `s`.
Note: this does not require `IsScalarTower F A K`. -/
theorem algHom_fieldRange_eq_of_comp_eq_of_range_eq
(h : RingHom.comp f (algebraMap A K) = (g : A →+* L))
{s : Set L} (hs : g.range = Algebra.adjoin F s) :
f.fieldRange = IntermediateField.adjoin F s := by
apply IntermediateField.toSubfield_injective
simp_rw [AlgHom.fieldRange_toSubfield, IntermediateField.adjoin_toSubfield]
refine ringHom_fieldRange_eq_of_comp_eq_of_range_eq h ?_
rw [← Algebra.adjoin_eq_ring_closure, ← hs]; rfl
IsFractionRing.liftAlgHom_fieldRange
theorem
(hg : Function.Injective g) : (liftAlgHom hg : K →ₐ[F] L).fieldRange = IntermediateField.adjoin F g.range
/-- The image of `IsFractionRing.liftAlgHom` is the intermediate field generated by the image
of the algebra hom. -/
theorem liftAlgHom_fieldRange (hg : Function.Injective g) :
(liftAlgHom hg : K →ₐ[F] L).fieldRange = IntermediateField.adjoin F g.range :=
algHom_fieldRange_eq_of_comp_eq (by ext; simp)
IsFractionRing.liftAlgHom_fieldRange_eq_of_range_eq
theorem
(hg : Function.Injective g) {s : Set L} (hs : g.range = Algebra.adjoin F s) :
(liftAlgHom hg : K →ₐ[F] L).fieldRange = IntermediateField.adjoin F s
/-- The image of `IsFractionRing.liftAlgHom` is the intermediate field generated by `s`,
if the image of the algebra hom is the subalgebra generated by `s`. -/
theorem liftAlgHom_fieldRange_eq_of_range_eq (hg : Function.Injective g)
{s : Set L} (hs : g.range = Algebra.adjoin F s) :
(liftAlgHom hg : K →ₐ[F] L).fieldRange = IntermediateField.adjoin F s :=
algHom_fieldRange_eq_of_comp_eq_of_range_eq (by ext; simp) hs