Skip to content

Commit 2def5da

Browse files
committed
chore: remove SubfieldWithHom (#8333)
It has become our consensus that `SubfieldWithHom` should be deprecated in favor of `IntermediateField.Lifts` after discussing with @acmepjz in #6670. @acmepjz [got rid of](#6670 (comment)) the use of `SubfieldWithHom` in `IsAlgClosed.lift`, so nothing depends on it now. In #8221 I extracted some proofs from `SubfieldWithHom` that are simpler than their `Lifts` counterparts, so I think now is the time to delete `SubfieldWithHom` completely, and get rid of this [slow proof](https://github.com/leanprover-community/mathlib4/compare/remove_SubfieldWithHom?expand=1#diff-abe22930a9c8ef025fcfdec88b7a436960fd44bb8738c6ea3418d19de32f67f3L310) as a bonus. Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
1 parent 5ac3430 commit 2def5da

File tree

1 file changed

+1
-138
lines changed

1 file changed

+1
-138
lines changed

Mathlib/FieldTheory/IsAlgClosed/Basic.lean

Lines changed: 1 addition & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -210,146 +210,9 @@ instance (priority := 100) IsAlgClosure.separable (R K : Type*) [Field R] [Field
210210

211211
namespace IsAlgClosed
212212

213-
namespace lift
214-
215-
/- In this section, the homomorphism from any algebraic extension into an algebraically
216-
closed extension is proven to exist. The assumption that M is algebraically closed could probably
217-
easily be switched to an assumption that M contains all the roots of polynomials in K -/
218-
variable {K : Type u} {L : Type v} {M : Type w} [Field K] [Field L] [Algebra K L] [Field M]
219-
[Algebra K M] [IsAlgClosed M] (hL : Algebra.IsAlgebraic K L)
220-
221-
variable (K L M)
222-
223-
open Subalgebra AlgHom Function
224-
225-
/-- This structure is used to prove the existence of a homomorphism from any algebraic extension
226-
into an algebraic closure -/
227-
structure SubfieldWithHom where
228-
/-- The corresponding `Subalgebra` -/
229-
carrier : Subalgebra K L
230-
/-- The embedding into the algebraically closed field -/
231-
emb : carrier →ₐ[K] M
232-
#align lift.subfield_with_hom IsAlgClosed.lift.SubfieldWithHom
233-
234-
variable {K L M hL}
235-
236-
namespace SubfieldWithHom
237-
238-
variable {E₁ E₂ E₃ : SubfieldWithHom K L M}
239-
240-
instance : LE (SubfieldWithHom K L M) where
241-
le E₁ E₂ := ∃ h : E₁.carrier ≤ E₂.carrier, ∀ x, E₂.emb (inclusion h x) = E₁.emb x
242-
243-
noncomputable instance : Inhabited (SubfieldWithHom K L M) :=
244-
⟨{ carrier := ⊥
245-
emb := (Algebra.ofId K M).comp (Algebra.botEquiv K L).toAlgHom }⟩
246-
247-
theorem le_def : E₁ ≤ E₂ ↔ ∃ h : E₁.carrier ≤ E₂.carrier, ∀ x, E₂.emb (inclusion h x) = E₁.emb x :=
248-
Iff.rfl
249-
#align lift.subfield_with_hom.le_def IsAlgClosed.lift.SubfieldWithHom.le_def
250-
251-
theorem compat (h : E₁ ≤ E₂) : ∀ x, E₂.emb (inclusion h.fst x) = E₁.emb x := by
252-
rw [le_def] at h; cases h; assumption
253-
#align lift.subfield_with_hom.compat IsAlgClosed.lift.SubfieldWithHom.compat
254-
255-
instance : Preorder (SubfieldWithHom K L M) where
256-
le := (· ≤ ·)
257-
le_refl E := ⟨le_rfl, by simp⟩
258-
le_trans E₁ E₂ E₃ h₁₂ h₂₃ := by
259-
refine ⟨h₁₂.1.trans h₂₃.1, fun _ ↦ ?_⟩
260-
erw [← inclusion_inclusion h₁₂.fst h₂₃.fst, compat h₂₃, compat h₁₂]
261-
262-
open Lattice
263-
264-
theorem maximal_subfieldWithHom_chain_bounded (c : Set (SubfieldWithHom K L M))
265-
(hc : IsChain (· ≤ ·) c) : ∃ ub : SubfieldWithHom K L M, ∀ N, N ∈ c → N ≤ ub := by
266-
by_cases hcn : c.Nonempty
267-
case neg => rw [Set.not_nonempty_iff_eq_empty] at hcn; simp [hcn]
268-
case pos =>
269-
have : Nonempty c := Set.Nonempty.to_subtype hcn
270-
let ub : SubfieldWithHom K L M :=
271-
⟨⨆ i : c, (i : SubfieldWithHom K L M).carrier,
272-
@Subalgebra.iSupLift _ _ _ _ _ _ _ _ _ this
273-
(fun i : c => (i : SubfieldWithHom K L M).carrier)
274-
(fun i j =>
275-
let ⟨k, hik, hjk⟩ := directedOn_iff_directed.1 hc.directedOn i j
276-
⟨k, hik.fst, hjk.fst⟩)
277-
(fun i => (i : SubfieldWithHom K L M).emb)
278-
(by
279-
intro i j h
280-
ext x
281-
cases' hc.total i.prop j.prop with hij hji
282-
· simp [← hij.snd x]
283-
· erw [AlgHom.comp_apply, ← hji.snd (inclusion h x), inclusion_inclusion,
284-
inclusion_self, AlgHom.id_apply x])
285-
_ rfl⟩
286-
exact ⟨ub, fun N hN =>
287-
⟨(le_iSup (fun i : c => (i : SubfieldWithHom K L M).carrier) ⟨N, hN⟩ : _), by
288-
intro x
289-
simp⟩⟩
290-
#align lift.subfield_with_hom.maximal_subfield_with_hom_chain_bounded IsAlgClosed.lift.SubfieldWithHom.maximal_subfieldWithHom_chain_bounded
291-
292-
variable (K L M)
293-
294-
theorem exists_maximal_subfieldWithHom : ∃ E : SubfieldWithHom K L M, ∀ N, E ≤ N → N ≤ E :=
295-
exists_maximal_of_chains_bounded maximal_subfieldWithHom_chain_bounded le_trans
296-
#align lift.subfield_with_hom.exists_maximal_subfield_with_hom IsAlgClosed.lift.SubfieldWithHom.exists_maximal_subfieldWithHom
297-
298-
/-- The maximal `SubfieldWithHom`. We later prove that this is equal to `⊤`. -/
299-
noncomputable def maximalSubfieldWithHom : SubfieldWithHom K L M :=
300-
Classical.choose (exists_maximal_subfieldWithHom K L M)
301-
#align lift.subfield_with_hom.maximal_subfield_with_hom IsAlgClosed.lift.SubfieldWithHom.maximalSubfieldWithHom
302-
303-
theorem maximalSubfieldWithHom_is_maximal :
304-
∀ N : SubfieldWithHom K L M,
305-
maximalSubfieldWithHom K L M ≤ N → N ≤ maximalSubfieldWithHom K L M :=
306-
Classical.choose_spec (exists_maximal_subfieldWithHom K L M)
307-
#align lift.subfield_with_hom.maximal_subfield_with_hom_is_maximal IsAlgClosed.lift.SubfieldWithHom.maximalSubfieldWithHom_is_maximal
308-
309-
-- porting note: this was much faster in lean 3
310-
set_option synthInstance.maxHeartbeats 200000 in
311-
theorem maximalSubfieldWithHom_eq_top : (maximalSubfieldWithHom K L M).carrier = ⊤ := by
312-
rw [eq_top_iff]
313-
intro x _
314-
let N : Subalgebra K L := (maximalSubfieldWithHom K L M).carrier
315-
letI : Field N := (Subalgebra.isField_of_algebraic N hL).toField
316-
letI : Algebra N M := (maximalSubfieldWithHom K L M).emb.toRingHom.toAlgebra
317-
obtain ⟨y, hy⟩ := IsAlgClosed.exists_aeval_eq_zero M (minpoly N x) <|
318-
(minpoly.degree_pos
319-
(isAlgebraic_iff_isIntegral.1 (Algebra.isAlgebraic_of_larger_base _ hL x))).ne'
320-
let O : Subalgebra N L := Algebra.adjoin N {(x : L)}
321-
letI : Algebra N O := Subalgebra.algebra O
322-
-- Porting note: there are some tricky unfolds going on here:
323-
-- (O.restrictScalars K : Type*) is identified with (O : Type*) in a few places
324-
let larger_emb : O →ₐ[N] M := Algebra.adjoin.liftSingleton N x y hy
325-
let larger_emb' : O →ₐ[K] M := AlgHom.restrictScalars K (S := N) (A := O) (B := M) larger_emb
326-
have hNO : N ≤ O.restrictScalars K := by
327-
intro z hz
328-
show algebraMap N L ⟨z, hz⟩ ∈ O
329-
exact O.algebraMap_mem _
330-
let O' : SubfieldWithHom K L M :=
331-
⟨O.restrictScalars K, larger_emb'⟩
332-
have hO' : maximalSubfieldWithHom K L M ≤ O' := by
333-
refine' ⟨hNO, _⟩
334-
intro z
335-
-- Porting note: have to help Lean unfold even more here
336-
show Algebra.adjoin.liftSingleton N x y hy (@algebraMap N O _ _ (Subalgebra.algebra O) z) =
337-
algebraMap N M z
338-
exact AlgHom.commutes _ _
339-
refine' (maximalSubfieldWithHom_is_maximal K L M O' hO').fst _
340-
show x ∈ Algebra.adjoin N {(x : L)}
341-
exact Algebra.subset_adjoin (Set.mem_singleton x)
342-
#align lift.subfield_with_hom.maximal_subfield_with_hom_eq_top IsAlgClosed.lift.SubfieldWithHom.maximalSubfieldWithHom_eq_top
343-
344-
end SubfieldWithHom
345-
346-
end lift
347-
348-
variable {K : Type u} [Field K] {L : Type v} {M : Type w} [Field L] [Algebra K L] [Field M]
213+
variable (K : Type u) [Field K] (L : Type v) (M : Type w) [Field L] [Algebra K L] [Field M]
349214
[Algebra K M] [IsAlgClosed M] (hL : Algebra.IsAlgebraic K L)
350215

351-
variable (K L M)
352-
353216
/-- Less general version of `lift`. -/
354217
private noncomputable irreducible_def lift_aux : L →ₐ[K] M :=
355218
Classical.choice <| IntermediateField.nonempty_algHom_of_adjoin_splits

0 commit comments

Comments
 (0)