field_theory.adjoin
⟷
Mathlib.FieldTheory.Adjoin
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -854,19 +854,19 @@ theorem adjoin_one : F⟮⟯ = ⊥ :=
-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
-#print IntermediateField.adjoin_int /-
+#print IntermediateField.adjoin_intCast /-
@[simp]
-theorem adjoin_int (n : ℤ) : F⟮⟯ = ⊥ :=
- adjoin_simple_eq_bot_iff.mpr (coe_int_mem ⊥ n)
-#align intermediate_field.adjoin_int IntermediateField.adjoin_int
+theorem adjoin_intCast (n : ℤ) : F⟮⟯ = ⊥ :=
+ adjoin_simple_eq_bot_iff.mpr (intCast_mem ⊥ n)
+#align intermediate_field.adjoin_int IntermediateField.adjoin_intCast
-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
-#print IntermediateField.adjoin_nat /-
+#print IntermediateField.adjoin_natCast /-
@[simp]
-theorem adjoin_nat (n : ℕ) : F⟮⟯ = ⊥ :=
- adjoin_simple_eq_bot_iff.mpr (coe_nat_mem ⊥ n)
-#align intermediate_field.adjoin_nat IntermediateField.adjoin_nat
+theorem adjoin_natCast (n : ℕ) : F⟮⟯ = ⊥ :=
+ adjoin_simple_eq_bot_iff.mpr (natCast_mem ⊥ n)
+#align intermediate_field.adjoin_nat IntermediateField.adjoin_natCast
-/
section AdjoinRank
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -6,7 +6,7 @@ Authors: Thomas Browning, Patrick Lutz
import FieldTheory.IntermediateField
import FieldTheory.Separable
import FieldTheory.SplittingField.IsSplittingField
-import RingTheory.TensorProduct
+import LinearAlgebra.TensorProduct.Tower
#align_import field_theory.adjoin from "leanprover-community/mathlib"@"6b31d1eebd64eab86d5bd9936bfaada6ca8b5842"
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -640,7 +640,7 @@ variable {F} {α}
theorem adjoin_algebraic_toSubalgebra {S : Set E} (hS : ∀ x ∈ S, IsAlgebraic F x) :
(IntermediateField.adjoin F S).toSubalgebra = Algebra.adjoin F S :=
by
- simp only [isAlgebraic_iff_isIntegral] at hS
+ simp only [isAlgebraic_iff_isIntegral] at hS
have : Algebra.IsIntegral F (Algebra.adjoin F S) := by
rwa [← le_integralClosure_iff_isIntegral, Algebra.adjoin_le_iff]
have := isField_of_isIntegral_of_isField' this (Field.toIsField F)
@@ -781,7 +781,7 @@ theorem exists_finset_of_mem_iSup {ι : Type _} {f : ι → IntermediateField F
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset ι, x ∈ ⨆ i ∈ s, f i :=
by
have := (adjoin_simple_is_compact_element x).exists_finset_of_le_iSup (IntermediateField F E) f
- simp only [adjoin_simple_le_iff] at this
+ simp only [adjoin_simple_le_iff] at this
exact this hx
#align intermediate_field.exists_finset_of_mem_supr IntermediateField.exists_finset_of_mem_iSup
-/
@@ -999,7 +999,7 @@ variable {K : Type _} [Field K] [Algebra F K]
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
theorem minpoly_gen {α : E} (h : IsIntegral F α) : minpoly F (AdjoinSimple.gen F α) = minpoly F α :=
by
- rw [← adjoin_simple.algebra_map_gen F α] at h
+ rw [← adjoin_simple.algebra_map_gen F α] at h
have inj := (algebraMap F⟮⟯ E).Injective
exact
minpoly.eq_of_algebraMap_eq inj ((isIntegral_algebraMap_iff inj).mp h)
@@ -1085,7 +1085,7 @@ noncomputable def adjoin.powerBasis {x : L} (hx : IsIntegral K x) : PowerBasis K
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
#print IntermediateField.adjoin.finiteDimensional /-
theorem adjoin.finiteDimensional {x : L} (hx : IsIntegral K x) : FiniteDimensional K K⟮⟯ :=
- PowerBasis.finiteDimensional (adjoin.powerBasis hx)
+ PowerBasis.finite (adjoin.powerBasis hx)
#align intermediate_field.adjoin.finite_dimensional IntermediateField.adjoin.finiteDimensional
-/
@@ -1412,7 +1412,7 @@ theorem nonempty_algHom_adjoin_of_splits
(fun s t => x.2.map_hMul ⟨s, _⟩ ⟨t, _⟩) x.2.map_zero (fun s t => x.2.map_add ⟨s, _⟩ ⟨t, _⟩)
x.2.commutes⟩
rcases x.exists_lift_of_splits (hK s hs).1 (hK s hs).2 with ⟨y, h1, h2⟩
- rwa [hx y h1] at h2
+ rwa [hx y h1] at h2
#align intermediate_field.alg_hom_mk_adjoin_splits IntermediateField.nonempty_algHom_adjoin_of_splits
-/
@@ -1421,7 +1421,7 @@ theorem nonempty_algHom_of_adjoin_splits (hS : adjoin F S = ⊤)
(hK : ∀ x ∈ S, IsIntegral F (x : E) ∧ (minpoly F x).Splits (algebraMap F K)) :
Nonempty (E →ₐ[F] K) := by
cases' alg_hom_mk_adjoin_splits hK with ϕ
- rw [hS] at ϕ
+ rw [hS] at ϕ
exact ⟨ϕ.comp top_equiv.symm.to_alg_hom⟩
#align intermediate_field.alg_hom_mk_adjoin_splits' IntermediateField.nonempty_algHom_of_adjoin_splits
-/
@@ -1471,7 +1471,7 @@ instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensi
suffices g.range = (E1 ⊔ E2).toSubalgebra
by
have h : FiniteDimensional K g.range.to_submodule := g.to_linear_map.finite_dimensional_range
- rwa [this] at h
+ rwa [this] at h
rw [Algebra.TensorProduct.productMap_range, E1.range_val, E2.range_val, sup_to_subalgebra]
#align intermediate_field.finite_dimensional_sup IntermediateField.finiteDimensional_sup
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -1438,8 +1438,8 @@ theorem le_sup_toSubalgebra : E1.toSubalgebra ⊔ E2.toSubalgebra ≤ (E1 ⊔ E2
#align intermediate_field.le_sup_to_subalgebra IntermediateField.le_sup_toSubalgebra
-/
-#print IntermediateField.sup_toSubalgebra /-
-theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
+#print IntermediateField.sup_toSubalgebra_of_left /-
+theorem sup_toSubalgebra_of_left [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
by
let S1 := E1.to_subalgebra
@@ -1460,7 +1460,7 @@ theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K
isField_of_isIntegral_of_isField'
(is_integral_sup.mpr ⟨Algebra.isIntegral_of_finite K E1, Algebra.isIntegral_of_finite K E2⟩)
(Field.toIsField K)
-#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra
+#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra_of_left
-/
#print IntermediateField.finiteDimensional_sup /-
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -1361,7 +1361,7 @@ theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤
/-- Extend a lift `x : lifts F E K` to an element `s : E` whose conjugates are all in `K` -/
noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
(h2 : (minpoly F s).Splits (algebraMap F K)) : Lifts F E K :=
- let h3 : IsIntegral x.1 s := isIntegral_of_isScalarTower h1
+ let h3 : IsIntegral x.1 s := IsIntegral.tower_top h1
let key : (minpoly x.1 s).Splits x.2.toRingHom :=
splits_of_splits_of_dvd _ (map_ne_zero (minpoly.ne_zero h1))
((splits_map_iff _ _).mpr (by convert h2; exact RingHom.ext fun y => x.2.commutes y))
@@ -1520,7 +1520,7 @@ theorem isAlgebraic_iSup {ι : Type _} {f : ι → IntermediateField K L}
rw [is_algebraic_iff, Subtype.coe_mk, ← Subtype.coe_mk x hx, ← is_algebraic_iff]
haveI : ∀ i : Σ i, f i, FiniteDimensional K K⟮⟯ := fun ⟨i, x⟩ =>
adjoin.finite_dimensional (is_integral_iff.1 (isAlgebraic_iff_isIntegral.1 (h i x)))
- apply Algebra.isAlgebraic_of_finite
+ apply Algebra.IsAlgebraic.of_finite
#align intermediate_field.is_algebraic_supr IntermediateField.isAlgebraic_iSup
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -1267,13 +1267,10 @@ noncomputable instance : OrderBot (Lifts F E K)
noncomputable instance : Inhabited (Lifts F E K) :=
⟨⊥⟩
-#print IntermediateField.Lifts.eq_of_le /-
theorem Lifts.eq_of_le {x y : Lifts F E K} (hxy : x ≤ y) (s : x.1) : x.2 s = y.2 ⟨s, hxy.1 s.Mem⟩ :=
hxy.2 s ⟨s, hxy.1 s.Mem⟩ rfl
#align intermediate_field.lifts.eq_of_le IntermediateField.Lifts.eq_of_le
--/
-#print IntermediateField.Lifts.exists_max_two /-
theorem Lifts.exists_max_two {c : Set (Lifts F E K)} {x y : Lifts F E K} (hc : IsChain (· ≤ ·) c)
(hx : x ∈ Insert.insert ⊥ c) (hy : y ∈ Insert.insert ⊥ c) :
∃ z : Lifts F E K, z ∈ Insert.insert ⊥ c ∧ x ≤ z ∧ y ≤ z :=
@@ -1282,9 +1279,7 @@ theorem Lifts.exists_max_two {c : Set (Lifts F E K)} {x y : Lifts F E K} (hc : I
· exact ⟨y, hy, hxy, le_refl y⟩
· exact ⟨x, hx, le_refl x, hyx⟩
#align intermediate_field.lifts.exists_max_two IntermediateField.Lifts.exists_max_two
--/
-#print IntermediateField.Lifts.exists_max_three /-
theorem Lifts.exists_max_three {c : Set (Lifts F E K)} {x y z : Lifts F E K}
(hc : IsChain (· ≤ ·) c) (hx : x ∈ Insert.insert ⊥ c) (hy : y ∈ Insert.insert ⊥ c)
(hz : z ∈ Insert.insert ⊥ c) :
@@ -1294,9 +1289,7 @@ theorem Lifts.exists_max_three {c : Set (Lifts F E K)} {x y z : Lifts F E K}
obtain ⟨w, hw, hzw, hvw⟩ := lifts.exists_max_two hc hz hv
exact ⟨w, hw, le_trans hxv hvw, le_trans hyv hvw, hzw⟩
#align intermediate_field.lifts.exists_max_three IntermediateField.Lifts.exists_max_three
--/
-#print IntermediateField.Lifts.upperBoundIntermediateField /-
/-- An upper bound on a chain of lifts -/
def Lifts.upperBoundIntermediateField {c : Set (Lifts F E K)} (hc : IsChain (· ≤ ·) c) :
IntermediateField F E
@@ -1316,9 +1309,7 @@ def Lifts.upperBoundIntermediateField {c : Set (Lifts F E K)} (hc : IsChain (·
exact ⟨z, hz, z.1.hMul_mem (hxz.1 ha) (hyz.1 hb)⟩
algebraMap_mem' s := ⟨⊥, Set.mem_insert ⊥ c, algebraMap_mem ⊥ s⟩
#align intermediate_field.lifts.upper_bound_intermediate_field IntermediateField.Lifts.upperBoundIntermediateField
--/
-#print IntermediateField.Lifts.upperBoundAlgHom /-
/-- The lift on the upper bound on a chain of lifts -/
noncomputable def Lifts.upperBoundAlgHom {c : Set (Lifts F E K)} (hc : IsChain (· ≤ ·) c) :
Lifts.upperBoundIntermediateField hc →ₐ[F] K
@@ -1342,14 +1333,11 @@ noncomputable def Lifts.upperBoundAlgHom {c : Set (Lifts F E K)} (hc : IsChain (
rfl
commutes' _ := AlgHom.commutes _ _
#align intermediate_field.lifts.upper_bound_alg_hom IntermediateField.Lifts.upperBoundAlgHom
--/
-#print IntermediateField.Lifts.upperBound /-
/-- An upper bound on a chain of lifts -/
noncomputable def Lifts.upperBound {c : Set (Lifts F E K)} (hc : IsChain (· ≤ ·) c) : Lifts F E K :=
⟨Lifts.upperBoundIntermediateField hc, Lifts.upperBoundAlgHom hc⟩
#align intermediate_field.lifts.upper_bound IntermediateField.Lifts.upperBound
--/
#print IntermediateField.Lifts.exists_upper_bound /-
theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤ ·) c) :
@@ -1370,7 +1358,6 @@ theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
-#print IntermediateField.Lifts.liftOfSplits /-
/-- Extend a lift `x : lifts F E K` to an element `s : E` whose conjugates are all in `K` -/
noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
(h2 : (minpoly F s).Splits (algebraMap F K)) : Lifts F E K :=
@@ -1389,11 +1376,9 @@ noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral
simp_rw [mem_roots (map_ne_zero (minpoly.ne_zero h3)), is_root, ← eval₂_eq_eval_map]
exact map_root_of_splits x.2.toRingHom key (ne_of_gt (minpoly.degree_pos h3))⟩⟩⟩
#align intermediate_field.lifts.lift_of_splits IntermediateField.Lifts.liftOfSplits
--/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
-#print IntermediateField.Lifts.le_lifts_of_splits /-
theorem Lifts.le_lifts_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
(h2 : (minpoly F s).Splits (algebraMap F K)) : x ≤ x.lift_of_splits h1 h2 :=
⟨fun z hz => algebraMap_mem x.1⟮⟯ ⟨z, hz⟩, fun t u htu =>
@@ -1403,14 +1388,11 @@ theorem Lifts.le_lifts_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
letI : Algebra x.1 K := x.2.toRingHom.toAlgebra
exact AlgHom.commutes _ t)⟩
#align intermediate_field.lifts.le_lifts_of_splits IntermediateField.Lifts.le_lifts_of_splits
--/
-#print IntermediateField.Lifts.mem_lifts_of_splits /-
theorem Lifts.mem_lifts_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
(h2 : (minpoly F s).Splits (algebraMap F K)) : s ∈ (x.lift_of_splits h1 h2).1 :=
mem_adjoin_simple_self x.1 s
#align intermediate_field.lifts.mem_lifts_of_splits IntermediateField.Lifts.mem_lifts_of_splits
--/
#print IntermediateField.Lifts.exists_lift_of_splits /-
theorem Lifts.exists_lift_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
@@ -1419,8 +1401,8 @@ theorem Lifts.exists_lift_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F
#align intermediate_field.lifts.exists_lift_of_splits IntermediateField.Lifts.exists_lift_of_splits
-/
-#print IntermediateField.algHom_mk_adjoin_splits /-
-theorem algHom_mk_adjoin_splits
+#print IntermediateField.nonempty_algHom_adjoin_of_splits /-
+theorem nonempty_algHom_adjoin_of_splits
(hK : ∀ s ∈ S, IsIntegral F (s : E) ∧ (minpoly F s).Splits (algebraMap F K)) :
Nonempty (adjoin F S →ₐ[F] K) :=
by
@@ -1431,17 +1413,17 @@ theorem algHom_mk_adjoin_splits
x.2.commutes⟩
rcases x.exists_lift_of_splits (hK s hs).1 (hK s hs).2 with ⟨y, h1, h2⟩
rwa [hx y h1] at h2
-#align intermediate_field.alg_hom_mk_adjoin_splits IntermediateField.algHom_mk_adjoin_splits
+#align intermediate_field.alg_hom_mk_adjoin_splits IntermediateField.nonempty_algHom_adjoin_of_splits
-/
-#print IntermediateField.algHom_mk_adjoin_splits' /-
-theorem algHom_mk_adjoin_splits' (hS : adjoin F S = ⊤)
+#print IntermediateField.nonempty_algHom_of_adjoin_splits /-
+theorem nonempty_algHom_of_adjoin_splits (hS : adjoin F S = ⊤)
(hK : ∀ x ∈ S, IsIntegral F (x : E) ∧ (minpoly F x).Splits (algebraMap F K)) :
Nonempty (E →ₐ[F] K) := by
cases' alg_hom_mk_adjoin_splits hK with ϕ
rw [hS] at ϕ
exact ⟨ϕ.comp top_equiv.symm.to_alg_hom⟩
-#align intermediate_field.alg_hom_mk_adjoin_splits' IntermediateField.algHom_mk_adjoin_splits'
+#align intermediate_field.alg_hom_mk_adjoin_splits' IntermediateField.nonempty_algHom_of_adjoin_splits
-/
end AlgHomMkAdjoinSplits
mathlib commit https://github.com/leanprover-community/mathlib/commit/3365b20c2ffa7c35e47e5209b89ba9abdddf3ffe
@@ -330,33 +330,33 @@ theorem restrictScalars_top {K : Type _} [Field K] [Algebra K E] [Algebra K F]
#align intermediate_field.restrict_scalars_top IntermediateField.restrictScalars_top
-/
-#print IntermediateField.AlgHom.fieldRange_eq_map /-
-theorem IntermediateField.AlgHom.fieldRange_eq_map {K : Type _} [Field K] [Algebra F K]
- (f : E →ₐ[F] K) : f.fieldRange = IntermediateField.map f ⊤ :=
+#print AlgHom.fieldRange_eq_map /-
+theorem AlgHom.fieldRange_eq_map {K : Type _} [Field K] [Algebra F K] (f : E →ₐ[F] K) :
+ f.fieldRange = IntermediateField.map f ⊤ :=
SetLike.ext' Set.image_univ.symm
-#align alg_hom.field_range_eq_map IntermediateField.AlgHom.fieldRange_eq_map
+#align alg_hom.field_range_eq_map AlgHom.fieldRange_eq_map
-/
-#print IntermediateField.AlgHom.map_fieldRange /-
-theorem IntermediateField.AlgHom.map_fieldRange {K L : Type _} [Field K] [Field L] [Algebra F K]
- [Algebra F L] (f : E →ₐ[F] K) (g : K →ₐ[F] L) : f.fieldRange.map g = (g.comp f).fieldRange :=
+#print AlgHom.map_fieldRange /-
+theorem AlgHom.map_fieldRange {K L : Type _} [Field K] [Field L] [Algebra F K] [Algebra F L]
+ (f : E →ₐ[F] K) (g : K →ₐ[F] L) : f.fieldRange.map g = (g.comp f).fieldRange :=
SetLike.ext' (Set.range_comp g f).symm
-#align alg_hom.map_field_range IntermediateField.AlgHom.map_fieldRange
+#align alg_hom.map_field_range AlgHom.map_fieldRange
-/
-#print IntermediateField.AlgHom.fieldRange_eq_top /-
-theorem IntermediateField.AlgHom.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K]
- {f : E →ₐ[F] K} : f.fieldRange = ⊤ ↔ Function.Surjective f :=
+#print AlgHom.fieldRange_eq_top /-
+theorem AlgHom.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K] {f : E →ₐ[F] K} :
+ f.fieldRange = ⊤ ↔ Function.Surjective f :=
SetLike.ext'_iff.trans Set.range_iff_surjective
-#align alg_hom.field_range_eq_top IntermediateField.AlgHom.fieldRange_eq_top
+#align alg_hom.field_range_eq_top AlgHom.fieldRange_eq_top
-/
-#print IntermediateField.AlgEquiv.fieldRange_eq_top /-
+#print AlgEquiv.fieldRange_eq_top /-
@[simp]
-theorem IntermediateField.AlgEquiv.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K]
- (f : E ≃ₐ[F] K) : (f : E →ₐ[F] K).fieldRange = ⊤ :=
- IntermediateField.AlgHom.fieldRange_eq_top.mpr f.Surjective
-#align alg_equiv.field_range_eq_top IntermediateField.AlgEquiv.fieldRange_eq_top
+theorem AlgEquiv.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K] (f : E ≃ₐ[F] K) :
+ (f : E →ₐ[F] K).fieldRange = ⊤ :=
+ AlgHom.fieldRange_eq_top.mpr f.Surjective
+#align alg_equiv.field_range_eq_top AlgEquiv.fieldRange_eq_top
-/
end Lattice
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,10 +3,10 @@ Copyright (c) 2020 Thomas Browning, Patrick Lutz. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
-/
-import Mathbin.FieldTheory.IntermediateField
-import Mathbin.FieldTheory.Separable
-import Mathbin.FieldTheory.SplittingField.IsSplittingField
-import Mathbin.RingTheory.TensorProduct
+import FieldTheory.IntermediateField
+import FieldTheory.Separable
+import FieldTheory.SplittingField.IsSplittingField
+import RingTheory.TensorProduct
#align_import field_theory.adjoin from "leanprover-community/mathlib"@"6b31d1eebd64eab86d5bd9936bfaada6ca8b5842"
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -997,7 +997,6 @@ variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E] {α : E}
variable {K : Type _} [Field K] [Algebra F K]
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
-#print IntermediateField.minpoly_gen /-
theorem minpoly_gen {α : E} (h : IsIntegral F α) : minpoly F (AdjoinSimple.gen F α) = minpoly F α :=
by
rw [← adjoin_simple.algebra_map_gen F α] at h
@@ -1005,8 +1004,7 @@ theorem minpoly_gen {α : E} (h : IsIntegral F α) : minpoly F (AdjoinSimple.gen
exact
minpoly.eq_of_algebraMap_eq inj ((isIntegral_algebraMap_iff inj).mp h)
(adjoin_simple.algebra_map_gen _ _).symm
-#align intermediate_field.minpoly_gen IntermediateField.minpoly_gen
--/
+#align intermediate_field.minpoly_gen IntermediateField.minpoly_genₓ
variable (F)
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -727,7 +727,7 @@ theorem adjoin_simple_isCompactElement (x : E) : IsCompactElement F⟮⟯ :=
neg_mem' := by
rintro x ⟨-, ⟨E, rfl⟩, ⟨-, ⟨hE, rfl⟩, hx⟩⟩
exact mem_Union_of_mem E (mem_Union_of_mem hE (E.neg_mem hx))
- mul_mem' :=
+ hMul_mem' :=
by
rintro x₁ x₂ ⟨-, ⟨F₁, rfl⟩, ⟨-, ⟨hF₁, rfl⟩, hx₁⟩⟩ ⟨-, ⟨F₂, rfl⟩, ⟨-, ⟨hF₂, rfl⟩, hx₂⟩⟩
obtain ⟨F₃, hF₃, h₁₃, h₂₃⟩ := hs F₁ hF₁ F₂ hF₂
@@ -1312,10 +1312,10 @@ def Lifts.upperBoundIntermediateField {c : Set (Lifts F E K)} (hc : IsChain (·
rintro _ _ ⟨x, hx, ha⟩ ⟨y, hy, hb⟩
obtain ⟨z, hz, hxz, hyz⟩ := lifts.exists_max_two hc hx hy
exact ⟨z, hz, z.1.add_mem (hxz.1 ha) (hyz.1 hb)⟩
- mul_mem' := by
+ hMul_mem' := by
rintro _ _ ⟨x, hx, ha⟩ ⟨y, hy, hb⟩
obtain ⟨z, hz, hxz, hyz⟩ := lifts.exists_max_two hc hx hy
- exact ⟨z, hz, z.1.mul_mem (hxz.1 ha) (hyz.1 hb)⟩
+ exact ⟨z, hz, z.1.hMul_mem (hxz.1 ha) (hyz.1 hb)⟩
algebraMap_mem' s := ⟨⊥, Set.mem_insert ⊥ c, algebraMap_mem ⊥ s⟩
#align intermediate_field.lifts.upper_bound_intermediate_field IntermediateField.Lifts.upperBoundIntermediateField
-/
@@ -1340,7 +1340,7 @@ noncomputable def Lifts.upperBoundAlgHom {c : Set (Lifts F E K)} (hc : IsChain (
obtain ⟨w, hw, hxw, hyw, hzw⟩ :=
lifts.exists_max_three hc (Classical.choose_spec s.mem).1 (Classical.choose_spec t.mem).1
(Classical.choose_spec (s * t).Mem).1
- rw [lifts.eq_of_le hxw, lifts.eq_of_le hyw, lifts.eq_of_le hzw, ← w.2.map_mul]
+ rw [lifts.eq_of_le hxw, lifts.eq_of_le hyw, lifts.eq_of_le hzw, ← w.2.map_hMul]
rfl
commutes' _ := AlgHom.commutes _ _
#align intermediate_field.lifts.upper_bound_alg_hom IntermediateField.Lifts.upperBoundAlgHom
@@ -1429,7 +1429,7 @@ theorem algHom_mk_adjoin_splits
obtain ⟨x : lifts F E K, hx⟩ := zorn_partialOrder lifts.exists_upper_bound
refine'
⟨AlgHom.mk (fun s => x.2 ⟨s, adjoin_le_iff.mpr (fun s hs => _) s.Mem⟩) x.2.map_one
- (fun s t => x.2.map_mul ⟨s, _⟩ ⟨t, _⟩) x.2.map_zero (fun s t => x.2.map_add ⟨s, _⟩ ⟨t, _⟩)
+ (fun s t => x.2.map_hMul ⟨s, _⟩ ⟨t, _⟩) x.2.map_zero (fun s t => x.2.map_add ⟨s, _⟩ ⟨t, _⟩)
x.2.commutes⟩
rcases x.exists_lift_of_splits (hK s hs).1 (hK s hs).2 with ⟨y, h1, h2⟩
rwa [hx y h1] at h2
mathlib commit https://github.com/leanprover-community/mathlib/commit/d11f435d4e34a6cea0a1797d6b625b0c170be845
@@ -1102,18 +1102,18 @@ theorem adjoin.finrank {x : L} (hx : IsIntegral K x) :
-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
-#print IntermediateField.minpoly.natDegree_le /-
-theorem IntermediateField.minpoly.natDegree_le {x : L} [FiniteDimensional K L]
- (hx : IsIntegral K x) : (minpoly K x).natDegree ≤ finrank K L :=
+#print minpoly.natDegree_le /-
+theorem minpoly.natDegree_le {x : L} [FiniteDimensional K L] (hx : IsIntegral K x) :
+ (minpoly K x).natDegree ≤ finrank K L :=
le_of_eq_of_le (IntermediateField.adjoin.finrank hx).symm K⟮⟯.toSubmodule.finrank_le
-#align minpoly.nat_degree_le IntermediateField.minpoly.natDegree_le
+#align minpoly.nat_degree_le minpoly.natDegree_le
-/
-#print IntermediateField.minpoly.degree_le /-
-theorem IntermediateField.minpoly.degree_le {x : L} [FiniteDimensional K L] (hx : IsIntegral K x) :
+#print minpoly.degree_le /-
+theorem minpoly.degree_le {x : L} [FiniteDimensional K L] (hx : IsIntegral K x) :
(minpoly K x).degree ≤ finrank K L :=
- degree_le_of_natDegree_le (IntermediateField.minpoly.natDegree_le hx)
-#align minpoly.degree_le IntermediateField.minpoly.degree_le
+ degree_le_of_natDegree_le (minpoly.natDegree_le hx)
+#align minpoly.degree_le minpoly.degree_le
-/
end PowerBasis
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,17 +2,14 @@
Copyright (c) 2020 Thomas Browning, Patrick Lutz. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
-
-! This file was ported from Lean 3 source module field_theory.adjoin
-! leanprover-community/mathlib commit 6b31d1eebd64eab86d5bd9936bfaada6ca8b5842
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.FieldTheory.IntermediateField
import Mathbin.FieldTheory.Separable
import Mathbin.FieldTheory.SplittingField.IsSplittingField
import Mathbin.RingTheory.TensorProduct
+#align_import field_theory.adjoin from "leanprover-community/mathlib"@"6b31d1eebd64eab86d5bd9936bfaada6ca8b5842"
+
/-!
# Adjoining Elements to Fields
mathlib commit https://github.com/leanprover-community/mathlib/commit/8b981918a93bc45a8600de608cde7944a80d92b9
@@ -487,7 +487,7 @@ theorem adjoin_insert_adjoin (x : E) :
adjoin F (insert x (adjoin F S : Set E)) = adjoin F (insert x S) :=
le_antisymm
(adjoin_le_iff.mpr
- (Set.insert_subset.mpr
+ (Set.insert_subset_iff.mpr
⟨subset_adjoin _ _ (Set.mem_insert _ _),
adjoin_le_iff.mpr (subset_adjoin_of_subset_right _ _ (Set.subset_insert _ _))⟩))
(adjoin.mono _ _ _ (Set.insert_subset_insert (subset_adjoin _ _)))
mathlib commit https://github.com/leanprover-community/mathlib/commit/2a0ce625dbb0ffbc7d1316597de0b25c1ec75303
@@ -562,7 +562,6 @@ theorem adjoin_induction {s : Set E} {p : E → Prop} {x} (h : x ∈ adjoin F s)
#align intermediate_field.adjoin_induction IntermediateField.adjoin_induction
-/
-#print IntermediateField.Insert /-
--this definition of notation is courtesy of Kyle Miller on zulip
/-- Variation on `set.insert` to enable good notation for adjoining elements to fields.
Used to preferentially use `singleton` rather than `insert` when adjoining one element.
@@ -570,19 +569,14 @@ Used to preferentially use `singleton` rather than `insert` when adjoining one e
class Insert {α : Type _} (s : Set α) where
insert : α → Set α
#align intermediate_field.insert IntermediateField.Insert
--/
-#print IntermediateField.insertEmpty /-
instance (priority := 1000) insertEmpty {α : Type _} : Insert (∅ : Set α)
where insert x := @singleton _ _ Set.hasSingleton x
#align intermediate_field.insert_empty IntermediateField.insertEmpty
--/
-#print IntermediateField.insertNonempty /-
instance (priority := 900) insertNonempty {α : Type _} (s : Set α) : Insert s
where insert x := Insert.insert x s
#align intermediate_field.insert_nonempty IntermediateField.insertNonempty
--/
notation3:max K"⟮"(l ", "* => foldr (h t => Insert.insert t h) ∅)"⟯" => adjoin K l
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -59,17 +59,22 @@ section Lattice
variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E]
+#print IntermediateField.adjoin_le_iff /-
@[simp]
theorem adjoin_le_iff {S : Set E} {T : IntermediateField F E} : adjoin F S ≤ T ↔ S ≤ T :=
⟨fun H => le_trans (le_trans (Set.subset_union_right _ _) Subfield.subset_closure) H, fun H =>
(@Subfield.closure_le E _ (Set.range (algebraMap F E) ∪ S) T.toSubfield).mpr
(Set.union_subset (IntermediateField.set_range_subset T) H)⟩
#align intermediate_field.adjoin_le_iff IntermediateField.adjoin_le_iff
+-/
+#print IntermediateField.gc /-
theorem gc : GaloisConnection (adjoin F : Set E → IntermediateField F E) coe := fun _ _ =>
adjoin_le_iff
#align intermediate_field.gc IntermediateField.gc
+-/
+#print IntermediateField.gi /-
/-- Galois insertion between `adjoin` and `coe`. -/
def gi : GaloisInsertion (adjoin F : Set E → IntermediateField F E) coe
where
@@ -78,6 +83,7 @@ def gi : GaloisInsertion (adjoin F : Set E → IntermediateField F E) coe
le_l_u S := (IntermediateField.gc (S : Set E) (adjoin F S)).1 <| le_rfl
choice_eq _ _ := copy_eq _ _ _
#align intermediate_field.gi IntermediateField.gi
+-/
instance : CompleteLattice (IntermediateField F E) :=
GaloisInsertion.liftCompleteLattice IntermediateField.gi
@@ -85,97 +91,132 @@ instance : CompleteLattice (IntermediateField F E) :=
instance : Inhabited (IntermediateField F E) :=
⟨⊤⟩
+#print IntermediateField.coe_bot /-
theorem coe_bot : ↑(⊥ : IntermediateField F E) = Set.range (algebraMap F E) :=
by
change ↑(Subfield.closure (Set.range (algebraMap F E) ∪ ∅)) = Set.range (algebraMap F E)
simp [← Set.image_univ, ← RingHom.map_field_closure]
#align intermediate_field.coe_bot IntermediateField.coe_bot
+-/
+#print IntermediateField.mem_bot /-
theorem mem_bot {x : E} : x ∈ (⊥ : IntermediateField F E) ↔ x ∈ Set.range (algebraMap F E) :=
Set.ext_iff.mp coe_bot x
#align intermediate_field.mem_bot IntermediateField.mem_bot
+-/
+#print IntermediateField.bot_toSubalgebra /-
@[simp]
theorem bot_toSubalgebra : (⊥ : IntermediateField F E).toSubalgebra = ⊥ := by ext;
rw [mem_to_subalgebra, Algebra.mem_bot, mem_bot]
#align intermediate_field.bot_to_subalgebra IntermediateField.bot_toSubalgebra
+-/
+#print IntermediateField.coe_top /-
@[simp]
theorem coe_top : ↑(⊤ : IntermediateField F E) = (Set.univ : Set E) :=
rfl
#align intermediate_field.coe_top IntermediateField.coe_top
+-/
+#print IntermediateField.mem_top /-
@[simp]
theorem mem_top {x : E} : x ∈ (⊤ : IntermediateField F E) :=
trivial
#align intermediate_field.mem_top IntermediateField.mem_top
+-/
+#print IntermediateField.top_toSubalgebra /-
@[simp]
theorem top_toSubalgebra : (⊤ : IntermediateField F E).toSubalgebra = ⊤ :=
rfl
#align intermediate_field.top_to_subalgebra IntermediateField.top_toSubalgebra
+-/
+#print IntermediateField.top_toSubfield /-
@[simp]
theorem top_toSubfield : (⊤ : IntermediateField F E).toSubfield = ⊤ :=
rfl
#align intermediate_field.top_to_subfield IntermediateField.top_toSubfield
+-/
+#print IntermediateField.coe_inf /-
@[simp, norm_cast]
theorem coe_inf (S T : IntermediateField F E) : (↑(S ⊓ T) : Set E) = S ∩ T :=
rfl
#align intermediate_field.coe_inf IntermediateField.coe_inf
+-/
+#print IntermediateField.mem_inf /-
@[simp]
theorem mem_inf {S T : IntermediateField F E} {x : E} : x ∈ S ⊓ T ↔ x ∈ S ∧ x ∈ T :=
Iff.rfl
#align intermediate_field.mem_inf IntermediateField.mem_inf
+-/
+#print IntermediateField.inf_toSubalgebra /-
@[simp]
theorem inf_toSubalgebra (S T : IntermediateField F E) :
(S ⊓ T).toSubalgebra = S.toSubalgebra ⊓ T.toSubalgebra :=
rfl
#align intermediate_field.inf_to_subalgebra IntermediateField.inf_toSubalgebra
+-/
+#print IntermediateField.inf_toSubfield /-
@[simp]
theorem inf_toSubfield (S T : IntermediateField F E) :
(S ⊓ T).toSubfield = S.toSubfield ⊓ T.toSubfield :=
rfl
#align intermediate_field.inf_to_subfield IntermediateField.inf_toSubfield
+-/
+#print IntermediateField.coe_sInf /-
@[simp, norm_cast]
theorem coe_sInf (S : Set (IntermediateField F E)) : (↑(sInf S) : Set E) = sInf (coe '' S) :=
rfl
#align intermediate_field.coe_Inf IntermediateField.coe_sInf
+-/
+#print IntermediateField.sInf_toSubalgebra /-
@[simp]
theorem sInf_toSubalgebra (S : Set (IntermediateField F E)) :
(sInf S).toSubalgebra = sInf (toSubalgebra '' S) :=
SetLike.coe_injective <| by simp [Set.sUnion_image]
#align intermediate_field.Inf_to_subalgebra IntermediateField.sInf_toSubalgebra
+-/
+#print IntermediateField.sInf_toSubfield /-
@[simp]
theorem sInf_toSubfield (S : Set (IntermediateField F E)) :
(sInf S).toSubfield = sInf (toSubfield '' S) :=
SetLike.coe_injective <| by simp [Set.sUnion_image]
#align intermediate_field.Inf_to_subfield IntermediateField.sInf_toSubfield
+-/
+#print IntermediateField.coe_iInf /-
@[simp, norm_cast]
theorem coe_iInf {ι : Sort _} (S : ι → IntermediateField F E) : (↑(iInf S) : Set E) = ⋂ i, S i := by
simp [iInf]
#align intermediate_field.coe_infi IntermediateField.coe_iInf
+-/
+#print IntermediateField.iInf_toSubalgebra /-
@[simp]
theorem iInf_toSubalgebra {ι : Sort _} (S : ι → IntermediateField F E) :
(iInf S).toSubalgebra = ⨅ i, (S i).toSubalgebra :=
SetLike.coe_injective <| by simp [iInf]
#align intermediate_field.infi_to_subalgebra IntermediateField.iInf_toSubalgebra
+-/
+#print IntermediateField.iInf_toSubfield /-
@[simp]
theorem iInf_toSubfield {ι : Sort _} (S : ι → IntermediateField F E) :
(iInf S).toSubfield = ⨅ i, (S i).toSubfield :=
SetLike.coe_injective <| by simp [iInf]
#align intermediate_field.infi_to_subfield IntermediateField.iInf_toSubfield
+-/
+#print IntermediateField.equivOfEq /-
/-- Construct an algebra isomorphism from an equality of intermediate fields -/
@[simps apply]
def equivOfEq {S T : IntermediateField F E} (h : S = T) : S ≃ₐ[F] T := by
@@ -184,53 +225,71 @@ def equivOfEq {S T : IntermediateField F E} (h : S = T) : S ≃ₐ[F] T := by
invFun := fun x => ⟨x, _⟩ .. } <;>
tidy
#align intermediate_field.equiv_of_eq IntermediateField.equivOfEq
+-/
+#print IntermediateField.equivOfEq_symm /-
@[simp]
theorem equivOfEq_symm {S T : IntermediateField F E} (h : S = T) :
(equivOfEq h).symm = equivOfEq h.symm :=
rfl
#align intermediate_field.equiv_of_eq_symm IntermediateField.equivOfEq_symm
+-/
+#print IntermediateField.equivOfEq_rfl /-
@[simp]
theorem equivOfEq_rfl (S : IntermediateField F E) : equivOfEq (rfl : S = S) = AlgEquiv.refl := by
ext; rfl
#align intermediate_field.equiv_of_eq_rfl IntermediateField.equivOfEq_rfl
+-/
+#print IntermediateField.equivOfEq_trans /-
@[simp]
theorem equivOfEq_trans {S T U : IntermediateField F E} (hST : S = T) (hTU : T = U) :
(equivOfEq hST).trans (equivOfEq hTU) = equivOfEq (trans hST hTU) :=
rfl
#align intermediate_field.equiv_of_eq_trans IntermediateField.equivOfEq_trans
+-/
variable (F E)
+#print IntermediateField.botEquiv /-
/-- The bottom intermediate_field is isomorphic to the field. -/
noncomputable def botEquiv : (⊥ : IntermediateField F E) ≃ₐ[F] F :=
(Subalgebra.equivOfEq _ _ bot_toSubalgebra).trans (Algebra.botEquiv F E)
#align intermediate_field.bot_equiv IntermediateField.botEquiv
+-/
variable {F E}
+#print IntermediateField.botEquiv_def /-
@[simp]
theorem botEquiv_def (x : F) : botEquiv F E (algebraMap F (⊥ : IntermediateField F E) x) = x :=
AlgEquiv.commutes (botEquiv F E) x
#align intermediate_field.bot_equiv_def IntermediateField.botEquiv_def
+-/
+#print IntermediateField.botEquiv_symm /-
@[simp]
theorem botEquiv_symm (x : F) : (botEquiv F E).symm x = algebraMap F _ x :=
rfl
#align intermediate_field.bot_equiv_symm IntermediateField.botEquiv_symm
+-/
+#print IntermediateField.algebraOverBot /-
noncomputable instance algebraOverBot : Algebra (⊥ : IntermediateField F E) F :=
(IntermediateField.botEquiv F E).toAlgHom.toRingHom.toAlgebra
#align intermediate_field.algebra_over_bot IntermediateField.algebraOverBot
+-/
+#print IntermediateField.coe_algebraMap_over_bot /-
theorem coe_algebraMap_over_bot :
(algebraMap (⊥ : IntermediateField F E) F : (⊥ : IntermediateField F E) → F) =
IntermediateField.botEquiv F E :=
rfl
#align intermediate_field.coe_algebra_map_over_bot IntermediateField.coe_algebraMap_over_bot
+-/
+#print IntermediateField.isScalarTower_over_bot /-
instance isScalarTower_over_bot : IsScalarTower (⊥ : IntermediateField F E) F E :=
IsScalarTower.of_algebraMap_eq
(by
@@ -239,7 +298,9 @@ instance isScalarTower_over_bot : IsScalarTower (⊥ : IntermediateField F E) F
rw [coe_algebra_map_over_bot, (bot_equiv F E).apply_symm_apply, bot_equiv_symm,
IsScalarTower.algebraMap_apply F (⊥ : IntermediateField F E) E])
#align intermediate_field.is_scalar_tower_over_bot IntermediateField.isScalarTower_over_bot
+-/
+#print IntermediateField.topEquiv /-
/-- The top intermediate_field is isomorphic to the field.
This is the intermediate field version of `subalgebra.top_equiv`. -/
@@ -247,44 +308,59 @@ This is the intermediate field version of `subalgebra.top_equiv`. -/
def topEquiv : (⊤ : IntermediateField F E) ≃ₐ[F] E :=
(Subalgebra.equivOfEq _ _ top_toSubalgebra).trans Subalgebra.topEquiv
#align intermediate_field.top_equiv IntermediateField.topEquiv
+-/
+#print IntermediateField.topEquiv_symm_apply_coe /-
@[simp]
theorem topEquiv_symm_apply_coe (a : E) : ↑(topEquiv.symm a : (⊤ : IntermediateField F E)) = a :=
rfl
#align intermediate_field.top_equiv_symm_apply_coe IntermediateField.topEquiv_symm_apply_coe
+-/
+#print IntermediateField.restrictScalars_bot_eq_self /-
@[simp]
theorem restrictScalars_bot_eq_self (K : IntermediateField F E) :
(⊥ : IntermediateField K E).restrictScalars _ = K := by ext; rw [mem_restrict_scalars, mem_bot];
exact set.ext_iff.mp Subtype.range_coe x
#align intermediate_field.restrict_scalars_bot_eq_self IntermediateField.restrictScalars_bot_eq_self
+-/
+#print IntermediateField.restrictScalars_top /-
@[simp]
theorem restrictScalars_top {K : Type _} [Field K] [Algebra K E] [Algebra K F]
[IsScalarTower K F E] : (⊤ : IntermediateField F E).restrictScalars K = ⊤ :=
rfl
#align intermediate_field.restrict_scalars_top IntermediateField.restrictScalars_top
+-/
+#print IntermediateField.AlgHom.fieldRange_eq_map /-
theorem IntermediateField.AlgHom.fieldRange_eq_map {K : Type _} [Field K] [Algebra F K]
(f : E →ₐ[F] K) : f.fieldRange = IntermediateField.map f ⊤ :=
SetLike.ext' Set.image_univ.symm
#align alg_hom.field_range_eq_map IntermediateField.AlgHom.fieldRange_eq_map
+-/
+#print IntermediateField.AlgHom.map_fieldRange /-
theorem IntermediateField.AlgHom.map_fieldRange {K L : Type _} [Field K] [Field L] [Algebra F K]
[Algebra F L] (f : E →ₐ[F] K) (g : K →ₐ[F] L) : f.fieldRange.map g = (g.comp f).fieldRange :=
SetLike.ext' (Set.range_comp g f).symm
#align alg_hom.map_field_range IntermediateField.AlgHom.map_fieldRange
+-/
+#print IntermediateField.AlgHom.fieldRange_eq_top /-
theorem IntermediateField.AlgHom.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K]
{f : E →ₐ[F] K} : f.fieldRange = ⊤ ↔ Function.Surjective f :=
SetLike.ext'_iff.trans Set.range_iff_surjective
#align alg_hom.field_range_eq_top IntermediateField.AlgHom.fieldRange_eq_top
+-/
+#print IntermediateField.AlgEquiv.fieldRange_eq_top /-
@[simp]
theorem IntermediateField.AlgEquiv.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K]
(f : E ≃ₐ[F] K) : (f : E →ₐ[F] K).fieldRange = ⊤ :=
IntermediateField.AlgHom.fieldRange_eq_top.mpr f.Surjective
#align alg_equiv.field_range_eq_top IntermediateField.AlgEquiv.fieldRange_eq_top
+-/
end Lattice
@@ -292,15 +368,20 @@ section AdjoinDef
variable (F : Type _) [Field F] {E : Type _} [Field E] [Algebra F E] (S : Set E)
+#print IntermediateField.adjoin_eq_range_algebraMap_adjoin /-
theorem adjoin_eq_range_algebraMap_adjoin :
(adjoin F S : Set E) = Set.range (algebraMap (adjoin F S) E) :=
Subtype.range_coe.symm
#align intermediate_field.adjoin_eq_range_algebra_map_adjoin IntermediateField.adjoin_eq_range_algebraMap_adjoin
+-/
+#print IntermediateField.adjoin.algebraMap_mem /-
theorem adjoin.algebraMap_mem (x : F) : algebraMap F E x ∈ adjoin F S :=
IntermediateField.algebraMap_mem (adjoin F S) x
#align intermediate_field.adjoin.algebra_map_mem IntermediateField.adjoin.algebraMap_mem
+-/
+#print IntermediateField.adjoin.range_algebraMap_subset /-
theorem adjoin.range_algebraMap_subset : Set.range (algebraMap F E) ⊆ adjoin F S :=
by
intro x hx
@@ -308,45 +389,65 @@ theorem adjoin.range_algebraMap_subset : Set.range (algebraMap F E) ⊆ adjoin F
rw [← hf]
exact adjoin.algebra_map_mem F S f
#align intermediate_field.adjoin.range_algebra_map_subset IntermediateField.adjoin.range_algebraMap_subset
+-/
+#print IntermediateField.adjoin.fieldCoe /-
instance adjoin.fieldCoe : CoeTC F (adjoin F S)
where coe x := ⟨algebraMap F E x, adjoin.algebraMap_mem F S x⟩
#align intermediate_field.adjoin.field_coe IntermediateField.adjoin.fieldCoe
+-/
+#print IntermediateField.subset_adjoin /-
theorem subset_adjoin : S ⊆ adjoin F S := fun x hx => Subfield.subset_closure (Or.inr hx)
#align intermediate_field.subset_adjoin IntermediateField.subset_adjoin
+-/
+#print IntermediateField.adjoin.setCoe /-
instance adjoin.setCoe : CoeTC S (adjoin F S) where coe x := ⟨x, subset_adjoin F S (Subtype.mem x)⟩
#align intermediate_field.adjoin.set_coe IntermediateField.adjoin.setCoe
+-/
+#print IntermediateField.adjoin.mono /-
@[mono]
theorem adjoin.mono (T : Set E) (h : S ⊆ T) : adjoin F S ≤ adjoin F T :=
GaloisConnection.monotone_l gc h
#align intermediate_field.adjoin.mono IntermediateField.adjoin.mono
+-/
+#print IntermediateField.adjoin_contains_field_as_subfield /-
theorem adjoin_contains_field_as_subfield (F : Subfield E) : (F : Set E) ⊆ adjoin F S := fun x hx =>
adjoin.algebraMap_mem F S ⟨x, hx⟩
#align intermediate_field.adjoin_contains_field_as_subfield IntermediateField.adjoin_contains_field_as_subfield
+-/
+#print IntermediateField.subset_adjoin_of_subset_left /-
theorem subset_adjoin_of_subset_left {F : Subfield E} {T : Set E} (HT : T ⊆ F) : T ⊆ adjoin F S :=
fun x hx => (adjoin F S).algebraMap_mem ⟨x, HT hx⟩
#align intermediate_field.subset_adjoin_of_subset_left IntermediateField.subset_adjoin_of_subset_left
+-/
+#print IntermediateField.subset_adjoin_of_subset_right /-
theorem subset_adjoin_of_subset_right {T : Set E} (H : T ⊆ S) : T ⊆ adjoin F S := fun x hx =>
subset_adjoin F S (H hx)
#align intermediate_field.subset_adjoin_of_subset_right IntermediateField.subset_adjoin_of_subset_right
+-/
+#print IntermediateField.adjoin_empty /-
@[simp]
theorem adjoin_empty (F E : Type _) [Field F] [Field E] [Algebra F E] : adjoin F (∅ : Set E) = ⊥ :=
eq_bot_iff.mpr (adjoin_le_iff.mpr (Set.empty_subset _))
#align intermediate_field.adjoin_empty IntermediateField.adjoin_empty
+-/
+#print IntermediateField.adjoin_univ /-
@[simp]
theorem adjoin_univ (F E : Type _) [Field F] [Field E] [Algebra F E] :
adjoin F (Set.univ : Set E) = ⊤ :=
eq_top_iff.mpr <| subset_adjoin _ _
#align intermediate_field.adjoin_univ IntermediateField.adjoin_univ
+-/
+#print IntermediateField.adjoin_le_subfield /-
/-- If `K` is a field with `F ⊆ K` and `S ⊆ K` then `adjoin F S ≤ K`. -/
theorem adjoin_le_subfield {K : Subfield E} (HF : Set.range (algebraMap F E) ⊆ K) (HS : S ⊆ K) :
(adjoin F S).toSubfield ≤ K := by
@@ -354,13 +455,16 @@ theorem adjoin_le_subfield {K : Subfield E} (HF : Set.range (algebraMap F E) ⊆
rw [Set.union_subset_iff]
exact ⟨HF, HS⟩
#align intermediate_field.adjoin_le_subfield IntermediateField.adjoin_le_subfield
+-/
+#print IntermediateField.adjoin_subset_adjoin_iff /-
theorem adjoin_subset_adjoin_iff {F' : Type _} [Field F'] [Algebra F' E] {S S' : Set E} :
(adjoin F S : Set E) ⊆ adjoin F' S' ↔
Set.range (algebraMap F E) ⊆ adjoin F' S' ∧ S ⊆ adjoin F' S' :=
⟨fun h => ⟨trans (adjoin.range_algebraMap_subset _ _) h, trans (subset_adjoin _ _) h⟩,
fun ⟨hF, hS⟩ => Subfield.closure_le.mpr (Set.union_subset hF hS)⟩
#align intermediate_field.adjoin_subset_adjoin_iff IntermediateField.adjoin_subset_adjoin_iff
+-/
#print IntermediateField.adjoin_adjoin_left /-
/-- `F[S][T] = F[S ∪ T]` -/
@@ -398,6 +502,7 @@ theorem adjoin_adjoin_comm (T : Set E) :
#align intermediate_field.adjoin_adjoin_comm IntermediateField.adjoin_adjoin_comm
-/
+#print IntermediateField.adjoin_map /-
theorem adjoin_map {E' : Type _} [Field E'] [Algebra F E'] (f : E →ₐ[F] E') :
(adjoin F S).map f = adjoin F (f '' S) := by
ext x
@@ -408,11 +513,15 @@ theorem adjoin_map {E' : Type _} [Field E'] [Algebra F E'] (f : E →ₐ[F] E')
f.comp_algebra_map]
rfl
#align intermediate_field.adjoin_map IntermediateField.adjoin_map
+-/
+#print IntermediateField.algebra_adjoin_le_adjoin /-
theorem algebra_adjoin_le_adjoin : Algebra.adjoin F S ≤ (adjoin F S).toSubalgebra :=
Algebra.adjoin_le (subset_adjoin _ _)
#align intermediate_field.algebra_adjoin_le_adjoin IntermediateField.algebra_adjoin_le_adjoin
+-/
+#print IntermediateField.adjoin_eq_algebra_adjoin /-
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
@@ -426,7 +535,9 @@ theorem adjoin_eq_algebra_adjoin (inv_mem : ∀ x ∈ Algebra.adjoin F S, x⁻¹
from adjoin_le_iff.mpr Algebra.subset_adjoin)
(algebra_adjoin_le_adjoin _ _)
#align intermediate_field.adjoin_eq_algebra_adjoin IntermediateField.adjoin_eq_algebra_adjoin
+-/
+#print IntermediateField.eq_adjoin_of_eq_algebra_adjoin /-
theorem eq_adjoin_of_eq_algebra_adjoin (K : IntermediateField F E)
(h : K.toSubalgebra = Algebra.adjoin F S) : K = adjoin F S :=
by
@@ -438,7 +549,9 @@ theorem eq_adjoin_of_eq_algebra_adjoin (K : IntermediateField F E)
rw [← h]
rfl
#align intermediate_field.eq_adjoin_of_eq_algebra_adjoin IntermediateField.eq_adjoin_of_eq_algebra_adjoin
+-/
+#print IntermediateField.adjoin_induction /-
@[elab_as_elim]
theorem adjoin_induction {s : Set E} {p : E → Prop} {x} (h : x ∈ adjoin F s) (Hs : ∀ x ∈ s, p x)
(Hmap : ∀ x, p (algebraMap F E x)) (Hadd : ∀ x y, p x → p y → p (x + y))
@@ -447,6 +560,7 @@ theorem adjoin_induction {s : Set E} {p : E → Prop} {x} (h : x ∈ adjoin F s)
Subfield.closure_induction h (fun x hx => Or.cases_on hx (fun ⟨x, hx⟩ => hx ▸ Hmap x) (Hs x))
((algebraMap F E).map_one ▸ Hmap 1) Hadd Hneg Hinv Hmul
#align intermediate_field.adjoin_induction IntermediateField.adjoin_induction
+-/
#print IntermediateField.Insert /-
--this definition of notation is courtesy of Kyle Miller on zulip
@@ -470,7 +584,6 @@ instance (priority := 900) insertNonempty {α : Type _} (s : Set α) : Insert s
#align intermediate_field.insert_nonempty IntermediateField.insertNonempty
-/
--- mathport name: «expr ⟮ ,⟯»
notation3:max K"⟮"(l ", "* => foldr (h t => Insert.insert t h) ∅)"⟯" => adjoin K l
section AdjoinSimple
@@ -478,23 +591,30 @@ section AdjoinSimple
variable (α : E)
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.mem_adjoin_simple_self /-
theorem mem_adjoin_simple_self : α ∈ F⟮⟯ :=
subset_adjoin F {α} (Set.mem_singleton α)
#align intermediate_field.mem_adjoin_simple_self IntermediateField.mem_adjoin_simple_self
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.AdjoinSimple.gen /-
/-- generator of `F⟮α⟯` -/
def AdjoinSimple.gen : F⟮⟯ :=
⟨α, mem_adjoin_simple_self F α⟩
#align intermediate_field.adjoin_simple.gen IntermediateField.AdjoinSimple.gen
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.AdjoinSimple.algebraMap_gen /-
@[simp]
theorem AdjoinSimple.algebraMap_gen : algebraMap F⟮⟯ E (AdjoinSimple.gen F α) = α :=
rfl
#align intermediate_field.adjoin_simple.algebra_map_gen IntermediateField.AdjoinSimple.algebraMap_gen
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.AdjoinSimple.isIntegral_gen /-
@[simp]
theorem AdjoinSimple.isIntegral_gen : IsIntegral F (AdjoinSimple.gen F α) ↔ IsIntegral F α :=
by
@@ -502,6 +622,7 @@ theorem AdjoinSimple.isIntegral_gen : IsIntegral F (AdjoinSimple.gen F α) ↔ I
rw [isIntegral_algebraMap_iff (algebraMap F⟮⟯ E).Injective]
infer_instance
#align intermediate_field.adjoin_simple.is_integral_gen IntermediateField.AdjoinSimple.isIntegral_gen
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
@@ -537,6 +658,7 @@ theorem adjoin_algebraic_toSubalgebra {S : Set E} (hS : ∀ x ∈ S, IsAlgebraic
-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_simple_toSubalgebra_of_integral /-
theorem adjoin_simple_toSubalgebra_of_integral (hα : IsIntegral F α) :
F⟮⟯.toSubalgebra = Algebra.adjoin F {α} :=
by
@@ -544,7 +666,9 @@ theorem adjoin_simple_toSubalgebra_of_integral (hα : IsIntegral F α) :
rintro x (rfl : x = α)
rwa [isAlgebraic_iff_isIntegral]
#align intermediate_field.adjoin_simple_to_subalgebra_of_integral IntermediateField.adjoin_simple_toSubalgebra_of_integral
+-/
+#print IntermediateField.isSplittingField_iff /-
theorem isSplittingField_iff {p : F[X]} {K : IntermediateField F E} :
p.IsSplittingField F K ↔ p.Splits (algebraMap F K) ∧ K = adjoin F (p.rootSet E) :=
by
@@ -554,14 +678,18 @@ theorem isSplittingField_iff {p : F[X]} {K : IntermediateField F E} :
rw [← K.range_val, adjoin_algebraic_to_subalgebra fun x => isAlgebraic_of_mem_rootSet]
exact fun hp => (adjoin_root_set_eq_range hp K.val).symm.trans eq_comm
#align intermediate_field.is_splitting_field_iff IntermediateField.isSplittingField_iff
+-/
+#print IntermediateField.adjoin_rootSet_isSplittingField /-
theorem adjoin_rootSet_isSplittingField {p : F[X]} (hp : p.Splits (algebraMap F E)) :
p.IsSplittingField F (adjoin F (p.rootSet E)) :=
isSplittingField_iff.mpr ⟨splits_of_splits hp fun x hx => subset_adjoin F (p.rootSet E) hx, rfl⟩
#align intermediate_field.adjoin_root_set_is_splitting_field IntermediateField.adjoin_rootSet_isSplittingField
+-/
open scoped BigOperators
+#print IntermediateField.isSplittingField_iSup /-
/-- A compositum of splitting fields is a splitting field -/
theorem isSplittingField_iSup {ι : Type _} {t : ι → IntermediateField F E} {p : ι → F[X]}
{s : Finset ι} (h0 : ∏ i in s, p i ≠ 0) (h : ∀ i ∈ s, (p i).IsSplittingField F (t i)) :
@@ -578,16 +706,20 @@ theorem isSplittingField_iSup {ι : Type _} {t : ι → IntermediateField F E} {
simp only [root_set_prod p s h0, ← Set.iSup_eq_iUnion, (@gc F _ E _ _).l_iSup₂]
exact iSup_congr fun i => iSup_congr fun hi => (h i hi).2
#align intermediate_field.is_splitting_field_supr IntermediateField.isSplittingField_iSup
+-/
open Set CompleteLattice
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_simple_le_iff /-
@[simp]
theorem adjoin_simple_le_iff {K : IntermediateField F E} : F⟮⟯ ≤ K ↔ α ∈ K :=
adjoin_le_iff.trans singleton_subset_iff
#align intermediate_field.adjoin_simple_le_iff IntermediateField.adjoin_simple_le_iff
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_simple_isCompactElement /-
/-- Adjoining a single element is compact in the lattice of intermediate fields. -/
theorem adjoin_simple_isCompactElement (x : E) : IsCompactElement F⟮⟯ :=
by
@@ -618,8 +750,10 @@ theorem adjoin_simple_isCompactElement (x : E) : IsCompactElement F⟮⟯ :=
obtain ⟨-, ⟨E, rfl⟩, -, ⟨hE, rfl⟩, hx⟩ := key hx
exact ⟨E, hE, hx⟩
#align intermediate_field.adjoin_simple_is_compact_element IntermediateField.adjoin_simple_isCompactElement
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_finset_isCompactElement /-
/-- Adjoining a finite subset is compact in the lattice of intermediate fields. -/
theorem adjoin_finset_isCompactElement (S : Finset E) :
IsCompactElement (adjoin F S : IntermediateField F E) :=
@@ -632,11 +766,14 @@ theorem adjoin_finset_isCompactElement (S : Finset E) :
rw [key, ← Finset.sup_eq_iSup]
exact finset_sup_compact_of_compact S fun x hx => adjoin_simple_is_compact_element x
#align intermediate_field.adjoin_finset_is_compact_element IntermediateField.adjoin_finset_isCompactElement
+-/
+#print IntermediateField.adjoin_finite_isCompactElement /-
/-- Adjoining a finite subset is compact in the lattice of intermediate fields. -/
theorem adjoin_finite_isCompactElement {S : Set E} (h : S.Finite) : IsCompactElement (adjoin F S) :=
Finite.coe_toFinset h ▸ adjoin_finset_isCompactElement h.toFinset
#align intermediate_field.adjoin_finite_is_compact_element IntermediateField.adjoin_finite_isCompactElement
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/-- The lattice of intermediate fields is compactly generated. -/
@@ -648,6 +785,7 @@ instance : IsCompactlyGenerated (IntermediateField F E) :=
(le_antisymm (iSup_le fun i => iSup_le fun hi => adjoin_simple_le_iff.mpr hi) fun x hx =>
adjoin_simple_le_iff.mp (le_iSup_of_le x (le_iSup_of_le hx le_rfl)))⟩⟩⟩
+#print IntermediateField.exists_finset_of_mem_iSup /-
theorem exists_finset_of_mem_iSup {ι : Type _} {f : ι → IntermediateField F E} {x : E}
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset ι, x ∈ ⨆ i ∈ s, f i :=
by
@@ -655,8 +793,10 @@ theorem exists_finset_of_mem_iSup {ι : Type _} {f : ι → IntermediateField F
simp only [adjoin_simple_le_iff] at this
exact this hx
#align intermediate_field.exists_finset_of_mem_supr IntermediateField.exists_finset_of_mem_iSup
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.exists_finset_of_mem_supr' /-
theorem exists_finset_of_mem_supr' {ι : Type _} {f : ι → IntermediateField F E} {x : E}
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset (Σ i, f i), x ∈ ⨆ i ∈ s, F⟮⟯ :=
exists_finset_of_mem_iSup
@@ -665,7 +805,9 @@ theorem exists_finset_of_mem_supr' {ι : Type _} {f : ι → IntermediateField F
SetLike.le_def.mp (le_iSup_of_le ⟨i, x, h⟩ le_rfl) (mem_adjoin_simple_self F x))
hx)
#align intermediate_field.exists_finset_of_mem_supr' IntermediateField.exists_finset_of_mem_supr'
+-/
+#print IntermediateField.exists_finset_of_mem_supr'' /-
theorem exists_finset_of_mem_supr'' {ι : Type _} {f : ι → IntermediateField F E}
(h : ∀ i, Algebra.IsAlgebraic F (f i)) {x : E} (hx : x ∈ ⨆ i, f i) :
∃ s : Finset (Σ i, f i), x ∈ ⨆ i ∈ s, adjoin F ((minpoly F (i.2 : _)).rootSet E) :=
@@ -679,6 +821,7 @@ theorem exists_finset_of_mem_supr'' {ι : Type _} {f : ι → IntermediateField
rw [IntermediateField.minpoly_eq, Subtype.coe_mk, mem_root_set_of_ne, minpoly.aeval]
exact minpoly.ne_zero (is_integral_iff.mp (is_algebraic_iff_is_integral.mp (h i ⟨x, hx⟩)))
#align intermediate_field.exists_finset_of_mem_supr'' IntermediateField.exists_finset_of_mem_supr''
+-/
end AdjoinSimple
@@ -688,16 +831,20 @@ section AdjoinIntermediateFieldLattice
variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E] {α : E} {S : Set E}
+#print IntermediateField.adjoin_eq_bot_iff /-
@[simp]
theorem adjoin_eq_bot_iff : adjoin F S = ⊥ ↔ S ⊆ (⊥ : IntermediateField F E) := by
rw [eq_bot_iff, adjoin_le_iff]; rfl
#align intermediate_field.adjoin_eq_bot_iff IntermediateField.adjoin_eq_bot_iff
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_simple_eq_bot_iff /-
@[simp]
theorem adjoin_simple_eq_bot_iff : F⟮⟯ = ⊥ ↔ α ∈ (⊥ : IntermediateField F E) := by
rw [adjoin_eq_bot_iff]; exact Set.singleton_subset_iff
#align intermediate_field.adjoin_simple_eq_bot_iff IntermediateField.adjoin_simple_eq_bot_iff
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
#print IntermediateField.adjoin_zero /-
@@ -737,45 +884,62 @@ open FiniteDimensional Module
variable {K L : IntermediateField F E}
+#print IntermediateField.rank_eq_one_iff /-
@[simp]
theorem rank_eq_one_iff : Module.rank F K = 1 ↔ K = ⊥ := by
rw [← to_subalgebra_eq_iff, ← rank_eq_rank_subalgebra, Subalgebra.rank_eq_one_iff,
bot_to_subalgebra]
#align intermediate_field.rank_eq_one_iff IntermediateField.rank_eq_one_iff
+-/
+#print IntermediateField.finrank_eq_one_iff /-
@[simp]
theorem finrank_eq_one_iff : finrank F K = 1 ↔ K = ⊥ := by
rw [← to_subalgebra_eq_iff, ← finrank_eq_finrank_subalgebra, Subalgebra.finrank_eq_one_iff,
bot_to_subalgebra]
#align intermediate_field.finrank_eq_one_iff IntermediateField.finrank_eq_one_iff
+-/
+#print IntermediateField.rank_bot /-
@[simp]
theorem rank_bot : Module.rank F (⊥ : IntermediateField F E) = 1 := by rw [rank_eq_one_iff]
#align intermediate_field.rank_bot IntermediateField.rank_bot
+-/
+#print IntermediateField.finrank_bot /-
@[simp]
theorem finrank_bot : finrank F (⊥ : IntermediateField F E) = 1 := by rw [finrank_eq_one_iff]
#align intermediate_field.finrank_bot IntermediateField.finrank_bot
+-/
+#print IntermediateField.rank_adjoin_eq_one_iff /-
theorem rank_adjoin_eq_one_iff : Module.rank F (adjoin F S) = 1 ↔ S ⊆ (⊥ : IntermediateField F E) :=
Iff.trans rank_eq_one_iff adjoin_eq_bot_iff
#align intermediate_field.rank_adjoin_eq_one_iff IntermediateField.rank_adjoin_eq_one_iff
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.rank_adjoin_simple_eq_one_iff /-
theorem rank_adjoin_simple_eq_one_iff : Module.rank F F⟮⟯ = 1 ↔ α ∈ (⊥ : IntermediateField F E) :=
by rw [rank_adjoin_eq_one_iff]; exact Set.singleton_subset_iff
#align intermediate_field.rank_adjoin_simple_eq_one_iff IntermediateField.rank_adjoin_simple_eq_one_iff
+-/
+#print IntermediateField.finrank_adjoin_eq_one_iff /-
theorem finrank_adjoin_eq_one_iff : finrank F (adjoin F S) = 1 ↔ S ⊆ (⊥ : IntermediateField F E) :=
Iff.trans finrank_eq_one_iff adjoin_eq_bot_iff
#align intermediate_field.finrank_adjoin_eq_one_iff IntermediateField.finrank_adjoin_eq_one_iff
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.finrank_adjoin_simple_eq_one_iff /-
theorem finrank_adjoin_simple_eq_one_iff : finrank F F⟮⟯ = 1 ↔ α ∈ (⊥ : IntermediateField F E) := by
rw [finrank_adjoin_eq_one_iff]; exact Set.singleton_subset_iff
#align intermediate_field.finrank_adjoin_simple_eq_one_iff IntermediateField.finrank_adjoin_simple_eq_one_iff
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.bot_eq_top_of_rank_adjoin_eq_one /-
/-- If `F⟮x⟯` has dimension `1` over `F` for every `x ∈ E` then `F = E`. -/
theorem bot_eq_top_of_rank_adjoin_eq_one (h : ∀ x : E, Module.rank F F⟮⟯ = 1) :
(⊥ : IntermediateField F E) = ⊤ := by
@@ -783,29 +947,37 @@ theorem bot_eq_top_of_rank_adjoin_eq_one (h : ∀ x : E, Module.rank F F⟮⟯ =
rw [iff_true_right IntermediateField.mem_top]
exact rank_adjoin_simple_eq_one_iff.mp (h x)
#align intermediate_field.bot_eq_top_of_rank_adjoin_eq_one IntermediateField.bot_eq_top_of_rank_adjoin_eq_one
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.bot_eq_top_of_finrank_adjoin_eq_one /-
theorem bot_eq_top_of_finrank_adjoin_eq_one (h : ∀ x : E, finrank F F⟮⟯ = 1) :
(⊥ : IntermediateField F E) = ⊤ := by
ext
rw [iff_true_right IntermediateField.mem_top]
exact finrank_adjoin_simple_eq_one_iff.mp (h x)
#align intermediate_field.bot_eq_top_of_finrank_adjoin_eq_one IntermediateField.bot_eq_top_of_finrank_adjoin_eq_one
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.subsingleton_of_rank_adjoin_eq_one /-
theorem subsingleton_of_rank_adjoin_eq_one (h : ∀ x : E, Module.rank F F⟮⟯ = 1) :
Subsingleton (IntermediateField F E) :=
subsingleton_of_bot_eq_top (bot_eq_top_of_rank_adjoin_eq_one h)
#align intermediate_field.subsingleton_of_rank_adjoin_eq_one IntermediateField.subsingleton_of_rank_adjoin_eq_one
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.subsingleton_of_finrank_adjoin_eq_one /-
theorem subsingleton_of_finrank_adjoin_eq_one (h : ∀ x : E, finrank F F⟮⟯ = 1) :
Subsingleton (IntermediateField F E) :=
subsingleton_of_bot_eq_top (bot_eq_top_of_finrank_adjoin_eq_one h)
#align intermediate_field.subsingleton_of_finrank_adjoin_eq_one IntermediateField.subsingleton_of_finrank_adjoin_eq_one
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.bot_eq_top_of_finrank_adjoin_le_one /-
/-- If `F⟮x⟯` has dimension `≤1` over `F` for every `x ∈ E` then `F = E`. -/
theorem bot_eq_top_of_finrank_adjoin_le_one [FiniteDimensional F E]
(h : ∀ x : E, finrank F F⟮⟯ ≤ 1) : (⊥ : IntermediateField F E) = ⊤ :=
@@ -813,12 +985,15 @@ theorem bot_eq_top_of_finrank_adjoin_le_one [FiniteDimensional F E]
apply bot_eq_top_of_finrank_adjoin_eq_one
exact fun x => by linarith [h x, show 0 < finrank F F⟮⟯ from finrank_pos]
#align intermediate_field.bot_eq_top_of_finrank_adjoin_le_one IntermediateField.bot_eq_top_of_finrank_adjoin_le_one
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.subsingleton_of_finrank_adjoin_le_one /-
theorem subsingleton_of_finrank_adjoin_le_one [FiniteDimensional F E]
(h : ∀ x : E, finrank F F⟮⟯ ≤ 1) : Subsingleton (IntermediateField F E) :=
subsingleton_of_bot_eq_top (bot_eq_top_of_finrank_adjoin_le_one h)
#align intermediate_field.subsingleton_of_finrank_adjoin_le_one IntermediateField.subsingleton_of_finrank_adjoin_le_one
+-/
end AdjoinRank
@@ -831,6 +1006,7 @@ variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E] {α : E}
variable {K : Type _} [Field K] [Algebra F K]
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.minpoly_gen /-
theorem minpoly_gen {α : E} (h : IsIntegral F α) : minpoly F (AdjoinSimple.gen F α) = minpoly F α :=
by
rw [← adjoin_simple.algebra_map_gen F α] at h
@@ -839,9 +1015,11 @@ theorem minpoly_gen {α : E} (h : IsIntegral F α) : minpoly F (AdjoinSimple.gen
minpoly.eq_of_algebraMap_eq inj ((isIntegral_algebraMap_iff inj).mp h)
(adjoin_simple.algebra_map_gen _ _).symm
#align intermediate_field.minpoly_gen IntermediateField.minpoly_gen
+-/
variable (F)
+#print IntermediateField.aeval_gen_minpoly /-
theorem aeval_gen_minpoly (α : E) : aeval (AdjoinSimple.gen F α) (minpoly F α) = 0 :=
by
ext
@@ -849,10 +1027,12 @@ theorem aeval_gen_minpoly (α : E) : aeval (AdjoinSimple.gen F α) (minpoly F α
conv in aeval α => rw [← adjoin_simple.algebra_map_gen F α]
exact (aeval_algebra_map_apply E (adjoin_simple.gen F α) _).symm
#align intermediate_field.aeval_gen_minpoly IntermediateField.aeval_gen_minpoly
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoinRootEquivAdjoin /-
/-- algebra isomorphism between `adjoin_root` and `F⟮α⟯` -/
noncomputable def adjoinRootEquivAdjoin (h : IsIntegral F α) : AdjoinRoot (minpoly F α) ≃ₐ[F] F⟮⟯ :=
AlgEquiv.ofBijective
@@ -874,25 +1054,31 @@ noncomputable def adjoinRootEquivAdjoin (h : IsIntegral F α) : AdjoinRoot (minp
⟨AdjoinRoot.root (minpoly F α), by rw [RingHom.comp_apply, AdjoinRoot.lift_root];
rfl⟩)))
#align intermediate_field.adjoin_root_equiv_adjoin IntermediateField.adjoinRootEquivAdjoin
+-/
+#print IntermediateField.adjoinRootEquivAdjoin_apply_root /-
theorem adjoinRootEquivAdjoin_apply_root (h : IsIntegral F α) :
adjoinRootEquivAdjoin F h (AdjoinRoot.root (minpoly F α)) = AdjoinSimple.gen F α :=
AdjoinRoot.lift_root (aeval_gen_minpoly F α)
#align intermediate_field.adjoin_root_equiv_adjoin_apply_root IntermediateField.adjoinRootEquivAdjoin_apply_root
+-/
section PowerBasis
variable {L : Type _} [Field L] [Algebra K L]
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.powerBasisAux /-
/-- The elements `1, x, ..., x ^ (d - 1)` form a basis for `K⟮x⟯`,
where `d` is the degree of the minimal polynomial of `x`. -/
noncomputable def powerBasisAux {x : L} (hx : IsIntegral K x) :
Basis (Fin (minpoly K x).natDegree) K K⟮⟯ :=
(AdjoinRoot.powerBasis (minpoly.ne_zero hx)).Basis.map (adjoinRootEquivAdjoin K hx).toLinearEquiv
#align intermediate_field.power_basis_aux IntermediateField.powerBasisAux
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin.powerBasis /-
/-- The power basis `1, x, ..., x ^ (d - 1)` for `K⟮x⟯`,
where `d` is the degree of the minimal polynomial of `x`. -/
@[simps]
@@ -905,34 +1091,44 @@ noncomputable def adjoin.powerBasis {x : L} (hx : IsIntegral K x) : PowerBasis K
rw [power_basis_aux, Basis.map_apply, PowerBasis.basis_eq_pow, AlgEquiv.toLinearEquiv_apply,
AlgEquiv.map_pow, AdjoinRoot.powerBasis_gen, adjoin_root_equiv_adjoin_apply_root]
#align intermediate_field.adjoin.power_basis IntermediateField.adjoin.powerBasis
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin.finiteDimensional /-
theorem adjoin.finiteDimensional {x : L} (hx : IsIntegral K x) : FiniteDimensional K K⟮⟯ :=
PowerBasis.finiteDimensional (adjoin.powerBasis hx)
#align intermediate_field.adjoin.finite_dimensional IntermediateField.adjoin.finiteDimensional
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin.finrank /-
theorem adjoin.finrank {x : L} (hx : IsIntegral K x) :
FiniteDimensional.finrank K K⟮⟯ = (minpoly K x).natDegree :=
by
rw [PowerBasis.finrank (adjoin.power_basis hx : _)]
rfl
#align intermediate_field.adjoin.finrank IntermediateField.adjoin.finrank
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.minpoly.natDegree_le /-
theorem IntermediateField.minpoly.natDegree_le {x : L} [FiniteDimensional K L]
(hx : IsIntegral K x) : (minpoly K x).natDegree ≤ finrank K L :=
le_of_eq_of_le (IntermediateField.adjoin.finrank hx).symm K⟮⟯.toSubmodule.finrank_le
#align minpoly.nat_degree_le IntermediateField.minpoly.natDegree_le
+-/
+#print IntermediateField.minpoly.degree_le /-
theorem IntermediateField.minpoly.degree_le {x : L} [FiniteDimensional K L] (hx : IsIntegral K x) :
(minpoly K x).degree ≤ finrank K L :=
degree_le_of_natDegree_le (IntermediateField.minpoly.natDegree_le hx)
#align minpoly.degree_le IntermediateField.minpoly.degree_le
+-/
end PowerBasis
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.algHomAdjoinIntegralEquiv /-
/-- Algebra homomorphism `F⟮α⟯ →ₐ[F] K` are in bijection with the set of roots
of `minpoly α` in `K`. -/
noncomputable def algHomAdjoinIntegralEquiv (h : IsIntegral F α) :
@@ -941,20 +1137,25 @@ noncomputable def algHomAdjoinIntegralEquiv (h : IsIntegral F α) :
((Equiv.refl _).subtypeEquiv fun x => by
rw [adjoin.power_basis_gen, minpoly_gen h, Equiv.refl_apply])
#align intermediate_field.alg_hom_adjoin_integral_equiv IntermediateField.algHomAdjoinIntegralEquiv
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.fintypeOfAlgHomAdjoinIntegral /-
/-- Fintype of algebra homomorphism `F⟮α⟯ →ₐ[F] K` -/
noncomputable def fintypeOfAlgHomAdjoinIntegral (h : IsIntegral F α) : Fintype (F⟮⟯ →ₐ[F] K) :=
PowerBasis.AlgHom.fintype (adjoin.powerBasis h)
#align intermediate_field.fintype_of_alg_hom_adjoin_integral IntermediateField.fintypeOfAlgHomAdjoinIntegral
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.card_algHom_adjoin_integral /-
theorem card_algHom_adjoin_integral (h : IsIntegral F α) (h_sep : (minpoly F α).Separable)
(h_splits : (minpoly F α).Splits (algebraMap F K)) :
@Fintype.card (F⟮⟯ →ₐ[F] K) (fintypeOfAlgHomAdjoinIntegral F h) = (minpoly F α).natDegree := by
rw [AlgHom.card_of_powerBasis] <;>
simp only [adjoin.power_basis_dim, adjoin.power_basis_gen, minpoly_gen h, h_sep, h_splits]
#align intermediate_field.card_alg_hom_adjoin_integral IntermediateField.card_algHom_adjoin_integral
+-/
end AdjoinIntegralElement
@@ -976,25 +1177,34 @@ theorem fg_adjoin_finset (t : Finset E) : (adjoin F (↑t : Set E)).FG :=
#align intermediate_field.fg_adjoin_finset IntermediateField.fg_adjoin_finset
-/
+#print IntermediateField.fg_def /-
theorem fg_def {S : IntermediateField F E} : S.FG ↔ ∃ t : Set E, Set.Finite t ∧ adjoin F t = S :=
Iff.symm Set.exists_finite_iff_finset
#align intermediate_field.fg_def IntermediateField.fg_def
+-/
+#print IntermediateField.fg_bot /-
theorem fg_bot : (⊥ : IntermediateField F E).FG :=
⟨∅, adjoin_empty F E⟩
#align intermediate_field.fg_bot IntermediateField.fg_bot
+-/
+#print IntermediateField.fG_of_fG_toSubalgebra /-
theorem fG_of_fG_toSubalgebra (S : IntermediateField F E) (h : S.toSubalgebra.FG) : S.FG :=
by
cases' h with t ht
exact ⟨t, (eq_adjoin_of_eq_algebra_adjoin _ _ _ ht.symm).symm⟩
#align intermediate_field.fg_of_fg_to_subalgebra IntermediateField.fG_of_fG_toSubalgebra
+-/
+#print IntermediateField.fg_of_noetherian /-
theorem fg_of_noetherian (S : IntermediateField F E) [IsNoetherian F E] : S.FG :=
S.fG_of_fG_toSubalgebra S.toSubalgebra.fg_of_noetherian
#align intermediate_field.fg_of_noetherian IntermediateField.fg_of_noetherian
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.induction_on_adjoin_finset /-
theorem induction_on_adjoin_finset (S : Finset E) (P : IntermediateField F E → Prop) (base : P ⊥)
(ih : ∀ (K : IntermediateField F E), ∀ x ∈ S, P K → P (K⟮⟯.restrictScalars F)) :
P (adjoin F ↑S) := by
@@ -1004,8 +1214,10 @@ theorem induction_on_adjoin_finset (S : Finset E) (P : IntermediateField F E →
rw [Finset.coe_insert, Set.insert_eq, Set.union_comm, ← adjoin_adjoin_left]
exact ih (adjoin F s) a h1 h4
#align intermediate_field.induction_on_adjoin_finset IntermediateField.induction_on_adjoin_finset
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.induction_on_adjoin_fg /-
theorem induction_on_adjoin_fg (P : IntermediateField F E → Prop) (base : P ⊥)
(ih : ∀ (K : IntermediateField F E) (x : E), P K → P (K⟮⟯.restrictScalars F))
(K : IntermediateField F E) (hK : K.FG) : P K :=
@@ -1013,14 +1225,17 @@ theorem induction_on_adjoin_fg (P : IntermediateField F E → Prop) (base : P
obtain ⟨S, rfl⟩ := hK
exact induction_on_adjoin_finset S P base fun K x _ hK => ih K x hK
#align intermediate_field.induction_on_adjoin_fg IntermediateField.induction_on_adjoin_fg
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.induction_on_adjoin /-
theorem induction_on_adjoin [fd : FiniteDimensional F E] (P : IntermediateField F E → Prop)
(base : P ⊥) (ih : ∀ (K : IntermediateField F E) (x : E), P K → P (K⟮⟯.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
#align intermediate_field.induction_on_adjoin IntermediateField.induction_on_adjoin
+-/
end Induction
@@ -1063,10 +1278,13 @@ noncomputable instance : OrderBot (Lifts F E K)
noncomputable instance : Inhabited (Lifts F E K) :=
⟨⊥⟩
+#print IntermediateField.Lifts.eq_of_le /-
theorem Lifts.eq_of_le {x y : Lifts F E K} (hxy : x ≤ y) (s : x.1) : x.2 s = y.2 ⟨s, hxy.1 s.Mem⟩ :=
hxy.2 s ⟨s, hxy.1 s.Mem⟩ rfl
#align intermediate_field.lifts.eq_of_le IntermediateField.Lifts.eq_of_le
+-/
+#print IntermediateField.Lifts.exists_max_two /-
theorem Lifts.exists_max_two {c : Set (Lifts F E K)} {x y : Lifts F E K} (hc : IsChain (· ≤ ·) c)
(hx : x ∈ Insert.insert ⊥ c) (hy : y ∈ Insert.insert ⊥ c) :
∃ z : Lifts F E K, z ∈ Insert.insert ⊥ c ∧ x ≤ z ∧ y ≤ z :=
@@ -1075,7 +1293,9 @@ theorem Lifts.exists_max_two {c : Set (Lifts F E K)} {x y : Lifts F E K} (hc : I
· exact ⟨y, hy, hxy, le_refl y⟩
· exact ⟨x, hx, le_refl x, hyx⟩
#align intermediate_field.lifts.exists_max_two IntermediateField.Lifts.exists_max_two
+-/
+#print IntermediateField.Lifts.exists_max_three /-
theorem Lifts.exists_max_three {c : Set (Lifts F E K)} {x y z : Lifts F E K}
(hc : IsChain (· ≤ ·) c) (hx : x ∈ Insert.insert ⊥ c) (hy : y ∈ Insert.insert ⊥ c)
(hz : z ∈ Insert.insert ⊥ c) :
@@ -1085,7 +1305,9 @@ theorem Lifts.exists_max_three {c : Set (Lifts F E K)} {x y z : Lifts F E K}
obtain ⟨w, hw, hzw, hvw⟩ := lifts.exists_max_two hc hz hv
exact ⟨w, hw, le_trans hxv hvw, le_trans hyv hvw, hzw⟩
#align intermediate_field.lifts.exists_max_three IntermediateField.Lifts.exists_max_three
+-/
+#print IntermediateField.Lifts.upperBoundIntermediateField /-
/-- An upper bound on a chain of lifts -/
def Lifts.upperBoundIntermediateField {c : Set (Lifts F E K)} (hc : IsChain (· ≤ ·) c) :
IntermediateField F E
@@ -1105,7 +1327,9 @@ def Lifts.upperBoundIntermediateField {c : Set (Lifts F E K)} (hc : IsChain (·
exact ⟨z, hz, z.1.mul_mem (hxz.1 ha) (hyz.1 hb)⟩
algebraMap_mem' s := ⟨⊥, Set.mem_insert ⊥ c, algebraMap_mem ⊥ s⟩
#align intermediate_field.lifts.upper_bound_intermediate_field IntermediateField.Lifts.upperBoundIntermediateField
+-/
+#print IntermediateField.Lifts.upperBoundAlgHom /-
/-- The lift on the upper bound on a chain of lifts -/
noncomputable def Lifts.upperBoundAlgHom {c : Set (Lifts F E K)} (hc : IsChain (· ≤ ·) c) :
Lifts.upperBoundIntermediateField hc →ₐ[F] K
@@ -1129,12 +1353,16 @@ noncomputable def Lifts.upperBoundAlgHom {c : Set (Lifts F E K)} (hc : IsChain (
rfl
commutes' _ := AlgHom.commutes _ _
#align intermediate_field.lifts.upper_bound_alg_hom IntermediateField.Lifts.upperBoundAlgHom
+-/
+#print IntermediateField.Lifts.upperBound /-
/-- An upper bound on a chain of lifts -/
noncomputable def Lifts.upperBound {c : Set (Lifts F E K)} (hc : IsChain (· ≤ ·) c) : Lifts F E K :=
⟨Lifts.upperBoundIntermediateField hc, Lifts.upperBoundAlgHom hc⟩
#align intermediate_field.lifts.upper_bound IntermediateField.Lifts.upperBound
+-/
+#print IntermediateField.Lifts.exists_upper_bound /-
theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤ ·) c) :
∃ ub, ∀ a ∈ c, a ≤ ub :=
⟨Lifts.upperBound hc, by
@@ -1148,6 +1376,7 @@ theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤
rw [lifts.eq_of_le hxz, lifts.eq_of_le hyz]
exact congr_arg z.2 (Subtype.ext hst)⟩
#align intermediate_field.lifts.exists_upper_bound IntermediateField.Lifts.exists_upper_bound
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
@@ -1175,6 +1404,7 @@ noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.Lifts.le_lifts_of_splits /-
theorem Lifts.le_lifts_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
(h2 : (minpoly F s).Splits (algebraMap F K)) : x ≤ x.lift_of_splits h1 h2 :=
⟨fun z hz => algebraMap_mem x.1⟮⟯ ⟨z, hz⟩, fun t u htu =>
@@ -1184,17 +1414,23 @@ theorem Lifts.le_lifts_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
letI : Algebra x.1 K := x.2.toRingHom.toAlgebra
exact AlgHom.commutes _ t)⟩
#align intermediate_field.lifts.le_lifts_of_splits IntermediateField.Lifts.le_lifts_of_splits
+-/
+#print IntermediateField.Lifts.mem_lifts_of_splits /-
theorem Lifts.mem_lifts_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
(h2 : (minpoly F s).Splits (algebraMap F K)) : s ∈ (x.lift_of_splits h1 h2).1 :=
mem_adjoin_simple_self x.1 s
#align intermediate_field.lifts.mem_lifts_of_splits IntermediateField.Lifts.mem_lifts_of_splits
+-/
+#print IntermediateField.Lifts.exists_lift_of_splits /-
theorem Lifts.exists_lift_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
(h2 : (minpoly F s).Splits (algebraMap F K)) : ∃ y, x ≤ y ∧ s ∈ y.1 :=
⟨x.lift_of_splits h1 h2, x.le_lifts_of_splits h1 h2, x.mem_lifts_of_splits h1 h2⟩
#align intermediate_field.lifts.exists_lift_of_splits IntermediateField.Lifts.exists_lift_of_splits
+-/
+#print IntermediateField.algHom_mk_adjoin_splits /-
theorem algHom_mk_adjoin_splits
(hK : ∀ s ∈ S, IsIntegral F (s : E) ∧ (minpoly F s).Splits (algebraMap F K)) :
Nonempty (adjoin F S →ₐ[F] K) :=
@@ -1207,7 +1443,9 @@ theorem algHom_mk_adjoin_splits
rcases x.exists_lift_of_splits (hK s hs).1 (hK s hs).2 with ⟨y, h1, h2⟩
rwa [hx y h1] at h2
#align intermediate_field.alg_hom_mk_adjoin_splits IntermediateField.algHom_mk_adjoin_splits
+-/
+#print IntermediateField.algHom_mk_adjoin_splits' /-
theorem algHom_mk_adjoin_splits' (hS : adjoin F S = ⊤)
(hK : ∀ x ∈ S, IsIntegral F (x : E) ∧ (minpoly F x).Splits (algebraMap F K)) :
Nonempty (E →ₐ[F] K) := by
@@ -1215,6 +1453,7 @@ theorem algHom_mk_adjoin_splits' (hS : adjoin F S = ⊤)
rw [hS] at ϕ
exact ⟨ϕ.comp top_equiv.symm.to_alg_hom⟩
#align intermediate_field.alg_hom_mk_adjoin_splits' IntermediateField.algHom_mk_adjoin_splits'
+-/
end AlgHomMkAdjoinSplits
@@ -1222,10 +1461,13 @@ section Supremum
variable {K L : Type _} [Field K] [Field L] [Algebra K L] (E1 E2 : IntermediateField K L)
+#print IntermediateField.le_sup_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)
#align intermediate_field.le_sup_to_subalgebra IntermediateField.le_sup_toSubalgebra
+-/
+#print IntermediateField.sup_toSubalgebra /-
theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
by
@@ -1248,7 +1490,9 @@ theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K
(is_integral_sup.mpr ⟨Algebra.isIntegral_of_finite K E1, Algebra.isIntegral_of_finite K E2⟩)
(Field.toIsField K)
#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra
+-/
+#print IntermediateField.finiteDimensional_sup /-
instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
FiniteDimensional K ↥(E1 ⊔ E2) :=
by
@@ -1259,7 +1503,9 @@ instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensi
rwa [this] at h
rw [Algebra.TensorProduct.productMap_range, E1.range_val, E2.range_val, sup_to_subalgebra]
#align intermediate_field.finite_dimensional_sup IntermediateField.finiteDimensional_sup
+-/
+#print IntermediateField.finiteDimensional_iSup_of_finite /-
instance finiteDimensional_iSup_of_finite {ι : Type _} {t : ι → IntermediateField K L}
[h : Finite ι] [∀ i, FiniteDimensional K (t i)] :
FiniteDimensional K (⨆ i, t i : IntermediateField K L) :=
@@ -1276,7 +1522,9 @@ instance finiteDimensional_iSup_of_finite {ι : Type _} {t : ι → Intermediate
rw [iSup_insert]
exact IntermediateField.finiteDimensional_sup _ _
#align intermediate_field.finite_dimensional_supr_of_finite IntermediateField.finiteDimensional_iSup_of_finite
+-/
+#print IntermediateField.finiteDimensional_iSup_of_finset /-
instance finiteDimensional_iSup_of_finset {ι : Type _} {f : ι → IntermediateField K L}
{s : Finset ι} [h : ∀ i ∈ s, FiniteDimensional K (f i)] :
FiniteDimensional K (⨆ i ∈ s, f i : IntermediateField K L) :=
@@ -1287,8 +1535,10 @@ instance finiteDimensional_iSup_of_finset {ι : Type _} {f : ι → Intermediate
(iSup_le fun i => le_iSup_of_le i (le_iSup_of_le i.2 le_rfl))
exact this.symm ▸ IntermediateField.finiteDimensional_iSup_of_finite
#align intermediate_field.finite_dimensional_supr_of_finset IntermediateField.finiteDimensional_iSup_of_finset
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.isAlgebraic_iSup /-
/-- A compositum of algebraic extensions is algebraic -/
theorem isAlgebraic_iSup {ι : Type _} {f : ι → IntermediateField K L}
(h : ∀ i, Algebra.IsAlgebraic K (f i)) :
@@ -1301,6 +1551,7 @@ theorem isAlgebraic_iSup {ι : Type _} {f : ι → IntermediateField K L}
adjoin.finite_dimensional (is_integral_iff.1 (isAlgebraic_iff_isIntegral.1 (h i x)))
apply Algebra.isAlgebraic_of_finite
#align intermediate_field.is_algebraic_supr IntermediateField.isAlgebraic_iSup
+-/
end Supremum
@@ -1316,6 +1567,7 @@ open IntermediateField
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print PowerBasis.equivAdjoinSimple /-
/-- `pb.equiv_adjoin_simple` is the equivalence between `K⟮pb.gen⟯` and `L` itself. -/
noncomputable def equivAdjoinSimple (pb : PowerBasis K L) : K⟮⟯ ≃ₐ[K] L :=
(adjoin.powerBasis pb.isIntegral_gen).equivOfMinpoly pb
@@ -1323,30 +1575,39 @@ noncomputable def equivAdjoinSimple (pb : PowerBasis K L) : K⟮⟯ ≃ₐ[K] L
(adjoin.powerBasis pb.isIntegral_gen).isIntegral_gen
(by rw [adjoin.power_basis_gen, adjoin_simple.algebra_map_gen]))
#align power_basis.equiv_adjoin_simple PowerBasis.equivAdjoinSimple
+-/
+#print PowerBasis.equivAdjoinSimple_aeval /-
@[simp]
theorem equivAdjoinSimple_aeval (pb : PowerBasis K L) (f : K[X]) :
pb.equivAdjoinSimple (aeval (AdjoinSimple.gen K pb.gen) f) = aeval pb.gen f :=
equivOfMinpoly_aeval _ pb _ f
#align power_basis.equiv_adjoin_simple_aeval PowerBasis.equivAdjoinSimple_aeval
+-/
+#print PowerBasis.equivAdjoinSimple_gen /-
@[simp]
theorem equivAdjoinSimple_gen (pb : PowerBasis K L) :
pb.equivAdjoinSimple (AdjoinSimple.gen K pb.gen) = pb.gen :=
equivOfMinpoly_gen _ pb _
#align power_basis.equiv_adjoin_simple_gen PowerBasis.equivAdjoinSimple_gen
+-/
+#print PowerBasis.equivAdjoinSimple_symm_aeval /-
@[simp]
theorem equivAdjoinSimple_symm_aeval (pb : PowerBasis K L) (f : K[X]) :
pb.equivAdjoinSimple.symm (aeval pb.gen f) = aeval (AdjoinSimple.gen K pb.gen) f := by
rw [equiv_adjoin_simple, equiv_of_minpoly_symm, equiv_of_minpoly_aeval, adjoin.power_basis_gen]
#align power_basis.equiv_adjoin_simple_symm_aeval PowerBasis.equivAdjoinSimple_symm_aeval
+-/
+#print PowerBasis.equivAdjoinSimple_symm_gen /-
@[simp]
theorem equivAdjoinSimple_symm_gen (pb : PowerBasis K L) :
pb.equivAdjoinSimple.symm pb.gen = AdjoinSimple.gen K pb.gen := by
rw [equiv_adjoin_simple, equiv_of_minpoly_symm, equiv_of_minpoly_gen, adjoin.power_basis_gen]
#align power_basis.equiv_adjoin_simple_symm_gen PowerBasis.equivAdjoinSimple_symm_gen
+-/
end PowerBasis
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3e83f0fa4391c8740f7d773a7a9b74e311ae2a3
@@ -564,7 +564,7 @@ open scoped BigOperators
/-- A compositum of splitting fields is a splitting field -/
theorem isSplittingField_iSup {ι : Type _} {t : ι → IntermediateField F E} {p : ι → F[X]}
- {s : Finset ι} (h0 : (∏ i in s, p i) ≠ 0) (h : ∀ i ∈ s, (p i).IsSplittingField F (t i)) :
+ {s : Finset ι} (h0 : ∏ i in s, p i ≠ 0) (h : ∀ i ∈ s, (p i).IsSplittingField F (t i)) :
(∏ i in s, p i).IsSplittingField F (⨆ i ∈ s, t i : IntermediateField F E) :=
by
let K : IntermediateField F E := ⨆ i ∈ s, t i
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3e83f0fa4391c8740f7d773a7a9b74e311ae2a3
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
! This file was ported from Lean 3 source module field_theory.adjoin
-! leanprover-community/mathlib commit df76f43357840485b9d04ed5dee5ab115d420e87
+! leanprover-community/mathlib commit 6b31d1eebd64eab86d5bd9936bfaada6ca8b5842
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -16,6 +16,9 @@ import Mathbin.RingTheory.TensorProduct
/-!
# Adjoining Elements to Fields
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
In this file we introduce the notion of adjoining elements to fields.
This isn't quite the same as adjoining elements to rings.
For example, `algebra.adjoin K {x}` might not include `x⁻¹`.
mathlib commit https://github.com/leanprover-community/mathlib/commit/31c24aa72e7b3e5ed97a8412470e904f82b81004
@@ -42,11 +42,13 @@ section AdjoinDef
variable (F : Type _) [Field F] {E : Type _} [Field E] [Algebra F E] (S : Set E)
+#print IntermediateField.adjoin /-
/-- `adjoin F S` extends a field `F` by adjoining a set `S ⊆ E`. -/
def adjoin : IntermediateField F E :=
{ Subfield.closure (Set.range (algebraMap F E) ∪ S) with
algebraMap_mem' := fun x => Subfield.subset_closure (Or.inl (Set.mem_range_self x)) }
#align intermediate_field.adjoin IntermediateField.adjoin
+-/
end AdjoinDef
@@ -260,26 +262,26 @@ theorem restrictScalars_top {K : Type _} [Field K] [Algebra K E] [Algebra K F]
rfl
#align intermediate_field.restrict_scalars_top IntermediateField.restrictScalars_top
-theorem AlgHom.fieldRange_eq_map {K : Type _} [Field K] [Algebra F K] (f : E →ₐ[F] K) :
- f.fieldRange = IntermediateField.map f ⊤ :=
+theorem IntermediateField.AlgHom.fieldRange_eq_map {K : Type _} [Field K] [Algebra F K]
+ (f : E →ₐ[F] K) : f.fieldRange = IntermediateField.map f ⊤ :=
SetLike.ext' Set.image_univ.symm
-#align alg_hom.field_range_eq_map AlgHom.fieldRange_eq_map
+#align alg_hom.field_range_eq_map IntermediateField.AlgHom.fieldRange_eq_map
-theorem AlgHom.map_fieldRange {K L : Type _} [Field K] [Field L] [Algebra F K] [Algebra F L]
- (f : E →ₐ[F] K) (g : K →ₐ[F] L) : f.fieldRange.map g = (g.comp f).fieldRange :=
+theorem IntermediateField.AlgHom.map_fieldRange {K L : Type _} [Field K] [Field L] [Algebra F K]
+ [Algebra F L] (f : E →ₐ[F] K) (g : K →ₐ[F] L) : f.fieldRange.map g = (g.comp f).fieldRange :=
SetLike.ext' (Set.range_comp g f).symm
-#align alg_hom.map_field_range AlgHom.map_fieldRange
+#align alg_hom.map_field_range IntermediateField.AlgHom.map_fieldRange
-theorem AlgHom.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K] {f : E →ₐ[F] K} :
- f.fieldRange = ⊤ ↔ Function.Surjective f :=
+theorem IntermediateField.AlgHom.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K]
+ {f : E →ₐ[F] K} : f.fieldRange = ⊤ ↔ Function.Surjective f :=
SetLike.ext'_iff.trans Set.range_iff_surjective
-#align alg_hom.field_range_eq_top AlgHom.fieldRange_eq_top
+#align alg_hom.field_range_eq_top IntermediateField.AlgHom.fieldRange_eq_top
@[simp]
-theorem AlgEquiv.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K] (f : E ≃ₐ[F] K) :
- (f : E →ₐ[F] K).fieldRange = ⊤ :=
- AlgHom.fieldRange_eq_top.mpr f.Surjective
-#align alg_equiv.field_range_eq_top AlgEquiv.fieldRange_eq_top
+theorem IntermediateField.AlgEquiv.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K]
+ (f : E ≃ₐ[F] K) : (f : E →ₐ[F] K).fieldRange = ⊤ :=
+ IntermediateField.AlgHom.fieldRange_eq_top.mpr f.Surjective
+#align alg_equiv.field_range_eq_top IntermediateField.AlgEquiv.fieldRange_eq_top
end Lattice
@@ -357,6 +359,7 @@ theorem adjoin_subset_adjoin_iff {F' : Type _} [Field F'] [Algebra F' E] {S S' :
fun ⟨hF, hS⟩ => Subfield.closure_le.mpr (Set.union_subset hF hS)⟩
#align intermediate_field.adjoin_subset_adjoin_iff IntermediateField.adjoin_subset_adjoin_iff
+#print IntermediateField.adjoin_adjoin_left /-
/-- `F[S][T] = F[S ∪ T]` -/
theorem adjoin_adjoin_left (T : Set E) :
(adjoin (adjoin F S) T).restrictScalars _ = adjoin F (S ∪ T) :=
@@ -369,7 +372,9 @@ theorem adjoin_adjoin_left (T : Set E) :
· exact subset_adjoin_of_subset_left _ (adjoin.range_algebra_map_subset _ _)
· exact Set.union_subset (subset_adjoin_of_subset_left _ (subset_adjoin _ _)) (subset_adjoin _ _)
#align intermediate_field.adjoin_adjoin_left IntermediateField.adjoin_adjoin_left
+-/
+#print IntermediateField.adjoin_insert_adjoin /-
@[simp]
theorem adjoin_insert_adjoin (x : E) :
adjoin F (insert x (adjoin F S : Set E)) = adjoin F (insert x S) :=
@@ -380,12 +385,15 @@ theorem adjoin_insert_adjoin (x : E) :
adjoin_le_iff.mpr (subset_adjoin_of_subset_right _ _ (Set.subset_insert _ _))⟩))
(adjoin.mono _ _ _ (Set.insert_subset_insert (subset_adjoin _ _)))
#align intermediate_field.adjoin_insert_adjoin IntermediateField.adjoin_insert_adjoin
+-/
+#print IntermediateField.adjoin_adjoin_comm /-
/-- `F[S][T] = F[T][S]` -/
theorem adjoin_adjoin_comm (T : Set E) :
(adjoin (adjoin F S) T).restrictScalars F = (adjoin (adjoin F T) S).restrictScalars F := by
rw [adjoin_adjoin_left, adjoin_adjoin_left, Set.union_comm]
#align intermediate_field.adjoin_adjoin_comm IntermediateField.adjoin_adjoin_comm
+-/
theorem adjoin_map {E' : Type _} [Field E'] [Algebra F E'] (f : E →ₐ[F] E') :
(adjoin F S).map f = adjoin F (f '' S) := by
@@ -437,6 +445,7 @@ theorem adjoin_induction {s : Set E} {p : E → Prop} {x} (h : x ∈ adjoin F s)
((algebraMap F E).map_one ▸ Hmap 1) Hadd Hneg Hinv Hmul
#align intermediate_field.adjoin_induction IntermediateField.adjoin_induction
+#print IntermediateField.Insert /-
--this definition of notation is courtesy of Kyle Miller on zulip
/-- Variation on `set.insert` to enable good notation for adjoining elements to fields.
Used to preferentially use `singleton` rather than `insert` when adjoining one element.
@@ -444,14 +453,19 @@ Used to preferentially use `singleton` rather than `insert` when adjoining one e
class Insert {α : Type _} (s : Set α) where
insert : α → Set α
#align intermediate_field.insert IntermediateField.Insert
+-/
+#print IntermediateField.insertEmpty /-
instance (priority := 1000) insertEmpty {α : Type _} : Insert (∅ : Set α)
where insert x := @singleton _ _ Set.hasSingleton x
#align intermediate_field.insert_empty IntermediateField.insertEmpty
+-/
+#print IntermediateField.insertNonempty /-
instance (priority := 900) insertNonempty {α : Type _} (s : Set α) : Insert s
where insert x := Insert.insert x s
#align intermediate_field.insert_nonempty IntermediateField.insertNonempty
+-/
-- mathport name: «expr ⟮ ,⟯»
notation3:max K"⟮"(l ", "* => foldr (h t => Insert.insert t h) ∅)"⟯" => adjoin K l
@@ -489,20 +503,25 @@ theorem AdjoinSimple.isIntegral_gen : IsIntegral F (AdjoinSimple.gen F α) ↔ I
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_simple_adjoin_simple /-
theorem adjoin_simple_adjoin_simple (β : E) : F⟮⟯⟮⟯.restrictScalars F = F⟮⟯ :=
adjoin_adjoin_left _ _ _
#align intermediate_field.adjoin_simple_adjoin_simple IntermediateField.adjoin_simple_adjoin_simple
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_simple_comm /-
theorem adjoin_simple_comm (β : E) : F⟮⟯⟮⟯.restrictScalars F = F⟮⟯⟮⟯.restrictScalars F :=
adjoin_adjoin_comm _ _ _
#align intermediate_field.adjoin_simple_comm IntermediateField.adjoin_simple_comm
+-/
variable {F} {α}
+#print IntermediateField.adjoin_algebraic_toSubalgebra /-
theorem adjoin_algebraic_toSubalgebra {S : Set E} (hS : ∀ x ∈ S, IsAlgebraic F x) :
(IntermediateField.adjoin F S).toSubalgebra = Algebra.adjoin F S :=
by
@@ -512,6 +531,7 @@ theorem adjoin_algebraic_toSubalgebra {S : Set E} (hS : ∀ x ∈ S, IsAlgebraic
have := isField_of_isIntegral_of_isField' this (Field.toIsField F)
rw [← ((Algebra.adjoin F S).toIntermediateField' this).eq_adjoin_of_eq_algebra_adjoin F S] <;> rfl
#align intermediate_field.adjoin_algebraic_to_subalgebra IntermediateField.adjoin_algebraic_toSubalgebra
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
theorem adjoin_simple_toSubalgebra_of_integral (hα : IsIntegral F α) :
@@ -677,28 +697,36 @@ theorem adjoin_simple_eq_bot_iff : F⟮⟯ = ⊥ ↔ α ∈ (⊥ : IntermediateF
#align intermediate_field.adjoin_simple_eq_bot_iff IntermediateField.adjoin_simple_eq_bot_iff
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_zero /-
@[simp]
theorem adjoin_zero : F⟮⟯ = ⊥ :=
adjoin_simple_eq_bot_iff.mpr (zero_mem ⊥)
#align intermediate_field.adjoin_zero IntermediateField.adjoin_zero
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_one /-
@[simp]
theorem adjoin_one : F⟮⟯ = ⊥ :=
adjoin_simple_eq_bot_iff.mpr (one_mem ⊥)
#align intermediate_field.adjoin_one IntermediateField.adjoin_one
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_int /-
@[simp]
theorem adjoin_int (n : ℤ) : F⟮⟯ = ⊥ :=
adjoin_simple_eq_bot_iff.mpr (coe_int_mem ⊥ n)
#align intermediate_field.adjoin_int IntermediateField.adjoin_int
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.adjoin_nat /-
@[simp]
theorem adjoin_nat (n : ℕ) : F⟮⟯ = ⊥ :=
adjoin_simple_eq_bot_iff.mpr (coe_nat_mem ⊥ n)
#align intermediate_field.adjoin_nat IntermediateField.adjoin_nat
+-/
section AdjoinRank
@@ -889,15 +917,15 @@ theorem adjoin.finrank {x : L} (hx : IsIntegral K x) :
#align intermediate_field.adjoin.finrank IntermediateField.adjoin.finrank
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
-theorem minpoly.natDegree_le {x : L} [FiniteDimensional K L] (hx : IsIntegral K x) :
- (minpoly K x).natDegree ≤ finrank K L :=
+theorem IntermediateField.minpoly.natDegree_le {x : L} [FiniteDimensional K L]
+ (hx : IsIntegral K x) : (minpoly K x).natDegree ≤ finrank K L :=
le_of_eq_of_le (IntermediateField.adjoin.finrank hx).symm K⟮⟯.toSubmodule.finrank_le
-#align minpoly.nat_degree_le minpoly.natDegree_le
+#align minpoly.nat_degree_le IntermediateField.minpoly.natDegree_le
-theorem minpoly.degree_le {x : L} [FiniteDimensional K L] (hx : IsIntegral K x) :
+theorem IntermediateField.minpoly.degree_le {x : L} [FiniteDimensional K L] (hx : IsIntegral K x) :
(minpoly K x).degree ≤ finrank K L :=
- degree_le_of_natDegree_le (minpoly.natDegree_le hx)
-#align minpoly.degree_le minpoly.degree_le
+ degree_le_of_natDegree_le (IntermediateField.minpoly.natDegree_le hx)
+#align minpoly.degree_le IntermediateField.minpoly.degree_le
end PowerBasis
@@ -931,15 +959,19 @@ section Induction
variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E]
+#print IntermediateField.FG /-
/-- An intermediate field `S` is finitely generated if there exists `t : finset E` such that
`intermediate_field.adjoin F t = S`. -/
-def Fg (S : IntermediateField F E) : Prop :=
+def FG (S : IntermediateField F E) : Prop :=
∃ t : Finset E, adjoin F ↑t = S
-#align intermediate_field.fg IntermediateField.Fg
+#align intermediate_field.fg IntermediateField.FG
+-/
+#print IntermediateField.fg_adjoin_finset /-
theorem fg_adjoin_finset (t : Finset E) : (adjoin F (↑t : Set E)).FG :=
⟨t, rfl⟩
#align intermediate_field.fg_adjoin_finset IntermediateField.fg_adjoin_finset
+-/
theorem fg_def {S : IntermediateField F E} : S.FG ↔ ∃ t : Set E, Set.Finite t ∧ adjoin F t = S :=
Iff.symm Set.exists_finite_iff_finset
@@ -993,10 +1025,12 @@ section AlgHomMkAdjoinSplits
variable (F E K : Type _) [Field F] [Field E] [Field K] [Algebra F E] [Algebra F K] {S : Set E}
+#print IntermediateField.Lifts /-
/-- Lifts `L → K` of `F → K` -/
def Lifts :=
Σ L : IntermediateField F E, L →ₐ[F] K
#align intermediate_field.lifts IntermediateField.Lifts
+-/
variable {F E K}
@@ -1115,6 +1149,7 @@ theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print IntermediateField.Lifts.liftOfSplits /-
/-- Extend a lift `x : lifts F E K` to an element `s : E` whose conjugates are all in `K` -/
noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
(h2 : (minpoly F s).Splits (algebraMap F K)) : Lifts F E K :=
@@ -1133,6 +1168,7 @@ noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral
simp_rw [mem_roots (map_ne_zero (minpoly.ne_zero h3)), is_root, ← eval₂_eq_eval_map]
exact map_root_of_splits x.2.toRingHom key (ne_of_gt (minpoly.degree_pos h3))⟩⟩⟩
#align intermediate_field.lifts.lift_of_splits IntermediateField.Lifts.liftOfSplits
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3209ddf94136d36e5e5c624b10b2a347cc9d090
@@ -4,13 +4,13 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
! This file was ported from Lean 3 source module field_theory.adjoin
-! leanprover-community/mathlib commit d4437c68c8d350fc9d4e95e1e174409db35e30d7
+! leanprover-community/mathlib commit df76f43357840485b9d04ed5dee5ab115d420e87
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.FieldTheory.IntermediateField
import Mathbin.FieldTheory.Separable
-import Mathbin.FieldTheory.SplittingField
+import Mathbin.FieldTheory.SplittingField.IsSplittingField
import Mathbin.RingTheory.TensorProduct
/-!
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -454,7 +454,7 @@ instance (priority := 900) insertNonempty {α : Type _} (s : Set α) : Insert s
#align intermediate_field.insert_nonempty IntermediateField.insertNonempty
-- mathport name: «expr ⟮ ,⟯»
-notation3:max K"⟮"(l", "* => foldr (h t => Insert.insert t h) ∅)"⟯" => adjoin K l
+notation3:max K"⟮"(l ", "* => foldr (h t => Insert.insert t h) ∅)"⟯" => adjoin K l
section AdjoinSimple
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -176,7 +176,7 @@ theorem iInf_toSubfield {ι : Sort _} (S : ι → IntermediateField F E) :
def equivOfEq {S T : IntermediateField F E} (h : S = T) : S ≃ₐ[F] T := by
refine'
{ toFun := fun x => ⟨x, _⟩
- invFun := fun x => ⟨x, _⟩.. } <;>
+ invFun := fun x => ⟨x, _⟩ .. } <;>
tidy
#align intermediate_field.equiv_of_eq IntermediateField.equivOfEq
@@ -506,7 +506,7 @@ variable {F} {α}
theorem adjoin_algebraic_toSubalgebra {S : Set E} (hS : ∀ x ∈ S, IsAlgebraic F x) :
(IntermediateField.adjoin F S).toSubalgebra = Algebra.adjoin F S :=
by
- simp only [isAlgebraic_iff_isIntegral] at hS
+ simp only [isAlgebraic_iff_isIntegral] at hS
have : Algebra.IsIntegral F (Algebra.adjoin F S) := by
rwa [← le_integralClosure_iff_isIntegral, Algebra.adjoin_le_iff]
have := isField_of_isIntegral_of_isField' this (Field.toIsField F)
@@ -546,7 +546,7 @@ theorem isSplittingField_iSup {ι : Type _} {t : ι → IntermediateField F E} {
by
let K : IntermediateField F E := ⨆ i ∈ s, t i
have hK : ∀ i ∈ s, t i ≤ K := fun i hi => le_iSup_of_le i (le_iSup (fun _ => t i) hi)
- simp only [is_splitting_field_iff] at h⊢
+ simp only [is_splitting_field_iff] at h ⊢
refine'
⟨splits_prod (algebraMap F K) fun i hi =>
Polynomial.splits_comp_of_splits (algebraMap F (t i)) (inclusion (hK i hi)).toRingHom
@@ -570,7 +570,7 @@ theorem adjoin_simple_isCompactElement (x : E) : IsCompactElement F⟮⟯ :=
by
rw [is_compact_element_iff_le_of_directed_Sup_le]
rintro s ⟨F₀, hF₀⟩ hs hx
- simp only [adjoin_simple_le_iff] at hx⊢
+ simp only [adjoin_simple_le_iff] at hx ⊢
let F : IntermediateField F E :=
{ carrier := ⋃ E ∈ s, ↑E
add_mem' :=
@@ -629,13 +629,13 @@ theorem exists_finset_of_mem_iSup {ι : Type _} {f : ι → IntermediateField F
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset ι, x ∈ ⨆ i ∈ s, f i :=
by
have := (adjoin_simple_is_compact_element x).exists_finset_of_le_iSup (IntermediateField F E) f
- simp only [adjoin_simple_le_iff] at this
+ simp only [adjoin_simple_le_iff] at this
exact this hx
#align intermediate_field.exists_finset_of_mem_supr IntermediateField.exists_finset_of_mem_iSup
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
theorem exists_finset_of_mem_supr' {ι : Type _} {f : ι → IntermediateField F E} {x : E}
- (hx : x ∈ ⨆ i, f i) : ∃ s : Finset (Σi, f i), x ∈ ⨆ i ∈ s, F⟮⟯ :=
+ (hx : x ∈ ⨆ i, f i) : ∃ s : Finset (Σ i, f i), x ∈ ⨆ i ∈ s, F⟮⟯ :=
exists_finset_of_mem_iSup
(SetLike.le_def.mp
(iSup_le fun i x h =>
@@ -645,7 +645,7 @@ theorem exists_finset_of_mem_supr' {ι : Type _} {f : ι → IntermediateField F
theorem exists_finset_of_mem_supr'' {ι : Type _} {f : ι → IntermediateField F E}
(h : ∀ i, Algebra.IsAlgebraic F (f i)) {x : E} (hx : x ∈ ⨆ i, f i) :
- ∃ s : Finset (Σi, f i), x ∈ ⨆ i ∈ s, adjoin F ((minpoly F (i.2 : _)).rootSet E) :=
+ ∃ s : Finset (Σ i, f i), x ∈ ⨆ i ∈ s, adjoin F ((minpoly F (i.2 : _)).rootSet E) :=
by
refine'
exists_finset_of_mem_supr
@@ -802,7 +802,7 @@ variable {K : Type _} [Field K] [Algebra F K]
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
theorem minpoly_gen {α : E} (h : IsIntegral F α) : minpoly F (AdjoinSimple.gen F α) = minpoly F α :=
by
- rw [← adjoin_simple.algebra_map_gen F α] at h
+ rw [← adjoin_simple.algebra_map_gen F α] at h
have inj := (algebraMap F⟮⟯ E).Injective
exact
minpoly.eq_of_algebraMap_eq inj ((isIntegral_algebraMap_iff inj).mp h)
@@ -995,7 +995,7 @@ variable (F E K : Type _) [Field F] [Field E] [Field K] [Algebra F E] [Algebra F
/-- Lifts `L → K` of `F → K` -/
def Lifts :=
- ΣL : IntermediateField F E, L →ₐ[F] K
+ Σ L : IntermediateField F E, L →ₐ[F] K
#align intermediate_field.lifts IntermediateField.Lifts
variable {F E K}
@@ -1166,14 +1166,14 @@ theorem algHom_mk_adjoin_splits
(fun s t => x.2.map_mul ⟨s, _⟩ ⟨t, _⟩) x.2.map_zero (fun s t => x.2.map_add ⟨s, _⟩ ⟨t, _⟩)
x.2.commutes⟩
rcases x.exists_lift_of_splits (hK s hs).1 (hK s hs).2 with ⟨y, h1, h2⟩
- rwa [hx y h1] at h2
+ rwa [hx y h1] at h2
#align intermediate_field.alg_hom_mk_adjoin_splits IntermediateField.algHom_mk_adjoin_splits
theorem algHom_mk_adjoin_splits' (hS : adjoin F S = ⊤)
(hK : ∀ x ∈ S, IsIntegral F (x : E) ∧ (minpoly F x).Splits (algebraMap F K)) :
Nonempty (E →ₐ[F] K) := by
cases' alg_hom_mk_adjoin_splits hK with ϕ
- rw [hS] at ϕ
+ rw [hS] at ϕ
exact ⟨ϕ.comp top_equiv.symm.to_alg_hom⟩
#align intermediate_field.alg_hom_mk_adjoin_splits' IntermediateField.algHom_mk_adjoin_splits'
@@ -1217,7 +1217,7 @@ instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensi
suffices g.range = (E1 ⊔ E2).toSubalgebra
by
have h : FiniteDimensional K g.range.to_submodule := g.to_linear_map.finite_dimensional_range
- rwa [this] at h
+ rwa [this] at h
rw [Algebra.TensorProduct.productMap_range, E1.range_val, E2.range_val, sup_to_subalgebra]
#align intermediate_field.finite_dimensional_sup IntermediateField.finiteDimensional_sup
@@ -1258,7 +1258,7 @@ theorem isAlgebraic_iSup {ι : Type _} {f : ι → IntermediateField K L}
rintro ⟨x, hx⟩
obtain ⟨s, hx⟩ := exists_finset_of_mem_supr' hx
rw [is_algebraic_iff, Subtype.coe_mk, ← Subtype.coe_mk x hx, ← is_algebraic_iff]
- haveI : ∀ i : Σi, f i, FiniteDimensional K K⟮⟯ := fun ⟨i, x⟩ =>
+ haveI : ∀ i : Σ i, f i, FiniteDimensional K K⟮⟯ := fun ⟨i, x⟩ =>
adjoin.finite_dimensional (is_integral_iff.1 (isAlgebraic_iff_isIntegral.1 (h i x)))
apply Algebra.isAlgebraic_of_finite
#align intermediate_field.is_algebraic_supr IntermediateField.isAlgebraic_iSup
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -34,7 +34,7 @@ For example, `algebra.adjoin K {x}` might not include `x⁻¹`.
open FiniteDimensional Polynomial
-open Classical Polynomial
+open scoped Classical Polynomial
namespace IntermediateField
@@ -537,7 +537,7 @@ theorem adjoin_rootSet_isSplittingField {p : F[X]} (hp : p.Splits (algebraMap F
isSplittingField_iff.mpr ⟨splits_of_splits hp fun x hx => subset_adjoin F (p.rootSet E) hx, rfl⟩
#align intermediate_field.adjoin_root_set_is_splitting_field IntermediateField.adjoin_rootSet_isSplittingField
-open BigOperators
+open scoped BigOperators
/-- A compositum of splitting fields is a splitting field -/
theorem isSplittingField_iSup {ι : Type _} {t : ι → IntermediateField F E} {p : ι → F[X]}
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -91,9 +91,7 @@ theorem mem_bot {x : E} : x ∈ (⊥ : IntermediateField F E) ↔ x ∈ Set.rang
#align intermediate_field.mem_bot IntermediateField.mem_bot
@[simp]
-theorem bot_toSubalgebra : (⊥ : IntermediateField F E).toSubalgebra = ⊥ :=
- by
- ext
+theorem bot_toSubalgebra : (⊥ : IntermediateField F E).toSubalgebra = ⊥ := by ext;
rw [mem_to_subalgebra, Algebra.mem_bot, mem_bot]
#align intermediate_field.bot_to_subalgebra IntermediateField.bot_toSubalgebra
@@ -189,10 +187,8 @@ theorem equivOfEq_symm {S T : IntermediateField F E} (h : S = T) :
#align intermediate_field.equiv_of_eq_symm IntermediateField.equivOfEq_symm
@[simp]
-theorem equivOfEq_rfl (S : IntermediateField F E) : equivOfEq (rfl : S = S) = AlgEquiv.refl :=
- by
- ext
- rfl
+theorem equivOfEq_rfl (S : IntermediateField F E) : equivOfEq (rfl : S = S) = AlgEquiv.refl := by
+ ext; rfl
#align intermediate_field.equiv_of_eq_rfl IntermediateField.equivOfEq_rfl
@[simp]
@@ -254,10 +250,7 @@ theorem topEquiv_symm_apply_coe (a : E) : ↑(topEquiv.symm a : (⊤ : Intermedi
@[simp]
theorem restrictScalars_bot_eq_self (K : IntermediateField F E) :
- (⊥ : IntermediateField K E).restrictScalars _ = K :=
- by
- ext
- rw [mem_restrict_scalars, mem_bot]
+ (⊥ : IntermediateField K E).restrictScalars _ = K := by ext; rw [mem_restrict_scalars, mem_bot];
exact set.ext_iff.mp Subtype.range_coe x
#align intermediate_field.restrict_scalars_bot_eq_self IntermediateField.restrictScalars_bot_eq_self
@@ -371,8 +364,7 @@ theorem adjoin_adjoin_left (T : Set E) :
rw [SetLike.ext'_iff]
change ↑(adjoin (adjoin F S) T) = _
apply Set.eq_of_subset_of_subset <;> rw [adjoin_subset_adjoin_iff] <;> constructor
- · rintro _ ⟨⟨x, hx⟩, rfl⟩
- exact adjoin.mono _ _ _ (Set.subset_union_left _ _) hx
+ · rintro _ ⟨⟨x, hx⟩, rfl⟩; exact adjoin.mono _ _ _ (Set.subset_union_left _ _) hx
· exact subset_adjoin_of_subset_right _ _ (Set.subset_union_right _ _)
· exact subset_adjoin_of_subset_left _ (adjoin.range_algebra_map_subset _ _)
· exact Set.union_subset (subset_adjoin_of_subset_left _ (subset_adjoin _ _)) (subset_adjoin _ _)
@@ -674,18 +666,14 @@ section AdjoinIntermediateFieldLattice
variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E] {α : E} {S : Set E}
@[simp]
-theorem adjoin_eq_bot_iff : adjoin F S = ⊥ ↔ S ⊆ (⊥ : IntermediateField F E) :=
- by
- rw [eq_bot_iff, adjoin_le_iff]
- rfl
+theorem adjoin_eq_bot_iff : adjoin F S = ⊥ ↔ S ⊆ (⊥ : IntermediateField F E) := by
+ rw [eq_bot_iff, adjoin_le_iff]; rfl
#align intermediate_field.adjoin_eq_bot_iff IntermediateField.adjoin_eq_bot_iff
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
@[simp]
-theorem adjoin_simple_eq_bot_iff : F⟮⟯ = ⊥ ↔ α ∈ (⊥ : IntermediateField F E) :=
- by
- rw [adjoin_eq_bot_iff]
- exact Set.singleton_subset_iff
+theorem adjoin_simple_eq_bot_iff : F⟮⟯ = ⊥ ↔ α ∈ (⊥ : IntermediateField F E) := by
+ rw [adjoin_eq_bot_iff]; exact Set.singleton_subset_iff
#align intermediate_field.adjoin_simple_eq_bot_iff IntermediateField.adjoin_simple_eq_bot_iff
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
@@ -744,9 +732,7 @@ theorem rank_adjoin_eq_one_iff : Module.rank F (adjoin F S) = 1 ↔ S ⊆ (⊥ :
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
theorem rank_adjoin_simple_eq_one_iff : Module.rank F F⟮⟯ = 1 ↔ α ∈ (⊥ : IntermediateField F E) :=
- by
- rw [rank_adjoin_eq_one_iff]
- exact Set.singleton_subset_iff
+ by rw [rank_adjoin_eq_one_iff]; exact Set.singleton_subset_iff
#align intermediate_field.rank_adjoin_simple_eq_one_iff IntermediateField.rank_adjoin_simple_eq_one_iff
theorem finrank_adjoin_eq_one_iff : finrank F (adjoin F S) = 1 ↔ S ⊆ (⊥ : IntermediateField F E) :=
@@ -754,10 +740,8 @@ theorem finrank_adjoin_eq_one_iff : finrank F (adjoin F S) = 1 ↔ S ⊆ (⊥ :
#align intermediate_field.finrank_adjoin_eq_one_iff IntermediateField.finrank_adjoin_eq_one_iff
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
-theorem finrank_adjoin_simple_eq_one_iff : finrank F F⟮⟯ = 1 ↔ α ∈ (⊥ : IntermediateField F E) :=
- by
- rw [finrank_adjoin_eq_one_iff]
- exact Set.singleton_subset_iff
+theorem finrank_adjoin_simple_eq_one_iff : finrank F F⟮⟯ = 1 ↔ α ∈ (⊥ : IntermediateField F E) := by
+ rw [finrank_adjoin_eq_one_iff]; exact Set.singleton_subset_iff
#align intermediate_field.finrank_adjoin_simple_eq_one_iff IntermediateField.finrank_adjoin_simple_eq_one_iff
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
@@ -854,13 +838,9 @@ noncomputable def adjoinRootEquivAdjoin (h : IsIntegral F α) : AdjoinRoot (minp
(Set.union_subset
(fun x hx =>
Exists.cases_on hx fun y hy =>
- ⟨y, by
- rw [RingHom.comp_apply, AdjoinRoot.lift_of]
- exact hy⟩)
+ ⟨y, by rw [RingHom.comp_apply, AdjoinRoot.lift_of]; exact hy⟩)
(set.singleton_subset_iff.mpr
- ⟨AdjoinRoot.root (minpoly F α),
- by
- rw [RingHom.comp_apply, AdjoinRoot.lift_root]
+ ⟨AdjoinRoot.root (minpoly F α), by rw [RingHom.comp_apply, AdjoinRoot.lift_root];
rfl⟩)))
#align intermediate_field.adjoin_root_equiv_adjoin IntermediateField.adjoinRootEquivAdjoin
@@ -1076,12 +1056,8 @@ def Lifts.upperBoundIntermediateField {c : Set (Lifts F E K)} (hc : IsChain (·
carrier s := ∃ x : Lifts F E K, x ∈ Insert.insert ⊥ c ∧ (s ∈ x.1 : Prop)
zero_mem' := ⟨⊥, Set.mem_insert ⊥ c, zero_mem ⊥⟩
one_mem' := ⟨⊥, Set.mem_insert ⊥ c, one_mem ⊥⟩
- neg_mem' := by
- rintro _ ⟨x, y, h⟩
- exact ⟨x, ⟨y, x.1.neg_mem h⟩⟩
- inv_mem' := by
- rintro _ ⟨x, y, h⟩
- exact ⟨x, ⟨y, x.1.inv_mem h⟩⟩
+ neg_mem' := by rintro _ ⟨x, y, h⟩; exact ⟨x, ⟨y, x.1.neg_mem h⟩⟩
+ inv_mem' := by rintro _ ⟨x, y, h⟩; exact ⟨x, ⟨y, x.1.inv_mem h⟩⟩
add_mem' := by
rintro _ _ ⟨x, hx, ha⟩ ⟨y, hy, hb⟩
obtain ⟨z, hz, hxz, hyz⟩ := lifts.exists_max_two hc hx hy
@@ -1145,10 +1121,7 @@ noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral
let h3 : IsIntegral x.1 s := isIntegral_of_isScalarTower h1
let key : (minpoly x.1 s).Splits x.2.toRingHom :=
splits_of_splits_of_dvd _ (map_ne_zero (minpoly.ne_zero h1))
- ((splits_map_iff _ _).mpr
- (by
- convert h2
- exact RingHom.ext fun y => x.2.commutes y))
+ ((splits_map_iff _ _).mpr (by convert h2; exact RingHom.ext fun y => x.2.commutes y))
(minpoly.dvd_map_of_isScalarTower _ _ _)
⟨x.1⟮⟯.restrictScalars F,
(@algHomEquivSigma F x.1 (x.1⟮⟯.restrictScalars F) K _ _ _ _ _ _ _
mathlib commit https://github.com/leanprover-community/mathlib/commit/75e7fca56381d056096ce5d05e938f63a6567828
@@ -517,7 +517,7 @@ theorem adjoin_algebraic_toSubalgebra {S : Set E} (hS : ∀ x ∈ S, IsAlgebraic
simp only [isAlgebraic_iff_isIntegral] at hS
have : Algebra.IsIntegral F (Algebra.adjoin F S) := by
rwa [← le_integralClosure_iff_isIntegral, Algebra.adjoin_le_iff]
- have := isField_of_isIntegral_of_is_field' this (Field.toIsField F)
+ have := isField_of_isIntegral_of_isField' this (Field.toIsField F)
rw [← ((Algebra.adjoin F S).toIntermediateField' this).eq_adjoin_of_eq_algebra_adjoin F S] <;> rfl
#align intermediate_field.adjoin_algebraic_to_subalgebra IntermediateField.adjoin_algebraic_toSubalgebra
@@ -1232,7 +1232,7 @@ theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K
· obtain ⟨y, h⟩ := this.mul_inv_cancel hx'
exact (congr_arg (· ∈ S1 ⊔ S2) <| eq_inv_of_mul_eq_one_right <| subtype.ext_iff.mp h).mp y.2
exact
- isField_of_isIntegral_of_is_field'
+ isField_of_isIntegral_of_isField'
(is_integral_sup.mpr ⟨Algebra.isIntegral_of_finite K E1, Algebra.isIntegral_of_finite K E2⟩)
(Field.toIsField K)
#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -957,26 +957,26 @@ def Fg (S : IntermediateField F E) : Prop :=
∃ t : Finset E, adjoin F ↑t = S
#align intermediate_field.fg IntermediateField.Fg
-theorem fg_adjoin_finset (t : Finset E) : (adjoin F (↑t : Set E)).Fg :=
+theorem fg_adjoin_finset (t : Finset E) : (adjoin F (↑t : Set E)).FG :=
⟨t, rfl⟩
#align intermediate_field.fg_adjoin_finset IntermediateField.fg_adjoin_finset
-theorem fg_def {S : IntermediateField F E} : S.Fg ↔ ∃ t : Set E, Set.Finite t ∧ adjoin F t = S :=
+theorem fg_def {S : IntermediateField F E} : S.FG ↔ ∃ t : Set E, Set.Finite t ∧ adjoin F t = S :=
Iff.symm Set.exists_finite_iff_finset
#align intermediate_field.fg_def IntermediateField.fg_def
-theorem fg_bot : (⊥ : IntermediateField F E).Fg :=
+theorem fg_bot : (⊥ : IntermediateField F E).FG :=
⟨∅, adjoin_empty F E⟩
#align intermediate_field.fg_bot IntermediateField.fg_bot
-theorem fg_of_fg_toSubalgebra (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
cases' h with t ht
exact ⟨t, (eq_adjoin_of_eq_algebra_adjoin _ _ _ ht.symm).symm⟩
-#align intermediate_field.fg_of_fg_to_subalgebra IntermediateField.fg_of_fg_toSubalgebra
+#align intermediate_field.fg_of_fg_to_subalgebra IntermediateField.fG_of_fG_toSubalgebra
-theorem fg_of_noetherian (S : IntermediateField F E) [IsNoetherian F E] : S.Fg :=
- S.fg_of_fg_toSubalgebra S.toSubalgebra.fg_of_noetherian
+theorem fg_of_noetherian (S : IntermediateField F E) [IsNoetherian F E] : S.FG :=
+ S.fG_of_fG_toSubalgebra S.toSubalgebra.fg_of_noetherian
#align intermediate_field.fg_of_noetherian IntermediateField.fg_of_noetherian
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
@@ -993,7 +993,7 @@ theorem induction_on_adjoin_finset (S : Finset E) (P : IntermediateField F E →
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
theorem induction_on_adjoin_fg (P : IntermediateField F E → Prop) (base : P ⊥)
(ih : ∀ (K : IntermediateField F E) (x : E), P K → P (K⟮⟯.restrictScalars F))
- (K : IntermediateField F E) (hK : K.Fg) : P K :=
+ (K : IntermediateField F E) (hK : K.FG) : P K :=
by
obtain ⟨S, rfl⟩ := hK
exact induction_on_adjoin_finset S P base fun K x _ hK => ih K x hK
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -140,38 +140,38 @@ theorem inf_toSubfield (S T : IntermediateField F E) :
#align intermediate_field.inf_to_subfield IntermediateField.inf_toSubfield
@[simp, norm_cast]
-theorem coe_infₛ (S : Set (IntermediateField F E)) : (↑(infₛ S) : Set E) = infₛ (coe '' S) :=
+theorem coe_sInf (S : Set (IntermediateField F E)) : (↑(sInf S) : Set E) = sInf (coe '' S) :=
rfl
-#align intermediate_field.coe_Inf IntermediateField.coe_infₛ
+#align intermediate_field.coe_Inf IntermediateField.coe_sInf
@[simp]
-theorem infₛ_toSubalgebra (S : Set (IntermediateField F E)) :
- (infₛ S).toSubalgebra = infₛ (toSubalgebra '' S) :=
- SetLike.coe_injective <| by simp [Set.unionₛ_image]
-#align intermediate_field.Inf_to_subalgebra IntermediateField.infₛ_toSubalgebra
+theorem sInf_toSubalgebra (S : Set (IntermediateField F E)) :
+ (sInf S).toSubalgebra = sInf (toSubalgebra '' S) :=
+ SetLike.coe_injective <| by simp [Set.sUnion_image]
+#align intermediate_field.Inf_to_subalgebra IntermediateField.sInf_toSubalgebra
@[simp]
-theorem infₛ_toSubfield (S : Set (IntermediateField F E)) :
- (infₛ S).toSubfield = infₛ (toSubfield '' S) :=
- SetLike.coe_injective <| by simp [Set.unionₛ_image]
-#align intermediate_field.Inf_to_subfield IntermediateField.infₛ_toSubfield
+theorem sInf_toSubfield (S : Set (IntermediateField F E)) :
+ (sInf S).toSubfield = sInf (toSubfield '' S) :=
+ SetLike.coe_injective <| by simp [Set.sUnion_image]
+#align intermediate_field.Inf_to_subfield IntermediateField.sInf_toSubfield
@[simp, norm_cast]
-theorem coe_infᵢ {ι : Sort _} (S : ι → IntermediateField F E) : (↑(infᵢ S) : Set E) = ⋂ i, S i := by
- simp [infᵢ]
-#align intermediate_field.coe_infi IntermediateField.coe_infᵢ
+theorem coe_iInf {ι : Sort _} (S : ι → IntermediateField F E) : (↑(iInf S) : Set E) = ⋂ i, S i := by
+ simp [iInf]
+#align intermediate_field.coe_infi IntermediateField.coe_iInf
@[simp]
-theorem infᵢ_toSubalgebra {ι : Sort _} (S : ι → IntermediateField F E) :
- (infᵢ S).toSubalgebra = ⨅ i, (S i).toSubalgebra :=
- SetLike.coe_injective <| by simp [infᵢ]
-#align intermediate_field.infi_to_subalgebra IntermediateField.infᵢ_toSubalgebra
+theorem iInf_toSubalgebra {ι : Sort _} (S : ι → IntermediateField F E) :
+ (iInf S).toSubalgebra = ⨅ i, (S i).toSubalgebra :=
+ SetLike.coe_injective <| by simp [iInf]
+#align intermediate_field.infi_to_subalgebra IntermediateField.iInf_toSubalgebra
@[simp]
-theorem infᵢ_toSubfield {ι : Sort _} (S : ι → IntermediateField F E) :
- (infᵢ S).toSubfield = ⨅ i, (S i).toSubfield :=
- SetLike.coe_injective <| by simp [infᵢ]
-#align intermediate_field.infi_to_subfield IntermediateField.infᵢ_toSubfield
+theorem iInf_toSubfield {ι : Sort _} (S : ι → IntermediateField F E) :
+ (iInf S).toSubfield = ⨅ i, (S i).toSubfield :=
+ SetLike.coe_injective <| by simp [iInf]
+#align intermediate_field.infi_to_subfield IntermediateField.iInf_toSubfield
/-- Construct an algebra isomorphism from an equality of intermediate fields -/
@[simps apply]
@@ -548,21 +548,21 @@ theorem adjoin_rootSet_isSplittingField {p : F[X]} (hp : p.Splits (algebraMap F
open BigOperators
/-- A compositum of splitting fields is a splitting field -/
-theorem isSplittingField_supᵢ {ι : Type _} {t : ι → IntermediateField F E} {p : ι → F[X]}
+theorem isSplittingField_iSup {ι : Type _} {t : ι → IntermediateField F E} {p : ι → F[X]}
{s : Finset ι} (h0 : (∏ i in s, p i) ≠ 0) (h : ∀ i ∈ s, (p i).IsSplittingField F (t i)) :
(∏ i in s, p i).IsSplittingField F (⨆ i ∈ s, t i : IntermediateField F E) :=
by
let K : IntermediateField F E := ⨆ i ∈ s, t i
- have hK : ∀ i ∈ s, t i ≤ K := fun i hi => le_supᵢ_of_le i (le_supᵢ (fun _ => t i) hi)
+ have hK : ∀ i ∈ s, t i ≤ K := fun i hi => le_iSup_of_le i (le_iSup (fun _ => t i) hi)
simp only [is_splitting_field_iff] at h⊢
refine'
⟨splits_prod (algebraMap F K) fun i hi =>
Polynomial.splits_comp_of_splits (algebraMap F (t i)) (inclusion (hK i hi)).toRingHom
(h i hi).1,
_⟩
- simp only [root_set_prod p s h0, ← Set.supᵢ_eq_unionᵢ, (@gc F _ E _ _).l_supᵢ₂]
- exact supᵢ_congr fun i => supᵢ_congr fun hi => (h i hi).2
-#align intermediate_field.is_splitting_field_supr IntermediateField.isSplittingField_supᵢ
+ simp only [root_set_prod p s h0, ← Set.iSup_eq_iUnion, (@gc F _ E _ _).l_iSup₂]
+ exact iSup_congr fun i => iSup_congr fun hi => (h i hi).2
+#align intermediate_field.is_splitting_field_supr IntermediateField.isSplittingField_iSup
open Set CompleteLattice
@@ -599,7 +599,7 @@ theorem adjoin_simple_isCompactElement (x : E) : IsCompactElement F⟮⟯ :=
exact mem_Union_of_mem E (mem_Union_of_mem hE (E.inv_mem hx))
algebraMap_mem' := fun x =>
mem_Union_of_mem F₀ (mem_Union_of_mem hF₀ (F₀.algebra_map_mem x)) }
- have key : Sup s ≤ F := supₛ_le fun E hE => subset_Union_of_subset E (subset_Union _ hE)
+ have key : Sup s ≤ F := sSup_le fun E hE => subset_Union_of_subset E (subset_Union _ hE)
obtain ⟨-, ⟨E, rfl⟩, -, ⟨hE, rfl⟩, hx⟩ := key hx
exact ⟨E, hE, hx⟩
#align intermediate_field.adjoin_simple_is_compact_element IntermediateField.adjoin_simple_isCompactElement
@@ -612,9 +612,9 @@ theorem adjoin_finset_isCompactElement (S : Finset E) :
have key : adjoin F ↑S = ⨆ x ∈ S, F⟮⟯ :=
le_antisymm
(adjoin_le_iff.mpr fun x hx =>
- set_like.mem_coe.mpr (adjoin_simple_le_iff.mp (le_supᵢ_of_le x (le_supᵢ_of_le hx le_rfl))))
- (supᵢ_le fun x => supᵢ_le fun hx => adjoin_simple_le_iff.mpr (subset_adjoin F S hx))
- rw [key, ← Finset.sup_eq_supᵢ]
+ set_like.mem_coe.mpr (adjoin_simple_le_iff.mp (le_iSup_of_le x (le_iSup_of_le hx le_rfl))))
+ (iSup_le fun x => iSup_le fun hx => adjoin_simple_le_iff.mpr (subset_adjoin F S hx))
+ rw [key, ← Finset.sup_eq_iSup]
exact finset_sup_compact_of_compact S fun x hx => adjoin_simple_is_compact_element x
#align intermediate_field.adjoin_finset_is_compact_element IntermediateField.adjoin_finset_isCompactElement
@@ -629,25 +629,25 @@ instance : IsCompactlyGenerated (IntermediateField F E) :=
⟨fun s =>
⟨(fun x => F⟮⟯) '' s,
⟨by rintro t ⟨x, hx, rfl⟩ <;> exact adjoin_simple_is_compact_element x,
- supₛ_image.trans
- (le_antisymm (supᵢ_le fun i => supᵢ_le fun hi => adjoin_simple_le_iff.mpr hi) fun x hx =>
- adjoin_simple_le_iff.mp (le_supᵢ_of_le x (le_supᵢ_of_le hx le_rfl)))⟩⟩⟩
+ sSup_image.trans
+ (le_antisymm (iSup_le fun i => iSup_le fun hi => adjoin_simple_le_iff.mpr hi) fun x hx =>
+ adjoin_simple_le_iff.mp (le_iSup_of_le x (le_iSup_of_le hx le_rfl)))⟩⟩⟩
-theorem exists_finset_of_mem_supᵢ {ι : Type _} {f : ι → IntermediateField F E} {x : E}
+theorem exists_finset_of_mem_iSup {ι : Type _} {f : ι → IntermediateField F E} {x : E}
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset ι, x ∈ ⨆ i ∈ s, f i :=
by
- have := (adjoin_simple_is_compact_element x).exists_finset_of_le_supᵢ (IntermediateField F E) f
+ have := (adjoin_simple_is_compact_element x).exists_finset_of_le_iSup (IntermediateField F E) f
simp only [adjoin_simple_le_iff] at this
exact this hx
-#align intermediate_field.exists_finset_of_mem_supr IntermediateField.exists_finset_of_mem_supᵢ
+#align intermediate_field.exists_finset_of_mem_supr IntermediateField.exists_finset_of_mem_iSup
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
theorem exists_finset_of_mem_supr' {ι : Type _} {f : ι → IntermediateField F E} {x : E}
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset (Σi, f i), x ∈ ⨆ i ∈ s, F⟮⟯ :=
- exists_finset_of_mem_supᵢ
+ exists_finset_of_mem_iSup
(SetLike.le_def.mp
- (supᵢ_le fun i x h =>
- SetLike.le_def.mp (le_supᵢ_of_le ⟨i, x, h⟩ le_rfl) (mem_adjoin_simple_self F x))
+ (iSup_le fun i x h =>
+ SetLike.le_def.mp (le_iSup_of_le ⟨i, x, h⟩ le_rfl) (mem_adjoin_simple_self F x))
hx)
#align intermediate_field.exists_finset_of_mem_supr' IntermediateField.exists_finset_of_mem_supr'
@@ -658,8 +658,8 @@ theorem exists_finset_of_mem_supr'' {ι : Type _} {f : ι → IntermediateField
refine'
exists_finset_of_mem_supr
(set_like.le_def.mp
- (supᵢ_le fun i x hx =>
- set_like.le_def.mp (le_supᵢ_of_le ⟨i, x, hx⟩ le_rfl) (subset_adjoin F _ _))
+ (iSup_le fun i x hx =>
+ set_like.le_def.mp (le_iSup_of_le ⟨i, x, hx⟩ le_rfl) (subset_adjoin F _ _))
hx)
rw [IntermediateField.minpoly_eq, Subtype.coe_mk, mem_root_set_of_ne, minpoly.aeval]
exact minpoly.ne_zero (is_integral_iff.mp (is_algebraic_iff_is_integral.mp (h i ⟨x, hx⟩)))
@@ -1248,37 +1248,37 @@ instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensi
rw [Algebra.TensorProduct.productMap_range, E1.range_val, E2.range_val, sup_to_subalgebra]
#align intermediate_field.finite_dimensional_sup IntermediateField.finiteDimensional_sup
-instance finiteDimensional_supᵢ_of_finite {ι : Type _} {t : ι → IntermediateField K L}
+instance finiteDimensional_iSup_of_finite {ι : Type _} {t : ι → IntermediateField K L}
[h : Finite ι] [∀ i, FiniteDimensional K (t i)] :
FiniteDimensional K (⨆ i, t i : IntermediateField K L) :=
by
- rw [← supᵢ_univ]
+ rw [← iSup_univ]
let P : Set ι → Prop := fun s => FiniteDimensional K (⨆ i ∈ s, t i : IntermediateField K L)
change P Set.univ
apply Set.Finite.induction_on
· exact Set.finite_univ
all_goals dsimp only [P]
- · rw [supᵢ_emptyset]
+ · rw [iSup_emptyset]
exact (bot_equiv K L).symm.toLinearEquiv.FiniteDimensional
· intro _ s _ _ hs
- rw [supᵢ_insert]
+ rw [iSup_insert]
exact IntermediateField.finiteDimensional_sup _ _
-#align intermediate_field.finite_dimensional_supr_of_finite IntermediateField.finiteDimensional_supᵢ_of_finite
+#align intermediate_field.finite_dimensional_supr_of_finite IntermediateField.finiteDimensional_iSup_of_finite
-instance finiteDimensional_supᵢ_of_finset {ι : Type _} {f : ι → IntermediateField K L}
+instance finiteDimensional_iSup_of_finset {ι : Type _} {f : ι → IntermediateField K L}
{s : Finset ι} [h : ∀ i ∈ s, FiniteDimensional K (f i)] :
FiniteDimensional K (⨆ i ∈ s, f i : IntermediateField K L) :=
by
haveI : ∀ i : { i // i ∈ s }, FiniteDimensional K (f i) := fun i => h i i.2
have : (⨆ i ∈ s, f i) = ⨆ i : { i // i ∈ s }, f i :=
- le_antisymm (supᵢ_le fun i => supᵢ_le fun h => le_supᵢ (fun i : { i // i ∈ s } => f i) ⟨i, h⟩)
- (supᵢ_le fun i => le_supᵢ_of_le i (le_supᵢ_of_le i.2 le_rfl))
- exact this.symm ▸ IntermediateField.finiteDimensional_supᵢ_of_finite
-#align intermediate_field.finite_dimensional_supr_of_finset IntermediateField.finiteDimensional_supᵢ_of_finset
+ le_antisymm (iSup_le fun i => iSup_le fun h => le_iSup (fun i : { i // i ∈ s } => f i) ⟨i, h⟩)
+ (iSup_le fun i => le_iSup_of_le i (le_iSup_of_le i.2 le_rfl))
+ exact this.symm ▸ IntermediateField.finiteDimensional_iSup_of_finite
+#align intermediate_field.finite_dimensional_supr_of_finset IntermediateField.finiteDimensional_iSup_of_finset
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/-- A compositum of algebraic extensions is algebraic -/
-theorem isAlgebraic_supᵢ {ι : Type _} {f : ι → IntermediateField K L}
+theorem isAlgebraic_iSup {ι : Type _} {f : ι → IntermediateField K L}
(h : ∀ i, Algebra.IsAlgebraic K (f i)) :
Algebra.IsAlgebraic K (⨆ i, f i : IntermediateField K L) :=
by
@@ -1288,7 +1288,7 @@ theorem isAlgebraic_supᵢ {ι : Type _} {f : ι → IntermediateField K L}
haveI : ∀ i : Σi, f i, FiniteDimensional K K⟮⟯ := fun ⟨i, x⟩ =>
adjoin.finite_dimensional (is_integral_iff.1 (isAlgebraic_iff_isIntegral.1 (h i x)))
apply Algebra.isAlgebraic_of_finite
-#align intermediate_field.is_algebraic_supr IntermediateField.isAlgebraic_supᵢ
+#align intermediate_field.is_algebraic_supr IntermediateField.isAlgebraic_iSup
end Supremum
mathlib commit https://github.com/leanprover-community/mathlib/commit/d4437c68c8d350fc9d4e95e1e174409db35e30d7
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
! This file was ported from Lean 3 source module field_theory.adjoin
-! leanprover-community/mathlib commit 039a089d2a4b93c761b234f3e5f5aeb752bac60f
+! leanprover-community/mathlib commit d4437c68c8d350fc9d4e95e1e174409db35e30d7
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -277,6 +277,17 @@ theorem AlgHom.map_fieldRange {K L : Type _} [Field K] [Field L] [Algebra F K] [
SetLike.ext' (Set.range_comp g f).symm
#align alg_hom.map_field_range AlgHom.map_fieldRange
+theorem AlgHom.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K] {f : E →ₐ[F] K} :
+ f.fieldRange = ⊤ ↔ Function.Surjective f :=
+ SetLike.ext'_iff.trans Set.range_iff_surjective
+#align alg_hom.field_range_eq_top AlgHom.fieldRange_eq_top
+
+@[simp]
+theorem AlgEquiv.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K] (f : E ≃ₐ[F] K) :
+ (f : E →ₐ[F] K).fieldRange = ⊤ :=
+ AlgHom.fieldRange_eq_top.mpr f.Surjective
+#align alg_equiv.field_range_eq_top AlgEquiv.fieldRange_eq_top
+
end Lattice
section AdjoinDef
mathlib commit https://github.com/leanprover-community/mathlib/commit/06a655b5fcfbda03502f9158bbf6c0f1400886f9
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
! This file was ported from Lean 3 source module field_theory.adjoin
-! leanprover-community/mathlib commit 3d32bf9cef95940e3fe1ca0dd2412e0f21579f46
+! leanprover-community/mathlib commit 039a089d2a4b93c761b234f3e5f5aeb752bac60f
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -23,7 +23,7 @@ For example, `algebra.adjoin K {x}` might not include `x⁻¹`.
## Main results
- `adjoin_adjoin_left`: adjoining S and then T is the same as adjoining `S ∪ T`.
-- `bot_eq_top_of_dim_adjoin_eq_one`: if `F⟮x⟯` has dimension `1` over `F` for every `x`
+- `bot_eq_top_of_rank_adjoin_eq_one`: if `F⟮x⟯` has dimension `1` over `F` for every `x`
in `E` then `F = E`
## Notation
@@ -701,16 +701,17 @@ theorem adjoin_nat (n : ℕ) : F⟮⟯ = ⊥ :=
adjoin_simple_eq_bot_iff.mpr (coe_nat_mem ⊥ n)
#align intermediate_field.adjoin_nat IntermediateField.adjoin_nat
-section AdjoinDim
+section AdjoinRank
open FiniteDimensional Module
variable {K L : IntermediateField F E}
@[simp]
-theorem dim_eq_one_iff : Module.rank F K = 1 ↔ K = ⊥ := by
- rw [← to_subalgebra_eq_iff, ← dim_eq_dim_subalgebra, Subalgebra.dim_eq_one_iff, bot_to_subalgebra]
-#align intermediate_field.dim_eq_one_iff IntermediateField.dim_eq_one_iff
+theorem rank_eq_one_iff : Module.rank F K = 1 ↔ K = ⊥ := by
+ rw [← to_subalgebra_eq_iff, ← rank_eq_rank_subalgebra, Subalgebra.rank_eq_one_iff,
+ bot_to_subalgebra]
+#align intermediate_field.rank_eq_one_iff IntermediateField.rank_eq_one_iff
@[simp]
theorem finrank_eq_one_iff : finrank F K = 1 ↔ K = ⊥ := by
@@ -719,23 +720,23 @@ theorem finrank_eq_one_iff : finrank F K = 1 ↔ K = ⊥ := by
#align intermediate_field.finrank_eq_one_iff IntermediateField.finrank_eq_one_iff
@[simp]
-theorem dim_bot : Module.rank F (⊥ : IntermediateField F E) = 1 := by rw [dim_eq_one_iff]
-#align intermediate_field.dim_bot IntermediateField.dim_bot
+theorem rank_bot : Module.rank F (⊥ : IntermediateField F E) = 1 := by rw [rank_eq_one_iff]
+#align intermediate_field.rank_bot IntermediateField.rank_bot
@[simp]
theorem finrank_bot : finrank F (⊥ : IntermediateField F E) = 1 := by rw [finrank_eq_one_iff]
#align intermediate_field.finrank_bot IntermediateField.finrank_bot
-theorem dim_adjoin_eq_one_iff : Module.rank F (adjoin F S) = 1 ↔ S ⊆ (⊥ : IntermediateField F E) :=
- Iff.trans dim_eq_one_iff adjoin_eq_bot_iff
-#align intermediate_field.dim_adjoin_eq_one_iff IntermediateField.dim_adjoin_eq_one_iff
+theorem rank_adjoin_eq_one_iff : Module.rank F (adjoin F S) = 1 ↔ S ⊆ (⊥ : IntermediateField F E) :=
+ Iff.trans rank_eq_one_iff adjoin_eq_bot_iff
+#align intermediate_field.rank_adjoin_eq_one_iff IntermediateField.rank_adjoin_eq_one_iff
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
-theorem dim_adjoin_simple_eq_one_iff : Module.rank F F⟮⟯ = 1 ↔ α ∈ (⊥ : IntermediateField F E) :=
+theorem rank_adjoin_simple_eq_one_iff : Module.rank F F⟮⟯ = 1 ↔ α ∈ (⊥ : IntermediateField F E) :=
by
- rw [dim_adjoin_eq_one_iff]
+ rw [rank_adjoin_eq_one_iff]
exact Set.singleton_subset_iff
-#align intermediate_field.dim_adjoin_simple_eq_one_iff IntermediateField.dim_adjoin_simple_eq_one_iff
+#align intermediate_field.rank_adjoin_simple_eq_one_iff IntermediateField.rank_adjoin_simple_eq_one_iff
theorem finrank_adjoin_eq_one_iff : finrank F (adjoin F S) = 1 ↔ S ⊆ (⊥ : IntermediateField F E) :=
Iff.trans finrank_eq_one_iff adjoin_eq_bot_iff
@@ -750,12 +751,12 @@ theorem finrank_adjoin_simple_eq_one_iff : finrank F F⟮⟯ = 1 ↔ α ∈ (⊥
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/-- If `F⟮x⟯` has dimension `1` over `F` for every `x ∈ E` then `F = E`. -/
-theorem bot_eq_top_of_dim_adjoin_eq_one (h : ∀ x : E, Module.rank F F⟮⟯ = 1) :
+theorem bot_eq_top_of_rank_adjoin_eq_one (h : ∀ x : E, Module.rank F F⟮⟯ = 1) :
(⊥ : IntermediateField F E) = ⊤ := by
ext
rw [iff_true_right IntermediateField.mem_top]
- exact dim_adjoin_simple_eq_one_iff.mp (h x)
-#align intermediate_field.bot_eq_top_of_dim_adjoin_eq_one IntermediateField.bot_eq_top_of_dim_adjoin_eq_one
+ exact rank_adjoin_simple_eq_one_iff.mp (h x)
+#align intermediate_field.bot_eq_top_of_rank_adjoin_eq_one IntermediateField.bot_eq_top_of_rank_adjoin_eq_one
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
theorem bot_eq_top_of_finrank_adjoin_eq_one (h : ∀ x : E, finrank F F⟮⟯ = 1) :
@@ -766,10 +767,10 @@ theorem bot_eq_top_of_finrank_adjoin_eq_one (h : ∀ x : E, finrank F F⟮⟯ =
#align intermediate_field.bot_eq_top_of_finrank_adjoin_eq_one IntermediateField.bot_eq_top_of_finrank_adjoin_eq_one
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
-theorem subsingleton_of_dim_adjoin_eq_one (h : ∀ x : E, Module.rank F F⟮⟯ = 1) :
+theorem subsingleton_of_rank_adjoin_eq_one (h : ∀ x : E, Module.rank F F⟮⟯ = 1) :
Subsingleton (IntermediateField F E) :=
- subsingleton_of_bot_eq_top (bot_eq_top_of_dim_adjoin_eq_one h)
-#align intermediate_field.subsingleton_of_dim_adjoin_eq_one IntermediateField.subsingleton_of_dim_adjoin_eq_one
+ subsingleton_of_bot_eq_top (bot_eq_top_of_rank_adjoin_eq_one h)
+#align intermediate_field.subsingleton_of_rank_adjoin_eq_one IntermediateField.subsingleton_of_rank_adjoin_eq_one
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
theorem subsingleton_of_finrank_adjoin_eq_one (h : ∀ x : E, finrank F F⟮⟯ = 1) :
@@ -793,7 +794,7 @@ theorem subsingleton_of_finrank_adjoin_le_one [FiniteDimensional F E]
subsingleton_of_bot_eq_top (bot_eq_top_of_finrank_adjoin_le_one h)
#align intermediate_field.subsingleton_of_finrank_adjoin_le_one IntermediateField.subsingleton_of_finrank_adjoin_le_one
-end AdjoinDim
+end AdjoinRank
end AdjoinIntermediateFieldLattice
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
iSup
to Sort (#12114)
This breaks a few simp
proofs which were expecting these lemmas to apply to the data binders but not the prop binders.
@@ -1219,6 +1219,7 @@ theorem _root_.minpoly.degree_le (x : L) [FiniteDimensional K L] :
degree_le_of_natDegree_le (minpoly.natDegree_le x)
#align minpoly.degree_le minpoly.degree_le
+-- TODO: generalize to `Sort`
/-- A compositum of algebraic extensions is algebraic -/
theorem isAlgebraic_iSup {ι : Type*} {t : ι → IntermediateField K L}
(h : ∀ i, Algebra.IsAlgebraic K (t i)) :
Subalgebra.Basic
(#12267)
This PR was supposed to be simultaneous with #12090 but I got ill last week.
This is based on seeing the import Algebra.Algebra.Subalgebra.Basic → RingTheory.Ideal.Operations
on the longest pole. It feels like Ideal.Operations
should not be needed to define the notion of subalgebra, only to construct some interesting examples. So I removed the import and split off anything that wouldn't fit.
The following results and their corollaries were split off:
Subalgebra.prod
Subalgebra.iSupLift
AlgHom.ker_rangeRestrict
Subalgebra.mem_of_finset_sum_eq_one_of_pow_smul_mem
Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>
@@ -3,6 +3,7 @@ Copyright (c) 2020 Thomas Browning, Patrick Lutz. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
-/
+import Mathlib.Algebra.Algebra.Subalgebra.Directed
import Mathlib.FieldTheory.IntermediateField
import Mathlib.FieldTheory.Separable
import Mathlib.FieldTheory.SplittingField.IsSplittingField
@@ -1092,7 +1092,7 @@ noncomputable def adjoinRootEquivAdjoin (h : IsIntegral F α) :
· exact RingHom.injective f
· suffices F⟮α⟯.toSubfield ≤ RingHom.fieldRange (F⟮α⟯.toSubfield.subtype.comp f) by
intro x
- obtain ⟨y, hy⟩ := (this (Subtype.mem x))
+ obtain ⟨y, hy⟩ := this (Subtype.mem x)
exact ⟨y, Subtype.ext hy⟩
refine' Subfield.closure_le.mpr (Set.union_subset (fun x hx => _) _)
· obtain ⟨y, hy⟩ := hx
Subalgebra.finite_(bot|sup)
(#12025)
... and deprecated Subalgebra.finiteDimensional_(bot|sup)
@@ -1194,7 +1194,7 @@ theorem exists_lt_finrank_of_infinite_dimensional
(halg : Algebra.IsAlgebraic F E) (hnfd : ¬ FiniteDimensional F E) (n : ℕ) :
∃ L : IntermediateField F E, FiniteDimensional F L ∧ n < finrank F L := by
induction' n with n ih
- · exact ⟨⊥, Subalgebra.finiteDimensional_bot, finrank_pos⟩
+ · exact ⟨⊥, Subalgebra.finite_bot, finrank_pos⟩
obtain ⟨L, fin, hn⟩ := ih
obtain ⟨x, hx⟩ : ∃ x : E, x ∉ L := by
contrapose! hnfd
@@ -945,14 +945,18 @@ theorem adjoin_one : F⟮(1 : E)⟯ = ⊥ :=
#align intermediate_field.adjoin_one IntermediateField.adjoin_one
@[simp]
-theorem adjoin_int (n : ℤ) : F⟮(n : E)⟯ = ⊥ := by
- exact adjoin_simple_eq_bot_iff.mpr (coe_int_mem ⊥ n)
-#align intermediate_field.adjoin_int IntermediateField.adjoin_int
+theorem adjoin_intCast (n : ℤ) : F⟮(n : E)⟯ = ⊥ := by
+ exact adjoin_simple_eq_bot_iff.mpr (intCast_mem ⊥ n)
+#align intermediate_field.adjoin_int IntermediateField.adjoin_intCast
@[simp]
-theorem adjoin_nat (n : ℕ) : F⟮(n : E)⟯ = ⊥ :=
- adjoin_simple_eq_bot_iff.mpr (coe_nat_mem ⊥ n)
-#align intermediate_field.adjoin_nat IntermediateField.adjoin_nat
+theorem adjoin_natCast (n : ℕ) : F⟮(n : E)⟯ = ⊥ :=
+ adjoin_simple_eq_bot_iff.mpr (natCast_mem ⊥ n)
+#align intermediate_field.adjoin_nat IntermediateField.adjoin_natCast
+
+-- 2024-04-05
+@[deprecated] alias adjoin_int := adjoin_intCast
+@[deprecated] alias adjoin_nat := adjoin_natCast
section AdjoinRank
Purely automatic replacement. If this is in any way controversial; I'm happy to just close this PR.
@@ -753,7 +753,7 @@ instance finiteDimensional_iSup_of_finite [h : Finite ι] [∀ i, FiniteDimensio
instance finiteDimensional_iSup_of_finset
/- Porting note: changed `h` from `∀ i ∈ s, FiniteDimensional K (t i)` because this caused an
error. See `finiteDimensional_iSup_of_finset'` for a stronger version, that was the one
- used in mathlib3.-/
+ used in mathlib3. -/
{s : Finset ι} [∀ i, FiniteDimensional K (t i)] :
FiniteDimensional K (⨆ i ∈ s, t i : IntermediateField K L) :=
iSup_subtype'' s t ▸ IntermediateField.finiteDimensional_iSup_of_finite
@@ -761,7 +761,7 @@ instance finiteDimensional_iSup_of_finset
theorem finiteDimensional_iSup_of_finset'
/- Porting note: this was the mathlib3 version. Using `[h : ...]`, as in mathlib3, causes the
- error "invalid parametric local instance".-/
+ error "invalid parametric local instance". -/
{s : Finset ι} (h : ∀ i ∈ s, FiniteDimensional K (t i)) :
FiniteDimensional K (⨆ i ∈ s, t i : IntermediateField K L) :=
have := Subtype.forall'.mp h
Also do the same for "/-A". This is a purely aesthetic change (and exhaustive).
@@ -751,7 +751,7 @@ instance finiteDimensional_iSup_of_finite [h : Finite ι] [∀ i, FiniteDimensio
#align intermediate_field.finite_dimensional_supr_of_finite IntermediateField.finiteDimensional_iSup_of_finite
instance finiteDimensional_iSup_of_finset
- /-Porting note: changed `h` from `∀ i ∈ s, FiniteDimensional K (t i)` because this caused an
+ /- Porting note: changed `h` from `∀ i ∈ s, FiniteDimensional K (t i)` because this caused an
error. See `finiteDimensional_iSup_of_finset'` for a stronger version, that was the one
used in mathlib3.-/
{s : Finset ι} [∀ i, FiniteDimensional K (t i)] :
@@ -760,7 +760,7 @@ instance finiteDimensional_iSup_of_finset
#align intermediate_field.finite_dimensional_supr_of_finset IntermediateField.finiteDimensional_iSup_of_finset
theorem finiteDimensional_iSup_of_finset'
- /-Porting note: this was the mathlib3 version. Using `[h : ...]`, as in mathlib3, causes the
+ /- Porting note: this was the mathlib3 version. Using `[h : ...]`, as in mathlib3, causes the
error "invalid parametric local instance".-/
{s : Finset ι} (h : ∀ i ∈ s, FiniteDimensional K (t i)) :
FiniteDimensional K (⨆ i ∈ s, t i : IntermediateField K L) :=
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -788,7 +788,6 @@ end Supremum
section Tower
variable (E)
-
variable {K : Type*} [Field K] [Algebra F K] [Algebra E K] [IsScalarTower F E K]
/-- If `K / E / F` is a field extension tower, `L` is an intermediate field of `K / F`, such that
@@ -1062,7 +1061,6 @@ section AdjoinIntegralElement
universe u
variable (F : Type*) [Field F] {E : Type*} [Field E] [Algebra F E] {α : E}
-
variable {K : Type u} [Field K] [Algebra F K]
theorem minpoly_gen (α : E) :
These are the case names used by the induction
tactic after the with
.
This replaces H0
, H1
, Hmul
etc with zero
, one
, mul
.
This PR does not touch Submonoid
or Subgroup
, as to_additive
does not know how to rename the argument names.
There are ways to work around this, but I'd prefer to leave them to a later PR.
This also leaves the closure_induction₂
variants alone, as renaming the arguments is more work for less gain.
@@ -536,12 +536,13 @@ 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)
@[elab_as_elim]
-theorem adjoin_induction {s : Set E} {p : E → Prop} {x} (h : x ∈ adjoin F s) (Hs : ∀ x ∈ s, p x)
- (Hmap : ∀ x, p (algebraMap F E x)) (Hadd : ∀ x y, p x → p y → p (x + y))
- (Hneg : ∀ x, p x → p (-x)) (Hinv : ∀ x, p x → p x⁻¹) (Hmul : ∀ x y, p x → p y → p (x * y)) :
+theorem adjoin_induction {s : Set E} {p : E → Prop} {x} (h : x ∈ adjoin F s) (mem : ∀ x ∈ s, p x)
+ (algebraMap : ∀ x, p (algebraMap F E x)) (add : ∀ x y, p x → p y → p (x + y))
+ (neg : ∀ x, p x → p (-x)) (inv : ∀ x, p x → p x⁻¹) (mul : ∀ x y, p x → p y → p (x * y)) :
p x :=
- Subfield.closure_induction h (fun x hx => Or.casesOn hx (fun ⟨x, hx⟩ => hx ▸ Hmap x) (Hs x))
- ((algebraMap F E).map_one ▸ Hmap 1) Hadd Hneg Hinv Hmul
+ Subfield.closure_induction h
+ (fun x hx => Or.casesOn hx (fun ⟨x, hx⟩ => hx ▸ algebraMap x) (mem x))
+ ((_root_.algebraMap F E).map_one ▸ algebraMap 1) add neg inv mul
#align intermediate_field.adjoin_induction IntermediateField.adjoin_induction
/- Porting note (kmill): this notation is replacing the typeclass-based one I had previously
Move:
Mathlib/Algebra/Module/DirectLimitAndTensorProduct.lean
to
LinearAlgebra/TensorProduct/DirectLimit.lean
Mathlib/LinearAlgebra/TensorProduct
to Mathlib/LinearAlgebra.TensorProduct.Basic.lean
Mathlib/RingTheory/TensorProduct
to Mathlib/RingTheory/TensorProduct/Basic.lean
.This follows suggestions 1, 2, 3 of
Co-authored-by: Antoine Chambert-Loir <antoine.chambert-loir@math.univ-paris-diderot.fr>
@@ -6,7 +6,7 @@ Authors: Thomas Browning, Patrick Lutz
import Mathlib.FieldTheory.IntermediateField
import Mathlib.FieldTheory.Separable
import Mathlib.FieldTheory.SplittingField.IsSplittingField
-import Mathlib.RingTheory.TensorProduct
+import Mathlib.RingTheory.TensorProduct.Basic
#align_import field_theory.adjoin from "leanprover-community/mathlib"@"df76f43357840485b9d04ed5dee5ab115d420e87"
Prove isSemisimple_of_mem_adjoin
: if two commuting endomorphisms of a finite-dimensional vector space over a perfect field are both semisimple, then every endomorphism in the algebra generated by them (in particular their product and sum) is semisimple.
In the same file LinearAlgebra/Semisimple.lean, eq_zero_of_isNilpotent_isSemisimple
and isSemisimple_of_squarefree_aeval_eq_zero
are golfed, and IsSemisimple.minpoly_squarefree
is proved
RingTheory/SimpleModule.lean:
Define IsSemisimpleRing R
to mean that R is a semisimple R-module.
add properties of simple modules and a characterization (they are exactly the quotients of the ring by maximal left ideals).
The annihilator of a semisimple module is a radical ideal.
Any module over a semisimple ring is semisimple.
A finite product of semisimple rings is semisimple.
Any quotient of a semisimple ring is semisimple.
Add Artin--Wedderburn as a TODO (proof_wanted).
Order/Atoms.lean: add the instance from IsSimpleOrder
to ComplementedLattice
, so that IsSimpleModule → IsSemisimpleModule
is automatically inferred.
Prerequisites for showing a product of semisimple rings is semisimple:
Algebra/Module/Submodule/Map.lean: generalize orderIsoMapComap
so that it only requires RingHomSurjective
rather than RingHomInvPair
Algebra/Ring/CompTypeclasses.lean, Mathlib/Algebra/Ring/Pi.lean, Algebra/Ring/Prod.lean: add RingHomSurjective instances
RingTheory/Artinian.lean:
quotNilradicalEquivPi
: the quotient of a commutative Artinian ring R by its nilradical is isomorphic to the (finite) product of its quotients by maximal ideals (therefore a product of fields).
equivPi
: if the ring is moreover reduced, then the ring itself is a product of fields. Deduce that R is a semisimple ring and both R and R[X] are decomposition monoids. Requires RingEquiv.quotientBot
in RingTheory/Ideal/QuotientOperations.lean.
Data/Polynomial/Eval.lean: the polynomial ring over a finite product of rings is isomorphic to the product of polynomial rings over individual rings. (Used to show R[X] is a decomposition monoid.)
Other necessary results:
FieldTheory/Minpoly/Field.lean: the minimal polynomial of an element in a reduced algebra over a field is radical.
RingTheory/PowerBasis.lean: generalize PowerBasis.finiteDimensional
and rename it to .finite
.
Annihilator stuff, some of which do not end up being used:
RingTheory/Ideal/Operations.lean: define Module.annihilator
and redefine Submodule.annihilator
in terms of it; add lemmas, including one that says an arbitrary intersection of radical ideals is radical. The new lemma Ideal.isRadical_iff_pow_one_lt
depends on pow_imp_self_of_one_lt
in Mathlib/Data/Nat/Interval.lean, which is also used to golf the proof of isRadical_iff_pow_one_lt
.
Algebra/Module/Torsion.lean: add a lemma and an instance (unused)
Data/Polynomial/Module/Basic.lean: add a def (unused) and a lemma
LinearAlgebra/AnnihilatingPolynomial.lean: add lemma span_minpoly_eq_annihilator
Some results about idempotent linear maps (projections) and idempotent elements, used to show that any (left) ideal in a semisimple ring is spanned by an idempotent element (unused):
LinearAlgebra/Projection.lean: add def isIdempotentElemEquiv
LinearAlgebra/Span.lean: add two lemmas
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -1136,7 +1136,7 @@ noncomputable def adjoin.powerBasis {x : L} (hx : IsIntegral K x) : PowerBasis K
#align intermediate_field.adjoin.power_basis IntermediateField.adjoin.powerBasis
theorem adjoin.finiteDimensional {x : L} (hx : IsIntegral K x) : FiniteDimensional K K⟮x⟯ :=
- PowerBasis.finiteDimensional (adjoin.powerBasis hx)
+ (adjoin.powerBasis hx).finite
#align intermediate_field.adjoin.finite_dimensional IntermediateField.adjoin.finiteDimensional
theorem isAlgebraic_adjoin_simple {x : L} (hx : IsIntegral K x) : Algebra.IsAlgebraic K K⟮x⟯ :=
@@ -1297,7 +1297,7 @@ theorem _root_.Polynomial.irreducible_comp {f g : K[X]} (hfm : f.Monic) (hgm : g
(this.trans natDegree_comp.symm).ge).irreducible hp₁
have := Fact.mk hp₁
let Kx := AdjoinRoot p
- letI := (AdjoinRoot.powerBasis hp₁.ne_zero).finiteDimensional
+ letI := (AdjoinRoot.powerBasis hp₁.ne_zero).finite
have key₁ : f = minpoly K (aeval (root p) g) := by
refine minpoly.eq_of_irreducible_of_monic hf ?_ hfm
rw [← aeval_comp]
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -41,7 +41,7 @@ section AdjoinDef
variable (F : Type*) [Field F] {E : Type*} [Field E] [Algebra F E] (S : Set E)
---Porting note: not adding `neg_mem'` causes an error.
+-- Porting note: not adding `neg_mem'` causes an error.
/-- `adjoin F S` extends a field `F` by adjoining a set `S ⊆ E`. -/
def adjoin : IntermediateField F E :=
{ Subfield.closure (Set.range (algebraMap F E) ∪ S) with
@@ -1076,7 +1076,7 @@ theorem aeval_gen_minpoly (α : E) : aeval (AdjoinSimple.gen F α) (minpoly F α
exact (aeval_algebraMap_apply E (AdjoinSimple.gen F α) _).symm
#align intermediate_field.aeval_gen_minpoly IntermediateField.aeval_gen_minpoly
---Porting note: original proof used `Exists.cases_on`.
+-- Porting note: original proof used `Exists.cases_on`.
/-- algebra isomorphism between `AdjoinRoot` and `F⟮α⟯` -/
noncomputable def adjoinRootEquivAdjoin (h : IsIntegral F α) :
AdjoinRoot (minpoly F α) ≃ₐ[F] F⟮α⟯ :=
@@ -1343,7 +1343,7 @@ theorem fg_def {S : IntermediateField F E} : S.FG ↔ ∃ t : Set E, Set.Finite
#align intermediate_field.fg_def IntermediateField.fg_def
theorem fg_bot : (⊥ : IntermediateField F E).FG :=
- -- porting note: was `⟨∅, adjoin_empty F E⟩`
+ -- Porting note: was `⟨∅, adjoin_empty F E⟩`
⟨∅, by simp only [Finset.coe_empty, adjoin_empty]⟩
#align intermediate_field.fg_bot IntermediateField.fg_bot
@@ -740,7 +740,7 @@ instance finiteDimensional_iSup_of_finite [h : Finite ι] [∀ i, FiniteDimensio
let P : Set ι → Prop := fun s => FiniteDimensional K (⨆ i ∈ s, t i : IntermediateField K L)
change P Set.univ
apply Set.Finite.induction_on
- all_goals dsimp only
+ all_goals dsimp only [P]
· exact Set.finite_univ
· rw [iSup_emptyset]
exact (botEquiv K L).symm.toLinearEquiv.finiteDimensional
@@ -980,6 +980,12 @@ theorem rank_bot : Module.rank F (⊥ : IntermediateField F E) = 1 := by rw [ran
theorem finrank_bot : finrank F (⊥ : IntermediateField F E) = 1 := by rw [finrank_eq_one_iff]
#align intermediate_field.finrank_bot IntermediateField.finrank_bot
+@[simp] theorem rank_bot' : Module.rank (⊥ : IntermediateField F E) E = Module.rank F E := by
+ rw [← rank_mul_rank F (⊥ : IntermediateField F E) E, IntermediateField.rank_bot, one_mul]
+
+@[simp] theorem finrank_bot' : finrank (⊥ : IntermediateField F E) E = finrank F E :=
+ congr(Cardinal.toNat $(rank_bot'))
+
@[simp] protected theorem rank_top : Module.rank (⊤ : IntermediateField F E) E = 1 :=
Subalgebra.bot_eq_top_iff_rank_eq_one.mp <| top_le_iff.mp fun x _ ↦ ⟨⟨x, trivial⟩, rfl⟩
refine
s (#10762)
I replaced a few "terminal" refine/refine'
s with exact
.
The strategy was very simple-minded: essentially any refine
whose following line had smaller indentation got replaced by exact
and then I cleaned up the mess.
This PR certainly leaves some further terminal refine
s, but maybe the current change is beneficial.
@@ -946,7 +946,7 @@ theorem adjoin_one : F⟮(1 : E)⟯ = ⊥ :=
@[simp]
theorem adjoin_int (n : ℤ) : F⟮(n : E)⟯ = ⊥ := by
- refine' adjoin_simple_eq_bot_iff.mpr (coe_int_mem ⊥ n)
+ exact adjoin_simple_eq_bot_iff.mpr (coe_int_mem ⊥ n)
#align intermediate_field.adjoin_int IntermediateField.adjoin_int
@[simp]
have
, replace
and suffices
(#10640)
No changes to tactic file, it's just boring fixes throughout the library.
This follows on from #6964.
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -1163,12 +1163,12 @@ theorem adjoin_minpoly_coeff_of_exists_primitive_element
rintro ⟨n, -, rfl⟩
rw [coeff_map]
apply Subtype.mem
- have dvd_g : minpoly K' α ∣ g.toSubring K'.toSubring (subset_adjoin F _)
- · apply minpoly.dvd
+ have dvd_g : minpoly K' α ∣ g.toSubring K'.toSubring (subset_adjoin F _) := by
+ apply minpoly.dvd
erw [aeval_def, eval₂_eq_eval_map, g.map_toSubring K'.toSubring, eval_map, ← aeval_def]
exact minpoly.aeval K α
- have finrank_eq : ∀ K : IntermediateField F E, finrank K E = natDegree (minpoly K α)
- · intro K
+ have finrank_eq : ∀ K : IntermediateField F E, finrank K E = natDegree (minpoly K α) := by
+ intro K
have := adjoin.finrank (.of_finite K α)
erw [adjoin_eq_top_of_adjoin_eq_top F hprim, finrank_top K E] at this
exact this
@@ -1275,8 +1275,8 @@ theorem _root_.Polynomial.irreducible_comp {f g : K[X]} (hfm : f.Monic) (hgm : g
Irreducible (f.comp g) := by
have hf' : natDegree f ≠ 0 :=
fun e ↦ not_irreducible_C (f.coeff 0) (eq_C_of_natDegree_eq_zero e ▸ hf)
- have hg' : natDegree g ≠ 0
- · have := Fact.mk hf
+ have hg' : natDegree g ≠ 0 := by
+ have := Fact.mk hf
intro e
apply not_irreducible_C ((g.map (algebraMap _ _)).coeff 0 - AdjoinSimple.gen K (root f))
-- Needed to specialize `map_sub` to avoid a timeout #8386
@@ -1292,21 +1292,21 @@ theorem _root_.Polynomial.irreducible_comp {f g : K[X]} (hfm : f.Monic) (hgm : g
have := Fact.mk hp₁
let Kx := AdjoinRoot p
letI := (AdjoinRoot.powerBasis hp₁.ne_zero).finiteDimensional
- have key₁ : f = minpoly K (aeval (root p) g)
- · refine minpoly.eq_of_irreducible_of_monic hf ?_ hfm
+ have key₁ : f = minpoly K (aeval (root p) g) := by
+ refine minpoly.eq_of_irreducible_of_monic hf ?_ hfm
rw [← aeval_comp]
exact aeval_eq_zero_of_dvd_aeval_eq_zero hp₂ (AdjoinRoot.eval₂_root p)
- have key₁' : finrank K K⟮aeval (root p) g⟯ = natDegree f
- · rw [adjoin.finrank, ← key₁]
+ have key₁' : finrank K K⟮aeval (root p) g⟯ = natDegree f := by
+ rw [adjoin.finrank, ← key₁]
exact IsIntegral.of_finite _ _
have key₂ : g.map (algebraMap _ _) - C (AdjoinSimple.gen K (aeval (root p) g)) =
- minpoly K⟮aeval (root p) g⟯ (root p)
- · exact minpoly.eq_of_irreducible_of_monic (hg _ _ key₁.symm) (by simp [AdjoinSimple.gen])
+ minpoly K⟮aeval (root p) g⟯ (root p) :=
+ minpoly.eq_of_irreducible_of_monic (hg _ _ key₁.symm) (by simp [AdjoinSimple.gen])
(Monic.sub_of_left (hgm.map _) (degree_lt_degree (by simpa [Nat.pos_iff_ne_zero] using hg')))
- have key₂' : finrank K⟮aeval (root p) g⟯ Kx = natDegree g
- · trans natDegree (minpoly K⟮aeval (root p) g⟯ (root p))
- · have : K⟮aeval (root p) g⟯⟮root p⟯ = ⊤
- · apply restrictScalars_injective K
+ have key₂' : finrank K⟮aeval (root p) g⟯ Kx = natDegree g := by
+ trans natDegree (minpoly K⟮aeval (root p) g⟯ (root p))
+ · have : K⟮aeval (root p) g⟯⟮root p⟯ = ⊤ := by
+ apply restrictScalars_injective K
rw [restrictScalars_top, adjoin_adjoin_left, Set.union_comm, ← adjoin_adjoin_left,
adjoin_root_eq_top p, restrictScalars_adjoin]
simp
@@ -761,7 +761,7 @@ instance finiteDimensional_iSup_of_finset
theorem finiteDimensional_iSup_of_finset'
/-Porting note: this was the mathlib3 version. Using `[h : ...]`, as in mathlib3, causes the
error "invalid parametric local instance".-/
- {s : Finset ι} (h : ∀ i, i ∈ s → FiniteDimensional K (t i)) :
+ {s : Finset ι} (h : ∀ i ∈ s, FiniteDimensional K (t i)) :
FiniteDimensional K (⨆ i ∈ s, t i : IntermediateField K L) :=
have := Subtype.forall'.mp h
iSup_subtype'' s t ▸ IntermediateField.finiteDimensional_iSup_of_finite
The FunLike hierarchy is very big and gets scanned through each time we need a coercion (via the CoeFun
instance). It looks like unbundled inheritance suits Lean 4 better here. The only class that still extends FunLike
is EquivLike
, since that has a custom coe_injective'
field that is easier to implement. All other classes should take FunLike
or EquivLike
as a parameter.
Previously, morphism classes would be Type
-valued and extend FunLike
:
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
extends FunLike F A B :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))
After this PR, they should be Prop
-valued and take FunLike
as a parameter:
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
[FunLike F A B] : Prop :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))
(Note that A B
stay marked as outParam
even though they are not purely required to be so due to the FunLike
parameter already filling them in. This is required to see through type synonyms, which is important in the category theory library. Also, I think keeping them as outParam
is slightly faster.)
Similarly, MyEquivClass
should take EquivLike
as a parameter.
As a result, every mention of [MyHomClass F A B]
should become [FunLike F A B] [MyHomClass F A B]
.
While overall this gives some great speedups, there are some cases that are noticeably slower. In particular, a failing application of a lemma such as map_mul
is more expensive. This is due to suboptimal processing of arguments. For example:
variable [FunLike F M N] [Mul M] [Mul N] (f : F) (x : M) (y : M)
theorem map_mul [MulHomClass F M N] : f (x * y) = f x * f y
example [AddHomClass F A B] : f (x * y) = f x * f y := map_mul f _ _
Before this PR, applying map_mul f
gives the goals [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]
. Since M
and N
are out_param
s, [MulHomClass F ?M ?N]
is synthesized first, supplies values for ?M
and ?N
and then the Mul M
and Mul N
instances can be found.
After this PR, the goals become [FunLike F ?M ?N] [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]
. Now [FunLike F ?M ?N]
is synthesized first, supplies values for ?M
and ?N
and then the Mul M
and Mul N
instances can be found, before trying MulHomClass F M N
which fails. Since the Mul
hierarchy is very big, this can be slow to fail, especially when there is no such Mul
instance.
A long-term but harder to achieve solution would be to specify the order in which instance goals get solved. For example, we'd like to change the arguments to map_mul
to look like [FunLike F M N] [Mul M] [Mul N] [highPriority <| MulHomClass F M N]
because MulHomClass
fails or succeeds much faster than the others.
As a consequence, the simpNF
linter is much slower since by design it tries and fails to apply many map_
lemmas. The same issue occurs a few times in existing calls to simp [map_mul]
, where map_mul
is tried "too soon" and fails. Thanks to the speedup of leanprover/lean4#2478 the impact is very limited, only in files that already were close to the timeout.
simp
not firing sometimesThis affects map_smulₛₗ
and related definitions. For simp
lemmas Lean apparently uses a slightly different mechanism to find instances, so that rw
can find every argument to map_smulₛₗ
successfully but simp
can't: leanprover/lean4#3701.
Especially in the category theory library, we might sometimes have a type A
which is also accessible as a synonym (Bundled A hA).1
. Instance synthesis doesn't always work if we have f : A →* B
but x * y : (Bundled A hA).1
or vice versa. This seems to be mostly fixed by keeping A B
as outParam
s in MulHomClass F A B
. (Presumably because Lean will do a definitional check A =?= (Bundled A hA).1
instead of using the syntax in the discrimination tree.)
The timeouts can be worked around for now by specifying which map_mul
we mean, either as map_mul f
for some explicit f
, or as e.g. MonoidHomClass.map_mul
.
map_smulₛₗ
not firing as simp
lemma can be worked around by going back to the pre-FunLike situation and making LinearMap.map_smulₛₗ
a simp
lemma instead of the generic map_smulₛₗ
. Writing simp [map_smulₛₗ _]
also works.
Co-authored-by: Matthew Ballard <matt@mrb.email> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott@tqft.net> Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>
@@ -1264,6 +1264,7 @@ theorem card_algHom_adjoin_integral (h : IsIntegral F α) (h_sep : (minpoly F α
simp only [adjoin.powerBasis_dim, adjoin.powerBasis_gen, minpoly_gen, h_sep, h_splits]
#align intermediate_field.card_alg_hom_adjoin_integral IntermediateField.card_algHom_adjoin_integral
+-- Apparently `K⟮root f⟯ →+* K⟮root f⟯` is expensive to unify during instance synthesis.
open FiniteDimensional AdjoinRoot in
/-- Let `f, g` be monic polynomials over `K`. If `f` is irreducible, and `g(x) - α` is irreducible
in `K⟮α⟯` with `α` a root of `f`, then `f(g(x))` is irreducible. -/
@@ -1278,7 +1279,8 @@ theorem _root_.Polynomial.irreducible_comp {f g : K[X]} (hfm : f.Monic) (hgm : g
· have := Fact.mk hf
intro e
apply not_irreducible_C ((g.map (algebraMap _ _)).coeff 0 - AdjoinSimple.gen K (root f))
- rw [map_sub, coeff_map, ← map_C, ← eq_C_of_natDegree_eq_zero e]
+ -- Needed to specialize `map_sub` to avoid a timeout #8386
+ rw [RingHom.map_sub, coeff_map, ← map_C, ← eq_C_of_natDegree_eq_zero e]
apply hg (AdjoinRoot f)
rw [AdjoinRoot.minpoly_root hf.ne_zero, hfm, inv_one, map_one, mul_one]
have H₁ : f.comp g ≠ 0 := fun h ↦ by simpa [hf', hg', natDegree_comp] using congr_arg natDegree h
Main changes:
extendScalars_adjoin
, restrictScalars_adjoin_of_algEquiv
, sup_toSubalgebra_of_isAlgebraic
, adjoin_toSubalgebra_of_isAlgebraic
, adjoin_rank_le_of_isAlgebraic
, and golf sup_toSubalgebra
adjoin_eq_span_of_eq_span
, adjoin_eq_span_basis
, restrictScalars_adjoin
, restrictScalars_adjoin_of_algEquiv
, adjoin_rank_le
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -484,6 +484,31 @@ theorem restrictScalars_adjoin (K : IntermediateField F E) (S : Set E) :
restrictScalars F (adjoin K S) = adjoin F (K ∪ S) := by
rw [← adjoin_self _ K, adjoin_adjoin_left, adjoin_self _ K]
+variable {F} in
+theorem extendScalars_adjoin {K : IntermediateField F E} {S : Set E} (h : K ≤ adjoin F S) :
+ extendScalars h = adjoin K S := restrictScalars_injective F <| by
+ rw [extendScalars_restrictScalars, restrictScalars_adjoin]
+ exact le_antisymm (adjoin.mono F S _ <| Set.subset_union_right _ S) <| adjoin_le_iff.2 <|
+ Set.union_subset h (subset_adjoin F S)
+
+variable {F} in
+/-- If `E / L / F` and `E / L' / F` are two field extension towers, `L ≃ₐ[F] L'` is an isomorphism
+compatible with `E / L` and `E / L'`, then for any subset `S` of `E`, `L(S)` and `L'(S)` are
+equal as intermediate fields of `E / F`. -/
+theorem restrictScalars_adjoin_of_algEquiv
+ {L L' : Type*} [Field L] [Field L']
+ [Algebra F L] [Algebra L E] [Algebra F L'] [Algebra L' E]
+ [IsScalarTower F L E] [IsScalarTower F L' E] (i : L ≃ₐ[F] L')
+ (hi : algebraMap L E = (algebraMap L' E) ∘ i) (S : Set E) :
+ (adjoin L S).restrictScalars F = (adjoin L' S).restrictScalars F := by
+ apply_fun toSubfield using (fun K K' h ↦ by
+ ext x; change x ∈ K.toSubfield ↔ x ∈ K'.toSubfield; rw [h])
+ change Subfield.closure _ = Subfield.closure _
+ congr
+ ext x
+ exact ⟨fun ⟨y, h⟩ ↦ ⟨i y, by rw [← h, hi]; rfl⟩,
+ fun ⟨y, h⟩ ↦ ⟨i.symm y, by rw [← h, hi, Function.comp_apply, AlgEquiv.apply_symm_apply]⟩⟩
+
theorem algebra_adjoin_le_adjoin : Algebra.adjoin F S ≤ (adjoin F S).toSubalgebra :=
Algebra.adjoin_le (subset_adjoin _ _)
#align intermediate_field.algebra_adjoin_le_adjoin IntermediateField.algebra_adjoin_le_adjoin
@@ -648,37 +673,47 @@ theorem le_sup_toSubalgebra : E1.toSubalgebra ⊔ E2.toSubalgebra ≤ (E1 ⊔ E2
sup_le (show E1 ≤ E1 ⊔ E2 from le_sup_left) (show E2 ≤ E1 ⊔ E2 from le_sup_right)
#align intermediate_field.le_sup_to_subalgebra IntermediateField.le_sup_toSubalgebra
-theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
+theorem sup_toSubalgebra_of_isAlgebraic_right (halg : Algebra.IsAlgebraic K E2) :
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra := by
- let S1 := E1.toSubalgebra
- let S2 := E2.toSubalgebra
- refine'
- le_antisymm
- (show _ ≤ (S1 ⊔ S2).toIntermediateField _ from
- sup_le (show S1 ≤ _ from le_sup_left) (show S2 ≤ _ from le_sup_right))
- (le_sup_toSubalgebra E1 E2)
- suffices IsField (S1 ⊔ S2 : Subalgebra K L) by
- intro x hx
- by_cases hx' : (⟨x, hx⟩ : (S1 ⊔ S2 : Subalgebra K L)) = 0
- · rw [← Subtype.coe_mk x, hx', Subalgebra.coe_zero, inv_zero]
- exact (S1 ⊔ S2).zero_mem
- · obtain ⟨y, h⟩ := this.mul_inv_cancel hx'
- exact (congr_arg (· ∈ S1 ⊔ S2) <| eq_inv_of_mul_eq_one_right <| Subtype.ext_iff.mp h).mp y.2
- exact
- isField_of_isIntegral_of_isField'
- (Algebra.isIntegral_sup.mpr
- ⟨Algebra.IsIntegral.of_finite K E1, Algebra.IsIntegral.of_finite K E2⟩)
- (Field.toIsField K)
-#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra
-
-instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
+ have : (adjoin E1 (E2 : Set L)).toSubalgebra = _ := adjoin_algebraic_toSubalgebra fun x h ↦
+ IsAlgebraic.tower_top E1 (isAlgebraic_iff.1 (halg ⟨x, h⟩))
+ apply_fun Subalgebra.restrictScalars K at this
+ erw [← restrictScalars_toSubalgebra, restrictScalars_adjoin,
+ Algebra.restrictScalars_adjoin] at this
+ exact this
+
+theorem sup_toSubalgebra_of_isAlgebraic_left (halg : Algebra.IsAlgebraic K E1) :
+ (E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra := by
+ have := sup_toSubalgebra_of_isAlgebraic_right E2 E1 halg
+ rwa [sup_comm (a := E1), sup_comm (a := E1.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.IsAlgebraic K E1 ∨ Algebra.IsAlgebraic K E2) :
+ (E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
+ halg.elim (sup_toSubalgebra_of_isAlgebraic_left E1 E2)
+ (sup_toSubalgebra_of_isAlgebraic_right E1 E2)
+
+theorem sup_toSubalgebra_of_left [FiniteDimensional K E1] :
+ (E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
+ sup_toSubalgebra_of_isAlgebraic_left E1 E2 (Algebra.IsAlgebraic.of_finite K _)
+#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra_of_left
+
+@[deprecated] alias sup_toSubalgebra := sup_toSubalgebra_of_left
+
+theorem sup_toSubalgebra_of_right [FiniteDimensional K E2] :
+ (E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
+ sup_toSubalgebra_of_isAlgebraic_right E1 E2 (Algebra.IsAlgebraic.of_finite K _)
+
+instance finiteDimensional_sup [FiniteDimensional K E1] [FiniteDimensional K E2] :
FiniteDimensional K (E1 ⊔ E2 : IntermediateField K L) := by
let g := Algebra.TensorProduct.productMap E1.val E2.val
suffices g.range = (E1 ⊔ E2).toSubalgebra by
have h : FiniteDimensional K (Subalgebra.toSubmodule g.range) :=
g.toLinearMap.finiteDimensional_range
rwa [this] at h
- rw [Algebra.TensorProduct.productMap_range, E1.range_val, E2.range_val, sup_toSubalgebra]
+ rw [Algebra.TensorProduct.productMap_range, E1.range_val, E2.range_val, sup_toSubalgebra_of_left]
#align intermediate_field.finite_dimensional_sup IntermediateField.finiteDimensional_sup
variable {ι : Type*} {t : ι → IntermediateField K L}
@@ -749,6 +784,61 @@ theorem isSplittingField_iSup {p : ι → K[X]}
end Supremum
+section Tower
+
+variable (E)
+
+variable {K : Type*} [Field K] [Algebra F K] [Algebra E K] [IsScalarTower F E 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.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
+ erw [← restrictScalars_toSubalgebra, restrictScalars_adjoin_of_algEquiv i' hi,
+ Algebra.restrictScalars_adjoin_of_algEquiv i' hi, restrictScalars_adjoin,
+ Algebra.restrictScalars_adjoin]
+ exact E'.sup_toSubalgebra_of_isAlgebraic L (halg.imp i'.isAlgebraic id)
+
+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)
+
+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)
+
+/-- 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 : F]`. A corollary of
+`Subalgebra.adjoin_rank_le` since in this case `E(L) = E[L]`. -/
+theorem adjoin_rank_le_of_isAlgebraic (L : IntermediateField F K)
+ (halg : Algebra.IsAlgebraic F E ∨ Algebra.IsAlgebraic F L) :
+ Module.rank E (adjoin E (L : Set K)) ≤ Module.rank F L := by
+ have h : (adjoin E (L.toSubalgebra : Set K)).toSubalgebra =
+ Algebra.adjoin E (L.toSubalgebra : Set K) :=
+ L.adjoin_toSubalgebra_of_isAlgebraic E halg
+ have := L.toSubalgebra.adjoin_rank_le E
+ rwa [(Subalgebra.equivOfEq _ _ h).symm.toLinearEquiv.rank_eq] at this
+
+theorem adjoin_rank_le_of_isAlgebraic_left (L : IntermediateField F K)
+ (halg : Algebra.IsAlgebraic F E) :
+ Module.rank E (adjoin E (L : Set K)) ≤ Module.rank F L :=
+ adjoin_rank_le_of_isAlgebraic E L (Or.inl halg)
+
+theorem adjoin_rank_le_of_isAlgebraic_right (L : IntermediateField F K)
+ (halg : Algebra.IsAlgebraic F L) :
+ Module.rank E (adjoin E (L : Set K)) ≤ Module.rank F L :=
+ adjoin_rank_le_of_isAlgebraic E L (Or.inr halg)
+
+end Tower
+
open Set CompleteLattice
/- Porting note: this was tagged `simp`, but the LHS can be simplified now that the notation
equivMap[OfInjective]
for subalgebra and intermediate field (#9709)
... parallel to Subring.equivMapOfInjective
, Subsemiring.equivMapOfInjective
, etc. etc.
@@ -315,6 +315,24 @@ theorem _root_.AlgEquiv.fieldRange_eq_top (f : E ≃ₐ[F] K) :
end Lattice
+section equivMap
+
+variable {F : Type*} [Field F] {E : Type*} [Field E] [Algebra F E]
+ {K : Type*} [Field K] [Algebra F K] (L : IntermediateField F E) (f : E →ₐ[F] K)
+
+theorem fieldRange_comp_val : (f.comp L.val).fieldRange = L.map f := toSubalgebra_injective <| by
+ rw [toSubalgebra_map, AlgHom.fieldRange_toSubalgebra, AlgHom.range_comp, range_val]
+
+/-- An intermediate field is isomorphic to its image under an `AlgHom`
+(which is automatically injective) -/
+noncomputable def equivMap : L ≃ₐ[F] L.map f :=
+ (AlgEquiv.ofInjective _ (f.comp L.val).injective).trans (equivOfEq (fieldRange_comp_val L f))
+
+@[simp]
+theorem coe_equivMap_apply (x : L) : ↑(equivMap L f x) = f x := rfl
+
+end equivMap
+
section AdjoinDef
variable (F : Type*) [Field F] {E : Type*} [Field E] [Algebra F E] (S : Set E)
@@ -1265,213 +1265,12 @@ theorem induction_on_adjoin [FiniteDimensional F E] (P : IntermediateField F E
end Induction
-section AlgHomMkAdjoinSplits
-
-variable (F E K : Type*) [Field F] [Field E] [Field K] [Algebra F E] [Algebra F K] {S : Set E}
-
-/-- Lifts `L → K` of `F → K` -/
-structure Lifts where
- /-- The domain of a lift. -/
- carrier : IntermediateField F E
- /-- The lifted RingHom, expressed as an AlgHom. -/
- emb : carrier →ₐ[F] K
-#align intermediate_field.lifts IntermediateField.Lifts
-
-variable {F E K}
-
-instance : PartialOrder (Lifts F E K) where
- le L₁ L₂ := ∃ h : L₁.carrier ≤ L₂.carrier, ∀ x, L₂.emb (inclusion h x) = L₁.emb x
- le_refl L := ⟨le_rfl, by simp⟩
- le_trans L₁ L₂ L₃ := by
- rintro ⟨h₁₂, h₁₂'⟩ ⟨h₂₃, h₂₃'⟩
- refine ⟨h₁₂.trans h₂₃, fun _ ↦ ?_⟩
- rw [← inclusion_inclusion h₁₂ h₂₃, h₂₃', h₁₂']
- le_antisymm := by
- rintro ⟨L₁, e₁⟩ ⟨L₂, e₂⟩ ⟨h₁₂, h₁₂'⟩ ⟨h₂₁, h₂₁'⟩
- obtain rfl : L₁ = L₂ := h₁₂.antisymm h₂₁
- congr
- exact AlgHom.ext h₂₁'
-
-noncomputable instance : OrderBot (Lifts F E K) where
- bot := ⟨⊥, (Algebra.ofId F K).comp (botEquiv F E)⟩
- bot_le L := ⟨bot_le, fun x ↦ by
- obtain ⟨x, rfl⟩ := (botEquiv F E).symm.surjective x
- simp_rw [AlgHom.comp_apply, AlgHom.coe_coe, AlgEquiv.apply_symm_apply]
- exact L.emb.commutes x⟩
-
-noncomputable instance : Inhabited (Lifts F E K) :=
- ⟨⊥⟩
-
-/-- A chain of lifts has an upper bound. -/
-theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤ ·) c) :
- ∃ ub, ∀ a ∈ c, a ≤ ub := by
- let t (i : ↑(insert ⊥ c)) := i.val.carrier
- let t' (i) := (t i).toSubalgebra
- have hc := hc.insert fun _ _ _ ↦ .inl bot_le
- have dir : Directed (· ≤ ·) t := hc.directedOn.directed_val.mono_comp _ fun _ _ h ↦ h.1
- refine ⟨⟨iSup t, (Subalgebra.iSupLift t' dir (fun i ↦ i.val.emb) (fun i j h ↦ ?_) _ rfl).comp
- (Subalgebra.equivOfEq _ _ <| toSubalgebra_iSup_of_directed dir)⟩,
- fun L hL ↦ have hL := Set.mem_insert_of_mem ⊥ hL; ⟨le_iSup t ⟨L, hL⟩, fun x ↦ ?_⟩⟩
- · refine AlgHom.ext fun x ↦ (hc.total i.2 j.2).elim (fun hij ↦ (hij.snd x).symm) fun hji ↦ ?_
- erw [AlgHom.comp_apply, ← hji.snd (Subalgebra.inclusion h x),
- inclusion_inclusion, inclusion_self, AlgHom.id_apply x]
- · dsimp only [AlgHom.comp_apply]
- exact Subalgebra.iSupLift_inclusion (K := t') (i := ⟨L, hL⟩) x (le_iSup t' ⟨L, hL⟩)
-#align intermediate_field.lifts.exists_upper_bound IntermediateField.Lifts.exists_upper_bound
-
-/-- Given a lift `x` and an integral element `s : E` over `x.carrier` whose conjugates over
-`x.carrier` are all in `K`, we can extend the lift to a lift whose carrier contains `s`. -/
-theorem Lifts.exists_lift_of_splits' (x : Lifts F E K) {s : E} (h1 : IsIntegral x.carrier s)
- (h2 : (minpoly x.carrier s).Splits x.emb.toRingHom) : ∃ y, x ≤ y ∧ s ∈ y.carrier :=
- have I2 := (minpoly.degree_pos h1).ne'
- letI : Algebra x.carrier K := x.emb.toRingHom.toAlgebra
- let carrier := x.carrier⟮s⟯.restrictScalars F
- letI : Algebra x.carrier carrier := x.carrier⟮s⟯.toSubalgebra.algebra
- let φ : carrier →ₐ[x.carrier] K := ((algHomAdjoinIntegralEquiv x.carrier h1).symm
- ⟨rootOfSplits x.emb.toRingHom h2 I2, by
- rw [mem_aroots, and_iff_right (minpoly.ne_zero h1)]
- exact map_rootOfSplits x.emb.toRingHom h2 I2⟩)
- ⟨⟨carrier, (@algHomEquivSigma F x.carrier carrier K _ _ _ _ _ _ _ _
- (IsScalarTower.of_algebraMap_eq fun _ ↦ rfl)).symm ⟨x.emb, φ⟩⟩,
- ⟨fun z hz ↦ algebraMap_mem x.carrier⟮s⟯ ⟨z, hz⟩, φ.commutes⟩,
- mem_adjoin_simple_self x.carrier s⟩
-
-/-- Given an integral element `s : E` over `F` whose `F`-conjugates are all in `K`,
-any lift can be extended to one whose carrier contains `s`. -/
-theorem Lifts.exists_lift_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
- (h2 : (minpoly F s).Splits (algebraMap F K)) : ∃ y, x ≤ y ∧ s ∈ y.carrier :=
- Lifts.exists_lift_of_splits' x h1.tower_top <| h1.minpoly_splits_tower_top' <| by
- rwa [← x.emb.comp_algebraMap] at h2
-#align intermediate_field.lifts.exists_lift_of_splits IntermediateField.Lifts.exists_lift_of_splits
-
-section
-
-private theorem exists_algHom_adjoin_of_splits'' {L : IntermediateField F E}
- (f : L →ₐ[F] K) (hK : ∀ s ∈ S, IsIntegral L s ∧ (minpoly L s).Splits f.toRingHom) :
- ∃ φ : adjoin L S →ₐ[F] K, φ.comp (IsScalarTower.toAlgHom F L _) = f := by
- obtain ⟨φ, hfφ, hφ⟩ := zorn_nonempty_Ici₀ _
- (fun c _ hc _ _ ↦ Lifts.exists_upper_bound c hc) ⟨L, f⟩ le_rfl
- refine ⟨φ.emb.comp (inclusion <| (le_extendScalars_iff hfφ.1 <| adjoin L S).mp <|
- adjoin_le_iff.mpr fun s h ↦ ?_), AlgHom.ext hfφ.2⟩
- letI := (inclusion hfφ.1).toAlgebra
- letI : SMul L φ.carrier := Algebra.toSMul
- have : IsScalarTower L φ.carrier E := ⟨(smul_assoc · (· : E))⟩
- have := φ.exists_lift_of_splits' (hK s h).1.tower_top ((hK s h).1.minpoly_splits_tower_top' ?_)
- · obtain ⟨y, h1, h2⟩ := this; exact (hφ y h1).1 h2
- · convert (hK s h).2; ext; apply hfφ.2
-
-variable {L : Type*} [Field L] [Algebra F L] [Algebra L E] [IsScalarTower F L E]
- (f : L →ₐ[F] K) (hK : ∀ s ∈ S, IsIntegral L s ∧ (minpoly L s).Splits f.toRingHom)
-
-theorem exists_algHom_adjoin_of_splits' :
- ∃ φ : adjoin L S →ₐ[F] K, φ.comp (IsScalarTower.toAlgHom F L _) = f := by
- let L' := (IsScalarTower.toAlgHom F L E).fieldRange
- let f' : L' →ₐ[F] K := f.comp (AlgEquiv.ofInjectiveField _).symm.toAlgHom
- have := exists_algHom_adjoin_of_splits'' f' (S := S) fun s hs ↦ ?_
- · obtain ⟨φ, hφ⟩ := this; refine ⟨φ.comp <|
- inclusion (?_ : (adjoin L S).restrictScalars F ≤ (adjoin L' S).restrictScalars F), ?_⟩
- · simp_rw [← SetLike.coe_subset_coe, coe_restrictScalars, adjoin_subset_adjoin_iff]
- refine ⟨subset_adjoin_of_subset_left S (F := L'.toSubfield) le_rfl, subset_adjoin _ _⟩
- · ext x; exact congr($hφ _).trans (congr_arg f <| AlgEquiv.symm_apply_apply _ _)
- letI : Algebra L L' := (AlgEquiv.ofInjectiveField _).toRingEquiv.toRingHom.toAlgebra
- have : IsScalarTower L L' E := IsScalarTower.of_algebraMap_eq' rfl
- refine ⟨(hK s hs).1.tower_top, (hK s hs).1.minpoly_splits_tower_top' ?_⟩
- convert (hK s hs).2; ext; exact congr_arg f (AlgEquiv.symm_apply_apply _ _)
-
-theorem exists_algHom_of_adjoin_splits' (hS : adjoin L S = ⊤) :
- ∃ φ : E →ₐ[F] K, φ.comp (IsScalarTower.toAlgHom F L E) = f :=
- have ⟨φ, hφ⟩ := exists_algHom_adjoin_of_splits' f hK
- ⟨φ.comp (((equivOfEq hS).trans topEquiv).symm.toAlgHom.restrictScalars F), hφ⟩
-
-theorem exists_algHom_of_splits' (hK : ∀ s : E, IsIntegral L s ∧ (minpoly L s).Splits f.toRingHom) :
- ∃ φ : E →ₐ[F] K, φ.comp (IsScalarTower.toAlgHom F L E) = f :=
- exists_algHom_of_adjoin_splits' f (fun x _ ↦ hK x) (adjoin_univ L E)
-
-end
-
-variable (hK : ∀ s ∈ S, IsIntegral F s ∧ (minpoly F s).Splits (algebraMap F K))
- (hK' : ∀ s : E, IsIntegral F s ∧ (minpoly F s).Splits (algebraMap F K))
- {L : IntermediateField F E} (f : L →ₐ[F] K) (hL : L ≤ adjoin F S)
-
--- The following uses the hypothesis `hK`.
-
-theorem exists_algHom_adjoin_of_splits : ∃ φ : adjoin F S →ₐ[F] K, φ.comp (inclusion hL) = f := by
- obtain ⟨φ, hfφ, hφ⟩ := zorn_nonempty_Ici₀ _
- (fun c _ hc _ _ ↦ Lifts.exists_upper_bound c hc) ⟨L, f⟩ le_rfl
- refine ⟨φ.emb.comp (inclusion <| adjoin_le_iff.mpr fun s hs ↦ ?_), ?_⟩
- · rcases φ.exists_lift_of_splits (hK s hs).1 (hK s hs).2 with ⟨y, h1, h2⟩
- exact (hφ y h1).1 h2
- · ext; apply hfφ.2
-
-theorem nonempty_algHom_adjoin_of_splits : Nonempty (adjoin F S →ₐ[F] K) :=
- have ⟨φ, _⟩ := exists_algHom_adjoin_of_splits hK (⊥ : Lifts F E K).emb bot_le; ⟨φ⟩
-#align intermediate_field.alg_hom_mk_adjoin_splits IntermediateField.nonempty_algHom_adjoin_of_splits
-
-variable (hS : adjoin F S = ⊤)
-
-theorem exists_algHom_of_adjoin_splits : ∃ φ : E →ₐ[F] K, φ.comp L.val = f :=
- have ⟨φ, hφ⟩ := exists_algHom_adjoin_of_splits hK f (hS.symm ▸ le_top)
- ⟨φ.comp ((equivOfEq hS).trans topEquiv).symm.toAlgHom, hφ⟩
-
-theorem nonempty_algHom_of_adjoin_splits : Nonempty (E →ₐ[F] K) :=
- have ⟨φ, _⟩ := exists_algHom_of_adjoin_splits hK (⊥ : Lifts F E K).emb hS; ⟨φ⟩
-#align intermediate_field.alg_hom_mk_adjoin_splits' IntermediateField.nonempty_algHom_of_adjoin_splits
-
-variable {x : E} (hx : x ∈ adjoin F S) {y : K} (hy : aeval y (minpoly F x) = 0)
-
-theorem exists_algHom_adjoin_of_splits_of_aeval : ∃ φ : adjoin F S →ₐ[F] K, φ ⟨x, hx⟩ = y := by
- have ix := isAlgebraic_adjoin (fun s hs ↦ (hK s hs).1) ⟨x, hx⟩
- rw [isAlgebraic_iff_isIntegral, isIntegral_iff] at ix
- obtain ⟨φ, hφ⟩ := exists_algHom_adjoin_of_splits hK ((algHomAdjoinIntegralEquiv F ix).symm
- ⟨y, mem_aroots.mpr ⟨minpoly.ne_zero ix, hy⟩⟩) (adjoin_simple_le_iff.mpr hx)
- exact ⟨φ, (FunLike.congr_fun hφ <| AdjoinSimple.gen F x).trans <|
- algHomAdjoinIntegralEquiv_symm_apply_gen F ix _⟩
-
-theorem exists_algHom_of_adjoin_splits_of_aeval : ∃ φ : E →ₐ[F] K, φ x = y :=
- have ⟨φ, hφ⟩ := exists_algHom_adjoin_of_splits_of_aeval hK (hS ▸ mem_top) hy
- ⟨φ.comp ((equivOfEq hS).trans topEquiv).symm.toAlgHom, hφ⟩
-
-/- The following uses the hypothesis
- (hK' : ∀ s : E, IsIntegral F s ∧ (minpoly F s).Splits (algebraMap F K)) -/
-
-theorem exists_algHom_of_splits : ∃ φ : E →ₐ[F] K, φ.comp L.val = f :=
- exists_algHom_of_adjoin_splits (fun x _ ↦ hK' x) f (adjoin_univ F E)
-
-theorem nonempty_algHom_of_splits : Nonempty (E →ₐ[F] K) :=
- nonempty_algHom_of_adjoin_splits (fun x _ ↦ hK' x) (adjoin_univ F E)
-
-theorem exists_algHom_of_splits_of_aeval : ∃ φ : E →ₐ[F] K, φ x = y :=
- exists_algHom_of_adjoin_splits_of_aeval (fun x _ ↦ hK' x) (adjoin_univ F E) hy
-
-end AlgHomMkAdjoinSplits
-
end IntermediateField
-section Algebra.IsAlgebraic
-
-/-- Let `K/F` be an algebraic extension of fields and `L` a field in which all the minimal
-polynomial over `F` of elements of `K` splits. Then, for `x ∈ K`, the images of `x` by the
-`F`-algebra morphisms from `K` to `L` are exactly the roots in `L` of the minimal polynomial
-of `x` over `F`. -/
-theorem Algebra.IsAlgebraic.range_eval_eq_rootSet_minpoly_of_splits {F K : Type*} (L : Type*)
- [Field F] [Field K] [Field L] [Algebra F L] [Algebra F K]
- (hA : ∀ x : K, (minpoly F x).Splits (algebraMap F L))
- (hK : Algebra.IsAlgebraic F K) (x : K) :
- (Set.range fun (ψ : K →ₐ[F] L) => ψ x) = (minpoly F x).rootSet L := by
- ext a
- rw [mem_rootSet_of_ne (minpoly.ne_zero (hK.isIntegral x))]
- refine ⟨fun ⟨ψ, hψ⟩ ↦ ?_, fun ha ↦ IntermediateField.exists_algHom_of_splits_of_aeval
- (fun x ↦ ⟨hK.isIntegral x, hA x⟩) ha⟩
- rw [← hψ, Polynomial.aeval_algHom_apply ψ x, minpoly.aeval, map_zero]
-
-end Algebra.IsAlgebraic
-
-section PowerBasis
+namespace PowerBasis
variable {K L : Type*} [Field K] [Field L] [Algebra K L]
-namespace PowerBasis
-
open IntermediateField
/-- `pb.equivAdjoinSimple` is the equivalence between `K⟮pb.gen⟯` and `L` itself. -/
@@ -1505,5 +1304,3 @@ theorem equivAdjoinSimple_symm_gen (pb : PowerBasis K L) :
#align power_basis.equiv_adjoin_simple_symm_gen PowerBasis.equivAdjoinSimple_symm_gen
end PowerBasis
-
-end PowerBasis
IntermediateField.exists_algHom_of_splits
(#9392)
Extract from Lifts.exists_lift_of_splits
a version that assumes integrality and splitting of minimal polynomial over an intermediate field (either actual IntermediateField or middle of IsScalarTower) rather than the base field
Generalize exists_algHom_adjoin_of_splits
, exists_algHom_of_adjoin_splits
, exists_algHom_of_splits
to the same setting
Prove the extension lemma surjective_comp_algebraMap_of_isAlgebraic/isSeparable
to be used in the proof that an epimorphism in the category of fields is a purely inseparable extension.
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -1319,28 +1319,76 @@ theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤
exact Subalgebra.iSupLift_inclusion (K := t') (i := ⟨L, hL⟩) x (le_iSup t' ⟨L, hL⟩)
#align intermediate_field.lifts.exists_upper_bound IntermediateField.Lifts.exists_upper_bound
-/-- Given an element `s : E` whose conjugates are all in `K`, any lift can be extended to one
- whose carrier contains `s`. -/
-theorem Lifts.exists_lift_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
- (h2 : (minpoly F s).Splits (algebraMap F K)) : ∃ y, x ≤ y ∧ s ∈ y.carrier :=
- have I1 : IsIntegral x.carrier s := h1.tower_top
- have I2 := (minpoly.degree_pos I1).ne'
- have key : (minpoly x.carrier s).Splits x.emb.toRingHom :=
- splits_of_splits_of_dvd _ (map_ne_zero (minpoly.ne_zero h1))
- ((splits_map_iff _ _).2 (x.emb.comp_algebraMap ▸ h2)) (minpoly.dvd_map_of_isScalarTower _ _ _)
+/-- Given a lift `x` and an integral element `s : E` over `x.carrier` whose conjugates over
+`x.carrier` are all in `K`, we can extend the lift to a lift whose carrier contains `s`. -/
+theorem Lifts.exists_lift_of_splits' (x : Lifts F E K) {s : E} (h1 : IsIntegral x.carrier s)
+ (h2 : (minpoly x.carrier s).Splits x.emb.toRingHom) : ∃ y, x ≤ y ∧ s ∈ y.carrier :=
+ have I2 := (minpoly.degree_pos h1).ne'
letI : Algebra x.carrier K := x.emb.toRingHom.toAlgebra
let carrier := x.carrier⟮s⟯.restrictScalars F
letI : Algebra x.carrier carrier := x.carrier⟮s⟯.toSubalgebra.algebra
- let φ : carrier →ₐ[x.carrier] K := ((algHomAdjoinIntegralEquiv x.carrier I1).symm
- ⟨rootOfSplits x.emb.toRingHom key I2, by
- rw [mem_aroots, and_iff_right (minpoly.ne_zero I1)]
- exact map_rootOfSplits x.emb.toRingHom key I2⟩)
+ let φ : carrier →ₐ[x.carrier] K := ((algHomAdjoinIntegralEquiv x.carrier h1).symm
+ ⟨rootOfSplits x.emb.toRingHom h2 I2, by
+ rw [mem_aroots, and_iff_right (minpoly.ne_zero h1)]
+ exact map_rootOfSplits x.emb.toRingHom h2 I2⟩)
⟨⟨carrier, (@algHomEquivSigma F x.carrier carrier K _ _ _ _ _ _ _ _
(IsScalarTower.of_algebraMap_eq fun _ ↦ rfl)).symm ⟨x.emb, φ⟩⟩,
⟨fun z hz ↦ algebraMap_mem x.carrier⟮s⟯ ⟨z, hz⟩, φ.commutes⟩,
mem_adjoin_simple_self x.carrier s⟩
+
+/-- Given an integral element `s : E` over `F` whose `F`-conjugates are all in `K`,
+any lift can be extended to one whose carrier contains `s`. -/
+theorem Lifts.exists_lift_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
+ (h2 : (minpoly F s).Splits (algebraMap F K)) : ∃ y, x ≤ y ∧ s ∈ y.carrier :=
+ Lifts.exists_lift_of_splits' x h1.tower_top <| h1.minpoly_splits_tower_top' <| by
+ rwa [← x.emb.comp_algebraMap] at h2
#align intermediate_field.lifts.exists_lift_of_splits IntermediateField.Lifts.exists_lift_of_splits
+section
+
+private theorem exists_algHom_adjoin_of_splits'' {L : IntermediateField F E}
+ (f : L →ₐ[F] K) (hK : ∀ s ∈ S, IsIntegral L s ∧ (minpoly L s).Splits f.toRingHom) :
+ ∃ φ : adjoin L S →ₐ[F] K, φ.comp (IsScalarTower.toAlgHom F L _) = f := by
+ obtain ⟨φ, hfφ, hφ⟩ := zorn_nonempty_Ici₀ _
+ (fun c _ hc _ _ ↦ Lifts.exists_upper_bound c hc) ⟨L, f⟩ le_rfl
+ refine ⟨φ.emb.comp (inclusion <| (le_extendScalars_iff hfφ.1 <| adjoin L S).mp <|
+ adjoin_le_iff.mpr fun s h ↦ ?_), AlgHom.ext hfφ.2⟩
+ letI := (inclusion hfφ.1).toAlgebra
+ letI : SMul L φ.carrier := Algebra.toSMul
+ have : IsScalarTower L φ.carrier E := ⟨(smul_assoc · (· : E))⟩
+ have := φ.exists_lift_of_splits' (hK s h).1.tower_top ((hK s h).1.minpoly_splits_tower_top' ?_)
+ · obtain ⟨y, h1, h2⟩ := this; exact (hφ y h1).1 h2
+ · convert (hK s h).2; ext; apply hfφ.2
+
+variable {L : Type*} [Field L] [Algebra F L] [Algebra L E] [IsScalarTower F L E]
+ (f : L →ₐ[F] K) (hK : ∀ s ∈ S, IsIntegral L s ∧ (minpoly L s).Splits f.toRingHom)
+
+theorem exists_algHom_adjoin_of_splits' :
+ ∃ φ : adjoin L S →ₐ[F] K, φ.comp (IsScalarTower.toAlgHom F L _) = f := by
+ let L' := (IsScalarTower.toAlgHom F L E).fieldRange
+ let f' : L' →ₐ[F] K := f.comp (AlgEquiv.ofInjectiveField _).symm.toAlgHom
+ have := exists_algHom_adjoin_of_splits'' f' (S := S) fun s hs ↦ ?_
+ · obtain ⟨φ, hφ⟩ := this; refine ⟨φ.comp <|
+ inclusion (?_ : (adjoin L S).restrictScalars F ≤ (adjoin L' S).restrictScalars F), ?_⟩
+ · simp_rw [← SetLike.coe_subset_coe, coe_restrictScalars, adjoin_subset_adjoin_iff]
+ refine ⟨subset_adjoin_of_subset_left S (F := L'.toSubfield) le_rfl, subset_adjoin _ _⟩
+ · ext x; exact congr($hφ _).trans (congr_arg f <| AlgEquiv.symm_apply_apply _ _)
+ letI : Algebra L L' := (AlgEquiv.ofInjectiveField _).toRingEquiv.toRingHom.toAlgebra
+ have : IsScalarTower L L' E := IsScalarTower.of_algebraMap_eq' rfl
+ refine ⟨(hK s hs).1.tower_top, (hK s hs).1.minpoly_splits_tower_top' ?_⟩
+ convert (hK s hs).2; ext; exact congr_arg f (AlgEquiv.symm_apply_apply _ _)
+
+theorem exists_algHom_of_adjoin_splits' (hS : adjoin L S = ⊤) :
+ ∃ φ : E →ₐ[F] K, φ.comp (IsScalarTower.toAlgHom F L E) = f :=
+ have ⟨φ, hφ⟩ := exists_algHom_adjoin_of_splits' f hK
+ ⟨φ.comp (((equivOfEq hS).trans topEquiv).symm.toAlgHom.restrictScalars F), hφ⟩
+
+theorem exists_algHom_of_splits' (hK : ∀ s : E, IsIntegral L s ∧ (minpoly L s).Splits f.toRingHom) :
+ ∃ φ : E →ₐ[F] K, φ.comp (IsScalarTower.toAlgHom F L E) = f :=
+ exists_algHom_of_adjoin_splits' f (fun x _ ↦ hK x) (adjoin_univ L E)
+
+end
+
variable (hK : ∀ s ∈ S, IsIntegral F s ∧ (minpoly F s).Splits (algebraMap F K))
(hK' : ∀ s : E, IsIntegral F s ∧ (minpoly F s).Splits (algebraMap F K))
{L : IntermediateField F E} (f : L →ₐ[F] K) (hL : L ≤ adjoin F S)
@@ -799,6 +799,15 @@ theorem exists_finset_of_mem_supr'' {ι : Type*} {f : ι → IntermediateField F
exact minpoly.ne_zero (isIntegral_iff.mp (h i ⟨x1, hx1⟩).isIntegral)
#align intermediate_field.exists_finset_of_mem_supr'' IntermediateField.exists_finset_of_mem_supr''
+theorem exists_finset_of_mem_adjoin {S : Set E} {x : E} (hx : x ∈ adjoin F S) :
+ ∃ T : Finset E, (T : Set E) ⊆ S ∧ x ∈ adjoin F (T : Set E) := by
+ simp_rw [← biSup_adjoin_simple S, ← iSup_subtype''] at hx
+ obtain ⟨s, hx'⟩ := exists_finset_of_mem_iSup hx
+ refine ⟨s.image Subtype.val, by simp, SetLike.le_def.mp ?_ hx'⟩
+ simp_rw [Finset.coe_image, iSup_le_iff, adjoin_le_iff]
+ rintro _ h _ rfl
+ exact subset_adjoin F _ ⟨_, h, rfl⟩
+
end AdjoinSimple
end AdjoinDef
@@ -558,6 +558,9 @@ def AdjoinSimple.gen : F⟮α⟯ :=
#align intermediate_field.adjoin_simple.gen IntermediateField.AdjoinSimple.gen
@[simp]
+theorem AdjoinSimple.coe_gen : (AdjoinSimple.gen F α : E) = α :=
+ rfl
+
theorem AdjoinSimple.algebraMap_gen : algebraMap F⟮α⟯ E (AdjoinSimple.gen F α) = α :=
rfl
#align intermediate_field.adjoin_simple.algebra_map_gen IntermediateField.AdjoinSimple.algebraMap_gen
@@ -866,6 +869,12 @@ theorem finrank_bot : finrank F (⊥ : IntermediateField F E) = 1 := by rw [finr
@[simp] protected theorem finrank_top : finrank (⊤ : IntermediateField F E) E = 1 :=
rank_eq_one_iff_finrank_eq_one.mp IntermediateField.rank_top
+@[simp] theorem rank_top' : Module.rank F (⊤ : IntermediateField F E) = Module.rank F E :=
+ rank_top F E
+
+@[simp] theorem finrank_top' : finrank F (⊤ : IntermediateField F E) = finrank F E :=
+ finrank_top F E
+
theorem rank_adjoin_eq_one_iff : Module.rank F (adjoin F S) = 1 ↔ S ⊆ (⊥ : IntermediateField F E) :=
Iff.trans rank_eq_one_iff adjoin_eq_bot_iff
#align intermediate_field.rank_adjoin_eq_one_iff IntermediateField.rank_adjoin_eq_one_iff
@@ -926,9 +935,11 @@ end AdjoinIntermediateFieldLattice
section AdjoinIntegralElement
+universe u
+
variable (F : Type*) [Field F] {E : Type*} [Field E] [Algebra F E] {α : E}
-variable {K : Type*} [Field K] [Algebra F K]
+variable {K : Type u} [Field K] [Algebra F K]
theorem minpoly_gen (α : E) :
minpoly F (AdjoinSimple.gen F α) = minpoly F α := by
@@ -974,6 +985,9 @@ theorem adjoinRootEquivAdjoin_apply_root (h : IsIntegral F α) :
AdjoinRoot.lift_root (aeval_gen_minpoly F α)
#align intermediate_field.adjoin_root_equiv_adjoin_apply_root IntermediateField.adjoinRootEquivAdjoin_apply_root
+theorem adjoin_root_eq_top (p : K[X]) [Fact (Irreducible p)] : K⟮AdjoinRoot.root p⟯ = ⊤ :=
+ (eq_adjoin_of_eq_algebra_adjoin K _ ⊤ (AdjoinRoot.adjoinRoot_eq_top (f := p)).symm).symm
+
section PowerBasis
variable {L : Type*} [Field L] [Algebra K L]
@@ -1133,6 +1147,56 @@ theorem card_algHom_adjoin_integral (h : IsIntegral F α) (h_sep : (minpoly F α
simp only [adjoin.powerBasis_dim, adjoin.powerBasis_gen, minpoly_gen, h_sep, h_splits]
#align intermediate_field.card_alg_hom_adjoin_integral IntermediateField.card_algHom_adjoin_integral
+open FiniteDimensional AdjoinRoot in
+/-- Let `f, g` be monic polynomials over `K`. If `f` is irreducible, and `g(x) - α` is irreducible
+in `K⟮α⟯` with `α` a root of `f`, then `f(g(x))` is irreducible. -/
+theorem _root_.Polynomial.irreducible_comp {f g : K[X]} (hfm : f.Monic) (hgm : g.Monic)
+ (hf : Irreducible f)
+ (hg : ∀ (E : Type u) [Field E] [Algebra K E] (x : E) (hx : minpoly K x = f),
+ Irreducible (g.map (algebraMap _ _) - C (AdjoinSimple.gen K x))) :
+ Irreducible (f.comp g) := by
+ have hf' : natDegree f ≠ 0 :=
+ fun e ↦ not_irreducible_C (f.coeff 0) (eq_C_of_natDegree_eq_zero e ▸ hf)
+ have hg' : natDegree g ≠ 0
+ · have := Fact.mk hf
+ intro e
+ apply not_irreducible_C ((g.map (algebraMap _ _)).coeff 0 - AdjoinSimple.gen K (root f))
+ rw [map_sub, coeff_map, ← map_C, ← eq_C_of_natDegree_eq_zero e]
+ apply hg (AdjoinRoot f)
+ rw [AdjoinRoot.minpoly_root hf.ne_zero, hfm, inv_one, map_one, mul_one]
+ have H₁ : f.comp g ≠ 0 := fun h ↦ by simpa [hf', hg', natDegree_comp] using congr_arg natDegree h
+ have H₂ : ¬ IsUnit (f.comp g) := fun h ↦
+ by simpa [hf', hg', natDegree_comp] using natDegree_eq_zero_of_isUnit h
+ have ⟨p, hp₁, hp₂⟩ := WfDvdMonoid.exists_irreducible_factor H₂ H₁
+ suffices natDegree p = natDegree f * natDegree g from (associated_of_dvd_of_natDegree_le hp₂ H₁
+ (this.trans natDegree_comp.symm).ge).irreducible hp₁
+ have := Fact.mk hp₁
+ let Kx := AdjoinRoot p
+ letI := (AdjoinRoot.powerBasis hp₁.ne_zero).finiteDimensional
+ have key₁ : f = minpoly K (aeval (root p) g)
+ · refine minpoly.eq_of_irreducible_of_monic hf ?_ hfm
+ rw [← aeval_comp]
+ exact aeval_eq_zero_of_dvd_aeval_eq_zero hp₂ (AdjoinRoot.eval₂_root p)
+ have key₁' : finrank K K⟮aeval (root p) g⟯ = natDegree f
+ · rw [adjoin.finrank, ← key₁]
+ exact IsIntegral.of_finite _ _
+ have key₂ : g.map (algebraMap _ _) - C (AdjoinSimple.gen K (aeval (root p) g)) =
+ minpoly K⟮aeval (root p) g⟯ (root p)
+ · exact minpoly.eq_of_irreducible_of_monic (hg _ _ key₁.symm) (by simp [AdjoinSimple.gen])
+ (Monic.sub_of_left (hgm.map _) (degree_lt_degree (by simpa [Nat.pos_iff_ne_zero] using hg')))
+ have key₂' : finrank K⟮aeval (root p) g⟯ Kx = natDegree g
+ · trans natDegree (minpoly K⟮aeval (root p) g⟯ (root p))
+ · have : K⟮aeval (root p) g⟯⟮root p⟯ = ⊤
+ · apply restrictScalars_injective K
+ rw [restrictScalars_top, adjoin_adjoin_left, Set.union_comm, ← adjoin_adjoin_left,
+ adjoin_root_eq_top p, restrictScalars_adjoin]
+ simp
+ rw [← finrank_top', ← this, adjoin.finrank]
+ exact IsIntegral.of_finite _ _
+ · simp [← key₂]
+ have := FiniteDimensional.finrank_mul_finrank K K⟮aeval (root p) g⟯ Kx
+ rwa [key₁', key₂', (AdjoinRoot.powerBasis hp₁.ne_zero).finrank, powerBasis_dim, eq_comm] at this
+
end AdjoinIntegralElement
section Induction
Main definitions:
separableClosure
: the (relative) separable closure of E / F
, or called maximal separable subextension of E / F
, is defined to be the intermediate field of E / F
consisting of all separable elements.Field.sepDegree F E
: the (infinite) separable degree [E:F]_s
of an algebraic extension E / F
of fields, defined to be the degree of separableClosure F E / F
.Field.insepDegree F E
: the (infinite) inseparable degree [E:F]_i
of an algebraic extension E / F
of fields, defined to be the degree of E / separableClosure F E
.Field.finInsepDegree F E
: the (finite) inseparable degree [E:F]_i
of an algebraic extension E / F
of fields, defined to be the degree of E / separableClosure F E
as a natural number. It is zero if such field extension is not finite.Main results:
le_separableClosure_iff
: an intermediate field of E / F
is contained in the (relative) separable closure of E / F
if and only if it is separable over F
.separableClosure.normalClosure_eq_self
: the normal closure of the (relative) separable closure of E / F
is equal to itself.separableClosure.normal
: the (relative) separable closure of a normal extension is normal.separableClosure.isSepClosure
: the (relative) separable closure of a separably closed extension is a separable closure of the base field.IntermediateField.isSeparable_adjoin_iff_separable
: F(S) / F
is a separable extension if and only if all elements of S
are separable elements.separableClosure.eq_top_iff
: the (relative) separable closure of E / F
is equal to E
if and only if E / F
is separable.@@ -102,6 +102,10 @@ instance : CompleteLattice (IntermediateField F E) where
instance : Inhabited (IntermediateField F E) :=
⟨⊤⟩
+instance : Unique (IntermediateField F F) :=
+ { inferInstanceAs (Inhabited (IntermediateField F F)) with
+ uniq := fun _ ↦ toSubalgebra_injective <| Subsingleton.elim _ _ }
+
theorem coe_bot : ↑(⊥ : IntermediateField F E) = Set.range (algebraMap F E) := rfl
#align intermediate_field.coe_bot IntermediateField.coe_bot
Finset
lemma names (#8894)
Change a few lemma names that have historically bothered me.
Finset.card_le_of_subset
→ Finset.card_le_card
Multiset.card_le_of_le
→ Multiset.card_le_card
Multiset.card_lt_of_lt
→ Multiset.card_lt_card
Set.ncard_le_of_subset
→ Set.ncard_le_ncard
Finset.image_filter
→ Finset.filter_image
CompleteLattice.finset_sup_compact_of_compact
→ CompleteLattice.isCompactElement_finset_sup
@@ -749,7 +749,7 @@ theorem adjoin_finset_isCompactElement (S : Finset E) :
IsCompactElement (adjoin F S : IntermediateField F E) := by
rw [← biSup_adjoin_simple]
simp_rw [Finset.mem_coe, ← Finset.sup_eq_iSup]
- exact finset_sup_compact_of_compact S fun x _ => adjoin_simple_isCompactElement x
+ exact isCompactElement_finsetSup S fun x _ => adjoin_simple_isCompactElement x
#align intermediate_field.adjoin_finset_is_compact_element IntermediateField.adjoin_finset_isCompactElement
/-- Adjoining a finite subset is compact in the lattice of intermediate fields. -/
exists_lt_finrank_of_infinite_dimensional
(#9262)
... which state that an infinite algebraic extension has finite subextension with arbitrary large degree.
@@ -1043,6 +1043,26 @@ theorem adjoin_minpoly_coeff_of_exists_primitive_element
((g.monic_toSubring _ _).mpr <| (minpoly.monic <| .of_finite K α).map _).ne_zero using 1
rw [natDegree_toSubring, natDegree_map]
+variable {F} in
+/-- If `E / F` is an infinite algebraic extension, then there exists an intermediate field
+`L / F` with arbitrarily large finite extension degree. -/
+theorem exists_lt_finrank_of_infinite_dimensional
+ (halg : Algebra.IsAlgebraic F E) (hnfd : ¬ FiniteDimensional F E) (n : ℕ) :
+ ∃ L : IntermediateField F E, FiniteDimensional F L ∧ n < finrank F L := by
+ induction' n with n ih
+ · exact ⟨⊥, Subalgebra.finiteDimensional_bot, finrank_pos⟩
+ obtain ⟨L, fin, hn⟩ := ih
+ obtain ⟨x, hx⟩ : ∃ x : E, x ∉ L := by
+ contrapose! hnfd
+ rw [show L = ⊤ from eq_top_iff.2 fun x _ ↦ hnfd x] at fin
+ exact topEquiv.toLinearEquiv.finiteDimensional
+ let L' := L ⊔ F⟮x⟯
+ haveI := adjoin.finiteDimensional (halg x).isIntegral
+ refine ⟨L', inferInstance, by_contra fun h ↦ ?_⟩
+ have h1 : L = L' := eq_of_le_of_finrank_le le_sup_left ((not_lt.1 h).trans hn)
+ have h2 : F⟮x⟯ ≤ L' := le_sup_right
+ exact hx <| (h1.symm ▸ h2) <| mem_adjoin_simple_self F x
+
theorem _root_.minpoly.natDegree_le (x : L) [FiniteDimensional K L] :
(minpoly K x).natDegree ≤ finrank K L :=
le_of_eq_of_le (IntermediateField.adjoin.finrank (.of_finite _ _)).symm
generalize image_rootSet
, adjoin_rootSet_eq_range
and splits_comp_of_splits
in Data/Polynomial/Splits and use the last one to golf splits_of_algHom
, splits_of_isScalarTower
(introduced in # 8609).
add three new lemmas mem_range_x_of_minpoly_splits
to simplify the construction of IntermediateField.algHomEquivAlgHomOfIsAlgClosed
and Algebra.IsAlgebraic.algHomEquivAlgHomOfIsAlgClosed
, remove the IsAlgClosed
condition and rename. They could be moved to an earlier file but I refrain from doing that. (#find_home says it's already in the right place)
golf primitive_element_iff_algHom_eq_of_eval
from # 8609, using a new lemma IsIntegral.minpoly_splits_tower_top
for the last step.
make integralClosure_algEquiv_restrict
(from # 8714) computable and rename to AlgEquiv.mapIntegralClosure
to follow camelCase naming convention and enable dot notation.
Co-authored-by: Xavier-François Roblot <46200072+xroblot@users.noreply.github.com> Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -848,14 +848,20 @@ theorem finrank_eq_one_iff : finrank F K = 1 ↔ K = ⊥ := by
bot_toSubalgebra]
#align intermediate_field.finrank_eq_one_iff IntermediateField.finrank_eq_one_iff
-@[simp]
+@[simp] protected
theorem rank_bot : Module.rank F (⊥ : IntermediateField F E) = 1 := by rw [rank_eq_one_iff]
#align intermediate_field.rank_bot IntermediateField.rank_bot
-@[simp]
+@[simp] protected
theorem finrank_bot : finrank F (⊥ : IntermediateField F E) = 1 := by rw [finrank_eq_one_iff]
#align intermediate_field.finrank_bot IntermediateField.finrank_bot
+@[simp] protected theorem rank_top : Module.rank (⊤ : IntermediateField F E) E = 1 :=
+ Subalgebra.bot_eq_top_iff_rank_eq_one.mp <| top_le_iff.mp fun x _ ↦ ⟨⟨x, trivial⟩, rfl⟩
+
+@[simp] protected theorem finrank_top : finrank (⊤ : IntermediateField F E) E = 1 :=
+ rank_eq_one_iff_finrank_eq_one.mp IntermediateField.rank_top
+
theorem rank_adjoin_eq_one_iff : Module.rank F (adjoin F S) = 1 ↔ S ⊆ (⊥ : IntermediateField F E) :=
Iff.trans rank_eq_one_iff adjoin_eq_bot_iff
#align intermediate_field.rank_adjoin_eq_one_iff IntermediateField.rank_adjoin_eq_one_iff
See the Zulip thread
@@ -1296,6 +1296,25 @@ end AlgHomMkAdjoinSplits
end IntermediateField
+section Algebra.IsAlgebraic
+
+/-- Let `K/F` be an algebraic extension of fields and `L` a field in which all the minimal
+polynomial over `F` of elements of `K` splits. Then, for `x ∈ K`, the images of `x` by the
+`F`-algebra morphisms from `K` to `L` are exactly the roots in `L` of the minimal polynomial
+of `x` over `F`. -/
+theorem Algebra.IsAlgebraic.range_eval_eq_rootSet_minpoly_of_splits {F K : Type*} (L : Type*)
+ [Field F] [Field K] [Field L] [Algebra F L] [Algebra F K]
+ (hA : ∀ x : K, (minpoly F x).Splits (algebraMap F L))
+ (hK : Algebra.IsAlgebraic F K) (x : K) :
+ (Set.range fun (ψ : K →ₐ[F] L) => ψ x) = (minpoly F x).rootSet L := by
+ ext a
+ rw [mem_rootSet_of_ne (minpoly.ne_zero (hK.isIntegral x))]
+ refine ⟨fun ⟨ψ, hψ⟩ ↦ ?_, fun ha ↦ IntermediateField.exists_algHom_of_splits_of_aeval
+ (fun x ↦ ⟨hK.isIntegral x, hA x⟩) ha⟩
+ rw [← hψ, Polynomial.aeval_algHom_apply ψ x, minpoly.aeval, map_zero]
+
+end Algebra.IsAlgebraic
+
section PowerBasis
variable {K L : Type*} [Field K] [Field L] [Algebra K L]
@@ -452,7 +452,7 @@ theorem lift_bot (K : IntermediateField F E) :
@[simp]
theorem lift_top (K : IntermediateField F E) :
- lift (F := K) ⊤ = K := by rw [lift, ←AlgHom.fieldRange_eq_map, fieldRange_val]
+ lift (F := K) ⊤ = K := by rw [lift, ← AlgHom.fieldRange_eq_map, fieldRange_val]
@[simp]
theorem adjoin_self (K : IntermediateField F E) :
Main changes are to the file NormalClosure:
Introduce predicate IsNormalClosure
to characterize normal closures L/F of a field extension K/F by the conditions that every minimal polynomial of an element of K over F splits in L, and that L is generated by roots of such polynomials. (When K/F is not necessarily algebraic, the conditions actually says L/F is a normal closure of the algebraic closure of F in K over F.
IsNormalClosure.normal
: a normal closure is always normal.
isNormalClosure_iff
: if K/F is algebraic, the "generated by roots" condition in IsNormalClosure can be replaced by "generated by images of embeddings". To prove it, we split out the two inclusions in restrictScalars_eq_iSup_adjoin
and golf its proof. restrictScalars_eq_iSup_adjoin
is renamed to normalClosure_eq_iSup_adjoin
as it has nothing to do with restrictScalars
.
IsNormalClosure.lift
: a normal closure of K/F embeds into any L/F such that the minpolys of K/F splits in L/F.
IsNormalClosure.equiv
: normal closures are unique up to F-algebra isomorphisms.
isNormalClosure_normalClosure
: normalClosure F K L
is a valid normal closure if K/F is algebraic and all minpolys of K/F splits in L/F; in particular, if there is at least one F-embedding of K into L, and L/F is normal.
Algebra.IsAlgebraic.cardinal_mk_algHom_le_of_splits
: if every minpoly of K/F
splits in L/F
, then L
is maximal w.r.t. F
-embeddings of K
, in the sense that K →ₐ[F] L
achieves maximal cardinality.
In the file Normal:
splits_of_mem_adjoin
: If a set of algebraic elements in a field extension K/F
have minimal polynomials that split in another extension L/F
, then all minimal polynomials in the intermediate field generated by the set also split in L/F
. This is in preparation for connecting IsNormalClosure
and IsSplittingField
.In the file IntermediateField:
comap
and show it forms a Galois connection with map
.In the file FieldTheory/Adjoin:
map_sup/iSup
lemmas that follow from the Galois connection, plus an additional convenience lemma.In the file RingTheory/Algebraic: add a lemma AlgHom.isAlgebraic_of_injective
.
Co-authored-by: Jz Pan <acme_pjz@hotmail.com>
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -209,7 +209,7 @@ theorem equivOfEq_rfl (S : IntermediateField F E) : equivOfEq (rfl : S = S) = Al
@[simp]
theorem equivOfEq_trans {S T U : IntermediateField F E} (hST : S = T) (hTU : T = U) :
- (equivOfEq hST).trans (equivOfEq hTU) = equivOfEq (_root_.trans hST hTU) :=
+ (equivOfEq hST).trans (equivOfEq hTU) = equivOfEq (hST.trans hTU) :=
rfl
#align intermediate_field.equiv_of_eq_trans IntermediateField.equivOfEq_trans
@@ -274,28 +274,37 @@ theorem restrictScalars_top {K : Type*} [Field K] [Algebra K E] [Algebra K F]
rfl
#align intermediate_field.restrict_scalars_top IntermediateField.restrictScalars_top
+variable {K : Type*} [Field K] [Algebra F K]
+
@[simp]
-theorem map_bot {K : Type*} [Field K] [Algebra F K] (f : E →ₐ[F] K) :
+theorem map_bot (f : E →ₐ[F] K) :
IntermediateField.map f ⊥ = ⊥ :=
toSubalgebra_injective <| Algebra.map_bot _
-theorem _root_.AlgHom.fieldRange_eq_map {K : Type*} [Field K] [Algebra F K] (f : E →ₐ[F] K) :
+theorem map_sup (s t : IntermediateField F E) (f : E →ₐ[F] K) : (s ⊔ t).map f = s.map f ⊔ t.map f :=
+ (gc_map_comap f).l_sup
+
+theorem map_iSup {ι : Sort*} (f : E →ₐ[F] K) (s : ι → IntermediateField F E) :
+ (iSup s).map f = ⨆ i, (s i).map f :=
+ (gc_map_comap f).l_iSup
+
+theorem _root_.AlgHom.fieldRange_eq_map (f : E →ₐ[F] K) :
f.fieldRange = IntermediateField.map f ⊤ :=
SetLike.ext' Set.image_univ.symm
#align alg_hom.field_range_eq_map AlgHom.fieldRange_eq_map
-theorem _root_.AlgHom.map_fieldRange {K L : Type*} [Field K] [Field L] [Algebra F K] [Algebra F L]
+theorem _root_.AlgHom.map_fieldRange {L : Type*} [Field L] [Algebra F L]
(f : E →ₐ[F] K) (g : K →ₐ[F] L) : f.fieldRange.map g = (g.comp f).fieldRange :=
SetLike.ext' (Set.range_comp g f).symm
#align alg_hom.map_field_range AlgHom.map_fieldRange
-theorem _root_.AlgHom.fieldRange_eq_top {K : Type*} [Field K] [Algebra F K] {f : E →ₐ[F] K} :
+theorem _root_.AlgHom.fieldRange_eq_top {f : E →ₐ[F] K} :
f.fieldRange = ⊤ ↔ Function.Surjective f :=
SetLike.ext'_iff.trans Set.range_iff_surjective
#align alg_hom.field_range_eq_top AlgHom.fieldRange_eq_top
@[simp]
-theorem _root_.AlgEquiv.fieldRange_eq_top {K : Type*} [Field K] [Algebra F K] (f : E ≃ₐ[F] K) :
+theorem _root_.AlgEquiv.fieldRange_eq_top (f : E ≃ₐ[F] K) :
(f : E →ₐ[F] K).fieldRange = ⊤ :=
AlgHom.fieldRange_eq_top.mpr f.surjective
#align alg_equiv.field_range_eq_top AlgEquiv.fieldRange_eq_top
@@ -371,8 +380,8 @@ theorem adjoin_le_subfield {K : Subfield E} (HF : Set.range (algebraMap F E) ⊆
theorem adjoin_subset_adjoin_iff {F' : Type*} [Field F'] [Algebra F' E] {S S' : Set E} :
(adjoin F S : Set E) ⊆ adjoin F' S' ↔
Set.range (algebraMap F E) ⊆ adjoin F' S' ∧ S ⊆ adjoin F' S' :=
- ⟨fun h => ⟨_root_.trans (adjoin.range_algebraMap_subset _ _) h, _root_.trans
- (subset_adjoin _ _) h⟩, fun ⟨hF, hS⟩ =>
+ ⟨fun h => ⟨(adjoin.range_algebraMap_subset _ _).trans h,
+ (subset_adjoin _ _).trans h⟩, fun ⟨hF, hS⟩ =>
(Subfield.closure_le (t := (adjoin F' S').toSubfield)).mpr (Set.union_subset hF hS)⟩
#align intermediate_field.adjoin_subset_adjoin_iff IntermediateField.adjoin_subset_adjoin_iff
@@ -581,19 +590,27 @@ theorem adjoin_simple_toSubalgebra_of_integral (hα : IsIntegral F α) :
rwa [isAlgebraic_iff_isIntegral]
#align intermediate_field.adjoin_simple_to_subalgebra_of_integral IntermediateField.adjoin_simple_toSubalgebra_of_integral
+/-- Characterize `IsSplittingField` with `IntermediateField.adjoin` instead of `Algebra.adjoin`. -/
+theorem _root_.isSplittingField_iff_intermediateField {p : F[X]} :
+ p.IsSplittingField F E ↔ p.Splits (algebraMap F E) ∧ adjoin F (p.rootSet E) = ⊤ := by
+ rw [← toSubalgebra_injective.eq_iff,
+ adjoin_algebraic_toSubalgebra fun _ ↦ isAlgebraic_of_mem_rootSet]
+ exact ⟨fun ⟨spl, adj⟩ ↦ ⟨spl, adj⟩, fun ⟨spl, adj⟩ ↦ ⟨spl, adj⟩⟩
+
+-- Note: p.Splits (algebraMap F E) also works
theorem isSplittingField_iff {p : F[X]} {K : IntermediateField F E} :
p.IsSplittingField F K ↔ p.Splits (algebraMap F K) ∧ K = adjoin F (p.rootSet E) := by
suffices _ → (Algebra.adjoin F (p.rootSet K) = ⊤ ↔ K = adjoin F (p.rootSet E)) by
- exact ⟨fun h => ⟨h.1, (this h.1).mp h.2⟩, fun h => ⟨h.1, (this h.1).mpr h.2⟩⟩
- simp_rw [SetLike.ext_iff, ← mem_toSubalgebra, ← SetLike.ext_iff]
- rw [adjoin_algebraic_toSubalgebra fun x => isAlgebraic_of_mem_rootSet]
- refine' fun hp => (adjoin_rootSet_eq_range hp K.val).symm.trans _
+ exact ⟨fun h ↦ ⟨h.1, (this h.1).mp h.2⟩, fun h ↦ ⟨h.1, (this h.1).mpr h.2⟩⟩
+ rw [← toSubalgebra_injective.eq_iff,
+ adjoin_algebraic_toSubalgebra fun x ↦ isAlgebraic_of_mem_rootSet]
+ refine fun hp ↦ (adjoin_rootSet_eq_range hp K.val).symm.trans ?_
rw [← K.range_val, eq_comm]
#align intermediate_field.is_splitting_field_iff IntermediateField.isSplittingField_iff
theorem adjoin_rootSet_isSplittingField {p : F[X]} (hp : p.Splits (algebraMap F E)) :
p.IsSplittingField F (adjoin F (p.rootSet E)) :=
- isSplittingField_iff.mpr ⟨splits_of_splits hp fun _ hx => subset_adjoin F (p.rootSet E) hx, rfl⟩
+ isSplittingField_iff.mpr ⟨splits_of_splits hp fun _ hx ↦ subset_adjoin F (p.rootSet E) hx, rfl⟩
#align intermediate_field.adjoin_root_set_is_splitting_field IntermediateField.adjoin_rootSet_isSplittingField
open scoped BigOperators
@@ -714,9 +731,8 @@ has been improved. -/
theorem adjoin_simple_le_iff {K : IntermediateField F E} : F⟮α⟯ ≤ K ↔ α ∈ K := by simp
#align intermediate_field.adjoin_simple_le_iff IntermediateField.adjoin_simple_le_iff
-theorem biSup_adjoin_simple : ⨆ x ∈ S, F⟮x⟯ = adjoin F S :=
- le_antisymm (iSup_le fun _ ↦ iSup_le fun hx ↦ adjoin_simple_le_iff.mpr <| subset_adjoin F S hx) <|
- adjoin_le_iff.mpr fun x hx ↦ adjoin_simple_le_iff.mp (le_iSup_of_le x (le_iSup_of_le hx le_rfl))
+theorem biSup_adjoin_simple : ⨆ x ∈ S, F⟮x⟯ = adjoin F S := by
+ rw [← iSup_subtype'', ← gc.l_iSup, iSup_subtype'']; congr; exact S.biUnion_of_singleton
/-- Adjoining a single element is compact in the lattice of intermediate fields. -/
theorem adjoin_simple_isCompactElement (x : E) : IsCompactElement F⟮x⟯ := by
@@ -751,8 +767,7 @@ instance : IsCompactlyGenerated (IntermediateField F E) :=
theorem exists_finset_of_mem_iSup {ι : Type*} {f : ι → IntermediateField F E} {x : E}
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset ι, x ∈ ⨆ i ∈ s, f i := by
- have := (adjoin_simple_isCompactElement x : IsCompactElement F⟮x⟯).exists_finset_of_le_iSup
- (IntermediateField F E) f
+ have := (adjoin_simple_isCompactElement x).exists_finset_of_le_iSup (IntermediateField F E) f
simp only [adjoin_simple_le_iff] at this
exact this hx
#align intermediate_field.exists_finset_of_mem_supr IntermediateField.exists_finset_of_mem_iSup
Initially I just wanted to add more dot notations for IsIntegral and IsAlgebraic (done in #8437); then I noticed near-duplicates
Algebra.isIntegral_of_finite [Field R] [Ring A]
and
RingHom.IsIntegral.of_finite [CommRing R] [CommRing A]
so I went on to generalize the latter to cover the former, and generalized everything in the IntegralClosure file to the noncommutative case whenever possible.
In the process I noticed more golfs, which result in this PR. Most notably, isIntegral_of_mem_of_FG is now proven using Cayley-Hamilton and doesn't depend on the Noetherian case isIntegral_of_noetherian; the latter is now proven using the former. In total the golfs makes mathlib 227 lines leaner (+487 -714).
The main changes are in the single file RingTheory/IntegralClosure:
Change the definition of Algebra.IsIntegral
which makes it unfold to IsIntegral
rather than RingHom.IsIntegralElem
because the former has much more APIs.
Fix lemma names involving is_integral
which are actually about IsIntegralElem
:
RingHom.is_integral_map
→ RingHom.isIntegralElem_map
RingHom.is_integral_of_mem_closure
→ RingHom.IsIntegralElem.of_mem_closure
RingHom.is_integral_zero/one
→ RingHom.isIntegralElem_zero/one
RingHom.is_integral_add/neg/sub/mul/of_mul_unit
→ RingHom.IsIntegralElem.add/neg/sub/mul/of_mul_unit
Add a lemma Algebra.IsIntegral.of_injective
.
Move isIntegral_of_(submodule_)noetherian
down and golf them.
Remove (Algebra.)isIntegral_of_finite
that work only over fields, in favor of the more general (Algebra.)isIntegral.of_finite
.
Merge duplicate lemmas isIntegral_of_isScalarTower
and isIntegral_tower_top_of_isIntegral
into IsIntegral.tower_top
.
Golf IsIntegral.of_mem_of_fg
by first proving IsIntegral.of_finite
using Cayley-Hamilton.
Add a docstring mentioning the Kurosh problem at Algebra.IsIntegral.finite
. The negative solution to the problem means the theorem doesn't generalize to noncommutative algebras.
Golf IsIntegral.tmul
and isField_of_isIntegral_of_isField(')
.
Combine isIntegral_trans_aux
into isIntegral_trans
and golf.
Add Algebra
namespace to isIntegral_sup
.
rename lemmas for dot notation:
RingHom.isIntegral_trans
→ RingHom.IsIntegral.trans
RingHom.isIntegral_quotient/tower_bot/top_of_isIntegral
→ RingHom.IsIntegral.quotient/tower_bot/top
isIntegral_of_mem_closure'
→ IsIntegral.of_mem_closure'
(and the '' version)
isIntegral_of_surjective
→ Algebra.isIntegral_of_surjective
The next changed file is RingTheory/Algebraic:
Rename:
of_larger_base
→ tower_top
(for consistency with IsIntegral
)
Algebra.isAlgebraic_of_finite
→ Algebra.IsAlgebraic.of_finite
Algebra.isAlgebraic_trans
→ Algebra.IsAlgebraic.trans
Add new lemmasAlgebra.IsIntegral.isAlgebraic
, isAlgebraic_algHom_iff
, and Algebra.IsAlgebraic.of_injective
to streamline some proofs.
The generalization from CommRing to Ring requires an additional lemma scaleRoots_eval₂_mul_of_commute
in Polynomial/ScaleRoots.
A lemma Algebra.lmul_injective
is added to Algebra/Bilinear (in order to golf the proof of IsIntegral.of_mem_of_fg
).
In all other files, I merely fix the changed names, or use newly available dot notations.
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -624,7 +624,8 @@ theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K
exact (congr_arg (· ∈ S1 ⊔ S2) <| eq_inv_of_mul_eq_one_right <| Subtype.ext_iff.mp h).mp y.2
exact
isField_of_isIntegral_of_isField'
- (isIntegral_sup.mpr ⟨Algebra.isIntegral_of_finite K E1, Algebra.isIntegral_of_finite K E2⟩)
+ (Algebra.isIntegral_sup.mpr
+ ⟨Algebra.IsIntegral.of_finite K E1, Algebra.IsIntegral.of_finite K E2⟩)
(Field.toIsField K)
#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra
@@ -773,7 +774,7 @@ theorem exists_finset_of_mem_supr'' {ι : Type*} {f : ι → IntermediateField F
(subset_adjoin F (rootSet (minpoly F x1) E) _)
· rw [IntermediateField.minpoly_eq, Subtype.coe_mk]
· rw [mem_rootSet_of_ne, minpoly.aeval]
- exact minpoly.ne_zero (isIntegral_iff.mp (isAlgebraic_iff_isIntegral.mp (h i ⟨x1, hx1⟩)))
+ exact minpoly.ne_zero (isIntegral_iff.mp (h i ⟨x1, hx1⟩).isIntegral)
#align intermediate_field.exists_finset_of_mem_supr'' IntermediateField.exists_finset_of_mem_supr''
end AdjoinSimple
@@ -977,7 +978,7 @@ theorem adjoin.finiteDimensional {x : L} (hx : IsIntegral K x) : FiniteDimension
#align intermediate_field.adjoin.finite_dimensional IntermediateField.adjoin.finiteDimensional
theorem isAlgebraic_adjoin_simple {x : L} (hx : IsIntegral K x) : Algebra.IsAlgebraic K K⟮x⟯ :=
- have := adjoin.finiteDimensional hx; Algebra.isAlgebraic_of_finite K K⟮x⟯
+ have := adjoin.finiteDimensional hx; Algebra.IsAlgebraic.of_finite K K⟮x⟯
theorem adjoin.finrank {x : L} (hx : IsIntegral K x) :
FiniteDimensional.finrank K K⟮x⟯ = (minpoly K x).natDegree := by
@@ -1006,31 +1007,24 @@ theorem adjoin_minpoly_coeff_of_exists_primitive_element
rintro ⟨n, -, rfl⟩
rw [coeff_map]
apply Subtype.mem
- have g_lifts : g ∈ lifts (algebraMap K' E) := by
- refine g.lifts_iff_coeff_lifts.mpr fun n ↦ ?_
- erw [Subtype.range_val]
- by_cases hn : n ∈ g.support
- · exact subset_adjoin F _ (mem_frange_iff.mpr ⟨n, hn, rfl⟩)
- · exact not_mem_support_iff.mp hn ▸ zero_mem K'
- obtain ⟨p, hp⟩ := g.lifts_and_natDegree_eq_and_monic
- g_lifts ((minpoly.monic <| IsIntegral.of_finite K α).map _)
- have dvd_p : minpoly K' α ∣ p
+ have dvd_g : minpoly K' α ∣ g.toSubring K'.toSubring (subset_adjoin F _)
· apply minpoly.dvd
- rw [aeval_def, eval₂_eq_eval_map, hp.1, ← eval₂_eq_eval_map, ← aeval_def]
+ erw [aeval_def, eval₂_eq_eval_map, g.map_toSubring K'.toSubring, eval_map, ← aeval_def]
exact minpoly.aeval K α
have finrank_eq : ∀ K : IntermediateField F E, finrank K E = natDegree (minpoly K α)
· intro K
- have := adjoin.finrank (IsIntegral.of_finite K α)
+ have := adjoin.finrank (.of_finite K α)
erw [adjoin_eq_top_of_adjoin_eq_top F hprim, finrank_top K E] at this
exact this
refine eq_of_le_of_finrank_le' hsub ?_
simp_rw [finrank_eq]
- convert natDegree_le_of_dvd dvd_p hp.2.2.ne_zero using 1
- rw [hp.2.1, natDegree_map]
+ convert natDegree_le_of_dvd dvd_g
+ ((g.monic_toSubring _ _).mpr <| (minpoly.monic <| .of_finite K α).map _).ne_zero using 1
+ rw [natDegree_toSubring, natDegree_map]
theorem _root_.minpoly.natDegree_le (x : L) [FiniteDimensional K L] :
(minpoly K x).natDegree ≤ finrank K L :=
- le_of_eq_of_le (IntermediateField.adjoin.finrank (IsIntegral.of_finite _ _)).symm
+ le_of_eq_of_le (IntermediateField.adjoin.finrank (.of_finite _ _)).symm
K⟮x⟯.toSubmodule.finrank_le
#align minpoly.nat_degree_le minpoly.natDegree_le
@@ -1047,8 +1041,8 @@ theorem isAlgebraic_iSup {ι : Type*} {t : ι → IntermediateField K L}
obtain ⟨s, hx⟩ := exists_finset_of_mem_supr' hx
rw [isAlgebraic_iff, Subtype.coe_mk, ← Subtype.coe_mk (p := (· ∈ _)) x hx, ← isAlgebraic_iff]
haveI : ∀ i : Σ i, t i, FiniteDimensional K K⟮(i.2 : L)⟯ := fun ⟨i, x⟩ ↦
- adjoin.finiteDimensional (isIntegral_iff.1 (isAlgebraic_iff_isIntegral.1 (h i x)))
- apply Algebra.isAlgebraic_of_finite
+ adjoin.finiteDimensional (isIntegral_iff.1 (h i x).isIntegral)
+ apply Algebra.IsAlgebraic.of_finite
#align intermediate_field.is_algebraic_supr IntermediateField.isAlgebraic_iSup
theorem isAlgebraic_adjoin {S : Set L} (hS : ∀ x ∈ S, IsIntegral K x) :
@@ -1211,7 +1205,7 @@ theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤
whose carrier contains `s`. -/
theorem Lifts.exists_lift_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
(h2 : (minpoly F s).Splits (algebraMap F K)) : ∃ y, x ≤ y ∧ s ∈ y.carrier :=
- have I1 : IsIntegral x.carrier s := isIntegral_of_isScalarTower h1
+ have I1 : IsIntegral x.carrier s := h1.tower_top
have I2 := (minpoly.degree_pos I1).ne'
have key : (minpoly x.carrier s).Splits x.emb.toRingHom :=
splits_of_splits_of_dvd _ (map_ne_zero (minpoly.ne_zero h1))
This PR tests a string-based tool for renaming declarations.
Inspired by this Zulip thread, I am trying to reduce the diff of #8406.
This PR makes the following renames:
| From | To |
@@ -1013,14 +1013,14 @@ theorem adjoin_minpoly_coeff_of_exists_primitive_element
· exact subset_adjoin F _ (mem_frange_iff.mpr ⟨n, hn, rfl⟩)
· exact not_mem_support_iff.mp hn ▸ zero_mem K'
obtain ⟨p, hp⟩ := g.lifts_and_natDegree_eq_and_monic
- g_lifts ((minpoly.monic <| isIntegral_of_finite K α).map _)
+ g_lifts ((minpoly.monic <| IsIntegral.of_finite K α).map _)
have dvd_p : minpoly K' α ∣ p
· apply minpoly.dvd
rw [aeval_def, eval₂_eq_eval_map, hp.1, ← eval₂_eq_eval_map, ← aeval_def]
exact minpoly.aeval K α
have finrank_eq : ∀ K : IntermediateField F E, finrank K E = natDegree (minpoly K α)
· intro K
- have := adjoin.finrank (isIntegral_of_finite K α)
+ have := adjoin.finrank (IsIntegral.of_finite K α)
erw [adjoin_eq_top_of_adjoin_eq_top F hprim, finrank_top K E] at this
exact this
refine eq_of_le_of_finrank_le' hsub ?_
@@ -1030,7 +1030,7 @@ theorem adjoin_minpoly_coeff_of_exists_primitive_element
theorem _root_.minpoly.natDegree_le (x : L) [FiniteDimensional K L] :
(minpoly K x).natDegree ≤ finrank K L :=
- le_of_eq_of_le (IntermediateField.adjoin.finrank (isIntegral_of_finite _ _)).symm
+ le_of_eq_of_le (IntermediateField.adjoin.finrank (IsIntegral.of_finite _ _)).symm
K⟮x⟯.toSubmodule.finrank_le
#align minpoly.nat_degree_le minpoly.natDegree_le
Inspired by the IsAlgClosed.lift.SubfieldWithHom counterpart:
Change Lifts
from a Sigma type to a structure with fields carrier
and emb
.
Change the definition of the partial order on Lifts
to use IntermediateField.inclusion
.
Use Subalgebra.iSupLift in the proof of Lifts.exists_upper_bound
.
Also:
Inline multiple auxiliary definitions for Lifts.exists_upper_bound
and Lifts.exists_lift_of_splits
into the proofs proper.
Move the Supremum
section much further up, in order to use the new lemma toSubalgebra_iSup_of_directed
to prove stuff about Lifts
(and golf a proof about CompactElement
). isAlgebraic_iSup
however can't be moved up, so I put it near adjoin.finiteDimensional
, the last lemma it depends on.
Co-authored-by: acmepjz <acme_pjz@hotmail.com>
@@ -96,10 +96,7 @@ instance : CompleteLattice (IntermediateField F E) where
__ := GaloisInsertion.liftCompleteLattice IntermediateField.gi
bot :=
{ toSubalgebra := ⊥
- inv_mem' := fun x (hx : x ∈ (⊥ : Subalgebra F E)) => show x⁻¹ ∈ (⊥ : Subalgebra F E) by
- rw [Algebra.mem_bot] at hx ⊢
- obtain ⟨r, rfl⟩ := hx
- exact ⟨r⁻¹, map_inv₀ _ _⟩ }
+ inv_mem' := by rintro x ⟨r, rfl⟩; exact ⟨r⁻¹, map_inv₀ _ _⟩ }
bot_le x := (bot_le : ⊥ ≤ x.toSubalgebra)
instance : Inhabited (IntermediateField F E) :=
@@ -193,19 +190,10 @@ theorem iInf_toSubfield {ι : Sort*} (S : ι → IntermediateField F E) :
SetLike.coe_injective <| by simp [iInf]
#align intermediate_field.infi_to_subfield IntermediateField.iInf_toSubfield
---Porting note: `left_inv`, `right_inv`, `map_mul'`, `map_add'` and `commutes` were not needed.
/-- Construct an algebra isomorphism from an equality of intermediate fields -/
-@[simps apply]
-def equivOfEq {S T : IntermediateField F E} (h : S = T) : S ≃ₐ[F] T := by
- refine'
- { toFun := fun x => ⟨x, _⟩
- invFun := fun x => ⟨x, _⟩
- left_inv := fun _ => by ext; simp
- right_inv := fun _ => by ext; simp
- map_mul' := fun _ _ => by ext; simp
- map_add' := fun _ _ => by ext; simp
- commutes' := fun _ => by ext; rfl } <;> aesop
-
+@[simps! apply]
+def equivOfEq {S T : IntermediateField F E} (h : S = T) : S ≃ₐ[F] T :=
+ Subalgebra.equivOfEq _ _ (congr_arg toSubalgebra h)
#align intermediate_field.equiv_of_eq IntermediateField.equivOfEq
@[simp]
@@ -488,6 +476,8 @@ theorem eq_adjoin_of_eq_algebra_adjoin (K : IntermediateField F E)
convert K.inv_mem (x := x) <;> rw [← h] <;> rfl
#align intermediate_field.eq_adjoin_of_eq_algebra_adjoin IntermediateField.eq_adjoin_of_eq_algebra_adjoin
+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)
@[elab_as_elim]
theorem adjoin_induction {s : Set E} {p : E → Prop} {x} (h : x ∈ adjoin F s) (Hs : ∀ x ∈ s, p x)
@@ -608,22 +598,114 @@ theorem adjoin_rootSet_isSplittingField {p : F[X]} (hp : p.Splits (algebraMap F
open scoped BigOperators
+section Supremum
+
+variable {K L : Type*} [Field K] [Field L] [Algebra K L] (E1 E2 : IntermediateField K L)
+
+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)
+#align intermediate_field.le_sup_to_subalgebra IntermediateField.le_sup_toSubalgebra
+
+theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
+ (E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra := by
+ let S1 := E1.toSubalgebra
+ let S2 := E2.toSubalgebra
+ refine'
+ le_antisymm
+ (show _ ≤ (S1 ⊔ S2).toIntermediateField _ from
+ sup_le (show S1 ≤ _ from le_sup_left) (show S2 ≤ _ from le_sup_right))
+ (le_sup_toSubalgebra E1 E2)
+ suffices IsField (S1 ⊔ S2 : Subalgebra K L) by
+ intro x hx
+ by_cases hx' : (⟨x, hx⟩ : (S1 ⊔ S2 : Subalgebra K L)) = 0
+ · rw [← Subtype.coe_mk x, hx', Subalgebra.coe_zero, inv_zero]
+ exact (S1 ⊔ S2).zero_mem
+ · obtain ⟨y, h⟩ := this.mul_inv_cancel hx'
+ exact (congr_arg (· ∈ S1 ⊔ S2) <| eq_inv_of_mul_eq_one_right <| Subtype.ext_iff.mp h).mp y.2
+ exact
+ isField_of_isIntegral_of_isField'
+ (isIntegral_sup.mpr ⟨Algebra.isIntegral_of_finite K E1, Algebra.isIntegral_of_finite K E2⟩)
+ (Field.toIsField K)
+#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra
+
+instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
+ FiniteDimensional K (E1 ⊔ E2 : IntermediateField K L) := by
+ let g := Algebra.TensorProduct.productMap E1.val E2.val
+ suffices g.range = (E1 ⊔ E2).toSubalgebra by
+ have h : FiniteDimensional K (Subalgebra.toSubmodule g.range) :=
+ g.toLinearMap.finiteDimensional_range
+ rwa [this] at h
+ rw [Algebra.TensorProduct.productMap_range, E1.range_val, E2.range_val, sup_toSubalgebra]
+#align intermediate_field.finite_dimensional_sup IntermediateField.finiteDimensional_sup
+
+variable {ι : Type*} {t : ι → IntermediateField K L}
+
+theorem coe_iSup_of_directed [Nonempty ι] (dir : Directed (· ≤ ·) t) :
+ ↑(iSup t) = ⋃ i, (t i : Set L) :=
+ let M : IntermediateField K L :=
+ { __ := Subalgebra.copy _ _ (Subalgebra.coe_iSup_of_directed dir).symm
+ inv_mem' := fun _ hx ↦ have ⟨i, hi⟩ := Set.mem_iUnion.mp hx
+ Set.mem_iUnion.mpr ⟨i, (t i).inv_mem hi⟩ }
+ have : iSup t = M := le_antisymm
+ (iSup_le fun i ↦ le_iSup (fun i ↦ (t i : Set L)) i) (Set.iUnion_subset fun _ ↦ le_iSup t _)
+ this.symm ▸ rfl
+
+theorem toSubalgebra_iSup_of_directed (dir : Directed (· ≤ ·) t) :
+ (iSup t).toSubalgebra = ⨆ i, (t i).toSubalgebra := by
+ cases isEmpty_or_nonempty ι
+ · simp_rw [iSup_of_empty, bot_toSubalgebra]
+ · exact SetLike.ext' ((coe_iSup_of_directed dir).trans (Subalgebra.coe_iSup_of_directed dir).symm)
+
+instance finiteDimensional_iSup_of_finite [h : Finite ι] [∀ i, FiniteDimensional K (t i)] :
+ FiniteDimensional K (⨆ i, t i : IntermediateField K L) := by
+ rw [← iSup_univ]
+ let P : Set ι → Prop := fun s => FiniteDimensional K (⨆ i ∈ s, t i : IntermediateField K L)
+ change P Set.univ
+ apply Set.Finite.induction_on
+ all_goals dsimp only
+ · exact Set.finite_univ
+ · rw [iSup_emptyset]
+ exact (botEquiv K L).symm.toLinearEquiv.finiteDimensional
+ · intro _ s _ _ hs
+ rw [iSup_insert]
+ exact IntermediateField.finiteDimensional_sup _ _
+#align intermediate_field.finite_dimensional_supr_of_finite IntermediateField.finiteDimensional_iSup_of_finite
+
+instance finiteDimensional_iSup_of_finset
+ /-Porting note: changed `h` from `∀ i ∈ s, FiniteDimensional K (t i)` because this caused an
+ error. See `finiteDimensional_iSup_of_finset'` for a stronger version, that was the one
+ used in mathlib3.-/
+ {s : Finset ι} [∀ i, FiniteDimensional K (t i)] :
+ FiniteDimensional K (⨆ i ∈ s, t i : IntermediateField K L) :=
+ iSup_subtype'' s t ▸ IntermediateField.finiteDimensional_iSup_of_finite
+#align intermediate_field.finite_dimensional_supr_of_finset IntermediateField.finiteDimensional_iSup_of_finset
+
+theorem finiteDimensional_iSup_of_finset'
+ /-Porting note: this was the mathlib3 version. Using `[h : ...]`, as in mathlib3, causes the
+ error "invalid parametric local instance".-/
+ {s : Finset ι} (h : ∀ i, i ∈ s → FiniteDimensional K (t i)) :
+ FiniteDimensional K (⨆ i ∈ s, t i : IntermediateField K L) :=
+ have := Subtype.forall'.mp h
+ iSup_subtype'' s t ▸ IntermediateField.finiteDimensional_iSup_of_finite
+
/-- A compositum of splitting fields is a splitting field -/
-theorem isSplittingField_iSup {ι : Type*} {t : ι → IntermediateField F E} {p : ι → F[X]}
- {s : Finset ι} (h0 : ∏ i in s, p i ≠ 0) (h : ∀ i ∈ s, (p i).IsSplittingField F (t i)) :
- (∏ i in s, p i).IsSplittingField F (⨆ i ∈ s, t i : IntermediateField F E) := by
- let K : IntermediateField F E := ⨆ i ∈ s, t i
- have hK : ∀ i ∈ s, t i ≤ K := fun i hi => le_iSup_of_le i (le_iSup (fun _ => t i) hi)
+theorem isSplittingField_iSup {p : ι → K[X]}
+ {s : Finset ι} (h0 : ∏ i in s, p i ≠ 0) (h : ∀ i ∈ s, (p i).IsSplittingField K (t i)) :
+ (∏ i in s, p i).IsSplittingField K (⨆ i ∈ s, t i : IntermediateField K L) := by
+ let F : IntermediateField K L := ⨆ i ∈ s, t i
+ have hF : ∀ i ∈ s, t i ≤ F := fun i hi ↦ le_iSup_of_le i (le_iSup (fun _ ↦ t i) hi)
simp only [isSplittingField_iff] at h ⊢
refine'
- ⟨splits_prod (algebraMap F K) fun i hi =>
- Polynomial.splits_comp_of_splits (algebraMap F (t i)) (inclusion (hK i hi)).toRingHom
+ ⟨splits_prod (algebraMap K F) fun i hi ↦
+ splits_comp_of_splits (algebraMap K (t i)) (inclusion (hF i hi)).toRingHom
(h i hi).1,
_⟩
- simp only [rootSet_prod p s h0, ← Set.iSup_eq_iUnion, (@gc F _ E _ _).l_iSup₂]
- exact iSup_congr fun i => iSup_congr fun hi => (h i hi).2
+ simp only [rootSet_prod p s h0, ← Set.iSup_eq_iUnion, (@gc K _ L _ _).l_iSup₂]
+ exact iSup_congr fun i ↦ iSup_congr fun hi ↦ (h i hi).2
#align intermediate_field.is_splitting_field_supr IntermediateField.isSplittingField_iSup
+end Supremum
+
open Set CompleteLattice
/- Porting note: this was tagged `simp`, but the LHS can be simplified now that the notation
@@ -631,46 +713,25 @@ has been improved. -/
theorem adjoin_simple_le_iff {K : IntermediateField F E} : F⟮α⟯ ≤ K ↔ α ∈ K := by simp
#align intermediate_field.adjoin_simple_le_iff IntermediateField.adjoin_simple_le_iff
+theorem biSup_adjoin_simple : ⨆ x ∈ S, F⟮x⟯ = adjoin F S :=
+ le_antisymm (iSup_le fun _ ↦ iSup_le fun hx ↦ adjoin_simple_le_iff.mpr <| subset_adjoin F S hx) <|
+ adjoin_le_iff.mpr fun x hx ↦ adjoin_simple_le_iff.mp (le_iSup_of_le x (le_iSup_of_le hx le_rfl))
+
/-- Adjoining a single element is compact in the lattice of intermediate fields. -/
theorem adjoin_simple_isCompactElement (x : E) : IsCompactElement F⟮x⟯ := by
- rw [isCompactElement_iff_le_of_directed_sSup_le]
- rintro s ⟨F₀, hF₀⟩ hs hx
- simp only [adjoin_simple_le_iff] at hx ⊢
- let F : IntermediateField F E :=
- { carrier := ⋃ E ∈ s, ↑E
- add_mem' := by
- rintro x₁ x₂ ⟨-, ⟨F₁, rfl⟩, ⟨-, ⟨hF₁, rfl⟩, hx₁⟩⟩ ⟨-, ⟨F₂, rfl⟩, ⟨-, ⟨hF₂, rfl⟩, hx₂⟩⟩
- obtain ⟨F₃, hF₃, h₁₃, h₂₃⟩ := hs F₁ hF₁ F₂ hF₂
- exact mem_iUnion_of_mem F₃ (mem_iUnion_of_mem hF₃ (F₃.add_mem (h₁₃ hx₁) (h₂₃ hx₂)))
- mul_mem' := by
- rintro x₁ x₂ ⟨-, ⟨F₁, rfl⟩, ⟨-, ⟨hF₁, rfl⟩, hx₁⟩⟩ ⟨-, ⟨F₂, rfl⟩, ⟨-, ⟨hF₂, rfl⟩, hx₂⟩⟩
- obtain ⟨F₃, hF₃, h₁₃, h₂₃⟩ := hs F₁ hF₁ F₂ hF₂
- exact mem_iUnion_of_mem F₃ (mem_iUnion_of_mem hF₃ (F₃.mul_mem (h₁₃ hx₁) (h₂₃ hx₂)))
- inv_mem' := by
- rintro x ⟨-, ⟨E, rfl⟩, ⟨-, ⟨hE, rfl⟩, hx⟩⟩
- exact mem_iUnion_of_mem E (mem_iUnion_of_mem hE (E.inv_mem hx))
- algebraMap_mem' := fun x =>
- mem_iUnion_of_mem F₀ (mem_iUnion_of_mem hF₀ (F₀.algebraMap_mem x)) }
--- Porting note: original proof of `key` was
--- `sSup_le fun E1 hE1 => Set.subset_iUnion_of_subset E1 (subset_iUnion _ hE1)`
- have key : sSup s ≤ F := sSup_le fun E1 hE1 => by
- refine' Set.subset_iUnion_of_subset E1 _
- intro x hx
- simpa [hE1] using hx
- obtain ⟨-, ⟨E, rfl⟩, -, ⟨hE, rfl⟩, hx⟩ := key hx
- exact ⟨E, hE, hx⟩
+ simp_rw [isCompactElement_iff_le_of_directed_sSup_le,
+ adjoin_simple_le_iff, sSup_eq_iSup', ← exists_prop]
+ intro s hne hs hx
+ have := hne.to_subtype
+ rwa [← SetLike.mem_coe, coe_iSup_of_directed hs.directed_val, mem_iUnion, Subtype.exists] at hx
#align intermediate_field.adjoin_simple_is_compact_element IntermediateField.adjoin_simple_isCompactElement
-- Porting note: original proof times out.
/-- Adjoining a finite subset is compact in the lattice of intermediate fields. -/
theorem adjoin_finset_isCompactElement (S : Finset E) :
IsCompactElement (adjoin F S : IntermediateField F E) := by
- have key : adjoin F ↑S = ⨆ x ∈ S, F⟮x⟯ := by
--- Porting note: `exact` or `apply` timeout here
- refine' le_antisymm (adjoin_le_iff.mpr fun x hx => SetLike.mem_coe.mpr
- (adjoin_simple_le_iff.mp (le_iSup_of_le x (le_iSup_iff.2 (fun E1 hE1 => hE1 hx)))))
- (iSup_le fun x => iSup_le fun hx => adjoin_simple_le_iff.mpr (subset_adjoin F S hx))
- rw [key, ← Finset.sup_eq_iSup]
+ rw [← biSup_adjoin_simple]
+ simp_rw [Finset.mem_coe, ← Finset.sup_eq_iSup]
exact finset_sup_compact_of_compact S fun x _ => adjoin_simple_isCompactElement x
#align intermediate_field.adjoin_finset_is_compact_element IntermediateField.adjoin_finset_isCompactElement
@@ -684,9 +745,8 @@ instance : IsCompactlyGenerated (IntermediateField F E) :=
⟨fun s =>
⟨(fun x => F⟮x⟯) '' s,
⟨by rintro t ⟨x, _, rfl⟩; exact adjoin_simple_isCompactElement x,
- sSup_image.trans
- (le_antisymm (iSup_le fun i => iSup_le fun hi => adjoin_simple_le_iff.mpr hi) fun x hx =>
- adjoin_simple_le_iff.mp (le_iSup_of_le x (le_iSup_of_le hx le_rfl)))⟩⟩⟩
+ sSup_image.trans <| (biSup_adjoin_simple _).trans <|
+ le_antisymm (adjoin_le_iff.mpr le_rfl) <| subset_adjoin F (s : Set E)⟩⟩⟩
theorem exists_finset_of_mem_iSup {ι : Type*} {f : ι → IntermediateField F E} {x : E}
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset ι, x ∈ ⨆ i ∈ s, f i := by
@@ -699,9 +759,8 @@ theorem exists_finset_of_mem_iSup {ι : Type*} {f : ι → IntermediateField F E
theorem exists_finset_of_mem_supr' {ι : Type*} {f : ι → IntermediateField F E} {x : E}
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset (Σ i, f i), x ∈ ⨆ i ∈ s, F⟮(i.2 : E)⟯ := by
-- Porting note: writing `fun i x h => ...` does not work.
- refine' exists_finset_of_mem_iSup (SetLike.le_def.mp (iSup_le (fun i => _)) hx)
- intro x h
- exact SetLike.le_def.mp (le_iSup_of_le ⟨i, x, h⟩ (by simp)) (mem_adjoin_simple_self F x)
+ refine exists_finset_of_mem_iSup (SetLike.le_def.mp (iSup_le fun i ↦ ?_) hx)
+ exact fun x h ↦ SetLike.le_def.mp (le_iSup_of_le ⟨i, x, h⟩ (by simp)) (mem_adjoin_simple_self F x)
#align intermediate_field.exists_finset_of_mem_supr' IntermediateField.exists_finset_of_mem_supr'
theorem exists_finset_of_mem_supr'' {ι : Type*} {f : ι → IntermediateField F E}
@@ -917,6 +976,9 @@ theorem adjoin.finiteDimensional {x : L} (hx : IsIntegral K x) : FiniteDimension
PowerBasis.finiteDimensional (adjoin.powerBasis hx)
#align intermediate_field.adjoin.finite_dimensional IntermediateField.adjoin.finiteDimensional
+theorem isAlgebraic_adjoin_simple {x : L} (hx : IsIntegral K x) : Algebra.IsAlgebraic K K⟮x⟯ :=
+ have := adjoin.finiteDimensional hx; Algebra.isAlgebraic_of_finite K K⟮x⟯
+
theorem adjoin.finrank {x : L} (hx : IsIntegral K x) :
FiniteDimensional.finrank K K⟮x⟯ = (minpoly K x).natDegree := by
rw [PowerBasis.finrank (adjoin.powerBasis hx : _)]
@@ -977,6 +1039,32 @@ theorem _root_.minpoly.degree_le (x : L) [FiniteDimensional K L] :
degree_le_of_natDegree_le (minpoly.natDegree_le x)
#align minpoly.degree_le minpoly.degree_le
+/-- A compositum of algebraic extensions is algebraic -/
+theorem isAlgebraic_iSup {ι : Type*} {t : ι → IntermediateField K L}
+ (h : ∀ i, Algebra.IsAlgebraic K (t i)) :
+ Algebra.IsAlgebraic K (⨆ i, t i : IntermediateField K L) := by
+ rintro ⟨x, hx⟩
+ obtain ⟨s, hx⟩ := exists_finset_of_mem_supr' hx
+ rw [isAlgebraic_iff, Subtype.coe_mk, ← Subtype.coe_mk (p := (· ∈ _)) x hx, ← isAlgebraic_iff]
+ haveI : ∀ i : Σ i, t i, FiniteDimensional K K⟮(i.2 : L)⟯ := fun ⟨i, x⟩ ↦
+ adjoin.finiteDimensional (isIntegral_iff.1 (isAlgebraic_iff_isIntegral.1 (h i x)))
+ apply Algebra.isAlgebraic_of_finite
+#align intermediate_field.is_algebraic_supr IntermediateField.isAlgebraic_iSup
+
+theorem isAlgebraic_adjoin {S : Set L} (hS : ∀ x ∈ S, IsIntegral K x) :
+ Algebra.IsAlgebraic K (adjoin K S) := by
+ rw [← biSup_adjoin_simple, ← iSup_subtype'']
+ exact isAlgebraic_iSup fun x ↦ isAlgebraic_adjoin_simple (hS x x.2)
+
+/-- If `L / K` is a field extension, `S` is a finite subset of `L`, such that every element of `S`
+is integral (= algebraic) over `K`, then `K(S) / K` is a finite extension.
+A direct corollary of `finiteDimensional_iSup_of_finite`. -/
+theorem finiteDimensional_adjoin {S : Set L} [Finite S] (hS : ∀ x ∈ S, IsIntegral K x) :
+ FiniteDimensional K (adjoin K S) := by
+ rw [← biSup_adjoin_simple, ← iSup_subtype'']
+ haveI (x : S) := adjoin.finiteDimensional (hS x.1 x.2)
+ exact finiteDimensional_iSup_of_finite
+
end PowerBasis
/-- Algebra homomorphism `F⟮α⟯ →ₐ[F] K` are in bijection with the set of roots
@@ -1042,7 +1130,7 @@ theorem fg_of_noetherian (S : IntermediateField F E) [IsNoetherian F E] : S.FG :
theorem induction_on_adjoin_finset (S : Finset E) (P : IntermediateField F E → Prop) (base : P ⊥)
(ih : ∀ (K : IntermediateField F E), ∀ x ∈ S, P K → P (K⟮x⟯.restrictScalars F)) :
- P (adjoin F ↑S) := by
+ P (adjoin F S) := by
refine' Finset.induction_on' S _ (fun ha _ _ h => _)
· simp [base]
· rw [Finset.coe_insert, Set.insert_eq, Set.union_comm, ← adjoin_adjoin_left]
@@ -1070,309 +1158,132 @@ section AlgHomMkAdjoinSplits
variable (F E K : Type*) [Field F] [Field E] [Field K] [Algebra F E] [Algebra F K] {S : Set E}
/-- Lifts `L → K` of `F → K` -/
-def Lifts :=
- Σ L : IntermediateField F E, L →ₐ[F] K
+structure Lifts where
+ /-- The domain of a lift. -/
+ carrier : IntermediateField F E
+ /-- The lifted RingHom, expressed as an AlgHom. -/
+ emb : carrier →ₐ[F] K
#align intermediate_field.lifts IntermediateField.Lifts
variable {F E K}
instance : PartialOrder (Lifts F E K) where
- le x y := x.1 ≤ y.1 ∧ ∀ (s : x.1) (t : y.1), (s : E) = t → x.2 s = y.2 t
- le_refl x := ⟨le_refl x.1, fun s t hst => congr_arg x.2 (Subtype.ext hst)⟩
- le_trans x y z hxy hyz :=
- ⟨le_trans hxy.1 hyz.1, fun s u hsu =>
- Eq.trans (hxy.2 s ⟨s, hxy.1 s.mem⟩ rfl) (hyz.2 ⟨s, hxy.1 s.mem⟩ u hsu)⟩
+ le L₁ L₂ := ∃ h : L₁.carrier ≤ L₂.carrier, ∀ x, L₂.emb (inclusion h x) = L₁.emb x
+ le_refl L := ⟨le_rfl, by simp⟩
+ le_trans L₁ L₂ L₃ := by
+ rintro ⟨h₁₂, h₁₂'⟩ ⟨h₂₃, h₂₃'⟩
+ refine ⟨h₁₂.trans h₂₃, fun _ ↦ ?_⟩
+ rw [← inclusion_inclusion h₁₂ h₂₃, h₂₃', h₁₂']
le_antisymm := by
- rintro ⟨x1, x2⟩ ⟨y1, y2⟩ ⟨hxy1, hxy2⟩ ⟨hyx1, hyx2⟩
- obtain rfl : x1 = y1 := le_antisymm hxy1 hyx1
+ rintro ⟨L₁, e₁⟩ ⟨L₂, e₂⟩ ⟨h₁₂, h₁₂'⟩ ⟨h₂₁, h₂₁'⟩
+ obtain rfl : L₁ = L₂ := h₁₂.antisymm h₂₁
congr
- exact AlgHom.ext fun s => hxy2 s s rfl
+ exact AlgHom.ext h₂₁'
noncomputable instance : OrderBot (Lifts F E K) where
- bot := ⟨⊥, (Algebra.ofId F K).comp (botEquiv F E).toAlgHom⟩
- bot_le x :=
- ⟨bot_le, fun s t hst => by
- cases' IntermediateField.mem_bot.mp s.mem with u hu
- rw [show s = (algebraMap F _) u from Subtype.ext hu.symm, AlgHom.commutes]
- rw [show t = (algebraMap F _) u from Subtype.ext (Eq.trans hu hst).symm, AlgHom.commutes]⟩
+ bot := ⟨⊥, (Algebra.ofId F K).comp (botEquiv F E)⟩
+ bot_le L := ⟨bot_le, fun x ↦ by
+ obtain ⟨x, rfl⟩ := (botEquiv F E).symm.surjective x
+ simp_rw [AlgHom.comp_apply, AlgHom.coe_coe, AlgEquiv.apply_symm_apply]
+ exact L.emb.commutes x⟩
noncomputable instance : Inhabited (Lifts F E K) :=
⟨⊥⟩
-theorem Lifts.eq_of_le {x y : Lifts F E K} (hxy : x ≤ y) (s : x.1) : x.2 s = y.2 ⟨s, hxy.1 s.mem⟩ :=
- hxy.2 s ⟨s, hxy.1 s.mem⟩ rfl
-#align intermediate_field.lifts.eq_of_le IntermediateField.Lifts.eq_of_le
-
-theorem Lifts.exists_max_two {c : Set (Lifts F E K)} {x y : Lifts F E K} (hc : IsChain (· ≤ ·) c)
- (hx : x ∈ insert ⊥ c) (hy : y ∈ insert ⊥ c) :
- ∃ z : Lifts F E K, z ∈ insert ⊥ c ∧ x ≤ z ∧ y ≤ z := by
- cases' (hc.insert fun _ _ _ => Or.inl bot_le).total hx hy with hxy hyx
- · exact ⟨y, hy, hxy, le_refl y⟩
- · exact ⟨x, hx, le_refl x, hyx⟩
-#align intermediate_field.lifts.exists_max_two IntermediateField.Lifts.exists_max_two
-
-theorem Lifts.exists_max_three {c : Set (Lifts F E K)} {x y z : Lifts F E K}
- (hc : IsChain (· ≤ ·) c) (hx : x ∈ insert ⊥ c) (hy : y ∈ insert ⊥ c)
- (hz : z ∈ insert ⊥ c) :
- ∃ w : Lifts F E K, w ∈ insert ⊥ c ∧ x ≤ w ∧ y ≤ w ∧ z ≤ w := by
- obtain ⟨v, hv, hxv, hyv⟩ := Lifts.exists_max_two hc hx hy
- obtain ⟨w, hw, hzw, hvw⟩ := Lifts.exists_max_two hc hz hv
- exact ⟨w, hw, le_trans hxv hvw, le_trans hyv hvw, hzw⟩
-#align intermediate_field.lifts.exists_max_three IntermediateField.Lifts.exists_max_three
-
-/-- An upper bound on a chain of lifts -/
-def Lifts.upperBoundIntermediateField {c : Set (Lifts F E K)} (hc : IsChain (· ≤ ·) c) :
- IntermediateField F E where
- carrier s := ∃ x : Lifts F E K, x ∈ insert ⊥ c ∧ (s ∈ x.1 : Prop)
- zero_mem' := ⟨⊥, Set.mem_insert ⊥ c, zero_mem ⊥⟩
- one_mem' := ⟨⊥, Set.mem_insert ⊥ c, one_mem ⊥⟩
- inv_mem' := by rintro _ ⟨x, y, h⟩; exact ⟨x, ⟨y, x.1.inv_mem h⟩⟩
- add_mem' := by
- rintro _ _ ⟨x, hx, ha⟩ ⟨y, hy, hb⟩
- obtain ⟨z, hz, hxz, hyz⟩ := Lifts.exists_max_two hc hx hy
- exact ⟨z, hz, z.1.add_mem (hxz.1 ha) (hyz.1 hb)⟩
- mul_mem' := by
- rintro _ _ ⟨x, hx, ha⟩ ⟨y, hy, hb⟩
- obtain ⟨z, hz, hxz, hyz⟩ := Lifts.exists_max_two hc hx hy
- exact ⟨z, hz, z.1.mul_mem (hxz.1 ha) (hyz.1 hb)⟩
- algebraMap_mem' s := ⟨⊥, Set.mem_insert ⊥ c, algebraMap_mem ⊥ s⟩
-#align intermediate_field.lifts.upper_bound_intermediate_field IntermediateField.Lifts.upperBoundIntermediateField
-
-/-- The lift on the upper bound on a chain of lifts -/
-noncomputable def Lifts.upperBoundAlgHom {c : Set (Lifts F E K)} (hc : IsChain (· ≤ ·) c) :
- Lifts.upperBoundIntermediateField hc →ₐ[F] K where
- toFun s := (Classical.choose s.mem).2 ⟨s, (Classical.choose_spec s.mem).2⟩
- map_zero' := AlgHom.map_zero _
- map_one' := AlgHom.map_one _
- map_add' s t := by
- obtain ⟨w, _, hxw, hyw, hzw⟩ :=
- Lifts.exists_max_three hc (Classical.choose_spec s.mem).1 (Classical.choose_spec t.mem).1
- (Classical.choose_spec (s + t).mem).1
-
- simp only [Subsemiring.coe_add, Subalgebra.coe_toSubsemiring, coe_toSubalgebra,
- Lifts.eq_of_le hzw, Lifts.eq_of_le hxw, Lifts.eq_of_le hyw, ← w.2.map_add,
- AddMemClass.mk_add_mk]
- map_mul' s t := by
- obtain ⟨w, _, hxw, hyw, hzw⟩ :=
- Lifts.exists_max_three hc (Classical.choose_spec s.mem).1 (Classical.choose_spec t.mem).1
- (Classical.choose_spec (s * t).mem).1
- simp only [Submonoid.coe_mul, Subsemiring.coe_toSubmonoid, Subalgebra.coe_toSubsemiring,
- coe_toSubalgebra, Lifts.eq_of_le hzw, Lifts.eq_of_le hxw, Lifts.eq_of_le hyw, ← w.2.map_mul,
- Submonoid.mk_mul_mk]
- commutes' _ := AlgHom.commutes _ _
-#align intermediate_field.lifts.upper_bound_alg_hom IntermediateField.Lifts.upperBoundAlgHom
-
-/-- An upper bound on a chain of lifts -/
-noncomputable def Lifts.upperBound {c : Set (Lifts F E K)} (hc : IsChain (· ≤ ·) c) : Lifts F E K :=
- ⟨Lifts.upperBoundIntermediateField hc, Lifts.upperBoundAlgHom hc⟩
-#align intermediate_field.lifts.upper_bound IntermediateField.Lifts.upperBound
-
+/-- A chain of lifts has an upper bound. -/
theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤ ·) c) :
- ∃ ub, ∀ a ∈ c, a ≤ ub :=
- ⟨Lifts.upperBound hc, by
- intro x hx
- constructor
- · exact fun s hs => ⟨x, Set.mem_insert_of_mem ⊥ hx, hs⟩
- · intro s t hst
- change x.2 s = (Classical.choose t.mem).2 ⟨t, (Classical.choose_spec t.mem).2⟩
- obtain ⟨z, _, hxz, hyz⟩ :=
- Lifts.exists_max_two hc (Set.mem_insert_of_mem ⊥ hx) (Classical.choose_spec t.mem).1
- rw [Lifts.eq_of_le hxz, Lifts.eq_of_le hyz]
- exact congr_arg z.2 (Subtype.ext hst)⟩
+ ∃ ub, ∀ a ∈ c, a ≤ ub := by
+ let t (i : ↑(insert ⊥ c)) := i.val.carrier
+ let t' (i) := (t i).toSubalgebra
+ have hc := hc.insert fun _ _ _ ↦ .inl bot_le
+ have dir : Directed (· ≤ ·) t := hc.directedOn.directed_val.mono_comp _ fun _ _ h ↦ h.1
+ refine ⟨⟨iSup t, (Subalgebra.iSupLift t' dir (fun i ↦ i.val.emb) (fun i j h ↦ ?_) _ rfl).comp
+ (Subalgebra.equivOfEq _ _ <| toSubalgebra_iSup_of_directed dir)⟩,
+ fun L hL ↦ have hL := Set.mem_insert_of_mem ⊥ hL; ⟨le_iSup t ⟨L, hL⟩, fun x ↦ ?_⟩⟩
+ · refine AlgHom.ext fun x ↦ (hc.total i.2 j.2).elim (fun hij ↦ (hij.snd x).symm) fun hji ↦ ?_
+ erw [AlgHom.comp_apply, ← hji.snd (Subalgebra.inclusion h x),
+ inclusion_inclusion, inclusion_self, AlgHom.id_apply x]
+ · dsimp only [AlgHom.comp_apply]
+ exact Subalgebra.iSupLift_inclusion (K := t') (i := ⟨L, hL⟩) x (le_iSup t' ⟨L, hL⟩)
#align intermediate_field.lifts.exists_upper_bound IntermediateField.Lifts.exists_upper_bound
--- Porting note: instance `alg` added by hand. The proof is very slow.
-/-- Extend a lift `x : Lifts F E K` to an element `s : E` whose conjugates are all in `K` -/
-noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
- (h2 : (minpoly F s).Splits (algebraMap F K)) : Lifts F E K :=
- let h3 : IsIntegral x.1 s := isIntegral_of_isScalarTower h1
- let key : (minpoly x.1 s).Splits x.2.toRingHom :=
- splits_of_splits_of_dvd _ (map_ne_zero (minpoly.ne_zero h1))
- ((splits_map_iff _ _).mpr (by convert h2; exact RingHom.ext fun y => x.2.commutes y))
- (minpoly.dvd_map_of_isScalarTower _ _ _)
- letI : Algebra {y // y ∈ x.fst} {y // y ∈ restrictScalars F {z // z ∈ x.fst}⟮s⟯} :=
- {z // z ∈ x.fst}⟮s⟯.toSubalgebra.algebra
- letI := x.2.toRingHom.toAlgebra
- ⟨x.1⟮s⟯.restrictScalars F,
- (@algHomEquivSigma F x.1 (x.1⟮s⟯.restrictScalars F) K _ _ _ _ _ _ _
- (IntermediateField.algebra x.1⟮s⟯) (IsScalarTower.of_algebraMap_eq fun _ => rfl)).invFun
- ⟨x.2,
- (@algHomAdjoinIntegralEquiv x.1 _ E _ _ s K _ _ h3).invFun
- ⟨rootOfSplits x.2.toRingHom key (ne_of_gt (minpoly.degree_pos h3)), by
- rw [mem_aroots, and_iff_right (minpoly.ne_zero h3)]
- exact map_rootOfSplits x.2.toRingHom key (ne_of_gt (minpoly.degree_pos h3))⟩⟩⟩
-#align intermediate_field.lifts.lift_of_splits IntermediateField.Lifts.liftOfSplits
-
--- Porting note: instance `alg` added by hand.
--- Porting note: Lean3 is able to guess `φ`
-theorem Lifts.le_lifts_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
- (h2 : (minpoly F s).Splits (algebraMap F K)) : x ≤ x.liftOfSplits h1 h2 :=
- ⟨fun z hz => algebraMap_mem x.1⟮s⟯ ⟨z, hz⟩, fun t u htu =>
- Eq.symm
- (by
- let alg : Algebra x.1 x.1⟮s⟯ := x.1⟮s⟯.toSubalgebra.algebra
- rw [← show algebraMap x.1 x.1⟮s⟯ t = u from Subtype.ext htu]
- letI : Algebra x.1 K := x.2.toRingHom.toAlgebra
- let I1 : IsIntegral x.1 s := isIntegral_of_isScalarTower h1
- let key : (minpoly x.1 s).Splits x.2.toRingHom :=
- splits_of_splits_of_dvd _ (map_ne_zero (minpoly.ne_zero h1))
- ((splits_map_iff _ _).mpr (by convert h2; exact RingHom.ext fun y => x.2.commutes y))
- (minpoly.dvd_map_of_isScalarTower _ _ _)
- have I2 := (ne_of_gt (minpoly.degree_pos I1))
- have I3 : rootOfSplits (AlgHom.toRingHom x.2) key (ne_of_gt (minpoly.degree_pos I1)) ∈
- (minpoly x.1 s).aroots K := by
- rw [mem_aroots, and_iff_right (minpoly.ne_zero I1)]
- exact map_rootOfSplits x.2.toRingHom key (ne_of_gt (minpoly.degree_pos I1))
- let φ : x.1⟮s⟯ →ₐ[x.1] K := ((algHomAdjoinIntegralEquiv x.1 I1).invFun
- ⟨rootOfSplits (AlgHom.toRingHom x.2) key I2, I3⟩)
-
- exact AlgHom.commutes φ t)⟩
-#align intermediate_field.lifts.le_lifts_of_splits IntermediateField.Lifts.le_lifts_of_splits
-
-theorem Lifts.mem_lifts_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
- (h2 : (minpoly F s).Splits (algebraMap F K)) : s ∈ (x.liftOfSplits h1 h2).1 :=
- mem_adjoin_simple_self x.1 s
-#align intermediate_field.lifts.mem_lifts_of_splits IntermediateField.Lifts.mem_lifts_of_splits
-
+/-- Given an element `s : E` whose conjugates are all in `K`, any lift can be extended to one
+ whose carrier contains `s`. -/
theorem Lifts.exists_lift_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
- (h2 : (minpoly F s).Splits (algebraMap F K)) : ∃ y, x ≤ y ∧ s ∈ y.1 :=
- ⟨x.liftOfSplits h1 h2, x.le_lifts_of_splits h1 h2, x.mem_lifts_of_splits h1 h2⟩
+ (h2 : (minpoly F s).Splits (algebraMap F K)) : ∃ y, x ≤ y ∧ s ∈ y.carrier :=
+ have I1 : IsIntegral x.carrier s := isIntegral_of_isScalarTower h1
+ have I2 := (minpoly.degree_pos I1).ne'
+ have key : (minpoly x.carrier s).Splits x.emb.toRingHom :=
+ splits_of_splits_of_dvd _ (map_ne_zero (minpoly.ne_zero h1))
+ ((splits_map_iff _ _).2 (x.emb.comp_algebraMap ▸ h2)) (minpoly.dvd_map_of_isScalarTower _ _ _)
+ letI : Algebra x.carrier K := x.emb.toRingHom.toAlgebra
+ let carrier := x.carrier⟮s⟯.restrictScalars F
+ letI : Algebra x.carrier carrier := x.carrier⟮s⟯.toSubalgebra.algebra
+ let φ : carrier →ₐ[x.carrier] K := ((algHomAdjoinIntegralEquiv x.carrier I1).symm
+ ⟨rootOfSplits x.emb.toRingHom key I2, by
+ rw [mem_aroots, and_iff_right (minpoly.ne_zero I1)]
+ exact map_rootOfSplits x.emb.toRingHom key I2⟩)
+ ⟨⟨carrier, (@algHomEquivSigma F x.carrier carrier K _ _ _ _ _ _ _ _
+ (IsScalarTower.of_algebraMap_eq fun _ ↦ rfl)).symm ⟨x.emb, φ⟩⟩,
+ ⟨fun z hz ↦ algebraMap_mem x.carrier⟮s⟯ ⟨z, hz⟩, φ.commutes⟩,
+ mem_adjoin_simple_self x.carrier s⟩
#align intermediate_field.lifts.exists_lift_of_splits IntermediateField.Lifts.exists_lift_of_splits
-theorem algHom_mk_adjoin_splits
- (hK : ∀ s ∈ S, IsIntegral F (s : E) ∧ (minpoly F s).Splits (algebraMap F K)) :
- Nonempty (adjoin F S →ₐ[F] K) := by
- obtain ⟨x, hx⟩ : ∃ m : Lifts F E K, ∀ a, m ≤ a → a = m :=
- zorn_partialOrder Lifts.exists_upper_bound
- refine'
- ⟨{ toFun := (fun s => x.2 ⟨s, adjoin_le_iff.mpr (fun s hs => _) s.mem⟩)
- map_one' := x.2.map_one
- map_mul' := (fun s t => x.2.map_mul ⟨s, _⟩ ⟨t, _⟩)
- map_zero' := x.2.map_zero
- map_add' := (fun s t => x.2.map_add ⟨s, _⟩ ⟨t, _⟩)
- commutes' := x.2.commutes }⟩
- rcases x.exists_lift_of_splits (hK s hs).1 (hK s hs).2 with ⟨y, h1, h2⟩
- rwa [hx y h1] at h2
-#align intermediate_field.alg_hom_mk_adjoin_splits IntermediateField.algHom_mk_adjoin_splits
-
-theorem algHom_mk_adjoin_splits' (hS : adjoin F S = ⊤)
- (hK : ∀ x ∈ S, IsIntegral F (x : E) ∧ (minpoly F x).Splits (algebraMap F K)) :
- Nonempty (E →ₐ[F] K) := by
- cases' algHom_mk_adjoin_splits hK with ϕ
- rw [hS] at ϕ
- exact ⟨ϕ.comp topEquiv.symm.toAlgHom⟩
-#align intermediate_field.alg_hom_mk_adjoin_splits' IntermediateField.algHom_mk_adjoin_splits'
+variable (hK : ∀ s ∈ S, IsIntegral F s ∧ (minpoly F s).Splits (algebraMap F K))
+ (hK' : ∀ s : E, IsIntegral F s ∧ (minpoly F s).Splits (algebraMap F K))
+ {L : IntermediateField F E} (f : L →ₐ[F] K) (hL : L ≤ adjoin F S)
-end AlgHomMkAdjoinSplits
+-- The following uses the hypothesis `hK`.
-section Supremum
+theorem exists_algHom_adjoin_of_splits : ∃ φ : adjoin F S →ₐ[F] K, φ.comp (inclusion hL) = f := by
+ obtain ⟨φ, hfφ, hφ⟩ := zorn_nonempty_Ici₀ _
+ (fun c _ hc _ _ ↦ Lifts.exists_upper_bound c hc) ⟨L, f⟩ le_rfl
+ refine ⟨φ.emb.comp (inclusion <| adjoin_le_iff.mpr fun s hs ↦ ?_), ?_⟩
+ · rcases φ.exists_lift_of_splits (hK s hs).1 (hK s hs).2 with ⟨y, h1, h2⟩
+ exact (hφ y h1).1 h2
+ · ext; apply hfφ.2
-variable {K L : Type*} [Field K] [Field L] [Algebra K L] (E1 E2 : IntermediateField K L)
+theorem nonempty_algHom_adjoin_of_splits : Nonempty (adjoin F S →ₐ[F] K) :=
+ have ⟨φ, _⟩ := exists_algHom_adjoin_of_splits hK (⊥ : Lifts F E K).emb bot_le; ⟨φ⟩
+#align intermediate_field.alg_hom_mk_adjoin_splits IntermediateField.nonempty_algHom_adjoin_of_splits
-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)
-#align intermediate_field.le_sup_to_subalgebra IntermediateField.le_sup_toSubalgebra
+variable (hS : adjoin F S = ⊤)
-theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
- (E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra := by
- let S1 := E1.toSubalgebra
- let S2 := E2.toSubalgebra
- refine'
- le_antisymm
- (show _ ≤ (S1 ⊔ S2).toIntermediateField _ from
- sup_le (show S1 ≤ _ from le_sup_left) (show S2 ≤ _ from le_sup_right))
- (le_sup_toSubalgebra E1 E2)
- suffices IsField (S1 ⊔ S2 : Subalgebra K L) by
- intro x hx
- by_cases hx' : (⟨x, hx⟩ : (S1 ⊔ S2 : Subalgebra K L)) = 0
- · rw [← Subtype.coe_mk x, hx', Subalgebra.coe_zero, inv_zero]
- exact (S1 ⊔ S2).zero_mem
- · obtain ⟨y, h⟩ := this.mul_inv_cancel hx'
- exact (congr_arg (· ∈ S1 ⊔ S2) <| eq_inv_of_mul_eq_one_right <| Subtype.ext_iff.mp h).mp y.2
- exact
- isField_of_isIntegral_of_isField'
- (isIntegral_sup.mpr ⟨Algebra.isIntegral_of_finite K E1, Algebra.isIntegral_of_finite K E2⟩)
- (Field.toIsField K)
-#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra
+theorem exists_algHom_of_adjoin_splits : ∃ φ : E →ₐ[F] K, φ.comp L.val = f :=
+ have ⟨φ, hφ⟩ := exists_algHom_adjoin_of_splits hK f (hS.symm ▸ le_top)
+ ⟨φ.comp ((equivOfEq hS).trans topEquiv).symm.toAlgHom, hφ⟩
-instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
- FiniteDimensional K (E1 ⊔ E2 : IntermediateField K L) := by
- let g := Algebra.TensorProduct.productMap E1.val E2.val
- suffices g.range = (E1 ⊔ E2).toSubalgebra by
- have h : FiniteDimensional K (Subalgebra.toSubmodule g.range) :=
- g.toLinearMap.finiteDimensional_range
- rwa [this] at h
- rw [Algebra.TensorProduct.productMap_range, E1.range_val, E2.range_val, sup_toSubalgebra]
-#align intermediate_field.finite_dimensional_sup IntermediateField.finiteDimensional_sup
+theorem nonempty_algHom_of_adjoin_splits : Nonempty (E →ₐ[F] K) :=
+ have ⟨φ, _⟩ := exists_algHom_of_adjoin_splits hK (⊥ : Lifts F E K).emb hS; ⟨φ⟩
+#align intermediate_field.alg_hom_mk_adjoin_splits' IntermediateField.nonempty_algHom_of_adjoin_splits
-instance finiteDimensional_iSup_of_finite {ι : Type*} {t : ι → IntermediateField K L}
- [h : Finite ι] [∀ i, FiniteDimensional K (t i)] :
- FiniteDimensional K (⨆ i, t i : IntermediateField K L) := by
- rw [← iSup_univ]
- let P : Set ι → Prop := fun s => FiniteDimensional K (⨆ i ∈ s, t i : IntermediateField K L)
- change P Set.univ
- apply Set.Finite.induction_on
- all_goals dsimp only
- · exact Set.finite_univ
- · rw [iSup_emptyset]
- exact (botEquiv K L).symm.toLinearEquiv.finiteDimensional
- · intro _ s _ _ hs
- rw [iSup_insert]
- exact IntermediateField.finiteDimensional_sup _ _
-#align intermediate_field.finite_dimensional_supr_of_finite IntermediateField.finiteDimensional_iSup_of_finite
+variable {x : E} (hx : x ∈ adjoin F S) {y : K} (hy : aeval y (minpoly F x) = 0)
-/-- If `L / K` is an algebraic extension, then for any finite subset `S` of `L`, `K(S) / K` is a
-finite extension. A direct corollary of `finiteDimensional_iSup_of_finite`. -/
-theorem finiteDimensional_adjoin_of_finite_of_isAlgebraic
- (halg : Algebra.IsAlgebraic K L) (S : Set L) [Finite S] :
- FiniteDimensional K (adjoin K S) := by
- let t : S → IntermediateField K L := fun x ↦ K⟮x.1⟯
- have h : ∀ x : S, FiniteDimensional K (t x) := fun x ↦
- adjoin.finiteDimensional <| isAlgebraic_iff_isIntegral.1 (halg x.1)
- have hfin := finiteDimensional_iSup_of_finite (t := t)
- have := (gc (F := K) (E := L)).l_iSup (f := fun (x : S) ↦ {x.1})
- rw [Set.iSup_eq_iUnion, Set.iUnion_singleton_eq_range, Subtype.range_coe_subtype,
- Set.setOf_mem_eq] at this
- rwa [← this] at hfin
-
-instance finiteDimensional_iSup_of_finset {ι : Type*} {f : ι → IntermediateField K L}
- /-Porting note: changed `h` from `∀ i ∈ s, FiniteDimensional K (f i)` because this caused an
- error. See `finiteDimensional_iSup_of_finset'` for a stronger version, that was the one
- used in mathlib3.-/
- {s : Finset ι} [h : ∀ i, FiniteDimensional K (f i)] :
- FiniteDimensional K (⨆ i ∈ s, f i : IntermediateField K L) := by
- haveI : ∀ i : { i // i ∈ s }, FiniteDimensional K (f i) := fun i => h i
- have : ⨆ i ∈ s, f i = ⨆ i : { i // i ∈ s }, f i :=
- le_antisymm (iSup_le fun i => iSup_le fun h => le_iSup (fun i : { i // i ∈ s } => f i) ⟨i, h⟩)
- (iSup_le fun i => le_iSup_of_le i (le_iSup_of_le i.2 le_rfl))
- exact this.symm ▸ IntermediateField.finiteDimensional_iSup_of_finite
-#align intermediate_field.finite_dimensional_supr_of_finset IntermediateField.finiteDimensional_iSup_of_finset
+theorem exists_algHom_adjoin_of_splits_of_aeval : ∃ φ : adjoin F S →ₐ[F] K, φ ⟨x, hx⟩ = y := by
+ have ix := isAlgebraic_adjoin (fun s hs ↦ (hK s hs).1) ⟨x, hx⟩
+ rw [isAlgebraic_iff_isIntegral, isIntegral_iff] at ix
+ obtain ⟨φ, hφ⟩ := exists_algHom_adjoin_of_splits hK ((algHomAdjoinIntegralEquiv F ix).symm
+ ⟨y, mem_aroots.mpr ⟨minpoly.ne_zero ix, hy⟩⟩) (adjoin_simple_le_iff.mpr hx)
+ exact ⟨φ, (FunLike.congr_fun hφ <| AdjoinSimple.gen F x).trans <|
+ algHomAdjoinIntegralEquiv_symm_apply_gen F ix _⟩
-theorem finiteDimensional_iSup_of_finset' {ι : Type*} {f : ι → IntermediateField K L}
- /-Porting note: this was the mathlib3 version. Using `[h : ...]`, as in mathlib3, causes the
- error "invalid parametric local instance".-/
- {s : Finset ι} (h : ∀ i, i ∈ s → FiniteDimensional K (f i)) :
- FiniteDimensional K (⨆ i ∈ s, f i : IntermediateField K L) := by
- haveI : ∀ i : { i // i ∈ s }, FiniteDimensional K (f i) := fun i => h i i.2
- have : ⨆ i ∈ s, f i = ⨆ i : { i // i ∈ s }, f i :=
- le_antisymm (iSup_le fun i => iSup_le fun h => le_iSup (fun i : { i // i ∈ s } => f i) ⟨i, h⟩)
- (iSup_le fun i => le_iSup_of_le i (le_iSup_of_le i.2 le_rfl))
- exact this.symm ▸ IntermediateField.finiteDimensional_iSup_of_finite
+theorem exists_algHom_of_adjoin_splits_of_aeval : ∃ φ : E →ₐ[F] K, φ x = y :=
+ have ⟨φ, hφ⟩ := exists_algHom_adjoin_of_splits_of_aeval hK (hS ▸ mem_top) hy
+ ⟨φ.comp ((equivOfEq hS).trans topEquiv).symm.toAlgHom, hφ⟩
-/-- A compositum of algebraic extensions is algebraic -/
-theorem isAlgebraic_iSup {ι : Type*} {f : ι → IntermediateField K L}
- (h : ∀ i, Algebra.IsAlgebraic K (f i)) :
- Algebra.IsAlgebraic K (⨆ i, f i : IntermediateField K L) := by
- rintro ⟨x, hx⟩
- obtain ⟨s, hx⟩ := exists_finset_of_mem_supr' hx
- rw [isAlgebraic_iff, Subtype.coe_mk, ← Subtype.coe_mk (p := fun x => x ∈ _) x hx,
- ← isAlgebraic_iff]
- haveI : ∀ i : Σ i, f i, FiniteDimensional K K⟮(i.2 : L)⟯ := fun ⟨i, x⟩ =>
- adjoin.finiteDimensional (isIntegral_iff.1 (isAlgebraic_iff_isIntegral.1 (h i x)))
- apply Algebra.isAlgebraic_of_finite
-#align intermediate_field.is_algebraic_supr IntermediateField.isAlgebraic_iSup
+/- The following uses the hypothesis
+ (hK' : ∀ s : E, IsIntegral F s ∧ (minpoly F s).Splits (algebraMap F K)) -/
-end Supremum
+theorem exists_algHom_of_splits : ∃ φ : E →ₐ[F] K, φ.comp L.val = f :=
+ exists_algHom_of_adjoin_splits (fun x _ ↦ hK' x) f (adjoin_univ F E)
+
+theorem nonempty_algHom_of_splits : Nonempty (E →ₐ[F] K) :=
+ nonempty_algHom_of_adjoin_splits (fun x _ ↦ hK' x) (adjoin_univ F E)
+
+theorem exists_algHom_of_splits_of_aeval : ∃ φ : E →ₐ[F] K, φ x = y :=
+ exists_algHom_of_adjoin_splits_of_aeval (fun x _ ↦ hK' x) (adjoin_univ F E) hy
+
+end AlgHomMkAdjoinSplits
end IntermediateField
Added Field.exists_primitive_element_iff_finite_intermediateField
: a finite extension E / F
has a primitive element if and only if the intermediate fields between E / F
are finitely many.
Also known as Steinitz Theorem https://en.wikipedia.org/wiki/Primitive_element_theorem#The_theorems.
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Junyan Xu <junyanxumath@gmail.com> Co-authored-by: Mario Carneiro <di.gama@gmail.com>
@@ -48,6 +48,23 @@ def adjoin : IntermediateField F E :=
algebraMap_mem' := fun x => Subfield.subset_closure (Or.inl (Set.mem_range_self x)) }
#align intermediate_field.adjoin IntermediateField.adjoin
+variable {S}
+
+theorem mem_adjoin_iff (x : E) :
+ x ∈ adjoin F S ↔ ∃ r s : MvPolynomial S F,
+ x = MvPolynomial.aeval Subtype.val r / MvPolynomial.aeval Subtype.val s := by
+ simp only [adjoin, mem_mk, Subring.mem_toSubsemiring, Subfield.mem_toSubring,
+ Subfield.mem_closure_iff, ← Algebra.adjoin_eq_ring_closure, Subalgebra.mem_toSubring,
+ Algebra.adjoin_eq_range, AlgHom.mem_range, exists_exists_eq_and]
+ tauto
+
+theorem mem_adjoin_simple_iff {α : E} (x : E) :
+ x ∈ adjoin F {α} ↔ ∃ r s : F[X], x = aeval α r / aeval α s := by
+ simp only [adjoin, mem_mk, Subring.mem_toSubsemiring, Subfield.mem_toSubring,
+ Subfield.mem_closure_iff, ← Algebra.adjoin_eq_ring_closure, Subalgebra.mem_toSubring,
+ Algebra.adjoin_singleton_eq_range_aeval, AlgHom.mem_range, exists_exists_eq_and]
+ tauto
+
end AdjoinDef
section Lattice
@@ -423,6 +440,31 @@ theorem adjoin_map {E' : Type*} [Field E'] [Algebra F E'] (f : E →ₐ[F] E') :
rfl
#align intermediate_field.adjoin_map IntermediateField.adjoin_map
+@[simp]
+theorem lift_adjoin (K : IntermediateField F E) (S : Set K) :
+ lift (adjoin F S) = adjoin F (Subtype.val '' S) :=
+ adjoin_map _ _ _
+
+theorem lift_adjoin_simple (K : IntermediateField F E) (α : K) :
+ lift (adjoin F {α}) = adjoin F {α.1} := by
+ simp only [lift_adjoin, Set.image_singleton]
+
+@[simp]
+theorem lift_bot (K : IntermediateField F E) :
+ lift (F := K) ⊥ = ⊥ := map_bot _
+
+@[simp]
+theorem lift_top (K : IntermediateField F E) :
+ lift (F := K) ⊤ = K := by rw [lift, ←AlgHom.fieldRange_eq_map, fieldRange_val]
+
+@[simp]
+theorem adjoin_self (K : IntermediateField F E) :
+ adjoin F K = K := le_antisymm (adjoin_le_iff.2 fun _ ↦ id) (subset_adjoin F _)
+
+theorem restrictScalars_adjoin (K : IntermediateField F E) (S : Set E) :
+ restrictScalars F (adjoin K S) = adjoin F (K ∪ S) := by
+ rw [← adjoin_self _ K, adjoin_adjoin_left, adjoin_self _ K]
+
theorem algebra_adjoin_le_adjoin : Algebra.adjoin F S ≤ (adjoin F S).toSubalgebra :=
Algebra.adjoin_le (subset_adjoin _ _)
#align intermediate_field.algebra_adjoin_le_adjoin IntermediateField.algebra_adjoin_le_adjoin
@@ -881,6 +923,49 @@ theorem adjoin.finrank {x : L} (hx : IsIntegral K x) :
rfl
#align intermediate_field.adjoin.finrank IntermediateField.adjoin.finrank
+/-- If `K / E / F` is a field extension tower, `S ⊂ K` is such that `F(S) = K`,
+then `E(S) = K`. -/
+theorem adjoin_eq_top_of_adjoin_eq_top [Algebra E K] [IsScalarTower F E K]
+ {S : Set K} (hprim : adjoin F S = ⊤) : adjoin E S = ⊤ :=
+ restrictScalars_injective F <| by
+ rw [restrictScalars_top, ← top_le_iff, ← hprim, adjoin_le_iff,
+ coe_restrictScalars, ← adjoin_le_iff]
+
+/-- If `E / F` is a finite extension such that `E = F(α)`, then for any intermediate field `K`, the
+`F` adjoin the coefficients of `minpoly K α` is equal to `K` itself. -/
+theorem adjoin_minpoly_coeff_of_exists_primitive_element
+ [FiniteDimensional F E] (hprim : adjoin F {α} = ⊤) (K : IntermediateField F E) :
+ adjoin F ((minpoly K α).map (algebraMap K E)).frange = K := by
+ set g := (minpoly K α).map (algebraMap K E)
+ set K' : IntermediateField F E := adjoin F g.frange
+ have hsub : K' ≤ K := by
+ refine adjoin_le_iff.mpr fun x ↦ ?_
+ rw [Finset.mem_coe, mem_frange_iff]
+ rintro ⟨n, -, rfl⟩
+ rw [coeff_map]
+ apply Subtype.mem
+ have g_lifts : g ∈ lifts (algebraMap K' E) := by
+ refine g.lifts_iff_coeff_lifts.mpr fun n ↦ ?_
+ erw [Subtype.range_val]
+ by_cases hn : n ∈ g.support
+ · exact subset_adjoin F _ (mem_frange_iff.mpr ⟨n, hn, rfl⟩)
+ · exact not_mem_support_iff.mp hn ▸ zero_mem K'
+ obtain ⟨p, hp⟩ := g.lifts_and_natDegree_eq_and_monic
+ g_lifts ((minpoly.monic <| isIntegral_of_finite K α).map _)
+ have dvd_p : minpoly K' α ∣ p
+ · apply minpoly.dvd
+ rw [aeval_def, eval₂_eq_eval_map, hp.1, ← eval₂_eq_eval_map, ← aeval_def]
+ exact minpoly.aeval K α
+ have finrank_eq : ∀ K : IntermediateField F E, finrank K E = natDegree (minpoly K α)
+ · intro K
+ have := adjoin.finrank (isIntegral_of_finite K α)
+ erw [adjoin_eq_top_of_adjoin_eq_top F hprim, finrank_top K E] at this
+ exact this
+ refine eq_of_le_of_finrank_le' hsub ?_
+ simp_rw [finrank_eq]
+ convert natDegree_le_of_dvd dvd_p hp.2.2.ne_zero using 1
+ rw [hp.2.1, natDegree_map]
+
theorem _root_.minpoly.natDegree_le (x : L) [FiniteDimensional K L] :
(minpoly K x).natDegree ≤ finrank K L :=
le_of_eq_of_le (IntermediateField.adjoin.finrank (isIntegral_of_finite _ _)).symm
@@ -1236,6 +1321,20 @@ instance finiteDimensional_iSup_of_finite {ι : Type*} {t : ι → IntermediateF
exact IntermediateField.finiteDimensional_sup _ _
#align intermediate_field.finite_dimensional_supr_of_finite IntermediateField.finiteDimensional_iSup_of_finite
+/-- If `L / K` is an algebraic extension, then for any finite subset `S` of `L`, `K(S) / K` is a
+finite extension. A direct corollary of `finiteDimensional_iSup_of_finite`. -/
+theorem finiteDimensional_adjoin_of_finite_of_isAlgebraic
+ (halg : Algebra.IsAlgebraic K L) (S : Set L) [Finite S] :
+ FiniteDimensional K (adjoin K S) := by
+ let t : S → IntermediateField K L := fun x ↦ K⟮x.1⟯
+ have h : ∀ x : S, FiniteDimensional K (t x) := fun x ↦
+ adjoin.finiteDimensional <| isAlgebraic_iff_isIntegral.1 (halg x.1)
+ have hfin := finiteDimensional_iSup_of_finite (t := t)
+ have := (gc (F := K) (E := L)).l_iSup (f := fun (x : S) ↦ {x.1})
+ rw [Set.iSup_eq_iUnion, Set.iUnion_singleton_eq_range, Subtype.range_coe_subtype,
+ Set.setOf_mem_eq] at this
+ rwa [← this] at hfin
+
instance finiteDimensional_iSup_of_finset {ι : Type*} {f : ι → IntermediateField K L}
/-Porting note: changed `h` from `∀ i ∈ s, FiniteDimensional K (f i)` because this caused an
error. See `finiteDimensional_iSup_of_finset'` for a stronger version, that was the one
@@ -791,8 +791,7 @@ theorem bot_eq_top_of_finrank_adjoin_le_one [FiniteDimensional F E]
theorem subsingleton_of_finrank_adjoin_le_one [FiniteDimensional F E]
(h : ∀ x : E, finrank F F⟮x⟯ ≤ 1) : Subsingleton (IntermediateField F E) :=
subsingleton_of_bot_eq_top (bot_eq_top_of_finrank_adjoin_le_one h)
-#align intermediate_field.subsingleton_of_finrank_adjoin_le_one
- IntermediateField.subsingleton_of_finrank_adjoin_le_one
+#align intermediate_field.subsingleton_of_finrank_adjoin_le_one IntermediateField.subsingleton_of_finrank_adjoin_le_one
end AdjoinRank
Before: Construction only imports Normal, which transitively imports IsSplittingField
Now: Normal imports Construction, Construction only imports IsSplittingField
So no extra transitive import is added to any file other than Construction and Normal.
As a consequence, Polynomial.SplittingField.instNormal
is moved from Construction to Normal.
adjoin_rootSet_eq_range
is added to IsSplittingField.
splits_of_comp
in Splits is extracted from splits_of_splits
in IsSplittingField.
Source of proof: https://math.stackexchange.com/a/2585087/12932
Move Algebra.adjoin.liftSingleton
from IsAlgClosed/Basic to Adjoin/Field in order to speed up lift_of_splits
(renamed to add namespace Polynomial
).
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -904,6 +904,12 @@ noncomputable def algHomAdjoinIntegralEquiv (h : IsIntegral F α) :
rw [adjoin.powerBasis_gen, minpoly_gen, Equiv.refl_apply])
#align intermediate_field.alg_hom_adjoin_integral_equiv IntermediateField.algHomAdjoinIntegralEquiv
+lemma algHomAdjoinIntegralEquiv_symm_apply_gen (h : IsIntegral F α)
+ (x : { x // x ∈ (minpoly F α).aroots K }) :
+ (algHomAdjoinIntegralEquiv F h).symm x (AdjoinSimple.gen F α) = x :=
+ (adjoin.powerBasis h).lift_gen x.val <| by
+ rw [adjoin.powerBasis_gen, minpoly_gen]; exact (mem_aroots.mp x.2).2
+
/-- Fintype of algebra homomorphism `F⟮α⟯ →ₐ[F] K` -/
noncomputable def fintypeOfAlgHomAdjoinIntegral (h : IsIntegral F α) : Fintype (F⟮α⟯ →ₐ[F] K) :=
PowerBasis.AlgHom.fintype (adjoin.powerBasis h)
⊥ : Subalgebra R A
(#8038)
And the same thing for StarSubalgebra R A
. IntermediateField
was already handled in #7957.
As a result, nine (obvious) lemmas are now true by definition.
This slightly adjusts the statement of Algebra.toSubmodule_bot
to make it simpler and true by definition; the original statement can be recovered by rewriting by Submodule.one_eq_span
, which I've had to add in some downstream proofs.
@@ -88,12 +88,11 @@ instance : CompleteLattice (IntermediateField F E) where
instance : Inhabited (IntermediateField F E) :=
⟨⊤⟩
-theorem coe_bot : ↑(⊥ : IntermediateField F E) = Set.range (algebraMap F E) :=
- Algebra.coe_bot
+theorem coe_bot : ↑(⊥ : IntermediateField F E) = Set.range (algebraMap F E) := rfl
#align intermediate_field.coe_bot IntermediateField.coe_bot
theorem mem_bot {x : E} : x ∈ (⊥ : IntermediateField F E) ↔ x ∈ Set.range (algebraMap F E) :=
- Algebra.mem_bot
+ Iff.rfl
#align intermediate_field.mem_bot IntermediateField.mem_bot
@[simp]
@@ -260,10 +259,8 @@ def topEquiv : (⊤ : IntermediateField F E) ≃ₐ[F] E :=
@[simp]
theorem restrictScalars_bot_eq_self (K : IntermediateField F E) :
- (⊥ : IntermediateField K E).restrictScalars _ = K := by
- ext x
- rw [mem_restrictScalars, mem_bot];
- exact Set.ext_iff.mp Subtype.range_coe x
+ (⊥ : IntermediateField K E).restrictScalars _ = K :=
+ SetLike.coe_injective Subtype.range_coe
#align intermediate_field.restrict_scalars_bot_eq_self IntermediateField.restrictScalars_bot_eq_self
@[simp]
⊥
(#7957)
This means (⊥ : IntermediateField F E).toSubalgebra = ⊥
is true by definition.
Also adds IntermediateField.map_bot
now that the proof is trivial.
@@ -75,26 +75,29 @@ def gi : GaloisInsertion (adjoin F : Set E → IntermediateField F E)
choice_eq _ _ := copy_eq _ _ _
#align intermediate_field.gi IntermediateField.gi
-instance : CompleteLattice (IntermediateField F E) :=
- GaloisInsertion.liftCompleteLattice IntermediateField.gi
+instance : CompleteLattice (IntermediateField F E) where
+ __ := GaloisInsertion.liftCompleteLattice IntermediateField.gi
+ bot :=
+ { toSubalgebra := ⊥
+ inv_mem' := fun x (hx : x ∈ (⊥ : Subalgebra F E)) => show x⁻¹ ∈ (⊥ : Subalgebra F E) by
+ rw [Algebra.mem_bot] at hx ⊢
+ obtain ⟨r, rfl⟩ := hx
+ exact ⟨r⁻¹, map_inv₀ _ _⟩ }
+ bot_le x := (bot_le : ⊥ ≤ x.toSubalgebra)
instance : Inhabited (IntermediateField F E) :=
⟨⊤⟩
-theorem coe_bot : ↑(⊥ : IntermediateField F E) = Set.range (algebraMap F E) := by
- change ↑(Subfield.closure (Set.range (algebraMap F E) ∪ ∅)) = Set.range (algebraMap F E)
- rw [Set.union_empty, ← Set.image_univ, ← RingHom.map_field_closure]
- simp
+theorem coe_bot : ↑(⊥ : IntermediateField F E) = Set.range (algebraMap F E) :=
+ Algebra.coe_bot
#align intermediate_field.coe_bot IntermediateField.coe_bot
theorem mem_bot {x : E} : x ∈ (⊥ : IntermediateField F E) ↔ x ∈ Set.range (algebraMap F E) :=
- Set.ext_iff.mp coe_bot x
+ Algebra.mem_bot
#align intermediate_field.mem_bot IntermediateField.mem_bot
@[simp]
-theorem bot_toSubalgebra : (⊥ : IntermediateField F E).toSubalgebra = ⊥ := by
- ext
- rw [mem_toSubalgebra, Algebra.mem_bot, mem_bot]
+theorem bot_toSubalgebra : (⊥ : IntermediateField F E).toSubalgebra = ⊥ := rfl
#align intermediate_field.bot_to_subalgebra IntermediateField.bot_toSubalgebra
@[simp]
@@ -269,6 +272,11 @@ theorem restrictScalars_top {K : Type*} [Field K] [Algebra K E] [Algebra K F]
rfl
#align intermediate_field.restrict_scalars_top IntermediateField.restrictScalars_top
+@[simp]
+theorem map_bot {K : Type*} [Field K] [Algebra F K] (f : E →ₐ[F] K) :
+ IntermediateField.map f ⊥ = ⊥ :=
+ toSubalgebra_injective <| Algebra.map_bot _
+
theorem _root_.AlgHom.fieldRange_eq_map {K : Type*} [Field K] [Algebra F K] (f : E →ₐ[F] K) :
f.fieldRange = IntermediateField.map f ⊤ :=
SetLike.ext' Set.image_univ.symm
_root_
lost during porting (#7981)
You can tell this was a porting error because the #align
s were weird.
@@ -269,26 +269,26 @@ theorem restrictScalars_top {K : Type*} [Field K] [Algebra K E] [Algebra K F]
rfl
#align intermediate_field.restrict_scalars_top IntermediateField.restrictScalars_top
-theorem AlgHom.fieldRange_eq_map {K : Type*} [Field K] [Algebra F K] (f : E →ₐ[F] K) :
+theorem _root_.AlgHom.fieldRange_eq_map {K : Type*} [Field K] [Algebra F K] (f : E →ₐ[F] K) :
f.fieldRange = IntermediateField.map f ⊤ :=
SetLike.ext' Set.image_univ.symm
-#align alg_hom.field_range_eq_map IntermediateField.AlgHom.fieldRange_eq_map
+#align alg_hom.field_range_eq_map AlgHom.fieldRange_eq_map
-theorem AlgHom.map_fieldRange {K L : Type*} [Field K] [Field L] [Algebra F K] [Algebra F L]
+theorem _root_.AlgHom.map_fieldRange {K L : Type*} [Field K] [Field L] [Algebra F K] [Algebra F L]
(f : E →ₐ[F] K) (g : K →ₐ[F] L) : f.fieldRange.map g = (g.comp f).fieldRange :=
SetLike.ext' (Set.range_comp g f).symm
-#align alg_hom.map_field_range IntermediateField.AlgHom.map_fieldRange
+#align alg_hom.map_field_range AlgHom.map_fieldRange
-theorem AlgHom.fieldRange_eq_top {K : Type*} [Field K] [Algebra F K] {f : E →ₐ[F] K} :
+theorem _root_.AlgHom.fieldRange_eq_top {K : Type*} [Field K] [Algebra F K] {f : E →ₐ[F] K} :
f.fieldRange = ⊤ ↔ Function.Surjective f :=
SetLike.ext'_iff.trans Set.range_iff_surjective
-#align alg_hom.field_range_eq_top IntermediateField.AlgHom.fieldRange_eq_top
+#align alg_hom.field_range_eq_top AlgHom.fieldRange_eq_top
@[simp]
-theorem AlgEquiv.fieldRange_eq_top {K : Type*} [Field K] [Algebra F K] (f : E ≃ₐ[F] K) :
+theorem _root_.AlgEquiv.fieldRange_eq_top {K : Type*} [Field K] [Algebra F K] (f : E ≃ₐ[F] K) :
(f : E →ₐ[F] K).fieldRange = ⊤ :=
AlgHom.fieldRange_eq_top.mpr f.surjective
-#align alg_equiv.field_range_eq_top IntermediateField.AlgEquiv.fieldRange_eq_top
+#align alg_equiv.field_range_eq_top AlgEquiv.fieldRange_eq_top
end Lattice
@@ -25,7 +25,7 @@ For example, `Algebra.adjoin K {x}` might not include `x⁻¹`.
## Notation
- - `F⟮α⟯`: adjoin a single element `α` to `F`.
+ - `F⟮α⟯`: adjoin a single element `α` to `F` (in scope `IntermediateField`).
-/
set_option autoImplicit true
@@ -469,7 +469,7 @@ where
/-- If `x₁ x₂ ... xₙ : E` then `F⟮x₁,x₂,...,xₙ⟯` is the `IntermediateField F E`
generated by these elements. -/
-macro:max K:term "⟮" xs:term,* "⟯" : term => do ``(adjoin $K $(← mkInsertTerm xs.getElems))
+scoped macro:max K:term "⟮" xs:term,* "⟯" : term => do ``(adjoin $K $(← mkInsertTerm xs.getElems))
open Lean PrettyPrinter.Delaborator SubExpr in
@[delab app.IntermediateField.adjoin]
@@ -829,10 +829,12 @@ noncomputable def adjoinRootEquivAdjoin (h : IsIntegral F α) :
refine' Subfield.closure_le.mpr (Set.union_subset (fun x hx => _) _)
· obtain ⟨y, hy⟩ := hx
refine' ⟨y, _⟩
- rw [RingHom.comp_apply, AdjoinRoot.lift_of (aeval_gen_minpoly F α)]
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [RingHom.comp_apply, AdjoinRoot.lift_of (aeval_gen_minpoly F α)]
exact hy
· refine' Set.singleton_subset_iff.mpr ⟨AdjoinRoot.root (minpoly F α), _⟩
- rw [RingHom.comp_apply, AdjoinRoot.lift_root (aeval_gen_minpoly F α)]
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [RingHom.comp_apply, AdjoinRoot.lift_root (aeval_gen_minpoly F α)]
rfl)
#align intermediate_field.adjoin_root_equiv_adjoin IntermediateField.adjoinRootEquivAdjoin
@@ -860,7 +862,8 @@ noncomputable def adjoin.powerBasis {x : L} (hx : IsIntegral K x) : PowerBasis K
dim := (minpoly K x).natDegree
basis := powerBasisAux hx
basis_eq_pow i := by
- rw [powerBasisAux, Basis.map_apply, PowerBasis.basis_eq_pow, AlgEquiv.toLinearEquiv_apply,
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [powerBasisAux, Basis.map_apply, PowerBasis.basis_eq_pow, AlgEquiv.toLinearEquiv_apply,
AlgEquiv.map_pow, AdjoinRoot.powerBasis_gen, adjoinRootEquivAdjoin_apply_root]
#align intermediate_field.adjoin.power_basis IntermediateField.adjoin.powerBasis
@@ -829,12 +829,10 @@ noncomputable def adjoinRootEquivAdjoin (h : IsIntegral F α) :
refine' Subfield.closure_le.mpr (Set.union_subset (fun x hx => _) _)
· obtain ⟨y, hy⟩ := hx
refine' ⟨y, _⟩
- -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
- erw [RingHom.comp_apply, AdjoinRoot.lift_of (aeval_gen_minpoly F α)]
+ rw [RingHom.comp_apply, AdjoinRoot.lift_of (aeval_gen_minpoly F α)]
exact hy
· refine' Set.singleton_subset_iff.mpr ⟨AdjoinRoot.root (minpoly F α), _⟩
- -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
- erw [RingHom.comp_apply, AdjoinRoot.lift_root (aeval_gen_minpoly F α)]
+ rw [RingHom.comp_apply, AdjoinRoot.lift_root (aeval_gen_minpoly F α)]
rfl)
#align intermediate_field.adjoin_root_equiv_adjoin IntermediateField.adjoinRootEquivAdjoin
@@ -862,8 +860,7 @@ noncomputable def adjoin.powerBasis {x : L} (hx : IsIntegral K x) : PowerBasis K
dim := (minpoly K x).natDegree
basis := powerBasisAux hx
basis_eq_pow i := by
- -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
- erw [powerBasisAux, Basis.map_apply, PowerBasis.basis_eq_pow, AlgEquiv.toLinearEquiv_apply,
+ rw [powerBasisAux, Basis.map_apply, PowerBasis.basis_eq_pow, AlgEquiv.toLinearEquiv_apply,
AlgEquiv.map_pow, AdjoinRoot.powerBasis_gen, adjoinRootEquivAdjoin_apply_root]
#align intermediate_field.adjoin.power_basis IntermediateField.adjoin.powerBasis
@@ -829,10 +829,12 @@ noncomputable def adjoinRootEquivAdjoin (h : IsIntegral F α) :
refine' Subfield.closure_le.mpr (Set.union_subset (fun x hx => _) _)
· obtain ⟨y, hy⟩ := hx
refine' ⟨y, _⟩
- rw [RingHom.comp_apply, AdjoinRoot.lift_of (aeval_gen_minpoly F α)]
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [RingHom.comp_apply, AdjoinRoot.lift_of (aeval_gen_minpoly F α)]
exact hy
· refine' Set.singleton_subset_iff.mpr ⟨AdjoinRoot.root (minpoly F α), _⟩
- rw [RingHom.comp_apply, AdjoinRoot.lift_root (aeval_gen_minpoly F α)]
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [RingHom.comp_apply, AdjoinRoot.lift_root (aeval_gen_minpoly F α)]
rfl)
#align intermediate_field.adjoin_root_equiv_adjoin IntermediateField.adjoinRootEquivAdjoin
@@ -860,7 +862,8 @@ noncomputable def adjoin.powerBasis {x : L} (hx : IsIntegral K x) : PowerBasis K
dim := (minpoly K x).natDegree
basis := powerBasisAux hx
basis_eq_pow i := by
- rw [powerBasisAux, Basis.map_apply, PowerBasis.basis_eq_pow, AlgEquiv.toLinearEquiv_apply,
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [powerBasisAux, Basis.map_apply, PowerBasis.basis_eq_pow, AlgEquiv.toLinearEquiv_apply,
AlgEquiv.map_pow, AdjoinRoot.powerBasis_gen, adjoinRootEquivAdjoin_apply_root]
#align intermediate_field.adjoin.power_basis IntermediateField.adjoin.powerBasis
minpoly.eq_of_algebraMap_eq
by algebraMap_eq
(#7228)
Also changes the repetitive names minpoly.minpoly_algHom/Equiv
to minpoly.algHom/Equiv_eq
@@ -795,20 +795,14 @@ end AdjoinIntermediateFieldLattice
section AdjoinIntegralElement
-variable {F : Type*} [Field F] {E : Type*} [Field E] [Algebra F E] {α : E}
+variable (F : Type*) [Field F] {E : Type*} [Field E] [Algebra F E] {α : E}
variable {K : Type*} [Field K] [Algebra F K]
-theorem minpoly_gen {α : E} (h : IsIntegral F α) :
+theorem minpoly_gen (α : E) :
minpoly F (AdjoinSimple.gen F α) = minpoly F α := by
- rw [← AdjoinSimple.algebraMap_gen F α] at h
- have inj := (algebraMap F⟮α⟯ E).injective
- exact
- minpoly.eq_of_algebraMap_eq inj ((isIntegral_algebraMap_iff inj).mp h)
- (AdjoinSimple.algebraMap_gen _ _).symm
-#align intermediate_field.minpoly_gen IntermediateField.minpoly_gen
-
-variable (F)
+ rw [← minpoly.algebraMap_eq (algebraMap F⟮α⟯ E).injective, AdjoinSimple.algebraMap_gen]
+#align intermediate_field.minpoly_gen IntermediateField.minpoly_genₓ
theorem aeval_gen_minpoly (α : E) : aeval (AdjoinSimple.gen F α) (minpoly F α) = 0 := by
ext
@@ -899,7 +893,7 @@ noncomputable def algHomAdjoinIntegralEquiv (h : IsIntegral F α) :
(F⟮α⟯ →ₐ[F] K) ≃ { x // x ∈ (minpoly F α).aroots K } :=
(adjoin.powerBasis h).liftEquiv'.trans
((Equiv.refl _).subtypeEquiv fun x => by
- rw [adjoin.powerBasis_gen, minpoly_gen h, Equiv.refl_apply])
+ rw [adjoin.powerBasis_gen, minpoly_gen, Equiv.refl_apply])
#align intermediate_field.alg_hom_adjoin_integral_equiv IntermediateField.algHomAdjoinIntegralEquiv
/-- Fintype of algebra homomorphism `F⟮α⟯ →ₐ[F] K` -/
@@ -911,7 +905,7 @@ theorem card_algHom_adjoin_integral (h : IsIntegral F α) (h_sep : (minpoly F α
(h_splits : (minpoly F α).Splits (algebraMap F K)) :
@Fintype.card (F⟮α⟯ →ₐ[F] K) (fintypeOfAlgHomAdjoinIntegral F h) = (minpoly F α).natDegree := by
rw [AlgHom.card_of_powerBasis] <;>
- simp only [adjoin.powerBasis_dim, adjoin.powerBasis_gen, minpoly_gen h, h_sep, h_splits]
+ simp only [adjoin.powerBasis_dim, adjoin.powerBasis_gen, minpoly_gen, h_sep, h_splits]
#align intermediate_field.card_alg_hom_adjoin_integral IntermediateField.card_algHom_adjoin_integral
end AdjoinIntegralElement
@@ -1067,7 +1061,6 @@ noncomputable def Lifts.upperBoundAlgHom {c : Set (Lifts F E K)} (hc : IsChain (
simp only [Submonoid.coe_mul, Subsemiring.coe_toSubmonoid, Subalgebra.coe_toSubsemiring,
coe_toSubalgebra, Lifts.eq_of_le hzw, Lifts.eq_of_le hxw, Lifts.eq_of_le hyw, ← w.2.map_mul,
Submonoid.mk_mul_mk]
-
commutes' _ := AlgHom.commutes _ _
#align intermediate_field.lifts.upper_bound_alg_hom IntermediateField.Lifts.upperBoundAlgHom
@@ -1281,10 +1274,8 @@ open IntermediateField
/-- `pb.equivAdjoinSimple` is the equivalence between `K⟮pb.gen⟯` and `L` itself. -/
noncomputable def equivAdjoinSimple (pb : PowerBasis K L) : K⟮pb.gen⟯ ≃ₐ[K] L :=
- (adjoin.powerBasis pb.isIntegral_gen).equivOfMinpoly pb
- (minpoly.eq_of_algebraMap_eq (algebraMap K⟮pb.gen⟯ L).injective
- (adjoin.powerBasis pb.isIntegral_gen).isIntegral_gen
- (by rw [adjoin.powerBasis_gen, AdjoinSimple.algebraMap_gen]))
+ (adjoin.powerBasis pb.isIntegral_gen).equivOfMinpoly pb <| by
+ rw [adjoin.powerBasis_gen, minpoly_gen]
#align power_basis.equiv_adjoin_simple PowerBasis.equivAdjoinSimple
@[simp]
@@ -312,8 +312,8 @@ theorem adjoin.range_algebraMap_subset : Set.range (algebraMap F E) ⊆ adjoin F
exact adjoin.algebraMap_mem F S f
#align intermediate_field.adjoin.range_algebra_map_subset IntermediateField.adjoin.range_algebraMap_subset
-instance adjoin.fieldCoe : CoeTC F (adjoin F S)
- where coe x := ⟨algebraMap F E x, adjoin.algebraMap_mem F S x⟩
+instance adjoin.fieldCoe : CoeTC F (adjoin F S) where
+ coe x := ⟨algebraMap F E x, adjoin.algebraMap_mem F S x⟩
#align intermediate_field.adjoin.field_coe IntermediateField.adjoin.fieldCoe
theorem subset_adjoin : S ⊆ adjoin F S := fun _ hx => Subfield.subset_closure (Or.inr hx)
@@ -896,7 +896,7 @@ end PowerBasis
/-- Algebra homomorphism `F⟮α⟯ →ₐ[F] K` are in bijection with the set of roots
of `minpoly α` in `K`. -/
noncomputable def algHomAdjoinIntegralEquiv (h : IsIntegral F α) :
- (F⟮α⟯ →ₐ[F] K) ≃ { x // x ∈ ((minpoly F α).map (algebraMap F K)).roots } :=
+ (F⟮α⟯ →ₐ[F] K) ≃ { x // x ∈ (minpoly F α).aroots K } :=
(adjoin.powerBasis h).liftEquiv'.trans
((Equiv.refl _).subtypeEquiv fun x => by
rw [adjoin.powerBasis_gen, minpoly_gen h, Equiv.refl_apply])
@@ -1099,15 +1099,16 @@ noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral
splits_of_splits_of_dvd _ (map_ne_zero (minpoly.ne_zero h1))
((splits_map_iff _ _).mpr (by convert h2; exact RingHom.ext fun y => x.2.commutes y))
(minpoly.dvd_map_of_isScalarTower _ _ _)
- let alg : Algebra {y // y ∈ x.fst} {y // y ∈ restrictScalars F {z // z ∈ x.fst}⟮s⟯} :=
+ letI : Algebra {y // y ∈ x.fst} {y // y ∈ restrictScalars F {z // z ∈ x.fst}⟮s⟯} :=
{z // z ∈ x.fst}⟮s⟯.toSubalgebra.algebra
+ letI := x.2.toRingHom.toAlgebra
⟨x.1⟮s⟯.restrictScalars F,
(@algHomEquivSigma F x.1 (x.1⟮s⟯.restrictScalars F) K _ _ _ _ _ _ _
(IntermediateField.algebra x.1⟮s⟯) (IsScalarTower.of_algebraMap_eq fun _ => rfl)).invFun
⟨x.2,
- (@algHomAdjoinIntegralEquiv x.1 _ E _ _ s K _ x.2.toRingHom.toAlgebra h3).invFun
+ (@algHomAdjoinIntegralEquiv x.1 _ E _ _ s K _ _ h3).invFun
⟨rootOfSplits x.2.toRingHom key (ne_of_gt (minpoly.degree_pos h3)), by
- rw [mem_roots (map_ne_zero (minpoly.ne_zero h3)), IsRoot, ← eval₂_eq_eval_map]
+ rw [mem_aroots, and_iff_right (minpoly.ne_zero h3)]
exact map_rootOfSplits x.2.toRingHom key (ne_of_gt (minpoly.degree_pos h3))⟩⟩⟩
#align intermediate_field.lifts.lift_of_splits IntermediateField.Lifts.liftOfSplits
@@ -1128,8 +1129,8 @@ theorem Lifts.le_lifts_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
(minpoly.dvd_map_of_isScalarTower _ _ _)
have I2 := (ne_of_gt (minpoly.degree_pos I1))
have I3 : rootOfSplits (AlgHom.toRingHom x.2) key (ne_of_gt (minpoly.degree_pos I1)) ∈
- (Polynomial.map (algebraMap x.1 K) (minpoly x.1 s)).roots := by
- rw [mem_roots (map_ne_zero (minpoly.ne_zero I1)), IsRoot, ← eval₂_eq_eval_map]
+ (minpoly x.1 s).aroots K := by
+ rw [mem_aroots, and_iff_right (minpoly.ne_zero I1)]
exact map_rootOfSplits x.2.toRingHom key (ne_of_gt (minpoly.degree_pos I1))
let φ : x.1⟮s⟯ →ₐ[x.1] K := ((algHomAdjoinIntegralEquiv x.1 I1).invFun
⟨rootOfSplits (AlgHom.toRingHom x.2) key I2, I3⟩)
@@ -1090,7 +1090,6 @@ theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤
exact congr_arg z.2 (Subtype.ext hst)⟩
#align intermediate_field.lifts.exists_upper_bound IntermediateField.Lifts.exists_upper_bound
-set_option maxHeartbeats 350000 in
-- Porting note: instance `alg` added by hand. The proof is very slow.
/-- Extend a lift `x : Lifts F E K` to an element `s : E` whose conjugates are all in `K` -/
noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
@@ -1204,7 +1203,6 @@ theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K
(Field.toIsField K)
#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra
-set_option synthInstance.maxHeartbeats 30000 in
instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
FiniteDimensional K (E1 ⊔ E2 : IntermediateField K L) := by
let g := Algebra.TensorProduct.productMap E1.val E2.val
@@ -45,8 +45,7 @@ variable (F : Type*) [Field F] {E : Type*} [Field E] [Algebra F E] (S : Set E)
/-- `adjoin F S` extends a field `F` by adjoining a set `S ⊆ E`. -/
def adjoin : IntermediateField F E :=
{ Subfield.closure (Set.range (algebraMap F E) ∪ S) with
- algebraMap_mem' := fun x => Subfield.subset_closure (Or.inl (Set.mem_range_self x))
- neg_mem' := fun x => by simp }
+ algebraMap_mem' := fun x => Subfield.subset_closure (Or.inl (Set.mem_range_self x)) }
#align intermediate_field.adjoin IntermediateField.adjoin
end AdjoinDef
@@ -427,9 +426,7 @@ theorem adjoin_eq_algebra_adjoin (inv_mem : ∀ x ∈ Algebra.adjoin F S, x⁻¹
(adjoin F S).toSubalgebra = Algebra.adjoin F S :=
le_antisymm
(show adjoin F S ≤
- { Algebra.adjoin F
- S with
- neg_mem' := fun _ => (Algebra.adjoin F S).neg_mem
+ { Algebra.adjoin F S with
inv_mem' := inv_mem }
from adjoin_le_iff.mpr Algebra.subset_adjoin)
(algebra_adjoin_le_adjoin _ _)
@@ -598,9 +595,6 @@ theorem adjoin_simple_isCompactElement (x : E) : IsCompactElement F⟮x⟯ := by
rintro x₁ x₂ ⟨-, ⟨F₁, rfl⟩, ⟨-, ⟨hF₁, rfl⟩, hx₁⟩⟩ ⟨-, ⟨F₂, rfl⟩, ⟨-, ⟨hF₂, rfl⟩, hx₂⟩⟩
obtain ⟨F₃, hF₃, h₁₃, h₂₃⟩ := hs F₁ hF₁ F₂ hF₂
exact mem_iUnion_of_mem F₃ (mem_iUnion_of_mem hF₃ (F₃.add_mem (h₁₃ hx₁) (h₂₃ hx₂)))
- neg_mem' := by
- rintro x ⟨-, ⟨E, rfl⟩, ⟨-, ⟨hE, rfl⟩, hx⟩⟩
- exact mem_iUnion_of_mem E (mem_iUnion_of_mem hE (E.neg_mem hx))
mul_mem' := by
rintro x₁ x₂ ⟨-, ⟨F₁, rfl⟩, ⟨-, ⟨hF₁, rfl⟩, hx₁⟩⟩ ⟨-, ⟨F₂, rfl⟩, ⟨-, ⟨hF₂, rfl⟩, hx₂⟩⟩
obtain ⟨F₃, hF₃, h₁₃, h₂₃⟩ := hs F₁ hF₁ F₂ hF₂
@@ -1040,7 +1034,6 @@ def Lifts.upperBoundIntermediateField {c : Set (Lifts F E K)} (hc : IsChain (·
carrier s := ∃ x : Lifts F E K, x ∈ insert ⊥ c ∧ (s ∈ x.1 : Prop)
zero_mem' := ⟨⊥, Set.mem_insert ⊥ c, zero_mem ⊥⟩
one_mem' := ⟨⊥, Set.mem_insert ⊥ c, one_mem ⊥⟩
- neg_mem' := by rintro _ ⟨x, y, h⟩; exact ⟨x, ⟨y, x.1.neg_mem h⟩⟩
inv_mem' := by rintro _ ⟨x, y, h⟩; exact ⟨x, ⟨y, x.1.inv_mem h⟩⟩
add_mem' := by
rintro _ _ ⟨x, hx, ha⟩ ⟨y, hy, hb⟩
Autoimplicits are highly controversial and also defeat the performance-improving work in #6474.
The intent of this PR is to make autoImplicit
opt-in on a per-file basis, by disabling it in the lakefile and enabling it again with set_option autoImplicit true
in the few files that rely on it.
That also keeps this PR small, as opposed to attempting to "fix" files to not need it any more.
I claim that many of the uses of autoImplicit
in these files are accidental; situations such as:
variables
are in scope, but pasting the lemma in the wrong sectionHaving set_option autoImplicit false
as the default prevents these types of mistake being made in the 90% of files where autoImplicit
s are not used at all, and causes them to be caught by CI during review.
I think there were various points during the port where we encouraged porters to delete the universes u v
lines; I think having autoparams for universe variables only would cover a lot of the cases we actually use them, while avoiding any real shortcomings.
A Zulip poll (after combining overlapping votes accordingly) was in favor of this change with 5:5:18
as the no:dontcare:yes
vote ratio.
While this PR was being reviewed, a handful of files gained some more likely-accidental autoImplicits. In these places, set_option autoImplicit true
has been placed locally within a section, rather than at the top of the file.
@@ -28,6 +28,8 @@ For example, `Algebra.adjoin K {x}` might not include `x⁻¹`.
- `F⟮α⟯`: adjoin a single element `α` to `F`.
-/
+set_option autoImplicit true
+
open FiniteDimensional Polynomial
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -37,7 +37,7 @@ namespace IntermediateField
section AdjoinDef
-variable (F : Type _) [Field F] {E : Type _} [Field E] [Algebra F E] (S : Set E)
+variable (F : Type*) [Field F] {E : Type*} [Field E] [Algebra F E] (S : Set E)
--Porting note: not adding `neg_mem'` causes an error.
/-- `adjoin F S` extends a field `F` by adjoining a set `S ⊆ E`. -/
@@ -51,7 +51,7 @@ end AdjoinDef
section Lattice
-variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E]
+variable {F : Type*} [Field F] {E : Type*} [Field E] [Algebra F E]
@[simp]
theorem adjoin_le_iff {S : Set E} {T : IntermediateField F E} : adjoin F S ≤ T ↔ S ≤ T :=
@@ -157,18 +157,18 @@ theorem sInf_toSubfield (S : Set (IntermediateField F E)) :
#align intermediate_field.Inf_to_subfield IntermediateField.sInf_toSubfield
@[simp, norm_cast]
-theorem coe_iInf {ι : Sort _} (S : ι → IntermediateField F E) : (↑(iInf S) : Set E) = ⋂ i, S i := by
+theorem coe_iInf {ι : Sort*} (S : ι → IntermediateField F E) : (↑(iInf S) : Set E) = ⋂ i, S i := by
simp [iInf]
#align intermediate_field.coe_infi IntermediateField.coe_iInf
@[simp]
-theorem iInf_toSubalgebra {ι : Sort _} (S : ι → IntermediateField F E) :
+theorem iInf_toSubalgebra {ι : Sort*} (S : ι → IntermediateField F E) :
(iInf S).toSubalgebra = ⨅ i, (S i).toSubalgebra :=
SetLike.coe_injective <| by simp [iInf]
#align intermediate_field.infi_to_subalgebra IntermediateField.iInf_toSubalgebra
@[simp]
-theorem iInf_toSubfield {ι : Sort _} (S : ι → IntermediateField F E) :
+theorem iInf_toSubfield {ι : Sort*} (S : ι → IntermediateField F E) :
(iInf S).toSubfield = ⨅ i, (S i).toSubfield :=
SetLike.coe_injective <| by simp [iInf]
#align intermediate_field.infi_to_subfield IntermediateField.iInf_toSubfield
@@ -263,28 +263,28 @@ theorem restrictScalars_bot_eq_self (K : IntermediateField F E) :
#align intermediate_field.restrict_scalars_bot_eq_self IntermediateField.restrictScalars_bot_eq_self
@[simp]
-theorem restrictScalars_top {K : Type _} [Field K] [Algebra K E] [Algebra K F]
+theorem restrictScalars_top {K : Type*} [Field K] [Algebra K E] [Algebra K F]
[IsScalarTower K F E] : (⊤ : IntermediateField F E).restrictScalars K = ⊤ :=
rfl
#align intermediate_field.restrict_scalars_top IntermediateField.restrictScalars_top
-theorem AlgHom.fieldRange_eq_map {K : Type _} [Field K] [Algebra F K] (f : E →ₐ[F] K) :
+theorem AlgHom.fieldRange_eq_map {K : Type*} [Field K] [Algebra F K] (f : E →ₐ[F] K) :
f.fieldRange = IntermediateField.map f ⊤ :=
SetLike.ext' Set.image_univ.symm
#align alg_hom.field_range_eq_map IntermediateField.AlgHom.fieldRange_eq_map
-theorem AlgHom.map_fieldRange {K L : Type _} [Field K] [Field L] [Algebra F K] [Algebra F L]
+theorem AlgHom.map_fieldRange {K L : Type*} [Field K] [Field L] [Algebra F K] [Algebra F L]
(f : E →ₐ[F] K) (g : K →ₐ[F] L) : f.fieldRange.map g = (g.comp f).fieldRange :=
SetLike.ext' (Set.range_comp g f).symm
#align alg_hom.map_field_range IntermediateField.AlgHom.map_fieldRange
-theorem AlgHom.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K] {f : E →ₐ[F] K} :
+theorem AlgHom.fieldRange_eq_top {K : Type*} [Field K] [Algebra F K] {f : E →ₐ[F] K} :
f.fieldRange = ⊤ ↔ Function.Surjective f :=
SetLike.ext'_iff.trans Set.range_iff_surjective
#align alg_hom.field_range_eq_top IntermediateField.AlgHom.fieldRange_eq_top
@[simp]
-theorem AlgEquiv.fieldRange_eq_top {K : Type _} [Field K] [Algebra F K] (f : E ≃ₐ[F] K) :
+theorem AlgEquiv.fieldRange_eq_top {K : Type*} [Field K] [Algebra F K] (f : E ≃ₐ[F] K) :
(f : E →ₐ[F] K).fieldRange = ⊤ :=
AlgHom.fieldRange_eq_top.mpr f.surjective
#align alg_equiv.field_range_eq_top IntermediateField.AlgEquiv.fieldRange_eq_top
@@ -293,7 +293,7 @@ end Lattice
section AdjoinDef
-variable (F : Type _) [Field F] {E : Type _} [Field E] [Algebra F E] (S : Set E)
+variable (F : Type*) [Field F] {E : Type*} [Field E] [Algebra F E] (S : Set E)
theorem adjoin_eq_range_algebraMap_adjoin :
(adjoin F S : Set E) = Set.range (algebraMap (adjoin F S) E) :=
@@ -339,12 +339,12 @@ theorem subset_adjoin_of_subset_right {T : Set E} (H : T ⊆ S) : T ⊆ adjoin F
#align intermediate_field.subset_adjoin_of_subset_right IntermediateField.subset_adjoin_of_subset_right
@[simp]
-theorem adjoin_empty (F E : Type _) [Field F] [Field E] [Algebra F E] : adjoin F (∅ : Set E) = ⊥ :=
+theorem adjoin_empty (F E : Type*) [Field F] [Field E] [Algebra F E] : adjoin F (∅ : Set E) = ⊥ :=
eq_bot_iff.mpr (adjoin_le_iff.mpr (Set.empty_subset _))
#align intermediate_field.adjoin_empty IntermediateField.adjoin_empty
@[simp]
-theorem adjoin_univ (F E : Type _) [Field F] [Field E] [Algebra F E] :
+theorem adjoin_univ (F E : Type*) [Field F] [Field E] [Algebra F E] :
adjoin F (Set.univ : Set E) = ⊤ :=
eq_top_iff.mpr <| subset_adjoin _ _
#align intermediate_field.adjoin_univ IntermediateField.adjoin_univ
@@ -357,7 +357,7 @@ theorem adjoin_le_subfield {K : Subfield E} (HF : Set.range (algebraMap F E) ⊆
exact ⟨HF, HS⟩
#align intermediate_field.adjoin_le_subfield IntermediateField.adjoin_le_subfield
-theorem adjoin_subset_adjoin_iff {F' : Type _} [Field F'] [Algebra F' E] {S S' : Set E} :
+theorem adjoin_subset_adjoin_iff {F' : Type*} [Field F'] [Algebra F' E] {S S' : Set E} :
(adjoin F S : Set E) ⊆ adjoin F' S' ↔
Set.range (algebraMap F E) ⊆ adjoin F' S' ∧ S ⊆ adjoin F' S' :=
⟨fun h => ⟨_root_.trans (adjoin.range_algebraMap_subset _ _) h, _root_.trans
@@ -406,7 +406,7 @@ theorem adjoin_adjoin_comm (T : Set E) :
rw [adjoin_adjoin_left, adjoin_adjoin_left, Set.union_comm]
#align intermediate_field.adjoin_adjoin_comm IntermediateField.adjoin_adjoin_comm
-theorem adjoin_map {E' : Type _} [Field E'] [Algebra F E'] (f : E →ₐ[F] E') :
+theorem adjoin_map {E' : Type*} [Field E'] [Algebra F E'] (f : E →ₐ[F] E') :
(adjoin F S).map f = adjoin F (f '' S) := by
ext x
show
@@ -563,7 +563,7 @@ theorem adjoin_rootSet_isSplittingField {p : F[X]} (hp : p.Splits (algebraMap F
open scoped BigOperators
/-- A compositum of splitting fields is a splitting field -/
-theorem isSplittingField_iSup {ι : Type _} {t : ι → IntermediateField F E} {p : ι → F[X]}
+theorem isSplittingField_iSup {ι : Type*} {t : ι → IntermediateField F E} {p : ι → F[X]}
{s : Finset ι} (h0 : ∏ i in s, p i ≠ 0) (h : ∀ i ∈ s, (p i).IsSplittingField F (t i)) :
(∏ i in s, p i).IsSplittingField F (⨆ i ∈ s, t i : IntermediateField F E) := by
let K : IntermediateField F E := ⨆ i ∈ s, t i
@@ -645,7 +645,7 @@ instance : IsCompactlyGenerated (IntermediateField F E) :=
(le_antisymm (iSup_le fun i => iSup_le fun hi => adjoin_simple_le_iff.mpr hi) fun x hx =>
adjoin_simple_le_iff.mp (le_iSup_of_le x (le_iSup_of_le hx le_rfl)))⟩⟩⟩
-theorem exists_finset_of_mem_iSup {ι : Type _} {f : ι → IntermediateField F E} {x : E}
+theorem exists_finset_of_mem_iSup {ι : Type*} {f : ι → IntermediateField F E} {x : E}
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset ι, x ∈ ⨆ i ∈ s, f i := by
have := (adjoin_simple_isCompactElement x : IsCompactElement F⟮x⟯).exists_finset_of_le_iSup
(IntermediateField F E) f
@@ -653,7 +653,7 @@ theorem exists_finset_of_mem_iSup {ι : Type _} {f : ι → IntermediateField F
exact this hx
#align intermediate_field.exists_finset_of_mem_supr IntermediateField.exists_finset_of_mem_iSup
-theorem exists_finset_of_mem_supr' {ι : Type _} {f : ι → IntermediateField F E} {x : E}
+theorem exists_finset_of_mem_supr' {ι : Type*} {f : ι → IntermediateField F E} {x : E}
(hx : x ∈ ⨆ i, f i) : ∃ s : Finset (Σ i, f i), x ∈ ⨆ i ∈ s, F⟮(i.2 : E)⟯ := by
-- Porting note: writing `fun i x h => ...` does not work.
refine' exists_finset_of_mem_iSup (SetLike.le_def.mp (iSup_le (fun i => _)) hx)
@@ -661,7 +661,7 @@ theorem exists_finset_of_mem_supr' {ι : Type _} {f : ι → IntermediateField F
exact SetLike.le_def.mp (le_iSup_of_le ⟨i, x, h⟩ (by simp)) (mem_adjoin_simple_self F x)
#align intermediate_field.exists_finset_of_mem_supr' IntermediateField.exists_finset_of_mem_supr'
-theorem exists_finset_of_mem_supr'' {ι : Type _} {f : ι → IntermediateField F E}
+theorem exists_finset_of_mem_supr'' {ι : Type*} {f : ι → IntermediateField F E}
(h : ∀ i, Algebra.IsAlgebraic F (f i)) {x : E} (hx : x ∈ ⨆ i, f i) :
∃ s : Finset (Σ i, f i), x ∈ ⨆ i ∈ s, adjoin F ((minpoly F (i.2 : _)).rootSet E) := by
-- Porting note: writing `fun i x1 hx1 => ...` does not work.
@@ -680,7 +680,7 @@ end AdjoinDef
section AdjoinIntermediateFieldLattice
-variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E] {α : E} {S : Set E}
+variable {F : Type*} [Field F] {E : Type*} [Field E] [Algebra F E] {α : E} {S : Set E}
@[simp]
theorem adjoin_eq_bot_iff : adjoin F S = ⊥ ↔ S ⊆ (⊥ : IntermediateField F E) := by
@@ -799,9 +799,9 @@ end AdjoinIntermediateFieldLattice
section AdjoinIntegralElement
-variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E] {α : E}
+variable {F : Type*} [Field F] {E : Type*} [Field E] [Algebra F E] {α : E}
-variable {K : Type _} [Field K] [Algebra F K]
+variable {K : Type*} [Field K] [Algebra F K]
theorem minpoly_gen {α : E} (h : IsIntegral F α) :
minpoly F (AdjoinSimple.gen F α) = minpoly F α := by
@@ -853,7 +853,7 @@ theorem adjoinRootEquivAdjoin_apply_root (h : IsIntegral F α) :
section PowerBasis
-variable {L : Type _} [Field L] [Algebra K L]
+variable {L : Type*} [Field L] [Algebra K L]
/-- The elements `1, x, ..., x ^ (d - 1)` form a basis for `K⟮x⟯`,
where `d` is the degree of the minimal polynomial of `x`. -/
@@ -922,7 +922,7 @@ end AdjoinIntegralElement
section Induction
-variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E]
+variable {F : Type*} [Field F] {E : Type*} [Field E] [Algebra F E]
/-- An intermediate field `S` is finitely generated if there exists `t : Finset E` such that
`IntermediateField.adjoin F t = S`. -/
@@ -979,7 +979,7 @@ end Induction
section AlgHomMkAdjoinSplits
-variable (F E K : Type _) [Field F] [Field E] [Field K] [Algebra F E] [Algebra F K] {S : Set E}
+variable (F E K : Type*) [Field F] [Field E] [Field K] [Algebra F E] [Algebra F K] {S : Set E}
/-- Lifts `L → K` of `F → K` -/
def Lifts :=
@@ -1181,7 +1181,7 @@ end AlgHomMkAdjoinSplits
section Supremum
-variable {K L : Type _} [Field K] [Field L] [Algebra K L] (E1 E2 : IntermediateField K L)
+variable {K L : Type*} [Field K] [Field L] [Algebra K L] (E1 E2 : IntermediateField K L)
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)
@@ -1220,7 +1220,7 @@ instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensi
rw [Algebra.TensorProduct.productMap_range, E1.range_val, E2.range_val, sup_toSubalgebra]
#align intermediate_field.finite_dimensional_sup IntermediateField.finiteDimensional_sup
-instance finiteDimensional_iSup_of_finite {ι : Type _} {t : ι → IntermediateField K L}
+instance finiteDimensional_iSup_of_finite {ι : Type*} {t : ι → IntermediateField K L}
[h : Finite ι] [∀ i, FiniteDimensional K (t i)] :
FiniteDimensional K (⨆ i, t i : IntermediateField K L) := by
rw [← iSup_univ]
@@ -1236,7 +1236,7 @@ instance finiteDimensional_iSup_of_finite {ι : Type _} {t : ι → Intermediate
exact IntermediateField.finiteDimensional_sup _ _
#align intermediate_field.finite_dimensional_supr_of_finite IntermediateField.finiteDimensional_iSup_of_finite
-instance finiteDimensional_iSup_of_finset {ι : Type _} {f : ι → IntermediateField K L}
+instance finiteDimensional_iSup_of_finset {ι : Type*} {f : ι → IntermediateField K L}
/-Porting note: changed `h` from `∀ i ∈ s, FiniteDimensional K (f i)` because this caused an
error. See `finiteDimensional_iSup_of_finset'` for a stronger version, that was the one
used in mathlib3.-/
@@ -1249,7 +1249,7 @@ instance finiteDimensional_iSup_of_finset {ι : Type _} {f : ι → Intermediate
exact this.symm ▸ IntermediateField.finiteDimensional_iSup_of_finite
#align intermediate_field.finite_dimensional_supr_of_finset IntermediateField.finiteDimensional_iSup_of_finset
-theorem finiteDimensional_iSup_of_finset' {ι : Type _} {f : ι → IntermediateField K L}
+theorem finiteDimensional_iSup_of_finset' {ι : Type*} {f : ι → IntermediateField K L}
/-Porting note: this was the mathlib3 version. Using `[h : ...]`, as in mathlib3, causes the
error "invalid parametric local instance".-/
{s : Finset ι} (h : ∀ i, i ∈ s → FiniteDimensional K (f i)) :
@@ -1261,7 +1261,7 @@ theorem finiteDimensional_iSup_of_finset' {ι : Type _} {f : ι → Intermediate
exact this.symm ▸ IntermediateField.finiteDimensional_iSup_of_finite
/-- A compositum of algebraic extensions is algebraic -/
-theorem isAlgebraic_iSup {ι : Type _} {f : ι → IntermediateField K L}
+theorem isAlgebraic_iSup {ι : Type*} {f : ι → IntermediateField K L}
(h : ∀ i, Algebra.IsAlgebraic K (f i)) :
Algebra.IsAlgebraic K (⨆ i, f i : IntermediateField K L) := by
rintro ⟨x, hx⟩
@@ -1279,7 +1279,7 @@ end IntermediateField
section PowerBasis
-variable {K L : Type _} [Field K] [Field L] [Algebra K L]
+variable {K L : Type*} [Field K] [Field L] [Algebra K L]
namespace PowerBasis
maxHeartbeats
(#6206)
git ls-files '*.lean' | xargs sed -i "s=maxHeartbeats [0-9]*$=& in="
Affected files:
Mathlib/CategoryTheory/Monoidal/Braided.lean:479:set_option maxHeartbeats 400000
Mathlib/FieldTheory/Adjoin.lean:1212:set_option synthInstance.maxHeartbeats 30000
Mathlib/FieldTheory/IsAlgClosed/Basic.lean:302:set_option maxHeartbeats 800000
Mathlib/FieldTheory/IsAlgClosed/Basic.lean:303:set_option synthInstance.maxHeartbeats 400000
Mathlib/RepresentationTheory/GroupCohomology/Basic.lean:202:set_option maxHeartbeats 6400000
Mathlib/RepresentationTheory/GroupCohomology/Resolution.lean:345:set_option maxHeartbeats 800000
Mathlib/Topology/MetricSpace/GromovHausdorff.lean:415:set_option maxHeartbeats 300000
@@ -1209,7 +1209,7 @@ theorem sup_toSubalgebra [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K
(Field.toIsField K)
#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra
-set_option synthInstance.maxHeartbeats 30000
+set_option synthInstance.maxHeartbeats 30000 in
instance finiteDimensional_sup [h1 : FiniteDimensional K E1] [h2 : FiniteDimensional K E2] :
FiniteDimensional K (E1 ⊔ E2 : IntermediateField K L) := by
let g := Algebra.TensorProduct.productMap E1.val E2.val
minpolynatDegree_le
and minpoly.degree_le
(#6152)
Also
minpoly.natDegree_le
and minpoly.degree_le
minpoly.ne_zero_of_finite_field_extension
to minpoly.ne_zero_of_finite
RingTheory/Algebraic
isIntegral_of_finite
and isAlgebraic_of_finite
Algebra.isIntegral_of_finite
to RingTheory/IntegralClosure
@@ -884,15 +884,16 @@ theorem adjoin.finrank {x : L} (hx : IsIntegral K x) :
rfl
#align intermediate_field.adjoin.finrank IntermediateField.adjoin.finrank
-theorem minpoly.natDegree_le {x : L} [FiniteDimensional K L] (hx : IsIntegral K x) :
+theorem _root_.minpoly.natDegree_le (x : L) [FiniteDimensional K L] :
(minpoly K x).natDegree ≤ finrank K L :=
- le_of_eq_of_le (IntermediateField.adjoin.finrank hx).symm K⟮x⟯.toSubmodule.finrank_le
-#align minpoly.nat_degree_le IntermediateField.minpoly.natDegree_le
+ le_of_eq_of_le (IntermediateField.adjoin.finrank (isIntegral_of_finite _ _)).symm
+ K⟮x⟯.toSubmodule.finrank_le
+#align minpoly.nat_degree_le minpoly.natDegree_le
-theorem minpoly.degree_le {x : L} [FiniteDimensional K L] (hx : IsIntegral K x) :
+theorem _root_.minpoly.degree_le (x : L) [FiniteDimensional K L] :
(minpoly K x).degree ≤ finrank K L :=
- degree_le_of_natDegree_le (minpoly.natDegree_le hx)
-#align minpoly.degree_le IntermediateField.minpoly.degree_le
+ degree_le_of_natDegree_le (minpoly.natDegree_le x)
+#align minpoly.degree_le minpoly.degree_le
end PowerBasis
@@ -2,17 +2,14 @@
Copyright (c) 2020 Thomas Browning, Patrick Lutz. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
-
-! This file was ported from Lean 3 source module field_theory.adjoin
-! leanprover-community/mathlib commit df76f43357840485b9d04ed5dee5ab115d420e87
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.FieldTheory.IntermediateField
import Mathlib.FieldTheory.Separable
import Mathlib.FieldTheory.SplittingField.IsSplittingField
import Mathlib.RingTheory.TensorProduct
+#align_import field_theory.adjoin from "leanprover-community/mathlib"@"df76f43357840485b9d04ed5dee5ab115d420e87"
+
/-!
# Adjoining Elements to Fields
@@ -629,7 +629,7 @@ theorem adjoin_finset_isCompactElement (S : Finset E) :
-- Porting note: `exact` or `apply` timeout here
refine' le_antisymm (adjoin_le_iff.mpr fun x hx => SetLike.mem_coe.mpr
(adjoin_simple_le_iff.mp (le_iSup_of_le x (le_iSup_iff.2 (fun E1 hE1 => hE1 hx)))))
- (iSup_le fun x => iSup_le fun hx => adjoin_simple_le_iff.mpr (subset_adjoin F S hx))
+ (iSup_le fun x => iSup_le fun hx => adjoin_simple_le_iff.mpr (subset_adjoin F S hx))
rw [key, ← Finset.sup_eq_iSup]
exact finset_sup_compact_of_compact S fun x _ => adjoin_simple_isCompactElement x
#align intermediate_field.adjoin_finset_is_compact_element IntermediateField.adjoin_finset_isCompactElement
Co-authored-by: Komyyy <pol_tta@outlook.jp> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@anu.edu.au> Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com> Co-authored-by: Mario Carneiro <di.gama@gmail.com>
@@ -1158,7 +1158,8 @@ theorem Lifts.exists_lift_of_splits (x : Lifts F E K) {s : E} (h1 : IsIntegral F
theorem algHom_mk_adjoin_splits
(hK : ∀ s ∈ S, IsIntegral F (s : E) ∧ (minpoly F s).Splits (algebraMap F K)) :
Nonempty (adjoin F S →ₐ[F] K) := by
- obtain ⟨x : Lifts F E K, hx⟩ := zorn_partialOrder Lifts.exists_upper_bound
+ obtain ⟨x, hx⟩ : ∃ m : Lifts F E K, ∀ a, m ≤ a → a = m :=
+ zorn_partialOrder Lifts.exists_upper_bound
refine'
⟨{ toFun := (fun s => x.2 ⟨s, adjoin_le_iff.mpr (fun s hs => _) s.mem⟩)
map_one' := x.2.map_one
∑'
precedence (#5615)
∑
, ∏
and variants).([^a-zA-Zα-ωΑ-Ω'𝓝ℳ₀𝕂ₛ)]) \(([∑∏][^()∑∏]*,[^()∑∏:]*)\) ([⊂⊆=<≤])
replaced by $1 $2 $3
@@ -567,7 +567,7 @@ open scoped BigOperators
/-- A compositum of splitting fields is a splitting field -/
theorem isSplittingField_iSup {ι : Type _} {t : ι → IntermediateField F E} {p : ι → F[X]}
- {s : Finset ι} (h0 : (∏ i in s, p i) ≠ 0) (h : ∀ i ∈ s, (p i).IsSplittingField F (t i)) :
+ {s : Finset ι} (h0 : ∏ i in s, p i ≠ 0) (h : ∀ i ∈ s, (p i).IsSplittingField F (t i)) :
(∏ i in s, p i).IsSplittingField F (⨆ i ∈ s, t i : IntermediateField F E) := by
let K : IntermediateField F E := ⨆ i ∈ s, t i
have hK : ∀ i ∈ s, t i ≤ K := fun i hi => le_iSup_of_le i (le_iSup (fun _ => t i) hi)
@@ -1244,7 +1244,7 @@ instance finiteDimensional_iSup_of_finset {ι : Type _} {f : ι → Intermediate
{s : Finset ι} [h : ∀ i, FiniteDimensional K (f i)] :
FiniteDimensional K (⨆ i ∈ s, f i : IntermediateField K L) := by
haveI : ∀ i : { i // i ∈ s }, FiniteDimensional K (f i) := fun i => h i
- have : (⨆ i ∈ s, f i) = ⨆ i : { i // i ∈ s }, f i :=
+ have : ⨆ i ∈ s, f i = ⨆ i : { i // i ∈ s }, f i :=
le_antisymm (iSup_le fun i => iSup_le fun h => le_iSup (fun i : { i // i ∈ s } => f i) ⟨i, h⟩)
(iSup_le fun i => le_iSup_of_le i (le_iSup_of_le i.2 le_rfl))
exact this.symm ▸ IntermediateField.finiteDimensional_iSup_of_finite
@@ -1256,7 +1256,7 @@ theorem finiteDimensional_iSup_of_finset' {ι : Type _} {f : ι → Intermediate
{s : Finset ι} (h : ∀ i, i ∈ s → FiniteDimensional K (f i)) :
FiniteDimensional K (⨆ i ∈ s, f i : IntermediateField K L) := by
haveI : ∀ i : { i // i ∈ s }, FiniteDimensional K (f i) := fun i => h i i.2
- have : (⨆ i ∈ s, f i) = ⨆ i : { i // i ∈ s }, f i :=
+ have : ⨆ i ∈ s, f i = ⨆ i : { i // i ∈ s }, f i :=
le_antisymm (iSup_le fun i => iSup_le fun h => le_iSup (fun i : { i // i ∈ s } => f i) ⟨i, h⟩)
(iSup_le fun i => le_iSup_of_le i (le_iSup_of_le i.2 le_rfl))
exact this.symm ▸ IntermediateField.finiteDimensional_iSup_of_finite
Currently, (for both Set
and Finset
) insert_subset
is an iff
lemma stating that insert a s ⊆ t
if and only if a ∈ t
and s ⊆ t
. For both types, this PR renames this lemma to insert_subset_iff
, and adds an insert_subset
lemma that gives the implication just in the reverse direction : namely theorem insert_subset (ha : a ∈ t) (hs : s ⊆ t) : insert a s ⊆ t
.
This both aligns the naming with union_subset
and union_subset_iff
, and removes the need for the awkward insert_subset.mpr ⟨_,_⟩
idiom. It touches a lot of files (too many to list), but in a trivial way.
@@ -397,7 +397,7 @@ theorem adjoin_insert_adjoin (x : E) :
adjoin F (insert x (adjoin F S : Set E)) = adjoin F (insert x S) :=
le_antisymm
(adjoin_le_iff.mpr
- (Set.insert_subset.mpr
+ (Set.insert_subset_iff.mpr
⟨subset_adjoin _ _ (Set.mem_insert _ _),
adjoin_le_iff.mpr (subset_adjoin_of_subset_right _ _ (Set.subset_insert _ _))⟩))
(adjoin.mono _ _ _ (Set.insert_subset_insert (subset_adjoin _ _)))
Field.toEuclideanDomain
(#5266)
Modifying the definition of Field.toEuclideanDomain
makes some declaration faster.
Co-authored-by: Sébastien Gouëzel
@@ -865,7 +865,6 @@ noncomputable def powerBasisAux {x : L} (hx : IsIntegral K x) :
(AdjoinRoot.powerBasis (minpoly.ne_zero hx)).basis.map (adjoinRootEquivAdjoin K hx).toLinearEquiv
#align intermediate_field.power_basis_aux IntermediateField.powerBasisAux
-set_option maxHeartbeats 300000 in
/-- The power basis `1, x, ..., x ^ (d - 1)` for `K⟮x⟯`,
where `d` is the degree of the minimal polynomial of `x`. -/
@[simps]
@@ -1098,7 +1097,7 @@ theorem Lifts.exists_upper_bound (c : Set (Lifts F E K)) (hc : IsChain (· ≤
exact congr_arg z.2 (Subtype.ext hst)⟩
#align intermediate_field.lifts.exists_upper_bound IntermediateField.Lifts.exists_upper_bound
-set_option maxHeartbeats 410000 in
+set_option maxHeartbeats 350000 in
-- Porting note: instance `alg` added by hand. The proof is very slow.
/-- Extend a lift `x : Lifts F E K` to an element `s : E` whose conjugates are all in `K` -/
noncomputable def Lifts.liftOfSplits (x : Lifts F E K) {s : E} (h1 : IsIntegral F s)
IntermediateField.adjoin
notation (#5110)
This replaces the hacky typeclass-based system I wrote before, and now there are true set notations in the elaborated terms.
@@ -455,28 +455,48 @@ theorem adjoin_induction {s : Set E} {p : E → Prop} {x} (h : x ∈ adjoin F s)
((algebraMap F E).map_one ▸ Hmap 1) Hadd Hneg Hinv Hmul
#align intermediate_field.adjoin_induction IntermediateField.adjoin_induction
---this definition of notation is courtesy of Kyle Miller on zulip
-/-- Variation on `set.insert` to enable good notation for adjoining elements to fields.
-Used to preferentially use `singleton` rather than `insert` when adjoining one element.
--/
-class Insert {α : Type _} (s : Set α) where
- /-- Variation on `set.insert`. -/
- insert : α → Set α
-#align intermediate_field.insert IntermediateField.Insert
-
-instance (priority := 1000) insertEmpty {α : Type _} : Insert (∅ : Set α)
- where insert x := @singleton _ _ inferInstance x
-#align intermediate_field.insert_empty IntermediateField.insertEmpty
-
-instance (priority := 900) insertNonempty {α : Type _} (s : Set α) : Insert s
- where insert x := _root_.Insert.insert x s
-#align intermediate_field.insert_nonempty IntermediateField.insertNonempty
-
-/-- If `S : Set E` then `F⟮S⟯` is the `IntermediateField F E` generated by `S`. -/
-notation3:max K"⟮"(l ", "* => foldr (h t => Insert.insert t h) ∅)"⟯" => adjoin K l
+/- Porting note (kmill): this notation is replacing the typeclass-based one I had previously
+written, and it gives true `{x₁, x₂, ..., xₙ}` sets in the `adjoin` term. -/
+
+open Lean in
+/-- Supporting function for the `F⟮x₁,x₂,...,xₙ⟯` adjunction notation. -/
+private partial def mkInsertTerm [Monad m] [MonadQuotation m] (xs : TSyntaxArray `term) : m Term :=
+ run 0
+where
+ run (i : Nat) : m Term := do
+ if i + 1 == xs.size then
+ ``(singleton $(xs[i]!))
+ else if i < xs.size then
+ ``(insert $(xs[i]!) $(← run (i + 1)))
+ else
+ ``(EmptyCollection.emptyCollection)
+
+/-- If `x₁ x₂ ... xₙ : E` then `F⟮x₁,x₂,...,xₙ⟯` is the `IntermediateField F E`
+generated by these elements. -/
+macro:max K:term "⟮" xs:term,* "⟯" : term => do ``(adjoin $K $(← mkInsertTerm xs.getElems))
+
+open Lean PrettyPrinter.Delaborator SubExpr in
+@[delab app.IntermediateField.adjoin]
+partial def delabAdjoinNotation : Delab := whenPPOption getPPNotation do
+ let e ← getExpr
+ guard <| e.isAppOfArity ``adjoin 6
+ let F ← withNaryArg 0 delab
+ let xs ← withNaryArg 5 delabInsertArray
+ `($F⟮$(xs.toArray),*⟯)
+where
+ delabInsertArray : DelabM (List Term) := do
+ let e ← getExpr
+ if e.isAppOfArity ``EmptyCollection.emptyCollection 2 then
+ return []
+ else if e.isAppOfArity ``singleton 4 then
+ let x ← withNaryArg 3 delab
+ return [x]
+ else if e.isAppOfArity ``insert 5 then
+ let x ← withNaryArg 3 delab
+ let xs ← withNaryArg 4 delabInsertArray
+ return x :: xs
+ else failure
--- Porting note: without the following line the linter complains.
-attribute [nolint docBlame] IntermediateField.«term_⟮_,⟯».delab
section AdjoinSimple
variable (α : E)
@@ -563,16 +583,9 @@ theorem isSplittingField_iSup {ι : Type _} {t : ι → IntermediateField F E} {
open Set CompleteLattice
-/- Porting note: added because `adjoin_simple_le_iff` below cannot be tagged `simp`.-/
-@[simp]
-theorem insert_le_iff {K : IntermediateField F E} : Insert.insert ∅ α ⊆ ↑K ↔ α ∈ K := by
- simp only [← adjoin_le_iff, ← le_eq_subset]
- exact adjoin_le_iff.trans singleton_subset_iff
-
-/- Porting note: this was tagged `simp`, but the LHS can be simplified, see `insert_le_iff` above
-for the corresponding declaration. -/
-theorem adjoin_simple_le_iff {K : IntermediateField F E} : F⟮α⟯ ≤ K ↔ α ∈ K := by
- simp
+/- Porting note: this was tagged `simp`, but the LHS can be simplified now that the notation
+has been improved. -/
+theorem adjoin_simple_le_iff {K : IntermediateField F E} : F⟮α⟯ ≤ K ↔ α ∈ K := by simp
#align intermediate_field.adjoin_simple_le_iff IntermediateField.adjoin_simple_le_iff
/-- Adjoining a single element is compact in the lattice of intermediate fields. -/
The unported dependencies are