Skip to content

Commit 0fa3a6f

Browse files
committed
feat: Hahn embedding theorem
1 parent e011708 commit 0fa3a6f

9 files changed

Lines changed: 224 additions & 5 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,7 @@ import Mathlib.Algebra.Order.Group.DenselyOrdered
844844
import Mathlib.Algebra.Order.Group.End
845845
import Mathlib.Algebra.Order.Group.Equiv
846846
import Mathlib.Algebra.Order.Group.Finset
847+
import Mathlib.Algebra.Order.Group.HahnEmbedding
847848
import Mathlib.Algebra.Order.Group.Indicator
848849
import Mathlib.Algebra.Order.Group.InjSurj
849850
import Mathlib.Algebra.Order.Group.Instances

Mathlib/Algebra/Order/Archimedean/Class.lean

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,4 +707,22 @@ theorem withTopOrderIso_symm_apply {a : M} (h : a ≠ 1) :
707707
unfold mk withTopOrderIso
708708
convert WithTop.subtypeOrderIso_symm_apply (MulArchimedeanClass.mk_eq_top_iff.ne.mpr h)
709709

710+
variable {N : Type*} [CommGroup N] [LinearOrder N] [IsOrderedMonoid N]
711+
712+
@[to_additive]
713+
noncomputable
714+
def congrOrderIso (e : MulArchimedeanClass M ≃o MulArchimedeanClass N) :
715+
FiniteMulArchimedeanClass M ≃o FiniteMulArchimedeanClass N where
716+
__ := Equiv.subtypeEquiv e (by simp)
717+
map_rel_iff' := by simp
718+
719+
@[to_additive (attr := simp)]
720+
theorem coe_congrOrderIso (e : MulArchimedeanClass M ≃o MulArchimedeanClass N)
721+
(a : FiniteMulArchimedeanClass M) :
722+
(congrOrderIso e a : MulArchimedeanClass N) = e a := rfl
723+
724+
@[to_additive (attr := simp)]
725+
theorem congrOrderIso_symm (e : MulArchimedeanClass M ≃o MulArchimedeanClass N) :
726+
(congrOrderIso e).symm = congrOrderIso e.symm := rfl
727+
710728
end FiniteMulArchimedeanClass
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
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+
import Mathlib.LinearAlgebra.Basis.VectorSpace
13+
14+
/-!
15+
16+
# Hahn embedding theorem
17+
18+
In this file, we prove the Hahn embedding theorem: every linearly ordered abelian group
19+
can be embedded as an ordered subgroup of `Lex (HahnSeries Ω ℝ)`, where `Ω` is the finite
20+
Archimedean classes of the group. The theorem is stated as
21+
`exists_orderAddMonoidHom_hahnSeries_real_injective_and_archimedeanClassMk_eq`.
22+
23+
## References
24+
25+
* [A. H. Clifford, *Note on Hahn’s theorem on ordered Abelian groups.*][zbMATH03090187]
26+
27+
-/
28+
29+
open ArchimedeanClass
30+
31+
variable (M : Type*) [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M]
32+
33+
section Module
34+
variable [Module ℚ M] [PosSMulMono ℚ M]
35+
36+
instance : Nonempty (HahnEmbedding.ArchimedeanStrata ℚ M) := by
37+
have : ComplementedLattice (Submodule ℚ M) := inferInstance
38+
have stratum (c : ArchimedeanClass M) :
39+
∃ G : Submodule ℚ M, Disjoint (ball ℚ c) G ∧ ball ℚ c ⊔ G = closedBall ℚ c := by
40+
apply IsModularLattice.exists_disjoint_and_sup_eq
41+
apply ball_le_closedBall
42+
choose g h1 h2 using stratum
43+
exact ⟨g, h1, h2⟩
44+
45+
instance : Nonempty (HahnEmbedding.Seed ℚ M ℝ) := by
46+
obtain ⟨strata⟩ : Nonempty (HahnEmbedding.ArchimedeanStrata ℚ M) := inferInstance
47+
choose f hf using fun c ↦ Archimedean.exists_orderAddMonoidHom_real_injective (strata.stratum c)
48+
refine ⟨strata, fun c ↦ (f c).toRatLinearMap, fun c ↦ ?_⟩
49+
apply Monotone.strictMono_of_injective
50+
· simpa using (f c).monotone'
51+
· simpa using hf c
52+
53+
theorem exists_linearMap_hahnSeries_real_strictMono_and_archimedeanClassMk_eq :
54+
∃ f : M →ₗ[ℚ] Lex (HahnSeries (FiniteArchimedeanClass M) ℝ), StrictMono f ∧
55+
∀ (a : M), mk a = FiniteArchimedeanClass.withTopOrderIso M (ofLex (f a)).orderTop := by
56+
apply exists_linearMap_hahnSeries_strictMono_and_archimedeanClassMk_eq
57+
58+
end Module
59+
60+
/--
61+
**Hahn embedding theorem**
62+
63+
For a linearly ordered additive group `M`, there exists an `OrderAddMonoidHom` from `M` to
64+
`Lex (HahnSeries (FiniteArchimedeanClass M) ℝ)` that is injective, and transfers the Archimedean
65+
class of each element to `HahnSeries.orderTop`.
66+
-/
67+
theorem exists_orderAddMonoidHom_hahnSeries_real_injective_and_archimedeanClassMk_eq :
68+
∃ f : M →+o Lex (HahnSeries (FiniteArchimedeanClass M) ℝ), Function.Injective f ∧
69+
∀ (a : M), mk a = FiniteArchimedeanClass.withTopOrderIso M (ofLex (f a)).orderTop := by
70+
/-
71+
The desired embedding is the composition of three functions:
72+
73+
Group type `ArchimedeanClass` / `HahnSeries.orderTop` type
74+
75+
`M` `ArchimedeanClass M`
76+
`f₁` ↓+o ↓o~
77+
`D-Hull M` `ArchimedeanClass (D-Hull M)`
78+
`f₂` ↓+o ↓o~
79+
`Lex (HahnSeries (F-A-Class (D-Hull M)) ℝ)` `WithTop (F-A-Class (D-Hull M))`
80+
`f₃` ↓+o(~) ↓o~
81+
`Lex (HahnSeries (F-A-Class M) ℝ)` `WithTop (F-A-Class M)`
82+
-/
83+
84+
let f₁ := DivisibleHull.coeOrderAddMonoidHom M
85+
have hf₁ : Function.Injective f₁ := DivisibleHull.coeOrderAddMonoidHom_injective
86+
have hf₁class (a : M) : mk a = (DivisibleHull.archimedeanClassOrderIso M).symm (mk (f₁ a)) := by
87+
simp [f₁]
88+
89+
obtain ⟨f₂', hf₂', hf₂class'⟩ :=
90+
exists_linearMap_hahnSeries_real_strictMono_and_archimedeanClassMk_eq (DivisibleHull M)
91+
let f₂ := OrderAddMonoidHom.mk f₂'.toAddMonoidHom hf₂'.monotone
92+
have hf₂ : Function.Injective f₂ := hf₂'.injective
93+
have hf₂class (a : DivisibleHull M) :
94+
mk a = (FiniteArchimedeanClass.withTopOrderIso (DivisibleHull M)) (ofLex (f₂ a)).orderTop :=
95+
hf₂class' a
96+
97+
let f₃ : Lex (HahnSeries (FiniteArchimedeanClass (DivisibleHull M)) ℝ) →+o
98+
Lex (HahnSeries (FiniteArchimedeanClass M) ℝ) :=
99+
HahnSeries.embDomainOrderAddMonoidHom
100+
(FiniteArchimedeanClass.congrOrderIso (DivisibleHull.archimedeanClassOrderIso M).symm)
101+
have hf₃ : Function.Injective f₃ := HahnSeries.embDomainOrderAddMonoidHom_injective _
102+
have hf₃class (a : Lex (HahnSeries (FiniteArchimedeanClass (DivisibleHull M)) ℝ)) :
103+
(ofLex a).orderTop = OrderIso.withTopCongr
104+
((FiniteArchimedeanClass.congrOrderIso (DivisibleHull.archimedeanClassOrderIso M)))
105+
(ofLex (f₃ a)).orderTop := by
106+
rw [← OrderIso.symm_apply_eq]
107+
simp [f₃, ← OrderIso.withTopCongr_symm]
108+
109+
refine ⟨f₃.comp (f₂.comp f₁), hf₃.comp (hf₂.comp hf₁), ?_⟩
110+
intro a
111+
simp_rw [hf₁class, hf₂class, hf₃class, OrderAddMonoidHom.comp_apply]
112+
cases (ofLex (f₃ (f₂ (f₁ a)))).orderTop with
113+
| top => simp
114+
| coe x => simp [-DivisibleHull.archimedeanClassOrderIso_apply]

Mathlib/Algebra/Order/Module/Archimedean.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,11 @@ theorem ball_antitone : Antitone (ball (M := M) K) := by
100100
intro _ _ h
101101
exact (Submodule.toAddSubgroup_le _ _).mp <| ballAddSubgroup_antitone h
102102

103+
theorem ball_le_closedBall (c : ArchimedeanClass M) :
104+
ball K c ≤ closedBall K c := by
105+
obtain rfl | hc := eq_or_ne c ⊤
106+
· simp
107+
intro a ha
108+
simpa using ((mem_ball_iff K hc).mp ha).le
109+
103110
end ArchimedeanClass

Mathlib/GroupTheory/DivisibleHull.lean

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,9 @@ def mk (m : M) (s : nonZeroDivisors ℕ) : DivisibleHull M := LocalizedModule.mk
6262
instance : Coe M (DivisibleHull M) where
6363
coe m := mk m 1
6464

65-
theorem coe_eq_mk (m : M) : m = mk m 1 := rfl
66-
6765
@[simp]
6866
theorem mk_zero (s : nonZeroDivisors ℕ) : mk (0 : M) s = 0 := by simp [mk]
6967

70-
@[simp]
71-
theorem coe_zero : (0 : M) = (0 : DivisibleHull M) := by simp
72-
7368
theorem ind {motive : DivisibleHull M → Prop} (mk : ∀ num den, motive (.mk num den)) :
7469
∀ x, motive x := by
7570
apply LocalizedModule.induction_on

Mathlib/RingTheory/HahnSeries/Basic.lean

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,21 @@ theorem embDomain_injective {f : Γ ↪o Γ'} :
484484
have xyg := xy (f g)
485485
rwa [embDomain_coeff, embDomain_coeff] at xyg
486486

487+
@[simp]
488+
theorem orderTop_embDomain {Γ : Type*} [LinearOrder Γ] {f : Γ ↪o Γ'} {x : HahnSeries Γ R} :
489+
(embDomain f x).orderTop = WithTop.map f x.orderTop := by
490+
obtain rfl | hx := eq_or_ne x 0
491+
· simp
492+
rw [← WithTop.coe_untop x.orderTop (by simpa using hx), WithTop.map_coe]
493+
apply orderTop_eq_of_le
494+
· simpa using HahnSeries.coeff_orderTop_ne (by simp)
495+
intro y hy
496+
obtain ⟨z, hz, rfl⟩ :=
497+
(Set.mem_image _ _ _).mp <| Set.mem_of_subset_of_mem support_embDomain_subset hy
498+
rw [OrderEmbedding.le_iff_le, WithTop.untop_le_iff]
499+
apply HahnSeries.orderTop_le_of_coeff_ne_zero
500+
simpa using hz
501+
487502
end Domain
488503

489504
end Zero

Mathlib/RingTheory/HahnSeries/Lex.lean

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,4 +353,55 @@ end Archimedean
353353

354354
end OrderedGroup
355355

356+
357+
section EmbDomain
358+
variable {Γ Γ' R : Type*} [LinearOrder Γ] [LinearOrder Γ'] [Zero R] [PartialOrder R]
359+
variable (f : Γ ↪o Γ')
360+
361+
/-- `HahnSeries.embDomain` as an `OrderEmbedding`. -/
362+
@[simps]
363+
noncomputable
364+
def embDomainOrderEmbedding : Lex (HahnSeries Γ R) ↪o Lex (HahnSeries Γ' R) where
365+
toFun a := toLex (HahnSeries.embDomain f (ofLex a))
366+
inj' := HahnSeries.embDomain_injective
367+
map_rel_iff' {a b} := by
368+
simp_rw [le_iff_lt_or_eq, lt_iff]
369+
simp only [Function.Embedding.coeFn_mk, ofLex_toLex, EmbeddingLike.apply_eq_iff_eq]
370+
constructor
371+
· rintro (⟨i, hj, hi⟩ | heq)
372+
· have himem : i ∈ Set.range f := by
373+
contrapose! hi
374+
simp [embDomain_notin_range hi]
375+
obtain ⟨k, hk⟩ := himem
376+
rw [← hk] at hj hi
377+
refine Or.inl ⟨k, fun j hjk ↦ ?_, by simpa using hi⟩
378+
simpa using hj (f j) (f.lt_iff_lt.mpr hjk)
379+
· exact Or.inr <| HahnSeries.embDomain_injective heq
380+
· rintro (⟨i, hj, hi⟩ | rfl)
381+
· refine Or.inl ⟨f i, fun k hki ↦ ?_, by simpa using hi⟩
382+
by_cases hkmem : k ∈ Set.range f
383+
· obtain ⟨j', hj'⟩ := hkmem
384+
rw [← hj'] at ⊢ hki
385+
simpa using hj _ <| f.lt_iff_lt.mp hki
386+
· simp_rw [embDomain_notin_range hkmem]
387+
· simp
388+
389+
variable {Γ Γ' R : Type*} [LinearOrder Γ] [LinearOrder Γ'] [AddMonoid R] [PartialOrder R]
390+
variable (f : Γ ↪o Γ')
391+
392+
/-- `HahnSeries.embDomain` as an `OrderAddMonoidHom`. -/
393+
@[simps]
394+
noncomputable
395+
def embDomainOrderAddMonoidHom : Lex (HahnSeries Γ R) →+o Lex (HahnSeries Γ' R) where
396+
toFun := embDomainOrderEmbedding f
397+
map_zero' := by simp
398+
map_add' a b := embDomain_add f a b
399+
monotone' := OrderEmbedding.monotone _
400+
401+
theorem embDomainOrderAddMonoidHom_injective :
402+
Function.Injective (embDomainOrderAddMonoidHom f (R := R)) := embDomain_injective
403+
404+
405+
end EmbDomain
406+
356407
end HahnSeries

docs/1000.yaml

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

31583158
Q5638886:
31593159
title: Hahn embedding theorem
3160+
decl: exists_orderAddMonoidHom_hahnSeries_real_injective
3161+
authors: Weiyi Wang
3162+
date: 2025
31603163

31613164
Q5643485:
31623165
title: Halpern–Läuchli theorem

docs/references.bib

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4526,6 +4526,21 @@ @Book{ zbMATH02107988
45264526
zbl = {1052.54001}
45274527
}
45284528

4529+
@Article{ zbMATH03090187,
4530+
author = {Clifford, A. H.},
4531+
title = {Note on {Hahn}'s theorem on ordered {Abelian} groups},
4532+
fjournal = {Proceedings of the American Mathematical Society},
4533+
journal = {Proc. Am. Math. Soc.},
4534+
issn = {0002-9939},
4535+
volume = {5},
4536+
pages = {860--863},
4537+
year = {1954},
4538+
language = {English},
4539+
doi = {10.2307/2032549},
4540+
zbMATH = {3090187},
4541+
Zbl = {0056.25503}
4542+
}
4543+
45294544
@Article{ zbMATH06785026,
45304545
author = {John F. {Clauser} and Michael A. {Horne} and Abner
45314546
{Shimony} and Richard A. {Holt}},

0 commit comments

Comments
 (0)