|
| 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] |
0 commit comments