@@ -210,146 +210,9 @@ instance (priority := 100) IsAlgClosure.separable (R K : Type*) [Field R] [Field
210
210
211
211
namespace IsAlgClosed
212
212
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]
349
214
[Algebra K M] [IsAlgClosed M] (hL : Algebra.IsAlgebraic K L)
350
215
351
- variable (K L M)
352
-
353
216
/-- Less general version of `lift`. -/
354
217
private noncomputable irreducible_def lift_aux : L →ₐ[K] M :=
355
218
Classical.choice <| IntermediateField.nonempty_algHom_of_adjoin_splits
0 commit comments