Documentation

CombinatorialGames.Mathlib.Dyadic

Dyadic numbers #

A dyadic (rational) number is a rational number whose denominator is a power of two. We define them as a subtype of , and build the CommRing structure, as well as proving some auxiliary theorems on them.

This material belongs in Mathlib, though we do need to consider if the definition of Dyadic used here is the best one.

For Mathlib #

theorem le_of_le_of_lt_of_lt {α : Type u_1} {β : Type u_2} [PartialOrder α] [Preorder β] {x y : α} {f : αβ} (h : x < yf x < f y) (hxy : x y) :
f x f y
theorem Nat.pow_log_eq_self_iff {b n : } (hb : b 0) :
b ^ log b n = n n Set.range fun (x : ) => b ^ x
theorem Set.range_if {α : Type u_1} {β : Type u_2} {p : αProp} [DecidablePred p] {x y : β} (hp : ∃ (a : α), p a) (hn : ∃ (a : α), ¬p a) :
(range fun (a : α) => if p a then x else y) = {x, y}
theorem range_zero_pow {M : Type u_1} [MonoidWithZero M] :
(Set.range fun (x : ) => 0 ^ x) = {1, 0}
theorem pos_of_mem_powers {n : } (h : n Submonoid.powers 2) :
0 < n
theorem dvd_iff_le_of_mem_powers {m n : } (hm : m Submonoid.powers 2) (hn : n Submonoid.powers 2) :
m n m n

Dyadic numbers #

def IsDyadic (x : ) :

A dyadic rational number is one whose denominator is a power of two.

Equations
Instances For
    theorem IsDyadic.mkRat (x : ) {y : } (hy : y Submonoid.powers 2) :
    theorem IsDyadic.neg {x : } (hx : IsDyadic x) :
    @[simp]
    theorem IsDyadic.natCast (n : ) :
    theorem IsDyadic.intCast (n : ) :
    theorem IsDyadic.add {x y : } (hx : IsDyadic x) (hy : IsDyadic y) :
    IsDyadic (x + y)
    theorem IsDyadic.sub {x y : } (hx : IsDyadic x) (hy : IsDyadic y) :
    IsDyadic (x - y)
    theorem IsDyadic.mul {x y : } (hx : IsDyadic x) (hy : IsDyadic y) :
    IsDyadic (x * y)
    theorem IsDyadic.nsmul {x : } (n : ) (hx : IsDyadic x) :
    theorem IsDyadic.zsmul {x : } (n : ) (hx : IsDyadic x) :
    theorem IsDyadic.pow {x : } (hx : IsDyadic x) (n : ) :
    IsDyadic (x ^ n)
    @[reducible, inline]
    abbrev Dyadic :

    The subtype of IsDyadic numbers.

    We don't use Localization.Away 2, as this would not give us any computability, nor would it allow us to talk about numerators and denominators.

    Equations
    Instances For
      theorem Dyadic.le_def {x y : Dyadic} :
      x y x y
      theorem Dyadic.lt_def {x y : Dyadic} :
      x < y x < y
      @[reducible, inline]
      abbrev Dyadic.num (x : Dyadic) :

      Numerator of a dyadic number.

      Equations
      Instances For
        @[reducible, inline]
        abbrev Dyadic.den (x : Dyadic) :

        Denominator of a dyadic number.

        Equations
        Instances For
          theorem Dyadic.den_pos (x : Dyadic) :
          0 < x.den
          @[simp]
          @[simp]
          theorem Dyadic.den_ne_one_of_den_lt {x y : Dyadic} (h : x.den < y.den) :
          y.den 1
          theorem Dyadic.ext {x y : Dyadic} (h : x = y) :
          x = y
          theorem Dyadic.ext_iff {x y : Dyadic} :
          x = y x = y
          Equations
          @[simp]
          theorem Dyadic.val_natCast (n : ) :
          n = n
          @[simp]
          theorem Dyadic.num_natCast (n : ) :
          (↑n).num = n
          @[simp]
          theorem Dyadic.den_natCast (n : ) :
          (↑n).den = 1
          @[simp]
          theorem Dyadic.val_ofNat (n : ) [n.AtLeastTwo] :
          (OfNat.ofNat n) = n
          @[simp]
          theorem Dyadic.num_ofNat (n : ) [n.AtLeastTwo] :
          (OfNat.ofNat n).num = n
          @[simp]
          theorem Dyadic.den_ofNat (n : ) [n.AtLeastTwo] :
          @[simp]
          theorem Dyadic.natCast_lt_val {x : } {y : Dyadic} :
          x < y x < y
          @[simp]
          theorem Dyadic.natCast_le_val {x : } {y : Dyadic} :
          x y x y
          @[simp]
          theorem Dyadic.val_lt_natCast {x : Dyadic} {y : } :
          x < y x < y
          @[simp]
          theorem Dyadic.val_le_natCast {x : Dyadic} {y : } :
          x y x y
          @[simp]
          theorem Dyadic.val_eq_natCast {x : Dyadic} {y : } :
          x = y x = y
          @[simp]
          theorem Dyadic.natCast_eq_val {x : } {y : Dyadic} :
          x = y x = y
          Equations
          @[simp]
          theorem Dyadic.val_intCast (n : ) :
          n = n
          @[simp]
          theorem Dyadic.mk_intCast {n : } (h : IsDyadic n) :
          n, h = n
          @[simp]
          theorem Dyadic.num_intCast (n : ) :
          (↑n).num = n
          @[simp]
          theorem Dyadic.den_intCast (n : ) :
          (↑n).den = 1
          @[simp]
          theorem Dyadic.intCast_lt_val {x : } {y : Dyadic} :
          x < y x < y
          @[simp]
          theorem Dyadic.intCast_le_val {x : } {y : Dyadic} :
          x y x y
          @[simp]
          theorem Dyadic.val_lt_intCast {x : Dyadic} {y : } :
          x < y x < y
          @[simp]
          theorem Dyadic.val_le_intCast {x : Dyadic} {y : } :
          x y x y
          @[simp]
          theorem Dyadic.val_eq_intCast {x : Dyadic} {y : } :
          x = y x = y
          @[simp]
          theorem Dyadic.intCast_eq_val {x : } {y : Dyadic} :
          x = y x = y
          Equations
          @[simp]
          theorem Dyadic.val_zero :
          0 = 0
          @[simp]
          theorem Dyadic.mk_zero (h : IsDyadic 0) :
          0, h = 0
          @[simp]
          theorem Dyadic.num_zero :
          num 0 = 0
          @[simp]
          theorem Dyadic.den_zero :
          den 0 = 1
          @[simp]
          theorem Dyadic.zero_lt_val {x : Dyadic} :
          0 < x 0 < x
          @[simp]
          theorem Dyadic.zero_le_val {x : Dyadic} :
          0 x 0 x
          @[simp]
          theorem Dyadic.val_lt_zero {x : Dyadic} :
          x < 0 x < 0
          @[simp]
          theorem Dyadic.val_le_zero {x : Dyadic} :
          x 0 x 0
          @[simp]
          theorem Dyadic.val_eq_zero {x : Dyadic} :
          x = 0 x = 0
          @[simp]
          theorem Dyadic.zero_eq_val {x : Dyadic} :
          0 = x 0 = x
          Equations
          @[simp]
          theorem Dyadic.val_one :
          1 = 1
          @[simp]
          theorem Dyadic.mk_one (h : IsDyadic 1) :
          1, h = 1
          @[simp]
          theorem Dyadic.num_one :
          num 1 = 1
          @[simp]
          theorem Dyadic.den_one :
          den 1 = 1
          @[simp]
          theorem Dyadic.one_lt_val {x : Dyadic} :
          1 < x 1 < x
          @[simp]
          theorem Dyadic.one_le_val {x : Dyadic} :
          1 x 1 x
          @[simp]
          theorem Dyadic.val_lt_one {x : Dyadic} :
          x < 1 x < 1
          @[simp]
          theorem Dyadic.val_le_one {x : Dyadic} :
          x 1 x 1
          @[simp]
          theorem Dyadic.val_eq_one {x : Dyadic} :
          x = 1 x = 1
          @[simp]
          theorem Dyadic.one_eq_val {x : Dyadic} :
          1 = x 1 = x
          Equations
          @[simp]
          theorem Dyadic.val_neg (x : Dyadic) :
          ↑(-x) = -x
          @[simp]
          theorem Dyadic.neg_mk {x : } (hx : IsDyadic x) :
          -x, hx = -x,
          @[simp]
          theorem Dyadic.num_neg (x : Dyadic) :
          (-x).num = -x.num
          @[simp]
          theorem Dyadic.den_neg (x : Dyadic) :
          (-x).den = x.den
          Equations
          @[simp]
          theorem Dyadic.val_add (x y : Dyadic) :
          ↑(x + y) = x + y
          Equations
          @[simp]
          theorem Dyadic.val_sub (x y : Dyadic) :
          ↑(x - y) = x - y
          Equations
          @[simp]
          theorem Dyadic.val_mul (x y : Dyadic) :
          ↑(x * y) = x * y
          Equations
          @[simp]
          theorem Dyadic.val_nsmul (x : ) (y : Dyadic) :
          ↑(x y) = x y
          Equations
          @[simp]
          theorem Dyadic.val_zsmul (x : ) (y : Dyadic) :
          ↑(x y) = x y
          Equations
          @[simp]
          theorem Dyadic.val_pow (x : Dyadic) (y : ) :
          ↑(x ^ y) = x ^ y

          The dyadic number ½.

          Equations
          Instances For
            @[simp]
            @[simp]
            @[simp]
            def Dyadic.mkRat (m : ) {n : } (h : n Submonoid.powers 2) :

            Constructor for the fraction m / n.

            Equations
            Instances For
              @[simp]
              theorem Dyadic.val_mkRat (m : ) {n : } (h : n Submonoid.powers 2) :
              (Dyadic.mkRat m h) = mkRat m n
              @[simp]
              theorem Dyadic.mkRat_self (x : Dyadic) :
              @[simp]
              theorem Dyadic.mkRat_one (m : ) (h : 1 Submonoid.powers 2) :
              Dyadic.mkRat m h = m
              @[simp]
              theorem Dyadic.mkRat_lt_mkRat {m n : } {k : } (h₁ h₂ : k Submonoid.powers 2) :
              Dyadic.mkRat m h₁ < Dyadic.mkRat n h₂ m < n
              @[simp]
              theorem Dyadic.mkRat_le_mkRat {m n : } {k : } (h₁ h₂ : k Submonoid.powers 2) :
              Dyadic.mkRat m h₁ Dyadic.mkRat n h₂ m n
              theorem Dyadic.mkRat_add_mkRat_self {m n : } {k : } (h₁ h₂ : k Submonoid.powers 2) :
              Dyadic.mkRat m h₁ + Dyadic.mkRat n h₂ = Dyadic.mkRat (m + n) h₁
              Equations
              • One or more equations did not get rendered due to their size.
              theorem Dyadic.even_den {x : Dyadic} (hx : x.den 1) :
              theorem Dyadic.odd_num {x : Dyadic} (hx : x.den 1) :
              theorem Dyadic.den_mkRat_le (x : ) {n : } (hn : n 0) :
              (mkRat x n).den n
              theorem Dyadic.den_mkRat_lt {x : Dyadic} {n : } (hn : 2 n) (hd : x.den 1) :
              (mkRat n x.den).den < x.den
              theorem Dyadic.den_add_self_lt {x : Dyadic} (hx : x.den 1) :
              (x + x).den < x.den
              theorem Dyadic.eq_mkRat_of_den_le {x : Dyadic} {n : } (h : x.den n) (hn : n Submonoid.powers 2) :
              ∃ (m : ), x = Dyadic.mkRat m hn
              theorem Dyadic.den_add_le_den_right {x y : Dyadic} (h : x.den y.den) :
              (x + y).den y.den