Skip to content

Commit 3da7809

Browse files
committed
feat: Hahn embedding theorem (leanprover-community#27268)
This proves [Hahn embedding theorem](https://en.wikipedia.org/wiki/Hahn_embedding_theorem), one among the 1000+ theorems project. Note on file location: I originally placed it in Algebra/Order/Group, but got prompted that Algebra can't import Analysis (needed for `Real` being a `Rat`-module` and related fact), so now I moved it under HahnSeries
1 parent 26fbcd9 commit 3da7809

5 files changed

Lines changed: 122 additions & 1 deletion

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5587,6 +5587,7 @@ import Mathlib.RingTheory.Grassmannian
55875587
import Mathlib.RingTheory.HahnSeries.Addition
55885588
import Mathlib.RingTheory.HahnSeries.Basic
55895589
import Mathlib.RingTheory.HahnSeries.HEval
5590+
import Mathlib.RingTheory.HahnSeries.HahnEmbedding
55905591
import Mathlib.RingTheory.HahnSeries.Lex
55915592
import Mathlib.RingTheory.HahnSeries.Multiplication
55925593
import Mathlib.RingTheory.HahnSeries.PowerSeries

Mathlib/Algebra/Order/Module/HahnEmbedding.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ under `ArchimedeanClass.closedBall K c`. The embeddings from these submodules ar
2828
`HahnEmbedding.Seed K M R`.
2929
3030
By setting `K = ℚ` and `R = ℝ`, the condition can be trivially satisfied, leading
31-
to a proof of the classic Hahn embedding theorem. (TODO: implement this)
31+
to a proof of the classic Hahn embedding theorem. (See `hahnEmbedding_isOrderedAddMonoid`)
3232
3333
## Main theorem
3434
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/-
2+
Copyright (c) 2025 Weiyi Wang. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Weiyi Wang
5+
-/
6+
import Mathlib.Algebra.Order.Module.HahnEmbedding
7+
import Mathlib.Algebra.Module.LinearMap.Rat
8+
import Mathlib.Algebra.Field.Rat
9+
import Mathlib.Analysis.RCLike.Basic
10+
import Mathlib.Data.Real.Embedding
11+
import Mathlib.GroupTheory.DivisibleHull
12+
13+
/-!
14+
15+
# Hahn embedding theorem
16+
17+
In this file, we prove the Hahn embedding theorem: every linearly ordered abelian group
18+
can be embedded as an ordered subgroup of `Lex (HahnSeries Ω ℝ)`, where `Ω` is the finite
19+
Archimedean classes of the group. The theorem is stated as `hahnEmbedding_isOrderedAddMonoid`.
20+
21+
## References
22+
23+
* [A. H. Clifford, *Note on Hahn’s theorem on ordered Abelian groups.*][clifford1954]
24+
25+
-/
26+
27+
open ArchimedeanClass
28+
29+
variable (M : Type*) [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M]
30+
31+
section Module
32+
variable [Module ℚ M] [IsOrderedModule ℚ M]
33+
34+
instance : Nonempty (HahnEmbedding.Seed ℚ M ℝ) := by
35+
obtain ⟨strata⟩ : Nonempty (HahnEmbedding.ArchimedeanStrata ℚ M) := inferInstance
36+
choose f hf using fun c ↦ Archimedean.exists_orderAddMonoidHom_real_injective (strata.stratum c)
37+
refine ⟨strata, fun c ↦ (f c).toRatLinearMap, fun c ↦ ?_⟩
38+
apply Monotone.strictMono_of_injective
39+
· simpa using OrderHomClass.monotone (f c)
40+
· simpa using hf c
41+
42+
theorem hahnEmbedding_isOrderedModule_rat :
43+
∃ f : M →ₗ[ℚ] Lex (HahnSeries (FiniteArchimedeanClass M) ℝ), StrictMono f ∧
44+
∀ a, mk a = FiniteArchimedeanClass.withTopOrderIso M (ofLex (f a)).orderTop := by
45+
apply hahnEmbedding_isOrderedModule
46+
47+
end Module
48+
49+
/--
50+
**Hahn embedding theorem**
51+
52+
For a linearly ordered additive group `M`, there exists an injective `OrderAddMonoidHom` from `M` to
53+
`Lex (HahnSeries (FiniteArchimedeanClass M) ℝ)` that sends each `a : M` to an element of the
54+
`a`-Archimedean class of the Hahn series.
55+
-/
56+
theorem hahnEmbedding_isOrderedAddMonoid :
57+
∃ f : M →+o Lex (HahnSeries (FiniteArchimedeanClass M) ℝ), Function.Injective f ∧
58+
∀ a, mk a = FiniteArchimedeanClass.withTopOrderIso M (ofLex (f a)).orderTop := by
59+
/-
60+
The desired embedding is the composition of three functions:
61+
62+
Group type `ArchimedeanClass` / `HahnSeries.orderTop` type
63+
64+
`M` `ArchimedeanClass M`
65+
`f₁` ↓+o ↓o~
66+
`D-Hull M` `ArchimedeanClass (D-Hull M)`
67+
`f₂` ↓+o ↓o~
68+
`Lex (HahnSeries (F-A-Class (D-Hull M)) ℝ)` `WithTop (F-A-Class (D-Hull M))`
69+
`f₃` ↓+o(~) ↓o~
70+
`Lex (HahnSeries (F-A-Class M) ℝ)` `WithTop (F-A-Class M)`
71+
-/
72+
73+
let f₁ := DivisibleHull.coeOrderAddMonoidHom M
74+
have hf₁ : Function.Injective f₁ := DivisibleHull.coe_injective
75+
have hf₁class (a : M) : mk a = (DivisibleHull.archimedeanClassOrderIso M).symm (mk (f₁ a)) := by
76+
simp [f₁]
77+
78+
obtain ⟨f₂', hf₂', hf₂class'⟩ := hahnEmbedding_isOrderedModule_rat (DivisibleHull M)
79+
let f₂ := OrderAddMonoidHom.mk f₂'.toAddMonoidHom hf₂'.monotone
80+
have hf₂ : Function.Injective f₂ := hf₂'.injective
81+
have hf₂class (a : DivisibleHull M) :
82+
mk a = (FiniteArchimedeanClass.withTopOrderIso (DivisibleHull M)) (ofLex (f₂ a)).orderTop :=
83+
hf₂class' a
84+
85+
let f₃ : Lex (HahnSeries (FiniteArchimedeanClass (DivisibleHull M)) ℝ) →+o
86+
Lex (HahnSeries (FiniteArchimedeanClass M) ℝ) :=
87+
HahnSeries.embDomainOrderAddMonoidHom
88+
(FiniteArchimedeanClass.congrOrderIso (DivisibleHull.archimedeanClassOrderIso M).symm)
89+
have hf₃ : Function.Injective f₃ := HahnSeries.embDomainOrderAddMonoidHom_injective _
90+
have hf₃class (a : Lex (HahnSeries (FiniteArchimedeanClass (DivisibleHull M)) ℝ)) :
91+
(ofLex a).orderTop = OrderIso.withTopCongr
92+
((FiniteArchimedeanClass.congrOrderIso (DivisibleHull.archimedeanClassOrderIso M)))
93+
(ofLex (f₃ a)).orderTop := by
94+
rw [← OrderIso.symm_apply_eq]
95+
simp [f₃, ← OrderIso.withTopCongr_symm]
96+
97+
refine ⟨f₃.comp (f₂.comp f₁), hf₃.comp (hf₂.comp hf₁), ?_⟩
98+
intro a
99+
simp_rw [hf₁class, hf₂class, hf₃class, OrderAddMonoidHom.comp_apply]
100+
cases (ofLex (f₃ (f₂ (f₁ a)))).orderTop with
101+
| top => simp
102+
| coe x => simp [-DivisibleHull.archimedeanClassOrderIso_apply]

docs/1000.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3196,6 +3196,9 @@ Q5638112:
31963196

31973197
Q5638886:
31983198
title: Hahn embedding theorem
3199+
decl: hahnEmbedding_isOrderedAddMonoid
3200+
authors: Weiyi Wang
3201+
date: 2025
31993202

32003203
Q5643485:
32013204
title: Halpern–Läuchli theorem

docs/references.bib

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,6 +1139,21 @@ @Book{ clark_gon
11391139
url = {http://alpha.math.uga.edu/~pete/geometryofnumbers.pdf}
11401140
}
11411141

1142+
@Article{ clifford1954,
1143+
author = {Clifford, A. H.},
1144+
title = {Note on {Hahn}'s theorem on ordered {Abelian} groups},
1145+
fjournal = {Proceedings of the American Mathematical Society},
1146+
journal = {Proc. Am. Math. Soc.},
1147+
issn = {0002-9939},
1148+
volume = {5},
1149+
pages = {860--863},
1150+
year = {1954},
1151+
language = {English},
1152+
doi = {10.2307/2032549},
1153+
zbmath = {3090187},
1154+
zbl = {0056.25503}
1155+
}
1156+
11421157
@Article{ cockett1993,
11431158
author = {J.R.B. Cockett},
11441159
title = {Introduction to Distributive Categories},

0 commit comments

Comments
 (0)