Skip to content

Commit 71f1384

Browse files
committed
feat: port FieldTheory.IsAlgClosed.Classification (#4940)
1 parent e3d3b97 commit 71f1384

File tree

2 files changed

+228
-0
lines changed

2 files changed

+228
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1696,6 +1696,7 @@ import Mathlib.FieldTheory.Finiteness
16961696
import Mathlib.FieldTheory.Fixed
16971697
import Mathlib.FieldTheory.IntermediateField
16981698
import Mathlib.FieldTheory.IsAlgClosed.Basic
1699+
import Mathlib.FieldTheory.IsAlgClosed.Classification
16991700
import Mathlib.FieldTheory.IsAlgClosed.Spectrum
17001701
import Mathlib.FieldTheory.Laurent
17011702
import Mathlib.FieldTheory.Minpoly.Basic
Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
/-
2+
Copyright (c) 2022 Chris Hughes. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Chris Hughes
5+
6+
! This file was ported from Lean 3 source module field_theory.is_alg_closed.classification
7+
! leanprover-community/mathlib commit 70fd9563a21e7b963887c9360bd29b2393e6225a
8+
! Please do not edit these lines, except to modify the commit id
9+
! if you have ported upstream changes.
10+
-/
11+
import Mathlib.RingTheory.AlgebraicIndependent
12+
import Mathlib.FieldTheory.IsAlgClosed.Basic
13+
import Mathlib.Data.Polynomial.Cardinal
14+
import Mathlib.Data.MvPolynomial.Cardinal
15+
import Mathlib.Data.ZMod.Algebra
16+
17+
/-!
18+
# Classification of Algebraically closed fields
19+
20+
This file contains results related to classifying algebraically closed fields.
21+
22+
## Main statements
23+
24+
* `IsAlgClosed.equivOfTranscendenceBasis` Two algebraically closed fields with the same
25+
characteristic and the same cardinality of transcendence basis are isomorphic.
26+
* `IsAlgClosed.ringEquivOfCardinalEqOfCharEq` Two uncountable algebraically closed fields
27+
are isomorphic if they have the same characteristic and the same cardinality.
28+
-/
29+
30+
31+
universe u
32+
33+
open scoped Cardinal Polynomial
34+
35+
open Cardinal
36+
37+
section AlgebraicClosure
38+
39+
namespace Algebra.IsAlgebraic
40+
41+
variable (R L : Type u) [CommRing R] [CommRing L] [IsDomain L] [Algebra R L]
42+
43+
variable [NoZeroSMulDivisors R L] (halg : Algebra.IsAlgebraic R L)
44+
45+
theorem cardinal_mk_le_sigma_polynomial :
46+
(#L) ≤ (#Σ p : R[X], { x : L // x ∈ (p.map (algebraMap R L)).roots }) :=
47+
@mk_le_of_injective L (Σ p : R[X], {x : L | x ∈ (p.map (algebraMap R L)).roots})
48+
(fun x : L =>
49+
let p := Classical.indefiniteDescription _ (halg x)
50+
⟨p.1, x, by
51+
dsimp
52+
have h : p.1.map (algebraMap R L) ≠ 0 := by
53+
rw [Ne.def, ← Polynomial.degree_eq_bot,
54+
Polynomial.degree_map_eq_of_injective (NoZeroSMulDivisors.algebraMap_injective R L),
55+
Polynomial.degree_eq_bot]
56+
exact p.2.1
57+
erw [Polynomial.mem_roots h, Polynomial.IsRoot, Polynomial.eval_map, ← Polynomial.aeval_def,
58+
p.2.2]⟩)
59+
fun x y => by
60+
intro h
61+
simp at h
62+
refine' (Subtype.heq_iff_coe_eq _).1 h.2
63+
simp only [h.1, iff_self_iff, forall_true_iff]
64+
#align algebra.is_algebraic.cardinal_mk_le_sigma_polynomial Algebra.IsAlgebraic.cardinal_mk_le_sigma_polynomial
65+
66+
/-- The cardinality of an algebraic extension is at most the maximum of the cardinality
67+
of the base ring or `ℵ₀` -/
68+
theorem cardinal_mk_le_max : (#L) ≤ max (#R) ℵ₀ :=
69+
calc
70+
(#L) ≤ (#Σ p : R[X], { x : L // x ∈ (p.map (algebraMap R L)).roots }) :=
71+
cardinal_mk_le_sigma_polynomial R L halg
72+
_ = Cardinal.sum fun p : R[X] => #{x : L | x ∈ (p.map (algebraMap R L)).roots} := by
73+
rw [← mk_sigma]; rfl
74+
_ ≤ Cardinal.sum.{u, u} fun _ : R[X] => ℵ₀ :=
75+
(sum_le_sum _ _ fun p => (Multiset.finite_toSet _).lt_aleph0.le)
76+
_ = (#R[X]) * ℵ₀ := (sum_const' _ _)
77+
_ ≤ max (max (#R[X]) ℵ₀) ℵ₀ := (mul_le_max _ _)
78+
_ ≤ max (max (max (#R) ℵ₀) ℵ₀) ℵ₀ :=
79+
(max_le_max (max_le_max Polynomial.cardinal_mk_le_max le_rfl) le_rfl)
80+
_ = max (#R) ℵ₀ := by simp only [max_assoc, max_comm ℵ₀, max_left_comm ℵ₀, max_self]
81+
#align algebra.is_algebraic.cardinal_mk_le_max Algebra.IsAlgebraic.cardinal_mk_le_max
82+
83+
end Algebra.IsAlgebraic
84+
85+
end AlgebraicClosure
86+
87+
namespace IsAlgClosed
88+
89+
section Classification
90+
91+
noncomputable section
92+
93+
variable {R L K : Type _} [CommRing R]
94+
95+
variable [Field K] [Algebra R K]
96+
97+
variable [Field L] [Algebra R L]
98+
99+
variable {ι : Type _} (v : ι → K)
100+
101+
variable {κ : Type _} (w : κ → L)
102+
103+
variable (hv : AlgebraicIndependent R v)
104+
105+
theorem isAlgClosure_of_transcendence_basis [IsAlgClosed K] (hv : IsTranscendenceBasis R v) :
106+
IsAlgClosure (Algebra.adjoin R (Set.range v)) K :=
107+
letI := RingHom.domain_nontrivial (algebraMap R K)
108+
{ alg_closed := by infer_instance
109+
algebraic := hv.isAlgebraic }
110+
#align is_alg_closed.is_alg_closure_of_transcendence_basis IsAlgClosed.isAlgClosure_of_transcendence_basis
111+
112+
variable (hw : AlgebraicIndependent R w)
113+
114+
/-- setting `R` to be `ZMod (ringChar R)` this result shows that if two algebraically
115+
closed fields have equipotent transcendence bases and the same characteristic then they are
116+
isomorphic. -/
117+
def equivOfTranscendenceBasis [IsAlgClosed K] [IsAlgClosed L] (e : ι ≃ κ)
118+
(hv : IsTranscendenceBasis R v) (hw : IsTranscendenceBasis R w) : K ≃+* L := by
119+
letI := isAlgClosure_of_transcendence_basis v hv
120+
letI := isAlgClosure_of_transcendence_basis w hw
121+
have e : Algebra.adjoin R (Set.range v) ≃+* Algebra.adjoin R (Set.range w)
122+
· refine' hv.1.aevalEquiv.symm.toRingEquiv.trans _
123+
refine' (AlgEquiv.ofAlgHom (MvPolynomial.rename e)
124+
(MvPolynomial.rename e.symm) _ _).toRingEquiv.trans _
125+
· ext; simp
126+
· ext; simp
127+
exact hw.1.aevalEquiv.toRingEquiv
128+
exact IsAlgClosure.equivOfEquiv K L e
129+
#align is_alg_closed.equiv_of_transcendence_basis IsAlgClosed.equivOfTranscendenceBasis
130+
131+
end
132+
133+
end Classification
134+
135+
section Cardinal
136+
137+
variable {R L K : Type u} [CommRing R]
138+
139+
variable [Field K] [Algebra R K] [IsAlgClosed K]
140+
141+
variable {ι : Type u} (v : ι → K)
142+
143+
variable (hv : IsTranscendenceBasis R v)
144+
145+
theorem cardinal_le_max_transcendence_basis (hv : IsTranscendenceBasis R v) :
146+
(#K) ≤ max (max (#R) (#ι)) ℵ₀ :=
147+
calc
148+
(#K) ≤ max (#Algebra.adjoin R (Set.range v)) ℵ₀ :=
149+
letI := isAlgClosure_of_transcendence_basis v hv
150+
Algebra.IsAlgebraic.cardinal_mk_le_max _ _ IsAlgClosure.algebraic
151+
_ = max (#MvPolynomial ι R) ℵ₀ := by rw [Cardinal.eq.2 ⟨hv.1.aevalEquiv.toEquiv⟩]
152+
_ ≤ max (max (max (#R) (#ι)) ℵ₀) ℵ₀ := (max_le_max MvPolynomial.cardinal_mk_le_max le_rfl)
153+
_ = _ := by simp [max_assoc]
154+
#align is_alg_closed.cardinal_le_max_transcendence_basis IsAlgClosed.cardinal_le_max_transcendence_basis
155+
156+
/-- If `K` is an uncountable algebraically closed field, then its
157+
cardinality is the same as that of a transcendence basis. -/
158+
theorem cardinal_eq_cardinal_transcendence_basis_of_aleph0_lt [Nontrivial R]
159+
(hv : IsTranscendenceBasis R v) (hR : (#R) ≤ ℵ₀) (hK : ℵ₀ < (#K)) : (#K) = (#ι) :=
160+
have : ℵ₀ ≤ (#ι) := le_of_not_lt fun h => not_le_of_gt hK <|
161+
calc
162+
(#K) ≤ max (max (#R) (#ι)) ℵ₀ := cardinal_le_max_transcendence_basis v hv
163+
_ ≤ _ := max_le (max_le hR (le_of_lt h)) le_rfl
164+
le_antisymm
165+
(calc
166+
(#K) ≤ max (max (#R) (#ι)) ℵ₀ := cardinal_le_max_transcendence_basis v hv
167+
_ = (#ι) := by
168+
rw [max_eq_left, max_eq_right]
169+
· exact le_trans hR this
170+
· exact le_max_of_le_right this)
171+
(mk_le_of_injective (show Function.Injective v from hv.1.injective))
172+
#align is_alg_closed.cardinal_eq_cardinal_transcendence_basis_of_aleph_0_lt IsAlgClosed.cardinal_eq_cardinal_transcendence_basis_of_aleph0_lt
173+
174+
end Cardinal
175+
176+
variable {K L : Type} [Field K] [Field L] [IsAlgClosed K] [IsAlgClosed L]
177+
178+
/-- Two uncountable algebraically closed fields of characteristic zero are isomorphic
179+
if they have the same cardinality. -/
180+
@[nolint defLemma]
181+
theorem ringEquivOfCardinalEqOfCharZero [CharZero K] [CharZero L] (hK : ℵ₀ < (#K))
182+
(hKL : (#K) = (#L)) : K ≃+* L := by
183+
apply Classical.choice
184+
cases' exists_isTranscendenceBasis ℤ
185+
(show Function.Injective (algebraMap ℤ K) from Int.cast_injective) with s hs
186+
cases' exists_isTranscendenceBasis ℤ
187+
(show Function.Injective (algebraMap ℤ L) from Int.cast_injective) with t ht
188+
have : (#s) = (#t) := by
189+
rw [← cardinal_eq_cardinal_transcendence_basis_of_aleph0_lt _ hs (le_of_eq mk_int) hK, ←
190+
cardinal_eq_cardinal_transcendence_basis_of_aleph0_lt _ ht (le_of_eq mk_int), hKL]
191+
rwa [← hKL]
192+
cases' Cardinal.eq.1 this with e
193+
exact ⟨equivOfTranscendenceBasis _ _ e hs ht⟩
194+
#align is_alg_closed.ring_equiv_of_cardinal_eq_of_char_zero IsAlgClosed.ringEquivOfCardinalEqOfCharZero
195+
196+
private theorem ringEquivOfCardinalEqOfCharP (p : ℕ) [Fact p.Prime] [CharP K p] [CharP L p]
197+
(hK : ℵ₀ < (#K)) (hKL : (#K) = (#L)) : K ≃+* L := by
198+
apply Classical.choice
199+
cases' exists_isTranscendenceBasis (ZMod p)
200+
(show Function.Injective (algebraMap (ZMod p) K) from RingHom.injective _) with s hs
201+
cases' exists_isTranscendenceBasis (ZMod p)
202+
(show Function.Injective (algebraMap (ZMod p) L) from RingHom.injective _) with t ht
203+
have : (#s) = (#t) := by
204+
rw [← cardinal_eq_cardinal_transcendence_basis_of_aleph0_lt _ hs
205+
(lt_aleph0_of_finite (ZMod p)).le hK,
206+
← cardinal_eq_cardinal_transcendence_basis_of_aleph0_lt _ ht
207+
(lt_aleph0_of_finite (ZMod p)).le, hKL]
208+
rwa [← hKL]
209+
cases' Cardinal.eq.1 this with e
210+
exact ⟨equivOfTranscendenceBasis _ _ e hs ht⟩
211+
212+
/-- Two uncountable algebraically closed fields are isomorphic
213+
if they have the same cardinality and the same characteristic. -/
214+
@[nolint defLemma]
215+
theorem ringEquivOfCardinalEqOfCharEq (p : ℕ) [CharP K p] [CharP L p] (hK : ℵ₀ < (#K))
216+
(hKL : (#K) = (#L)) : K ≃+* L := by
217+
apply Classical.choice
218+
rcases CharP.char_is_prime_or_zero K p with (hp | hp)
219+
· haveI : Fact p.Prime := ⟨hp⟩
220+
exact ⟨ringEquivOfCardinalEqOfCharP p hK hKL⟩
221+
· simp only [hp] at *
222+
letI : CharZero K := CharP.charP_to_charZero K
223+
letI : CharZero L := CharP.charP_to_charZero L
224+
exact ⟨ringEquivOfCardinalEqOfCharZero hK hKL⟩
225+
#align is_alg_closed.ring_equiv_of_cardinal_eq_of_char_eq IsAlgClosed.ringEquivOfCardinalEqOfCharEq
226+
227+
end IsAlgClosed

0 commit comments

Comments
 (0)