mathlib documentation

core.​init.​data.​nat.​lemmas

core.​init.​data.​nat.​lemmas

theorem nat.​add_comm (n m : ℕ) :
n + m = m + n

theorem nat.​add_assoc (n m k : ℕ) :
n + m + k = n + (m + k)

theorem nat.​add_left_comm (n m k : ℕ) :
n + (m + k) = m + (n + k)

theorem nat.​add_left_cancel {n m k : ℕ} :
n + m = n + k → m = k

theorem nat.​add_right_cancel {n m k : ℕ} :
n + m = k + m → n = k

theorem nat.​succ_ne_zero (n : ℕ) :
n.succ ≠ 0

theorem nat.​succ_ne_self (n : ℕ) :
n.succ ≠ n

theorem nat.​one_ne_zero  :
1 ≠ 0

theorem nat.​zero_ne_one  :
0 ≠ 1

theorem nat.​eq_zero_of_add_eq_zero_right {n m : ℕ} :
n + m = 0 → n = 0

theorem nat.​eq_zero_of_add_eq_zero_left {n m : ℕ} :
n + m = 0 → m = 0

@[simp]
theorem nat.​pred_zero  :
0.pred = 0

@[simp]
theorem nat.​pred_succ (n : ℕ) :
n.succ.pred = n

theorem nat.​mul_zero (n : ℕ) :
n * 0 = 0

theorem nat.​mul_succ (n m : ℕ) :
n * m.succ = n * m + n

theorem nat.​zero_mul (n : ℕ) :
0 * n = 0

theorem nat.​succ_mul (n m : ℕ) :
n.succ * m = n * m + m

theorem nat.​right_distrib (n m k : ℕ) :
(n + m) * k = n * k + m * k

theorem nat.​left_distrib (n m k : ℕ) :
n * (m + k) = n * m + n * k

theorem nat.​mul_comm (n m : ℕ) :
n * m = m * n

theorem nat.​mul_assoc (n m k : ℕ) :
n * m * k = n * (m * k)

theorem nat.​mul_one (n : ℕ) :
n * 1 = n

theorem nat.​one_mul (n : ℕ) :
1 * n = n

theorem nat.​le_of_eq {n m : ℕ} :
n = m → n ≤ m

theorem nat.​le_succ_of_le {n m : ℕ} :
n ≤ m → n ≤ m.succ

theorem nat.​le_of_succ_le {n m : ℕ} :
n.succ ≤ m → n ≤ m

theorem nat.​le_of_lt {n m : ℕ} :
n < m → n ≤ m

theorem nat.​eq_zero_or_pos (n : ℕ) :
n = 0 ∨ n > 0

theorem nat.​pos_of_ne_zero {n : ℕ} :
n ≠ 0 → n > 0

theorem nat.​lt_trans {n m k : ℕ} :
n < m → m < k → n < k

theorem nat.​lt_of_le_of_lt {n m k : ℕ} :
n ≤ m → m < k → n < k

def nat.​lt.​base (n : ℕ) :
n < n.succ

Equations
  • _ = _
theorem nat.​lt_succ_self (n : ℕ) :
n < n.succ

theorem nat.​le_antisymm {n m : ℕ} :
n ≤ m → m ≤ n → n = m

theorem nat.​lt_or_ge (a b : ℕ) :
a < b ∨ a ≥ b

theorem nat.​le_total {m n : ℕ} :
m ≤ n ∨ n ≤ m

theorem nat.​lt_of_le_and_ne {m n : ℕ} :
m ≤ n → m ≠ n → m < n

theorem nat.​lt_iff_le_not_le {m n : ℕ} :
m < n ↔ m ≤ n ∧ ¬n ≤ m

theorem nat.​eq_zero_of_le_zero {n : ℕ} :
n ≤ 0 → n = 0

theorem nat.​succ_lt_succ {a b : ℕ} :
a < b → a.succ < b.succ

theorem nat.​lt_of_succ_lt {a b : ℕ} :
a.succ < b → a < b

theorem nat.​lt_of_succ_lt_succ {a b : ℕ} :
a.succ < b.succ → a < b

theorem nat.​pred_lt_pred {n m : ℕ} :
n ≠ 0 → n < m → n.pred < m.pred

theorem nat.​lt_of_succ_le {a b : ℕ} :
a.succ ≤ b → a < b

theorem nat.​succ_le_of_lt {a b : ℕ} :
a < b → a.succ ≤ b

theorem nat.​le_add_right (n k : ℕ) :
n ≤ n + k

theorem nat.​le_add_left (n m : ℕ) :
n ≤ m + n

theorem nat.​le.​dest {n m : ℕ} :
n ≤ m → (∃ (k : ℕ), n + k = m)

theorem nat.​le.​intro {n m k : ℕ} :
n + k = m → n ≤ m

theorem nat.​add_le_add_left {n m : ℕ} (h : n ≤ m) (k : ℕ) :
k + n ≤ k + m

theorem nat.​add_le_add_right {n m : ℕ} (h : n ≤ m) (k : ℕ) :
n + k ≤ m + k

theorem nat.​le_of_add_le_add_left {k n m : ℕ} :
k + n ≤ k + m → n ≤ m

theorem nat.​le_of_add_le_add_right {k n m : ℕ} :
n + k ≤ m + k → n ≤ m

theorem nat.​add_le_add_iff_le_right (k n m : ℕ) :
n + k ≤ m + k ↔ n ≤ m

theorem nat.​lt_of_add_lt_add_left {k n m : ℕ} :
k + n < k + m → n < m

theorem nat.​lt_of_add_lt_add_right {a b c : ℕ} :
a + b < c + b → a < c

theorem nat.​add_lt_add_left {n m : ℕ} (h : n < m) (k : ℕ) :
k + n < k + m

theorem nat.​add_lt_add_right {n m : ℕ} (h : n < m) (k : ℕ) :
n + k < m + k

theorem nat.​lt_add_of_pos_right {n k : ℕ} :
k > 0 → n < n + k

theorem nat.​lt_add_of_pos_left {n k : ℕ} :
k > 0 → n < k + n

theorem nat.​add_lt_add {a b c d : ℕ} :
a < b → c < d → a + c < b + d

theorem nat.​add_le_add {a b c d : ℕ} :
a ≤ b → c ≤ d → a + c ≤ b + d

theorem nat.​zero_lt_one  :
0 < 1

theorem nat.​mul_le_mul_left {n m : ℕ} (k : ℕ) :
n ≤ m → k * n ≤ k * m

theorem nat.​mul_le_mul_right {n m : ℕ} (k : ℕ) :
n ≤ m → n * k ≤ m * k

theorem nat.​mul_lt_mul_of_pos_left {n m k : ℕ} :
n < m → k > 0 → k * n < k * m

theorem nat.​mul_lt_mul_of_pos_right {n m k : ℕ} :
n < m → k > 0 → n * k < m * k

theorem nat.​le_of_mul_le_mul_left {a b c : ℕ} :
c * a ≤ c * b → c > 0 → a ≤ b

theorem nat.​le_of_lt_succ {m n : ℕ} :
m < n.succ → m ≤ n

theorem nat.​eq_of_mul_eq_mul_left {m k n : ℕ} :
n > 0 → n * m = n * k → m = k

@[simp]
theorem nat.​zero_sub (a : ℕ) :
0 - a = 0

theorem nat.​sub_lt_succ (a b : ℕ) :
a - b < a.succ

theorem nat.​sub_le_sub_right {n m : ℕ} (h : n ≤ m) (k : ℕ) :
n - k ≤ m - k

theorem nat.​bit1_eq_succ_bit0 (n : ℕ) :
bit1 n = (bit0 n).succ

theorem nat.​bit1_succ_eq (n : ℕ) :

theorem nat.​bit1_ne_one {n : ℕ} :
n ≠ 0 → bit1 n ≠ 1

theorem nat.​bit0_ne_one (n : ℕ) :
bit0 n ≠ 1

theorem nat.​add_self_ne_one (n : ℕ) :
n + n ≠ 1

theorem nat.​bit1_ne_bit0 (n m : ℕ) :

theorem nat.​bit0_ne_bit1 (n m : ℕ) :

theorem nat.​bit0_inj {n m : ℕ} :
bit0 n = bit0 m → n = m

theorem nat.​bit1_inj {n m : ℕ} :
bit1 n = bit1 m → n = m

theorem nat.​bit0_ne {n m : ℕ} :
n ≠ m → bit0 n ≠ bit0 m

theorem nat.​bit1_ne {n m : ℕ} :
n ≠ m → bit1 n ≠ bit1 m

theorem nat.​zero_ne_bit0 {n : ℕ} :
n ≠ 0 → 0 ≠ bit0 n

theorem nat.​zero_ne_bit1 (n : ℕ) :
0 ≠ bit1 n

theorem nat.​one_ne_bit0 (n : ℕ) :
1 ≠ bit0 n

theorem nat.​one_ne_bit1 {n : ℕ} :
n ≠ 0 → 1 ≠ bit1 n

theorem nat.​one_lt_bit1 {n : ℕ} :
n ≠ 0 → 1 < bit1 n

theorem nat.​one_lt_bit0 {n : ℕ} :
n ≠ 0 → 1 < bit0 n

theorem nat.​bit0_lt {n m : ℕ} :
n < m → bit0 n < bit0 m

theorem nat.​bit1_lt {n m : ℕ} :
n < m → bit1 n < bit1 m

theorem nat.​bit0_lt_bit1 {n m : ℕ} :
n ≤ m → bit0 n < bit1 m

theorem nat.​bit1_lt_bit0 {n m : ℕ} :
n < m → bit1 n < bit0 m

theorem nat.​one_le_bit1 (n : ℕ) :
1 ≤ bit1 n

theorem nat.​one_le_bit0 (n : ℕ) :
n ≠ 0 → 1 ≤ bit0 n

@[simp]
theorem nat.​sub_zero (n : ℕ) :
n - 0 = n

theorem nat.​sub_succ (n m : ℕ) :
n - m.succ = (n - m).pred

theorem nat.​succ_sub_succ (n m : ℕ) :
n.succ - m.succ = n - m

@[simp]
theorem nat.​sub_self (n : ℕ) :
n - n = 0

theorem nat.​add_sub_add_right (n k m : ℕ) :
n + k - (m + k) = n - m

theorem nat.​add_sub_add_left (k n m : ℕ) :
k + n - (k + m) = n - m

@[simp]
theorem nat.​add_sub_cancel (n m : ℕ) :
n + m - m = n

@[simp]
theorem nat.​add_sub_cancel_left (n m : ℕ) :
n + m - n = m

theorem nat.​sub_sub (n m k : ℕ) :
n - m - k = n - (m + k)

theorem nat.​le_of_le_of_sub_le_sub_right {n m k : ℕ} :
k ≤ m → n - k ≤ m - k → n ≤ m

theorem nat.​sub_le_sub_right_iff (n m k : ℕ) :
k ≤ m → (n - k ≤ m - k ↔ n ≤ m)

theorem nat.​sub_self_add (n m : ℕ) :
n - (n + m) = 0

theorem nat.​add_le_to_le_sub (x : ℕ) {y k : ℕ} :
k ≤ y → (x + k ≤ y ↔ x ≤ y - k)

theorem nat.​sub_lt_of_pos_le (a b : ℕ) :
0 < a → a ≤ b → b - a < b

theorem nat.​sub_one (n : ℕ) :
n - 1 = n.pred

theorem nat.​succ_sub_one (n : ℕ) :
n.succ - 1 = n

theorem nat.​succ_pred_eq_of_pos {n : ℕ} :
n > 0 → n.pred.succ = n

theorem nat.​sub_eq_zero_of_le {n m : ℕ} :
n ≤ m → n - m = 0

theorem nat.​le_of_sub_eq_zero {n m : ℕ} :
n - m = 0 → n ≤ m

theorem nat.​sub_eq_zero_iff_le {n m : ℕ} :
n - m = 0 ↔ n ≤ m

theorem nat.​add_sub_of_le {n m : ℕ} :
n ≤ m → n + (m - n) = m

theorem nat.​sub_add_cancel {n m : ℕ} :
n ≥ m → n - m + m = n

theorem nat.​add_sub_assoc {m k : ℕ} (h : k ≤ m) (n : ℕ) :
n + m - k = n + (m - k)

theorem nat.​sub_eq_iff_eq_add {a b c : ℕ} :
b ≤ a → (a - b = c ↔ a = c + b)

theorem nat.​lt_of_sub_eq_succ {m n l : ℕ} :
m - n = l.succ → n < m

@[simp]
theorem nat.​zero_min (a : ℕ) :
min 0 a = 0

@[simp]
theorem nat.​min_zero (a : ℕ) :
min a 0 = 0

theorem nat.​min_succ_succ (x y : ℕ) :
min x.succ y.succ = (min x y).succ

theorem nat.​sub_eq_sub_min (n m : ℕ) :
n - m = n - min n m

@[simp]
theorem nat.​sub_add_min_cancel (n m : ℕ) :
n - m + min n m = n

def nat.​strong_rec_on {p : ℕ → Sort u} (n : ℕ) :
(Π (n : ℕ), (Π (m : ℕ), m < n → p m) → p n) → p n

Equations
  • n.strong_rec_on h = (λ (this : Π (n m : ℕ), m < n → p m), this n.succ n _) (λ (n : ℕ), nat.rec (λ (m : ℕ) (h₁ : m < 0), absurd h₁ _) (λ (n : ℕ) (ih : Π (m : ℕ), m < n → p m) (m : ℕ) (h₁ : m < n.succ), _.by_cases (λ (a : m < n), ih m a) (λ (a : m = n), eq.rec (λ (h₁ : n < n.succ), h n ih) _ h₁)) n)
theorem nat.​strong_induction_on {p : ℕ → Prop} (n : ℕ) :
(∀ (n : ℕ), (∀ (m : ℕ), m < n → p m) → p n) → p n

theorem nat.​case_strong_induction_on {p : ℕ → Prop} (a : ℕ) :
p 0 → (∀ (n : ℕ), (∀ (m : ℕ), m ≤ n → p m) → p n.succ) → p a

theorem nat.​mod_def (x y : ℕ) :
x % y = ite (0 < y ∧ y ≤ x) ((x - y) % y) x

@[simp]
theorem nat.​mod_zero (a : ℕ) :
a % 0 = a

theorem nat.​mod_eq_of_lt {a b : ℕ} :
a < b → a % b = a

@[simp]
theorem nat.​zero_mod (b : ℕ) :
0 % b = 0

theorem nat.​mod_eq_sub_mod {a b : ℕ} :
a ≥ b → a % b = (a - b) % b

theorem nat.​mod_lt (x : ℕ) {y : ℕ} :
y > 0 → x % y < y

@[simp]
theorem nat.​mod_self (n : ℕ) :
n % n = 0

@[simp]
theorem nat.​mod_one (n : ℕ) :
n % 1 = 0

theorem nat.​mod_two_eq_zero_or_one (n : ℕ) :
n % 2 = 0 ∨ n % 2 = 1

theorem nat.​div_def (x y : ℕ) :
x / y = ite (0 < y ∧ y ≤ x) ((x - y) / y + 1) 0

theorem nat.​mod_add_div (m k : ℕ) :
m % k + k * (m / k) = m

@[simp]
theorem nat.​div_one (n : ℕ) :
n / 1 = n

@[simp]
theorem nat.​div_zero (n : ℕ) :
n / 0 = 0

@[simp]
theorem nat.​zero_div (b : ℕ) :
0 / b = 0

theorem nat.​div_le_of_le_mul {m n k : ℕ} :
m ≤ k * n → m / k ≤ n

theorem nat.​div_le_self (m n : ℕ) :
m / n ≤ m

theorem nat.​div_eq_sub_div {a b : ℕ} :
b > 0 → a ≥ b → a / b = (a - b) / b + 1

theorem nat.​div_eq_of_lt {a b : ℕ} :
a < b → a / b = 0

theorem nat.​le_div_iff_mul_le (x y : ℕ) {k : ℕ} :
k > 0 → (x ≤ y / k ↔ x * k ≤ y)

theorem nat.​div_lt_iff_lt_mul (x y : ℕ) {k : ℕ} :
k > 0 → (x / k < y ↔ x < y * k)

def nat.​iterate {α : Sort u} :
(α → α) → ℕ → α → α

Equations
theorem nat.​add_one_ne_zero (n : ℕ) :
n + 1 ≠ 0

theorem nat.​exists_eq_succ_of_ne_zero {n : ℕ} :
n ≠ 0 → (∃ (k : ℕ), n = k.succ)

theorem nat.​discriminate {B : Sort u} {n : ℕ} :
(n = 0 → B) → (Π (m : ℕ), n = m.succ → B) → B

theorem nat.​one_succ_zero  :
1 = 1

theorem nat.​two_step_induction {P : ℕ → Sort u} (H1 : P 0) (H2 : P 1) (H3 : Π (n : ℕ), P n → P n.succ → P n.succ.succ) (a : ℕ) :
P a

theorem nat.​sub_induction {P : ℕ → ℕ → Sort u} (H1 : Π (m : ℕ), P 0 m) (H2 : Π (n : ℕ), P n.succ 0) (H3 : Π (n m : ℕ), P n m → P n.succ m.succ) (n m : ℕ) :
P n m

theorem nat.​succ_add_eq_succ_add (n m : ℕ) :
n.succ + m = n + m.succ

theorem nat.​add_right_comm (n m k : ℕ) :
n + m + k = n + k + m

theorem nat.​eq_zero_of_add_eq_zero {n m : ℕ} :
n + m = 0 → n = 0 ∧ m = 0

theorem nat.​eq_zero_of_mul_eq_zero {n m : ℕ} :
n * m = 0 → n = 0 ∨ m = 0

theorem nat.​le_succ_of_pred_le {n m : ℕ} :
n.pred ≤ m → n ≤ m.succ

theorem nat.​le_lt_antisymm {n m : ℕ} :
n ≤ m → m < n → false

theorem nat.​lt_le_antisymm {n m : ℕ} :
n < m → m ≤ n → false

theorem nat.​lt_asymm {n m : ℕ} :
n < m → ¬m < n

def nat.​lt_ge_by_cases {a b : ℕ} {C : Sort u} :
(a < b → C) → (a ≥ b → C) → C

Equations
def nat.​lt_by_cases {a b : ℕ} {C : Sort u} :
(a < b → C) → (a = b → C) → (b < a → C) → C

Equations
theorem nat.​lt_trichotomy (a b : ℕ) :
a < b ∨ a = b ∨ b < a

theorem nat.​eq_or_lt_of_not_lt {a b : ℕ} :
¬a < b → a = b ∨ b < a

theorem nat.​lt_succ_of_lt {a b : ℕ} :
a < b → a < b.succ

theorem nat.​sub_le_sub_left {n m : ℕ} (k : ℕ) :
n ≤ m → k - m ≤ k - n

theorem nat.​succ_sub_sub_succ (n m k : ℕ) :
n.succ - m - k.succ = n - m - k

theorem nat.​sub.​right_comm (m n k : ℕ) :
m - n - k = m - k - n

theorem nat.​mul_pred_left (n m : ℕ) :
n.pred * m = n * m - m

theorem nat.​mul_pred_right (n m : ℕ) :
n * m.pred = n * m - n

theorem nat.​mul_sub_right_distrib (n m k : ℕ) :
(n - m) * k = n * k - m * k

theorem nat.​mul_sub_left_distrib (n m k : ℕ) :
n * (m - k) = n * m - n * k

theorem nat.​mul_self_sub_mul_self_eq (a b : ℕ) :
a * a - b * b = (a + b) * (a - b)

theorem nat.​succ_mul_succ_eq (a b : ℕ) :
a.succ * b.succ = a * b + a + b + 1

theorem nat.​succ_sub {m n : ℕ} :
m ≥ n → m.succ - n = (m - n).succ

theorem nat.​sub_pos_of_lt {m n : ℕ} :
m < n → n - m > 0

theorem nat.​sub_sub_self {n m : ℕ} :
m ≤ n → n - (n - m) = m

theorem nat.​sub_add_comm {n m k : ℕ} :
k ≤ n → n + m - k = n - k + m

theorem nat.​sub_one_sub_lt {n i : ℕ} :
i < n → n - 1 - i < n

theorem nat.​pred_inj {a b : ℕ} :
a > 0 → b > 0 → a.pred = b.pred → a = b

def nat.​find_x {p : ℕ → Prop} [decidable_pred p] :
(∃ (n : ℕ), p n) → {n // p n ∧ ∀ (m : ℕ), m < n → ¬p m}

Equations
  • nat.find_x H = _.fix (λ (m : ℕ) (IH : Π (y : ℕ), lbp y m → (λ (k : ℕ), (∀ (n : ℕ), n < k → ¬p n) → {n // p n ∧ ∀ (m : ℕ), m < n → ¬p m}) y) (al : ∀ (n : ℕ), n < m → ¬p n), dite (p m) (λ (pm : p m), ⟨m, _⟩) (λ (pm : ¬p m), have this : ∀ (n : ℕ), n ≤ m → ¬p n, from _, IH (m + 1) _ _)) 0 nat.find_x._proof_5
def nat.​find {p : ℕ → Prop} [decidable_pred p] :
(∃ (n : ℕ), p n) → ℕ

Equations
theorem nat.​find_spec {p : ℕ → Prop} [decidable_pred p] (H : ∃ (n : ℕ), p n) :
p (nat.find H)

theorem nat.​find_min {p : ℕ → Prop} [decidable_pred p] (H : ∃ (n : ℕ), p n) {m : ℕ} :
m < nat.find H → ¬p m

theorem nat.​find_min' {p : ℕ → Prop} [decidable_pred p] (H : ∃ (n : ℕ), p n) {m : ℕ} :
p m → nat.find H ≤ m

theorem nat.​mod_le (x y : ℕ) :
x % y ≤ x

@[simp]
theorem nat.​add_mod_right (x z : ℕ) :
(x + z) % z = x % z

@[simp]
theorem nat.​add_mod_left (x z : ℕ) :
(x + z) % x = z % x

@[simp]
theorem nat.​add_mul_mod_self_left (x y z : ℕ) :
(x + y * z) % y = x % y

@[simp]
theorem nat.​add_mul_mod_self_right (x y z : ℕ) :
(x + y * z) % z = x % z

@[simp]
theorem nat.​mul_mod_right (m n : ℕ) :
m * n % m = 0

@[simp]
theorem nat.​mul_mod_left (m n : ℕ) :
m * n % n = 0

theorem nat.​mul_mod_mul_left (z x y : ℕ) :
z * x % (z * y) = z * (x % y)

theorem nat.​mul_mod_mul_right (z x y : ℕ) :
x * z % (y * z) = x % y * z

theorem nat.​cond_to_bool_mod_two (x : ℕ) [d : decidable (x % 2 = 1)] :
cond (decidable.to_bool (x % 2 = 1)) 1 0 = x % 2

theorem nat.​sub_mul_mod (x k n : ℕ) :
n * k ≤ x → (x - n * k) % n = x % n

theorem nat.​sub_mul_div (x n p : ℕ) :
n * p ≤ x → (x - n * p) / n = x / n - p

theorem nat.​div_mul_le_self (m n : ℕ) :
m / n * n ≤ m

@[simp]
theorem nat.​add_div_right (x : ℕ) {z : ℕ} :
z > 0 → (x + z) / z = (x / z).succ

@[simp]
theorem nat.​add_div_left (x : ℕ) {z : ℕ} :
z > 0 → (z + x) / z = (x / z).succ

@[simp]
theorem nat.​mul_div_right (n : ℕ) {m : ℕ} :
m > 0 → m * n / m = n

@[simp]
theorem nat.​mul_div_left (m : ℕ) {n : ℕ} :
n > 0 → m * n / n = m

@[simp]
theorem nat.​div_self {n : ℕ} :
n > 0 → n / n = 1

theorem nat.​add_mul_div_left (x z : ℕ) {y : ℕ} :
y > 0 → (x + y * z) / y = x / y + z

theorem nat.​add_mul_div_right (x y : ℕ) {z : ℕ} :
z > 0 → (x + y * z) / z = x / z + y

theorem nat.​mul_div_cancel (m : ℕ) {n : ℕ} :
n > 0 → m * n / n = m

theorem nat.​mul_div_cancel_left (m : ℕ) {n : ℕ} :
n > 0 → n * m / n = m

theorem nat.​div_eq_of_eq_mul_left {m n k : ℕ} :
n > 0 → m = k * n → m / n = k

theorem nat.​div_eq_of_eq_mul_right {m n k : ℕ} :
n > 0 → m = n * k → m / n = k

theorem nat.​div_eq_of_lt_le {m n k : ℕ} :
k * n ≤ m → m < k.succ * n → m / n = k

theorem nat.​mul_sub_div (x n p : ℕ) :
x < n * p → (n * p - x.succ) / n = p - (x / n).succ

theorem nat.​mul_pos {a b : ℕ} :
a > 0 → b > 0 → a * b > 0

theorem nat.​div_div_eq_div_mul (m n k : ℕ) :
m / n / k = m / (n * k)

theorem nat.​mul_div_mul {m : ℕ} (n k : ℕ) :
m > 0 → m * n / (m * k) = n / k

@[simp]
theorem nat.​dvd_mul_right (a b : ℕ) :
a ∣ a * b

theorem nat.​dvd_trans {a b c : ℕ} :
a ∣ b → b ∣ c → a ∣ c

theorem nat.​eq_zero_of_zero_dvd {a : ℕ} :
0 ∣ a → a = 0

theorem nat.​dvd_add {a b c : ℕ} :
a ∣ b → a ∣ c → a ∣ b + c

theorem nat.​dvd_add_iff_right {k m n : ℕ} :
k ∣ m → (k ∣ n ↔ k ∣ m + n)

theorem nat.​dvd_add_iff_left {k m n : ℕ} :
k ∣ n → (k ∣ m ↔ k ∣ m + n)

theorem nat.​dvd_sub {k m n : ℕ} :
n ≤ m → k ∣ m → k ∣ n → k ∣ m - n

theorem nat.​dvd_mod_iff {k m n : ℕ} :
k ∣ n → (k ∣ m % n ↔ k ∣ m)

theorem nat.​le_of_dvd {m n : ℕ} :
n > 0 → m ∣ n → m ≤ n

theorem nat.​dvd_antisymm {m n : ℕ} :
m ∣ n → n ∣ m → m = n

theorem nat.​pos_of_dvd_of_pos {m n : ℕ} :
m ∣ n → n > 0 → m > 0

theorem nat.​eq_one_of_dvd_one {n : ℕ} :
n ∣ 1 → n = 1

theorem nat.​dvd_of_mod_eq_zero {m n : ℕ} :
n % m = 0 → m ∣ n

theorem nat.​mod_eq_zero_of_dvd {m n : ℕ} :
m ∣ n → n % m = 0

theorem nat.​dvd_iff_mod_eq_zero (m n : ℕ) :
m ∣ n ↔ n % m = 0

theorem nat.​mul_div_cancel' {m n : ℕ} :
n ∣ m → n * (m / n) = m

theorem nat.​div_mul_cancel {m n : ℕ} :
n ∣ m → m / n * n = m

theorem nat.​mul_div_assoc (m : ℕ) {n k : ℕ} :
k ∣ n → m * n / k = m * (n / k)

theorem nat.​dvd_of_mul_dvd_mul_left {m n k : ℕ} :
k > 0 → k * m ∣ k * n → m ∣ n

theorem nat.​dvd_of_mul_dvd_mul_right {m n k : ℕ} :
k > 0 → m * k ∣ n * k → m ∣ n

theorem nat.​mul_le_mul_of_nonneg_left {a b c : ℕ} :
a ≤ b → c * a ≤ c * b

theorem nat.​mul_le_mul_of_nonneg_right {a b c : ℕ} :
a ≤ b → a * c ≤ b * c

theorem nat.​mul_lt_mul {a b c d : ℕ} :
a < c → b ≤ d → 0 < b → a * b < c * d

theorem nat.​mul_lt_mul' {a b c d : ℕ} :
a ≤ c → b < d → 0 < c → a * b < c * d

theorem nat.​mul_le_mul {a b c d : ℕ} :
a ≤ c → b ≤ d → a * b ≤ c * d

@[simp]
theorem nat.​pow_one (b : ℕ) :
b ^ 1 = b

theorem nat.​pow_le_pow_of_le_left {x y : ℕ} (H : x ≤ y) (i : ℕ) :
x ^ i ≤ y ^ i

theorem nat.​pow_le_pow_of_le_right {x : ℕ} (H : x > 0) {i j : ℕ} :
i ≤ j → x ^ i ≤ x ^ j

theorem nat.​pos_pow_of_pos {b : ℕ} (n : ℕ) :
0 < b → 0 < b ^ n

theorem nat.​zero_pow {n : ℕ} :
0 < n → 0 ^ n = 0

theorem nat.​pow_lt_pow_of_lt_left {x y : ℕ} (H : x < y) {i : ℕ} :
i > 0 → x ^ i < y ^ i

theorem nat.​pow_lt_pow_of_lt_right {x : ℕ} (H : x > 1) {i j : ℕ} :
i < j → x ^ i < x ^ j

theorem nat.​mod_pow_succ {b : ℕ} (b_pos : b > 0) (w m : ℕ) :
m % b ^ w.succ = b * (m / b % b ^ w) + m % b

theorem nat.​div_lt_self {n m : ℕ} :
n > 0 → m > 1 → n / m < n