@@ -4,10 +4,13 @@ Released under Apache 2.0 license as described in the file LICENSE.
44Authors: Weiyi Wang
55-/
66import Mathlib.Algebra.BigOperators.Group.Finset.Basic
7+ import Mathlib.Algebra.Group.Subgroup.Lattice
78import Mathlib.Algebra.Order.Archimedean.Basic
89import Mathlib.Algebra.Order.Hom.Monoid
910import Mathlib.Data.Finset.Max
1011import Mathlib.Order.Antisymmetrization
12+ import Mathlib.Order.UpperLower.CompleteLattice
13+ import Mathlib.Order.UpperLower.Principal
1114
1215/-!
1316# Archimedean classes of a linearly ordered group
@@ -24,6 +27,10 @@ is "infinitesimal" to `b` in the sense that `n • |a| < |b|` for all natural nu
2427* `MulArchimedeanClass` is the archimedean class for multiplicative linearly ordered group.
2528* `ArchimedeanClass.orderHom` and `MulArchimedeanClass.orderHom` are `OrderHom` over
2629 archimedean classes lifted from ordered group homomorphisms.
30+ * `ArchimedeanClass.ballAddSubgroup` and `MulArchimedeanClass.ballSubgroup` are subgroups
31+ formed by an open interval of archimedean classes
32+ * `ArchimedeanClass.closedBallAddSubgroup` and `MulArchimedeanClass.closedBallSubgroup` are
33+ subgroups formed by a closed interval of archimedean classes.
2734
2835 ## Main statements
2936
@@ -452,4 +459,111 @@ theorem liftOrderHom_mk (f : M → α) (h : ∀ a b, mk a ≤ mk b → f a ≤ f
452459
453460end LiftHom
454461
462+ /-- Given a `UpperSet` of `MulArchimedeanClass`,
463+ all group elements belonging to these classes form a subsemigroup.
464+ This is not yet a subgroup because it doesn't contain the identity if `s = ⊤`. -/
465+ @ [to_additive /-- Given a `UpperSet` of `ArchimedeanClass`,
466+ all group elements belonging to these classes form a subsemigroup.
467+ This is not yet a subgroup because it doesn't contain the identity if `s = ⊤`. -/ ]
468+ def subsemigroup (s : UpperSet (MulArchimedeanClass M)) : Subsemigroup M where
469+ carrier := mk ⁻¹' s
470+ mul_mem' {a b} ha hb := by
471+ rw [Set.mem_preimage] at ha hb ⊢
472+ obtain h | h := min_le_iff.mp (min_le_mk_mul a b)
473+ · exact s.upper h ha
474+ · exact s.upper h hb
475+
476+ /-- Make `MulArchimedeanClass.subsemigroup` a subgroup by assigning
477+ s = ⊤ with a junk value ⊥. -/
478+ @ [to_additive /-- Make `ArchimedeanClass.subsemigroup` a subgroup by assigning
479+ s = ⊤ with a junk value ⊥. -/ ]
480+ noncomputable
481+ def subgroup (s : UpperSet (MulArchimedeanClass M)) : Subgroup M :=
482+ open Classical in
483+ if hs : s = ⊤ then
484+ ⊥
485+ else {
486+ subsemigroup s with
487+ one_mem' := by
488+ rw [subsemigroup, Set.mem_preimage]
489+ obtain ⟨u, hu⟩ := UpperSet.coe_nonempty.mpr hs
490+ simpa using s.upper (by simp) hu
491+ inv_mem' := by simp [subsemigroup]
492+ }
493+
494+ variable {s : UpperSet (MulArchimedeanClass M)}
495+
496+ @[to_additive]
497+ theorem subsemigroup_eq_subgroup_of_ne_top (hs : s ≠ ⊤) :
498+ subsemigroup s = (subgroup s : Set M) := by
499+ simp [subgroup, hs]
500+
501+ variable (M) in
502+ @ [to_additive (attr := simp)]
503+ theorem subgroup_eq_bot : subgroup (M := M) ⊤ = ⊥ := by
504+ simp [subgroup]
505+
506+ @ [to_additive (attr := simp)]
507+ theorem mem_subgroup_iff (hs : s ≠ ⊤) : a ∈ subgroup s ↔ mk a ∈ s := by
508+ simp [subgroup, subsemigroup, hs]
509+
510+ @[to_additive]
511+ theorem subgroup_strictAntiOn : StrictAntiOn (subgroup (M := M)) (Set.Iio ⊤) := by
512+ intro s hs t ht hst
513+ rw [← SetLike.coe_ssubset_coe]
514+ rw [← subsemigroup_eq_subgroup_of_ne_top (Set.mem_Iio.mp hs).ne_top]
515+ rw [← subsemigroup_eq_subgroup_of_ne_top (Set.mem_Iio.mp ht).ne_top]
516+ refine Set.ssubset_iff_subset_ne.mpr ⟨by simpa [subsemigroup] using hst.le, ?_⟩
517+ contrapose! hst with heq
518+ apply le_of_eq
519+ simpa [mk_surjective, subsemigroup] using heq
520+
521+ @[to_additive]
522+ theorem subgroup_antitone : Antitone (subgroup (M := M)) := by
523+ intro s t hst
524+ obtain rfl | hs := eq_or_ne s ⊤
525+ · rw [eq_top_iff.mpr hst]
526+ obtain rfl | ht := eq_or_ne t ⊤
527+ · simp
528+ rwa [subgroup_strictAntiOn.le_iff_ge ht.lt_top hs.lt_top]
529+
530+ /-- An open ball defined by `MulArchimedeanClass.subgroup` of `UpperSet.Ioi c`.
531+ For `c = ⊤`, we assign the junk value `⊥`. -/
532+ @ [to_additive /--An open ball defined by `ArchimedeanClass.addSubgroup` of `UpperSet.Ioi c`.
533+ For `c = ⊤`, we assign the junk value `⊥`. -/ ]
534+ noncomputable
535+ abbrev ballSubgroup (c : MulArchimedeanClass M) := subgroup (UpperSet.Ioi c)
536+
537+ /-- A closed ball defined by `MulArchimedeanClass.subgroup` of `UpperSet.Ici c`. -/
538+ @ [to_additive /-- A closed ball defined by `ArchimedeanClass.addSubgroup` of `UpperSet.Ici c`. -/ ]
539+ noncomputable
540+ abbrev closedBallSubgroup (c : MulArchimedeanClass M) := subgroup (UpperSet.Ici c)
541+
542+ @[to_additive]
543+ theorem mem_ballSubgroup_iff {a : M} {c : MulArchimedeanClass M} (hA : c ≠ ⊤) :
544+ a ∈ ballSubgroup c ↔ c < mk a := by
545+ simp [hA]
546+
547+ @[to_additive]
548+ theorem mem_closedBallSubgroup_iff {a : M} {c : MulArchimedeanClass M} :
549+ a ∈ closedBallSubgroup c ↔ c ≤ mk a := by
550+ simp
551+
552+ variable (M) in
553+ @ [to_additive (attr := simp)]
554+ theorem ballSubgroup_top : ballSubgroup (M := M) ⊤ = ⊥ := by
555+ convert subgroup_eq_bot M
556+ simp
557+
558+ variable (M) in
559+ @ [to_additive (attr := simp)]
560+ theorem closedBallSubgroup_top : closedBallSubgroup (M := M) ⊤ = ⊥ := by
561+ ext
562+ simp
563+
564+ @[to_additive]
565+ theorem ballSubgroup_antitone : Antitone (ballSubgroup (M := M)) := by
566+ intro _ _ h
567+ exact subgroup_antitone <| (UpperSet.Ioi_strictMono _).monotone h
568+
455569end MulArchimedeanClass
0 commit comments