Documentation

Mathlib.Algebra.Order.Archimedean.Class

Archimedean classes of a linearly ordered group #

This file defines archimedean classes of a given linearly ordered group. Archimedean classes measure to what extent the group fails to be Archimedean. For additive group, elements a and b in the same class are "equivalent" in the sense that there exist two natural numbers m and n such that |a| ≤ m • |b| and |b| ≤ n • |a|. An element a in a higher class than b is "infinitesimal" to b in the sense that n • |a| < |b| for all natural numbers n.

If a and b are in the same equivalence class, they're sometimes referred to as "commensurate" elements.

Main definitions #

Main statements #

The following theorems state that an ordered commutative group is (mul-)archimedean if and only if all non-identity elements belong to the same (Mul-)ArchimedeanClass:

Implementation notes #

Archimedean classes are equipped with a linear order, where elements with smaller absolute value are placed in a higher classes by convention. Ordering backwards this way simplifies formalization of theorems such as the Hahn embedding theorem.

To naturally derive this order, we first define it on the underlying group via the type synonym (Mul-)ArchimedeanOrder, and define (Mul-)ArchimedeanClass as Antisymmetrization of the order.

def MulArchimedeanOrder (M : Type u_1) :
Type u_1

Type synonym to equip an ordered group with a new Preorder defined by the infinitesimal order of elements. a is said less than b if b is infinitesimal comparing to a, or more precisely, ∀ n, |b|ₘ ^ n < |a|ₘ. If a and b are neither infinitesimal to each other, they are equivalent in this order.

Instances For
    def ArchimedeanOrder (M : Type u_1) :
    Type u_1

    Type synonym to equip an ordered group with a new Preorder defined by the infinitesimal order of elements. a is said less than b if b is infinitesimal comparing to a, or more precisely, ∀ n, n • |b| < |a|. If a and b are neither infinitesimal to each other, they are equivalent in this order.

    Instances For

      Create a MulArchimedeanOrder element from the underlying type.

      Instances For

        Create a ArchimedeanOrder element from the underlying type.

        Instances For

          Retrieve the underlying value from a MulArchimedeanOrder element.

          Instances For

            Retrieve the underlying value from a ArchimedeanOrder element.

            Instances For
              @[simp]
              theorem MulArchimedeanOrder.of_val {M : Type u_1} (a : MulArchimedeanOrder M) :
              of (val a) = a
              @[simp]
              theorem ArchimedeanOrder.of_val {M : Type u_1} (a : ArchimedeanOrder M) :
              of (val a) = a
              @[simp]
              theorem MulArchimedeanOrder.val_of {M : Type u_1} (a : M) :
              val (of a) = a
              @[simp]
              theorem ArchimedeanOrder.val_of {M : Type u_1} (a : M) :
              val (of a) = a
              instance MulArchimedeanOrder.instNonempty {M : Type u_1} [Nonempty M] :
              Nonempty (MulArchimedeanOrder M)
              instance ArchimedeanOrder.instNonempty {M : Type u_1} [Nonempty M] :
              Nonempty (ArchimedeanOrder M)
              @[implicit_reducible]
              instance MulArchimedeanOrder.instInhabited {M : Type u_1} [Inhabited M] :
              Inhabited (MulArchimedeanOrder M)
              @[implicit_reducible]
              instance ArchimedeanOrder.instInhabited {M : Type u_1} [Inhabited M] :
              Inhabited (ArchimedeanOrder M)
              instance MulArchimedeanOrder.instSubsingleton {M : Type u_1} [Subsingleton M] :
              Subsingleton (MulArchimedeanOrder M)
              instance ArchimedeanOrder.instSubsingleton {M : Type u_1} [Subsingleton M] :
              Subsingleton (ArchimedeanOrder M)
              @[implicit_reducible]
              @[implicit_reducible]
              instance ArchimedeanOrder.instLE {M : Type u_1} [AddGroup M] [Lattice M] :
              @[implicit_reducible]
              @[implicit_reducible]
              instance ArchimedeanOrder.instLT {M : Type u_1} [AddGroup M] [Lattice M] :
              theorem MulArchimedeanOrder.le_def {M : Type u_1} [Group M] [Lattice M] {a b : MulArchimedeanOrder M} :
              a b ∃ (n : ), |val b|ₘ |val a|ₘ ^ n
              theorem ArchimedeanOrder.le_def {M : Type u_1} [AddGroup M] [Lattice M] {a b : ArchimedeanOrder M} :
              a b ∃ (n : ), |val b| n |val a|
              theorem MulArchimedeanOrder.lt_def {M : Type u_1} [Group M] [Lattice M] {a b : MulArchimedeanOrder M} :
              a < b ∀ (n : ), |val b|ₘ ^ n < |val a|ₘ
              theorem ArchimedeanOrder.lt_def {M : Type u_1} [AddGroup M] [Lattice M] {a b : ArchimedeanOrder M} :
              a < b ∀ (n : ), n |val b| < |val a|
              instance MulArchimedeanOrder.instTotalLe {M : Type u_2} [CommGroup M] [LinearOrder M] :
              Std.Total fun (x1 x2 : MulArchimedeanOrder M) => x1 x2
              instance ArchimedeanOrder.instTotalLe {M : Type u_2} [AddCommGroup M] [LinearOrder M] :
              Std.Total fun (x1 x2 : ArchimedeanOrder M) => x1 x2

              MulArchimedeanClass M is the quotient of the group M by multiplicative archimedean equivalence, where two elements a and b are in the same class iff (∃ m : ℕ, |b|ₘ ≤ |a|ₘ ^ m) ∧ (∃ n : ℕ, |a|ₘ ≤ |b|ₘ ^ n).

              Instances For

                ArchimedeanClass M is the quotient of the additive group M by additive archimedean equivalence, where two elements a and b are in the same class iff (∃ m : ℕ, |b| ≤ m • |a|) ∧ (∃ n : ℕ, |a| ≤ n • |b|).

                Instances For

                  The archimedean class of a given element.

                  Instances For

                    The archimedean class of a given element.

                    Instances For
                      theorem MulArchimedeanClass.ind {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {motive : MulArchimedeanClass MProp} (mk : ∀ (a : M), motive (mk a)) (x : MulArchimedeanClass M) :
                      motive x

                      An induction principle for MulArchimedeanClass.

                      theorem ArchimedeanClass.ind {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {motive : ArchimedeanClass MProp} (mk : ∀ (a : M), motive (mk a)) (x : ArchimedeanClass M) :
                      motive x

                      An induction principle for ArchimedeanClass

                      theorem MulArchimedeanClass.forall {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {p : MulArchimedeanClass MProp} :
                      (∀ (A : MulArchimedeanClass M), p A) ∀ (a : M), p (mk a)
                      theorem ArchimedeanClass.forall {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {p : ArchimedeanClass MProp} :
                      (∀ (A : ArchimedeanClass M), p A) ∀ (a : M), p (mk a)
                      theorem MulArchimedeanClass.mk_eq_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                      mk a = mk b (∃ (m : ), |b|ₘ |a|ₘ ^ m) ∃ (n : ), |a|ₘ |b|ₘ ^ n
                      theorem ArchimedeanClass.mk_eq_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                      mk a = mk b (∃ (m : ), |b| m |a|) ∃ (n : ), |a| n |b|
                      def MulArchimedeanClass.lift {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {α : Type u_2} (f : Mα) (h : ∀ (a b : M), mk a = mk bf a = f b) :

                      Lift a M → α function to MulArchimedeanClass M → α.

                      Instances For
                        def ArchimedeanClass.lift {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {α : Type u_2} (f : Mα) (h : ∀ (a b : M), mk a = mk bf a = f b) :

                        Lift a M → α function to ArchimedeanClass M → α.

                        Instances For
                          @[simp]
                          theorem MulArchimedeanClass.lift_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {α : Type u_2} (f : Mα) (h : ∀ (a b : M), mk a = mk bf a = f b) (a : M) :
                          lift f h (mk a) = f a
                          @[simp]
                          theorem ArchimedeanClass.lift_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {α : Type u_2} (f : Mα) (h : ∀ (a b : M), mk a = mk bf a = f b) (a : M) :
                          lift f h (mk a) = f a
                          def MulArchimedeanClass.lift₂ {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {α : Type u_2} (f : MMα) (h : ∀ (a₁ b₁ a₂ b₂ : M), mk a₁ = mk b₁mk a₂ = mk b₂f a₁ a₂ = f b₁ b₂) :

                          Lift a M → M → α function to MulArchimedeanClass M → MulArchimedeanClass M → α.

                          Instances For
                            def ArchimedeanClass.lift₂ {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {α : Type u_2} (f : MMα) (h : ∀ (a₁ b₁ a₂ b₂ : M), mk a₁ = mk b₁mk a₂ = mk b₂f a₁ a₂ = f b₁ b₂) :

                            Lift a M → M → α function to ArchimedeanClass M → ArchimedeanClass M → α.

                            Instances For
                              @[simp]
                              theorem MulArchimedeanClass.lift₂_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {α : Type u_2} (f : MMα) (h : ∀ (a₁ b₁ a₂ b₂ : M), mk a₁ = mk b₁mk a₂ = mk b₂f a₁ a₂ = f b₁ b₂) (a b : M) :
                              lift₂ f h (mk a) (mk b) = f a b
                              @[simp]
                              theorem ArchimedeanClass.lift₂_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {α : Type u_2} (f : MMα) (h : ∀ (a₁ b₁ a₂ b₂ : M), mk a₁ = mk b₁mk a₂ = mk b₂f a₁ a₂ = f b₁ b₂) (a b : M) :
                              lift₂ f h (mk a) (mk b) = f a b
                              noncomputable def MulArchimedeanClass.out {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] (A : MulArchimedeanClass M) :
                              M

                              Choose a representative element from a given archimedean class.

                              Instances For
                                noncomputable def ArchimedeanClass.out {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] (A : ArchimedeanClass M) :
                                M

                                Choose a representative element from a given archimedean class.

                                Instances For
                                  @[simp]
                                  theorem ArchimedeanClass.mk_neg {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] (a : M) :
                                  mk (-a) = mk a
                                  theorem MulArchimedeanClass.mk_div_comm {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] (a b : M) :
                                  mk (a / b) = mk (b / a)
                                  theorem ArchimedeanClass.mk_sub_comm {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] (a b : M) :
                                  mk (a - b) = mk (b - a)
                                  theorem MulArchimedeanClass.mk_le_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                                  mk a mk b ∃ (n : ), |b|ₘ |a|ₘ ^ n
                                  theorem ArchimedeanClass.mk_le_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                                  mk a mk b ∃ (n : ), |b| n |a|
                                  theorem MulArchimedeanClass.mk_lt_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                                  mk a < mk b ∀ (n : ), |b|ₘ ^ n < |a|ₘ
                                  theorem ArchimedeanClass.mk_lt_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                                  mk a < mk b ∀ (n : ), n |b| < |a|
                                  theorem MulArchimedeanClass.mk_le_mk_iff_lt {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (ha : a 1) :
                                  mk a mk b ∃ (n : ), |b|ₘ < |a|ₘ ^ n
                                  theorem ArchimedeanClass.mk_le_mk_iff_lt {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (ha : a 0) :
                                  mk a mk b ∃ (n : ), |b| < n |a|
                                  @[implicit_reducible]

                                  1 is in its own class (see MulArchimedeanClass.mk_eq_top_iff), which is also the largest class.

                                  @[implicit_reducible]

                                  0 is in its own class (see ArchimedeanClass.mk_eq_top_iff), which is also the largest class.

                                  @[implicit_reducible]
                                  noncomputable instance MulArchimedeanClass.instInhabited {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] :
                                  Inhabited (MulArchimedeanClass M)
                                  @[implicit_reducible]
                                  noncomputable instance ArchimedeanClass.instInhabited {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] :
                                  Inhabited (ArchimedeanClass M)
                                  @[simp]
                                  theorem MulArchimedeanClass.mk_eq_top_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a : M} :
                                  mk a = a = 1
                                  @[simp]
                                  theorem ArchimedeanClass.mk_eq_top_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a : M} :
                                  mk a = a = 0
                                  @[simp]
                                  theorem MulArchimedeanClass.top_eq_mk_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a : M} :
                                  = mk a a = 1
                                  @[simp]
                                  theorem ArchimedeanClass.top_eq_mk_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a : M} :
                                  = mk a a = 0
                                  theorem MulArchimedeanClass.min_le_mk_of_le_of_le {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {x y z : M} (hy : y x) (hz : x z) :
                                  min (mk y) (mk z) mk x
                                  theorem ArchimedeanClass.min_le_mk_of_le_of_le {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {x y z : M} (hy : y x) (hz : x z) :
                                  min (mk y) (mk z) mk x
                                  theorem MulArchimedeanClass.mk_left_le_mk_mul {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (hab : mk a mk b) :
                                  mk a mk (a * b)
                                  theorem ArchimedeanClass.mk_left_le_mk_add {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (hab : mk a mk b) :
                                  mk a mk (a + b)
                                  theorem MulArchimedeanClass.mk_right_le_mk_mul {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (hba : mk b mk a) :
                                  mk b mk (a * b)
                                  theorem MulArchimedeanClass.mk_left_le_mk_div {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (hab : mk a mk b) :
                                  mk a mk (a / b)
                                  theorem ArchimedeanClass.mk_left_le_mk_sub {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (hab : mk a mk b) :
                                  mk a mk (a - b)
                                  theorem MulArchimedeanClass.mk_right_le_mk_div {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (hba : mk b mk a) :
                                  mk b mk (a / b)
                                  @[simp]
                                  theorem MulArchimedeanClass.mk_left_le_mk_mul_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                                  mk a mk (a * b) mk a mk b
                                  @[simp]
                                  theorem ArchimedeanClass.mk_left_le_mk_add_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                                  mk a mk (a + b) mk a mk b
                                  @[simp]
                                  theorem MulArchimedeanClass.mk_right_le_mk_mul_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                                  mk b mk (a * b) mk b mk a
                                  @[simp]
                                  theorem ArchimedeanClass.mk_right_le_mk_add_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                                  mk b mk (a + b) mk b mk a
                                  @[simp]
                                  theorem MulArchimedeanClass.mk_left_le_mk_div_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                                  mk a mk (a / b) mk a mk b
                                  @[simp]
                                  theorem ArchimedeanClass.mk_left_le_mk_sub_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                                  mk a mk (a - b) mk a mk b
                                  @[simp]
                                  theorem MulArchimedeanClass.mk_right_le_mk_div_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                                  mk b mk (a / b) mk b mk a
                                  @[simp]
                                  theorem ArchimedeanClass.mk_right_le_mk_sub_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                                  mk b mk (a - b) mk b mk a
                                  @[simp]
                                  theorem MulArchimedeanClass.mk_mul_lt_mk_left_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                                  mk (a * b) < mk a mk b < mk a
                                  @[simp]
                                  theorem ArchimedeanClass.mk_add_lt_mk_left_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                                  mk (a + b) < mk a mk b < mk a
                                  @[simp]
                                  theorem MulArchimedeanClass.mk_mul_lt_mk_right_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                                  mk (a * b) < mk b mk a < mk b
                                  @[simp]
                                  theorem ArchimedeanClass.mk_add_lt_mk_right_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                                  mk (a + b) < mk b mk a < mk b
                                  @[simp]
                                  theorem MulArchimedeanClass.mk_div_lt_mk_left_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                                  mk (a / b) < mk a mk b < mk a
                                  @[simp]
                                  theorem ArchimedeanClass.mk_sub_lt_mk_left_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                                  mk (a - b) < mk a mk b < mk a
                                  @[simp]
                                  theorem MulArchimedeanClass.mk_div_lt_mk_right_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} :
                                  mk (a / b) < mk b mk a < mk b
                                  @[simp]
                                  theorem ArchimedeanClass.mk_sub_lt_mk_right_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} :
                                  mk (a - b) < mk b mk a < mk b
                                  theorem MulArchimedeanClass.mk_mul_eq_mk_left {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (h : mk a < mk b) :
                                  mk (a * b) = mk a
                                  theorem ArchimedeanClass.mk_add_eq_mk_left {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (h : mk a < mk b) :
                                  mk (a + b) = mk a
                                  theorem MulArchimedeanClass.mk_mul_eq_mk_right {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (h : mk b < mk a) :
                                  mk (a * b) = mk b
                                  theorem ArchimedeanClass.mk_add_eq_mk_right {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (h : mk b < mk a) :
                                  mk (a + b) = mk b
                                  theorem MulArchimedeanClass.mk_div_eq_mk_left {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (h : mk a < mk b) :
                                  mk (a / b) = mk a
                                  theorem ArchimedeanClass.mk_sub_eq_mk_left {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (h : mk a < mk b) :
                                  mk (a - b) = mk a
                                  theorem MulArchimedeanClass.mk_div_eq_mk_right {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (h : mk b < mk a) :
                                  mk (a / b) = mk b
                                  theorem ArchimedeanClass.mk_sub_eq_mk_right {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (h : mk b < mk a) :
                                  mk (a - b) = mk b
                                  theorem MulArchimedeanClass.mk_prod {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {ι : Type u_2} [LinearOrder ι] {s : Finset ι} (hnonempty : s.Nonempty) {a : ιM} :
                                  StrictMonoOn (mk a) smk (∏ is, a i) = mk (a (s.min' hnonempty))

                                  The product over a set of an elements in distinct classes is in the lowest class.

                                  theorem ArchimedeanClass.mk_sum {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {ι : Type u_2} [LinearOrder ι] {s : Finset ι} (hnonempty : s.Nonempty) {a : ιM} :
                                  StrictMonoOn (mk a) smk (∑ is, a i) = mk (a (s.min' hnonempty))

                                  The sum over a set of an elements in distinct classes is in the lowest class.

                                  theorem MulArchimedeanClass.lt_of_mk_lt_mk_of_one_le {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (h : mk a < mk b) (hpos : 1 a) :
                                  b < a
                                  theorem ArchimedeanClass.lt_of_mk_lt_mk_of_nonneg {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (h : mk a < mk b) (hpos : 0 a) :
                                  b < a
                                  theorem MulArchimedeanClass.lt_of_mk_lt_mk_of_le_one {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (h : mk a < mk b) (hneg : a 1) :
                                  a < b
                                  theorem ArchimedeanClass.lt_of_mk_lt_mk_of_nonpos {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (h : mk a < mk b) (hneg : a 0) :
                                  a < b
                                  theorem MulArchimedeanClass.one_lt_of_one_lt_of_mk_lt {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (ha : 1 < a) (hab : mk a < mk (b / a)) :
                                  1 < b
                                  theorem ArchimedeanClass.pos_of_pos_of_mk_lt {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (ha : 0 < a) (hab : mk a < mk (b - a)) :
                                  0 < b
                                  theorem MulArchimedeanClass.mulArchimedean_of_mk_eq_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] (h : ∀ (a : M), a 1∀ (b : M), b 1mk a = mk b) :
                                  theorem ArchimedeanClass.archimedean_of_mk_eq_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] (h : ∀ (a : M), a 0∀ (b : M), b 0mk a = mk b) :
                                  theorem MulArchimedeanClass.mk_eq_mk_of_mulArchimedean {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} [MulArchimedean M] (ha : a 1) (hb : b 1) :
                                  mk a = mk b
                                  theorem ArchimedeanClass.mk_eq_mk_of_archimedean {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} [Archimedean M] (ha : a 0) (hb : b 0) :
                                  mk a = mk b

                                  An OrderMonoidHom can be lifted to an OrderHom over archimedean classes.

                                  Instances For

                                    An OrderAddMonoidHom can be lifted to an OrderHom over archimedean classes.

                                    Instances For
                                      @[simp]
                                      theorem MulArchimedeanClass.orderHom_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {N : Type u_2} [CommGroup N] [LinearOrder N] [IsOrderedMonoid N] (f : M →*o N) (a : M) :
                                      (orderHom f) (mk a) = mk (f a)
                                      @[simp]
                                      theorem ArchimedeanClass.orderHom_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {N : Type u_2} [AddCommGroup N] [LinearOrder N] [IsOrderedAddMonoid N] (f : M →+o N) (a : M) :
                                      (orderHom f) (mk a) = mk (f a)
                                      theorem MulArchimedeanClass.map_mk_eq {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} {N : Type u_2} [CommGroup N] [LinearOrder N] [IsOrderedMonoid N] (f : M →*o N) (h : mk a = mk b) :
                                      mk (f a) = mk (f b)
                                      theorem ArchimedeanClass.map_mk_eq {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} {N : Type u_2} [AddCommGroup N] [LinearOrder N] [IsOrderedAddMonoid N] (f : M →+o N) (h : mk a = mk b) :
                                      mk (f a) = mk (f b)
                                      theorem MulArchimedeanClass.map_mk_le {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} {N : Type u_2} [CommGroup N] [LinearOrder N] [IsOrderedMonoid N] (f : M →*o N) (h : mk a mk b) :
                                      mk (f a) mk (f b)
                                      theorem ArchimedeanClass.map_mk_le {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} {N : Type u_2} [AddCommGroup N] [LinearOrder N] [IsOrderedAddMonoid N] (f : M →+o N) (h : mk a mk b) :
                                      mk (f a) mk (f b)
                                      theorem MulArchimedeanClass.orderHom_injective {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {N : Type u_2} [CommGroup N] [LinearOrder N] [IsOrderedMonoid N] {f : M →*o N} (h : Function.Injective f) :
                                      Function.Injective (orderHom f)
                                      theorem ArchimedeanClass.orderHom_injective {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {N : Type u_2} [AddCommGroup N] [LinearOrder N] [IsOrderedAddMonoid N] {f : M →+o N} (h : Function.Injective f) :
                                      Function.Injective (orderHom f)
                                      def MulArchimedeanClass.liftOrderHom {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {α : Type u_2} [PartialOrder α] (f : Mα) (h : ∀ (a b : M), mk a mk bf a f b) :

                                      Lift a function M → α that's monotone along archimedean classes to a monotone function MulArchimedeanClass M →o α.

                                      Instances For
                                        def ArchimedeanClass.liftOrderHom {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {α : Type u_2} [PartialOrder α] (f : Mα) (h : ∀ (a b : M), mk a mk bf a f b) :

                                        Lift a function M → α that's monotone along archimedean classes to a monotone function ArchimedeanClass M →o α.

                                        Instances For
                                          @[simp]
                                          theorem MulArchimedeanClass.liftOrderHom_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {α : Type u_2} [PartialOrder α] (f : Mα) (h : ∀ (a b : M), mk a mk bf a f b) (a : M) :
                                          (liftOrderHom f h) (mk a) = f a
                                          @[simp]
                                          theorem ArchimedeanClass.liftOrderHom_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {α : Type u_2} [PartialOrder α] (f : Mα) (h : ∀ (a b : M), mk a mk bf a f b) (a : M) :
                                          (liftOrderHom f h) (mk a) = f a

                                          Given a UpperSet of MulArchimedeanClass, all group elements belonging to these classes form a subsemigroup. This is not yet a subgroup because it doesn't contain the identity if s = ⊤.

                                          Instances For

                                            Given a UpperSet of ArchimedeanClass, all group elements belonging to these classes form a subsemigroup. This is not yet a subgroup because it doesn't contain the identity if s = ⊤.

                                            Instances For
                                              @[deprecated FiniteMulArchimedeanClass.subgroup (since := "2025-12-14")]

                                              Make MulArchimedeanClass.subsemigroup a subgroup by assigning s = ⊤ with a junk value ⊥.

                                              Instances For

                                                Make ArchimedeanClass.subsemigroup a subgroup by assigning s = ⊤ with a junk value ⊥.

                                                Instances For
                                                  @[deprecated FiniteMulArchimedeanClass.subsemigroup_eq_subgroup (since := "2025-12-14")]
                                                  @[simp, deprecated FiniteMulArchimedeanClass.subgroup_eq_bot (since := "2025-12-14")]
                                                  @[simp, deprecated FiniteMulArchimedeanClass.mem_subgroup_iff (since := "2025-12-14")]
                                                  theorem MulArchimedeanClass.mem_subgroup_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a : M} {s : UpperSet (MulArchimedeanClass M)} (hs : s ) :
                                                  a subgroup s mk a s
                                                  @[simp]
                                                  theorem ArchimedeanClass.mem_addSubgroup_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a : M} {s : UpperSet (ArchimedeanClass M)} (hs : s ) :
                                                  a addSubgroup s mk a s
                                                  @[deprecated FiniteMulArchimedeanClass.subgroup_strictAnti (since := "2025-12-14")]
                                                  @[deprecated FiniteMulArchimedeanClass.subgroup_strictAnti (since := "2025-12-14")]
                                                  @[reducible, inline, deprecated FiniteMulArchimedeanClass.ballSubgroup (since := "2025-12-14")]

                                                  An open ball defined by MulArchimedeanClass.subgroup of UpperSet.Ioi c. For c = ⊤, we assign the junk value .

                                                  Instances For
                                                    @[reducible, inline]

                                                    An open ball defined by ArchimedeanClass.addSubgroup of UpperSet.Ioi c. For c = ⊤, we assign the junk value .

                                                    Instances For
                                                      @[reducible, inline, deprecated FiniteMulArchimedeanClass.closedBallSubgroup (since := "2025-12-14")]

                                                      A closed ball defined by MulArchimedeanClass.subgroup of UpperSet.Ici c.

                                                      Instances For
                                                        @[reducible, inline]

                                                        A closed ball defined by ArchimedeanClass.addSubgroup of UpperSet.Ici c.

                                                        Instances For
                                                          @[deprecated FiniteMulArchimedeanClass.mem_ballSubgroup_iff (since := "2025-12-14")]
                                                          theorem MulArchimedeanClass.mem_ballSubgroup_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a : M} {c : MulArchimedeanClass M} (hA : c ) :
                                                          a c.ballSubgroup c < mk a
                                                          @[deprecated FiniteMulArchimedeanClass.mem_closedBallSubgroup_iff (since := "2025-12-14")]
                                                          @[simp, deprecated "Lemma for junk value." (since := "2025-12-14")]
                                                          @[simp, deprecated "Lemma for junk value." (since := "2025-12-14")]
                                                          @[deprecated FiniteMulArchimedeanClass.ballSubgroup_strictAnti (since := "2025-12-14")]
                                                          @[reducible, inline]

                                                          FiniteMulArchimedeanClass M is the quotient of the non-one elements of the group M by multiplicative archimedean equivalence, where two elements a and b are in the same class iff (∃ m : ℕ, |b|ₘ ≤ |a|ₘ ^ m) ∧ (∃ n : ℕ, |a|ₘ ≤ |b|ₘ ^ n).

                                                          It is defined as the subtype of non-top elements of MulArchimedeanClass M (⊤ : MulArchimedeanClass M is the archimedean class of 1).

                                                          This is useful since the family of non-top archimedean classes is linearly independent.

                                                          Instances For
                                                            @[reducible, inline]

                                                            FiniteArchimedeanClass M is the quotient of the non-zero elements of the additive group M by additive archimedean equivalence, where two elements a and b are in the same class iff (∃ m : ℕ, |b| ≤ m • |a|) ∧ (∃ n : ℕ, |a| ≤ n • |b|).

                                                            It is defined as the subtype of non-top elements of ArchimedeanClass M (⊤ : ArchimedeanClass M is the archimedean class of 0).

                                                            This is useful since the family of non-top archimedean classes is linearly independent.

                                                            Instances For

                                                              Create a FiniteMulArchimedeanClass from a non-one element.

                                                              Instances For

                                                                Create a FiniteArchimedeanClass from a non-zero element.

                                                                Instances For
                                                                  @[simp]
                                                                  theorem FiniteMulArchimedeanClass.val_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a : M} (h : a 1) :
                                                                  @[simp]
                                                                  theorem FiniteArchimedeanClass.val_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a : M} (h : a 0) :
                                                                  (mk a h) = ArchimedeanClass.mk a
                                                                  theorem FiniteMulArchimedeanClass.mk_le_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a : M} (ha : a 1) {b : M} (hb : b 1) :
                                                                  theorem FiniteArchimedeanClass.mk_le_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a : M} (ha : a 0) {b : M} (hb : b 0) :
                                                                  theorem FiniteMulArchimedeanClass.mk_lt_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a : M} (ha : a 1) {b : M} (hb : b 1) :
                                                                  theorem FiniteArchimedeanClass.mk_lt_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a : M} (ha : a 0) {b : M} (hb : b 0) :
                                                                  theorem FiniteMulArchimedeanClass.min_le_mk_mul {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a b : M} (ha : a 1) (hb : b 1) (hab : a * b 1) :
                                                                  min (mk a ha) (mk b hb) mk (a * b) hab
                                                                  theorem FiniteArchimedeanClass.min_le_mk_add {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a b : M} (ha : a 0) (hb : b 0) (hab : a + b 0) :
                                                                  min (mk a ha) (mk b hb) mk (a + b) hab
                                                                  theorem FiniteMulArchimedeanClass.mk_inv {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a : M} (ha : a 1) :
                                                                  mk a⁻¹ = mk a ha
                                                                  theorem FiniteArchimedeanClass.mk_neg {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a : M} (ha : a 0) :
                                                                  mk (-a) = mk a ha
                                                                  theorem FiniteMulArchimedeanClass.ind {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {motive : FiniteMulArchimedeanClass MProp} (mk : ∀ (a : M) (ha : a 1), motive (mk a ha)) (x : FiniteMulArchimedeanClass M) :
                                                                  motive x

                                                                  An induction principle for FiniteMulArchimedeanClass.

                                                                  theorem FiniteArchimedeanClass.ind {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {motive : FiniteArchimedeanClass MProp} (mk : ∀ (a : M) (ha : a 0), motive (mk a ha)) (x : FiniteArchimedeanClass M) :
                                                                  motive x

                                                                  An induction principle for FiniteArchimedeanClass.

                                                                  def FiniteMulArchimedeanClass.lift {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {α : Type u_2} (f : { a : M // a 1 }α) (h : ∀ (a b : { a : M // a 1 }), mk a = mk b f a = f b) :

                                                                  Lift a f : {a : M // a ≠ 1} → α function to FiniteMulArchimedeanClass M → α.

                                                                  Instances For
                                                                    def FiniteArchimedeanClass.lift {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {α : Type u_2} (f : { a : M // a 0 }α) (h : ∀ (a b : { a : M // a 0 }), mk a = mk b f a = f b) :

                                                                    Lift a f : {a : M // a ≠ 0} → α function to FiniteArchimedeanClass M → α.

                                                                    Instances For
                                                                      @[simp]
                                                                      theorem FiniteMulArchimedeanClass.lift_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {α : Type u_2} (f : { a : M // a 1 }α) (h : ∀ (a b : { a : M // a 1 }), mk a = mk b f a = f b) {a : M} (ha : a 1) :
                                                                      lift f h (mk a ha) = f a, ha
                                                                      @[simp]
                                                                      theorem FiniteArchimedeanClass.lift_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {α : Type u_2} (f : { a : M // a 0 }α) (h : ∀ (a b : { a : M // a 0 }), mk a = mk b f a = f b) {a : M} (ha : a 0) :
                                                                      lift f h (mk a ha) = f a, ha
                                                                      def FiniteMulArchimedeanClass.liftOrderHom {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {α : Type u_2} [PartialOrder α] (f : { a : M // a 1 }α) (h : ∀ (a b : { a : M // a 1 }), mk a mk b f a f b) :

                                                                      Lift a function {a : M // a ≠ 1} → α that's monotone along archimedean classes to a monotone function FiniteMulArchimedeanClass M →o α.

                                                                      Instances For
                                                                        def FiniteArchimedeanClass.liftOrderHom {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {α : Type u_2} [PartialOrder α] (f : { a : M // a 0 }α) (h : ∀ (a b : { a : M // a 0 }), mk a mk b f a f b) :

                                                                        Lift a function {a : M // a ≠ 1} → α that's monotone along archimedean classes to a monotone function FiniteArchimedeanClass M₁ →o α.

                                                                        Instances For
                                                                          @[simp]
                                                                          theorem FiniteMulArchimedeanClass.liftOrderHom_mk {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {α : Type u_2} [PartialOrder α] (f : { a : M // a 1 }α) (h : ∀ (a b : { a : M // a 1 }), mk a mk b f a f b) {a : M} (ha : a 1) :
                                                                          (liftOrderHom f h) (mk a ha) = f a, ha
                                                                          @[simp]
                                                                          theorem FiniteArchimedeanClass.liftOrderHom_mk {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {α : Type u_2} [PartialOrder α] (f : { a : M // a 0 }α) (h : ∀ (a b : { a : M // a 0 }), mk a mk b f a f b) {a : M} (ha : a 0) :
                                                                          (liftOrderHom f h) (mk a ha) = f a, ha

                                                                          Adding top to the type of finite classes yields the type of all classes.

                                                                          Instances For

                                                                            Adding top to the type of finite classes yields the type of all classes.

                                                                            Instances For

                                                                              The MulArchimedeanClass.subsemigroup associated to an upper set in FiniteMulArchimedeanClass M is a subgroup.

                                                                              Instances For

                                                                                The ArchimedeanClass.subsemigroup associated to an upper set in FiniteArchimedeanClass M is a subgroup.

                                                                                Instances For
                                                                                  @[simp]
                                                                                  theorem FiniteMulArchimedeanClass.mem_subgroup_iff {M : Type u_1} [CommGroup M] [LinearOrder M] [IsOrderedMonoid M] {a : M} {s : UpperSet (FiniteMulArchimedeanClass M)} :
                                                                                  a subgroup s ∀ (h : a 1), mk a h s
                                                                                  @[simp]
                                                                                  theorem FiniteArchimedeanClass.mem_addSubgroup_iff {M : Type u_1} [AddCommGroup M] [LinearOrder M] [IsOrderedAddMonoid M] {a : M} {s : UpperSet (FiniteArchimedeanClass M)} :
                                                                                  a addSubgroup s ∀ (h : a 0), mk a h s
                                                                                  @[reducible, inline]

                                                                                  An open ball defined by FiniteMulArchimedeanClass.subgroup of UpperSet.Ioi c.

                                                                                  Instances For
                                                                                    @[reducible, inline]

                                                                                    An open ball defined by FiniteArchimedeanClass.addSubgroup of UpperSet.Ioi c.

                                                                                    Instances For
                                                                                      @[reducible, inline]

                                                                                      A closed ball defined by FiniteMulArchimedeanClass.subgroup of UpperSet.Ici c.

                                                                                      Instances For
                                                                                        @[reducible, inline]

                                                                                        A closed ball defined by FiniteArchimedeanClass.addSubgroup of UpperSet.Ici c.

                                                                                        Instances For