Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - feat(field_theory/algebraic_closure): map from algebraic extensions into the algebraic closure #9110

Closed
wants to merge 77 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
40e74d7
chore(ring_theory/algebra): make first type argument explicit in alg_hom
ChrisHughes24 Aug 3, 2019
790c892
Update algebra.lean
ChrisHughes24 Aug 3, 2019
c0633b5
feat(field_theory/algebraic_closure)
ChrisHughes24 Aug 3, 2019
931bf08
Merge branch 'master' into algebraic_closure
ChrisHughes24 Aug 4, 2019
7fff9f3
Merge branch 'lean-3.4.2' into algebraic_closure
jcommelin Aug 26, 2019
e01a15e
Remove sorries about minimal polynomials
jcommelin Aug 26, 2019
2aff46a
Define alg_equiv.symm
jcommelin Aug 26, 2019
d5c4897
typo
jcommelin Aug 26, 2019
71ed4b5
Remove another sorry, in base_extension
jcommelin Aug 26, 2019
067984e
Work in progress
jcommelin Aug 26, 2019
b64985a
Remove a sorry in maximal_extension_chain
jcommelin Aug 26, 2019
25080c9
Merge two sorries
jcommelin Aug 27, 2019
ca7c85d
More sorries removed
jcommelin Aug 27, 2019
542fca8
More work on transitivity of algebraicity
jcommelin Aug 27, 2019
f3620a6
WIP
jcommelin Aug 27, 2019
cac8632
Sorry-free definition of algebraic closure
jcommelin Aug 28, 2019
6915af4
More or less sorries
jcommelin Aug 28, 2019
a4fb375
Removing some sorries
jcommelin Aug 29, 2019
3079d38
WIP
jcommelin Aug 29, 2019
4f0378c
Merge branch 'lean-3.4.2' into algebraic_closure
jcommelin Oct 7, 2019
a81fb91
Fix algebraic.lean
jcommelin Oct 7, 2019
62e7e1d
Fix build, mostly
jcommelin Oct 7, 2019
c2099e8
Merge remote-tracking branch 'origin' into algebraic_closure
kckennylau Jun 12, 2020
6db5817
Merge remote-tracking branch 'origin/master' into HEAD
ChrisHughes24 Sep 4, 2021
57985f3
feat(algebra/algebra/subalgebra): inclusion
ChrisHughes24 Sep 4, 2021
23dbec2
feat(algebra/algebra/subalgebra): inclusion map of subalgebras
ChrisHughes24 Sep 4, 2021
f4db504
Update subalgebra.lean
ChrisHughes24 Sep 4, 2021
888fef8
uncomment stuff
ChrisHughes24 Sep 5, 2021
af35a25
feat(data/set/Union_lift): lift functions to Unions of sets
ChrisHughes24 Sep 5, 2021
10697b5
add docstrings and more lemmas
ChrisHughes24 Sep 5, 2021
998b72e
Merge branch 'ChrisHughes24-patch-4' into union_lift
ChrisHughes24 Sep 5, 2021
872c19c
Merge branch 'ChrisHughes24-patch-4' into algebraic_closure
ChrisHughes24 Sep 5, 2021
31023b8
slightly change inclusion_self statement
ChrisHughes24 Sep 5, 2021
c0a2875
change statement of inclusion_self
ChrisHughes24 Sep 5, 2021
05acf8a
Merge branch 'ChrisHughes24-patch-4' into algebraic_closure
ChrisHughes24 Sep 5, 2021
237bd51
Merge branch 'union_lift' into algebraic_closure
ChrisHughes24 Sep 6, 2021
912a1c7
work on algebraic closure
ChrisHughes24 Sep 6, 2021
ef38180
Add lemmas and change docstrings
ChrisHughes24 Sep 6, 2021
be5d061
Merge branch 'union_lift' into algebraic_closure
ChrisHughes24 Sep 6, 2021
6c5bf79
nolint and explanation
ChrisHughes24 Sep 6, 2021
1176213
nolint and explanation
ChrisHughes24 Sep 6, 2021
b94e5b0
Merge branch 'union_lift' into algebraic_closure
ChrisHughes24 Sep 6, 2021
5a4a4b8
more work on lift
ChrisHughes24 Sep 7, 2021
644d228
Merge remote-tracking branch 'origin/master' into algebraic_closure
ChrisHughes24 Sep 7, 2021
1114ddf
Merge remote-tracking branch 'origin/master' into union_lift
ChrisHughes24 Sep 7, 2021
606d6ed
Merge remote-tracking branch 'origin/master' into HEAD
ChrisHughes24 Sep 8, 2021
ab2f3d5
feat(algebra/algebra/subalgebra): mem_under
ChrisHughes24 Sep 9, 2021
b745f36
Merge remote-tracking branch 'origin/ChrisHughes24-patch-1' into alge…
ChrisHughes24 Sep 9, 2021
f9a9ea6
feat(field_theory/algebraic_closure): map from algebraic extensions i…
ChrisHughes24 Sep 9, 2021
cc7699e
update module docstring
ChrisHughes24 Sep 9, 2021
7313b6c
delete field_theory/algebraic
ChrisHughes24 Sep 9, 2021
2c34044
delete nonsense comments
ChrisHughes24 Sep 9, 2021
1b1453d
Update src/algebra/algebra/subalgebra.lean
ChrisHughes24 Sep 9, 2021
c9342f9
minor changes
ChrisHughes24 Sep 9, 2021
9ac6235
Merge branch 'union_lift' into algebraic_closure
ChrisHughes24 Sep 9, 2021
90df042
Merge remote-tracking branch 'origin/master' into algebraic_closure
ChrisHughes24 Sep 9, 2021
21ed26b
mention glue in module docstring
ChrisHughes24 Sep 9, 2021
bc69476
Merge branch 'union_lift' into algebraic_closure
ChrisHughes24 Sep 9, 2021
b76d90c
Merge remote-tracking branch 'origin/master' into union_lift
ChrisHughes24 Sep 9, 2021
773938b
start on minor changes
ChrisHughes24 Sep 10, 2021
a6d4fd3
refactor Union_lift file
ChrisHughes24 Sep 12, 2021
e1c9aef
hopefully fix supr_lift
ChrisHughes24 Sep 12, 2021
03aab66
Merge remote-tracking branch 'origin/master' into union_lift
ChrisHughes24 Sep 12, 2021
2f0542f
Merge remote-tracking branch 'origin/master' into algebraic_closure
ChrisHughes24 Sep 12, 2021
9a03579
Merge branch 'union_lift' into algebraic_closure
ChrisHughes24 Sep 12, 2021
1ac0b94
fix build
ChrisHughes24 Sep 12, 2021
4547efe
docstring
ChrisHughes24 Sep 13, 2021
e7aebce
add T : subalgebra R A argument
ChrisHughes24 Sep 15, 2021
eea4e07
Merge remote-tracking branch 'origin/master' into union_lift
ChrisHughes24 Sep 15, 2021
07bb91d
Update src/data/set/Union_lift.lean
ChrisHughes24 Sep 15, 2021
22b584b
Update src/data/set/Union_lift.lean
ChrisHughes24 Sep 15, 2021
6a16989
Update src/data/set/Union_lift.lean
ChrisHughes24 Sep 15, 2021
9e2ef06
lint line length
ChrisHughes24 Sep 15, 2021
31eaf58
Merge branch 'union_lift' into algebraic_closure
ChrisHughes24 Sep 15, 2021
b14a141
Merge remote-tracking branch 'origin/master' into algebraic_closure
ChrisHughes24 Sep 15, 2021
cbfbdb3
Merge remote-tracking branch 'origin/master' into algebraic_closure
ChrisHughes24 Sep 15, 2021
dca2929
fix build
ChrisHughes24 Sep 16, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
155 changes: 153 additions & 2 deletions src/field_theory/algebraic_closure.lean
Expand Up @@ -26,9 +26,12 @@ polynomial in `k` splits.
out by a maximal ideal containing every `f(x_f)`, and then repeating this step countably
many times. See Exercise 1.13 in Atiyah--Macdonald.

- `is_alg_closed.lift` is a map from an algebraic extension `L` of `K`, into any algebraically
closed extension of `K`.

## TODO

Show that any algebraic extension embeds into any algebraically closed extension (via Zorn's lemma).
Show that any two algebraic closures are isomorphic

## Tags

Expand Down Expand Up @@ -69,9 +72,22 @@ polynomial.splits_of_splits_id _ $ is_alg_closed.splits _

namespace is_alg_closed

theorem exists_root [is_alg_closed k] (p : polynomial k) (hp : p.degree ≠ 0) : ∃ x, is_root p x :=
variables {k}

theorem exists_root [is_alg_closed k] (p : polynomial k) (hp : p.degree ≠ 0) : ∃ x, is_root p x :=
exists_root_of_splits _ (is_alg_closed.splits p) hp

theorem exists_eval₂_eq_zero {R : Type*} [field R] [is_alg_closed k] (f : R →+* k)
(p : polynomial R) (hp : p.degree ≠ 0) : ∃ x, p.eval₂ f x = 0 :=
let ⟨x, hx⟩ := exists_root (p.map f) (by rwa [degree_map]) in
⟨x, by rwa [eval₂_eq_eval_map, ← is_root]⟩

variables (k)

theorem exists_aeval_eq_zero {R : Type*} [field R] [is_alg_closed k] [algebra R k]
(p : polynomial R) (hp : p.degree ≠ 0) : ∃ x : k, aeval x p = 0 :=
exists_eval₂_eq_zero (algebra_map R k) p hp

theorem of_exists_root (H : ∀ p : polynomial k, p.monic → irreducible p → ∃ x, p.eval x = 0) :
is_alg_closed k :=
⟨λ p, or.inr $ λ q hq hqp,
Expand Down Expand Up @@ -374,3 +390,138 @@ begin
list.mem_map, aeval_X, exists_exists_and_eq_and, multiset.mem_map, alg_hom.map_sub] at nu,
exact ⟨nu.some, nu.some_spec.2⟩,
end

namespace lift
/- In this section, the homomorphism from any algebraic extension into an algebraically
closed extension is proven to exist. The assumption that M is algebraically closed could probably
easily be switched to an assumption that M contains all the roots of polynomials in K -/
variables {K : Type u} {L : Type v} {M : Type w} [field K] [field L] [algebra K L]
[field M] [algebra K M] [is_alg_closed M] (hL : algebra.is_algebraic K L)

variables (K L M)
include hL
open zorn subalgebra alg_hom function

/-- This structure is used to prove the existence of a homomorphism from any algebraic extension
into an algebraic closure -/
structure subfield_with_hom :=
(carrier : subalgebra K L)
(emb : carrier →ₐ[K] M)

variables {K L M hL}

namespace subfield_with_hom
variables {E₁ E₂ E₃ : subfield_with_hom K L M hL}

instance : has_le (subfield_with_hom K L M hL) :=
{ le := λ E₁ E₂, ∃ h : E₁.carrier ≤ E₂.carrier, ∀ x, E₂.emb (inclusion h x) = E₁.emb x }

instance : inhabited (subfield_with_hom K L M hL) :=
⟨{ carrier := ⊥,
emb := (algebra.of_id K M).comp (algebra.bot_equiv K L).to_alg_hom }⟩

lemma le_def : E₁ ≤ E₂ ↔ ∃ h : E₁.carrier ≤ E₂.carrier, ∀ x, E₂.emb (inclusion h x) = E₁.emb x :=
iff.rfl

lemma compat (h : E₁ ≤ E₂) : ∀ x, E₂.emb (inclusion h.fst x) = E₁.emb x :=
by { rw le_def at h, cases h, assumption }

instance : preorder (subfield_with_hom K L M hL) :=
{ le := (≤),
le_refl := λ E, ⟨le_refl _, by simp⟩,
le_trans := λ E₁ E₂ E₃ h₁₂ h₂₃,
⟨le_trans h₁₂.fst h₂₃.fst,
λ _, by erw [← inclusion_inclusion h₁₂.fst h₂₃.fst, compat, compat]⟩ }

open lattice

lemma maximal_subfield_with_hom_chain_bounded (c : set (subfield_with_hom K L M hL))
(hc : chain (≤) c) (hcn : c.nonempty) :
∃ ub : subfield_with_hom K L M hL, ∀ N, N ∈ c → N ≤ ub :=
let ub : subfield_with_hom K L M hL :=
by haveI : nonempty c := set.nonempty.to_subtype hcn; exact
{ carrier := ⨆ i : c, (i : subfield_with_hom K L M hL).carrier,
emb := subalgebra.supr_lift
(λ i : c, (i : subfield_with_hom K L M hL).carrier)
(λ i j, let ⟨k, hik, hjk⟩ := directed_on_iff_directed.1 hc.directed_on i j in
⟨k, hik.fst, hjk.fst⟩)
(λ i, (i : subfield_with_hom K L M hL).emb)
begin
assume i j h,
ext x,
cases hc.total i.prop j.prop with hij hji,
{ simp [← hij.snd x] },
{ erw [alg_hom.comp_apply, ← hji.snd (inclusion h x),
inclusion_inclusion, inclusion_self, alg_hom.id_apply x] }
end _ rfl } in
⟨ub, λ N hN, ⟨(le_supr (λ i : c, (i : subfield_with_hom K L M hL).carrier) ⟨N, hN⟩ : _),
begin
intro x,
simp [ub],
refl
end⟩⟩

variables (hL M)

lemma exists_maximal_subfield_with_hom : ∃ E : subfield_with_hom K L M hL,
∀ N, E ≤ N → N ≤ E :=
zorn.exists_maximal_of_nonempty_chains_bounded
maximal_subfield_with_hom_chain_bounded (λ _ _ _, le_trans)

/-- The maximal `subfield_with_hom`. We later prove that this is equal to `⊤`. -/
def maximal_subfield_with_hom : subfield_with_hom K L M hL :=
classical.some (exists_maximal_subfield_with_hom M hL)

lemma maximal_subfield_with_hom_is_maximal :
∀ (N : subfield_with_hom K L M hL),
(maximal_subfield_with_hom M hL) ≤ N → N ≤ (maximal_subfield_with_hom M hL) :=
classical.some_spec (exists_maximal_subfield_with_hom M hL)

lemma maximal_subfield_with_hom_eq_top :
(maximal_subfield_with_hom M hL).carrier = ⊤ :=
begin
rw [eq_top_iff],
intros x _,
let p := minpoly K x,
let N : subalgebra K L := (maximal_subfield_with_hom M hL).carrier,
letI : field N := is_field.to_field _ (subalgebra.is_field_of_algebraic N hL),
letI : algebra N M := (maximal_subfield_with_hom M hL).emb.to_ring_hom.to_algebra,
cases is_alg_closed.exists_aeval_eq_zero M (minpoly N x)
(ne_of_gt (minpoly.degree_pos
((is_algebraic_iff_is_integral _).1 (algebra.is_algebraic_of_larger_field hL x)))) with y hy,
let O : subalgebra N L := algebra.adjoin N {(x : L)},
let larger_emb := ((adjoin_root.lift_hom (minpoly N x) y hy).comp
(alg_equiv.adjoin_singleton_equiv_adjoin_root_minpoly N x).to_alg_hom),
have hNO : N ≤ N.under O,
{ intros z hz,
show algebra_map N L ⟨z, hz⟩ ∈ O,
exact O.algebra_map_mem _ },
let O' : subfield_with_hom K L M hL :=
{ carrier := N.under O,
emb := larger_emb.restrict_scalars K },
have hO' : maximal_subfield_with_hom M hL ≤ O',
{ refine ⟨hNO, _⟩,
intros z,
show O'.emb (algebra_map N O z) = algebra_map N M z,
simp only [O', restrict_scalars_apply, alg_hom.commutes] },
refine (maximal_subfield_with_hom_is_maximal M hL O' hO').fst _,
exact algebra.subset_adjoin (set.mem_singleton x),
end

end subfield_with_hom
end lift

namespace is_alg_closed

variables {K : Type u} [field K] {L : Type v} {M : Type w} [field L] [algebra K L]
[field M] [algebra K M] [is_alg_closed M] (hL : algebra.is_algebraic K L)

variables (K L M)
include hL

/-- A (random) hom from an algebraic extension of K into an algebraically closed extension of K -/
@[irreducible] def lift : L →ₐ[K] M :=
(lift.subfield_with_hom.maximal_subfield_with_hom M hL).emb.comp $
eq.rec_on (lift.subfield_with_hom.maximal_subfield_with_hom_eq_top M hL).symm algebra.to_top

end is_alg_closed
2 changes: 1 addition & 1 deletion src/ring_theory/algebraic.lean
Expand Up @@ -118,7 +118,7 @@ end

/-- If A is an algebraic algebra over K, then A is algebraic over L when L is an extension of K -/
lemma is_algebraic_of_larger_field (A_alg : is_algebraic K A) : is_algebraic L A :=
λ x, let ⟨p, hp⟩ := A_alg x in
λ x, let ⟨p, hp⟩ := A_alg x in
⟨p.map (algebra_map _ _), map_ne_zero hp.1, by simp [hp.2]⟩

/-- A field extension is algebraic if it is finite. -/
Expand Down