Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit f004d32

Browse files
kim-emmergify[bot]
authored andcommitted
feat(data/nat): various lemmas (#1017)
* feat(data/nat): various lemmas * protect a definition * fixes * Rob's suggestions * Mario’s proof (Working offline, let’s see what Travis says) * minigolf
1 parent 971ddcc commit f004d32

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

src/data/nat/basic.lean

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ by rw [nat.sub_sub, ←nat.add_sub_assoc h₂, nat.add_sub_cancel_left]
159159
lemma add_sub_cancel_right (n m k : ℕ) : n + (m + k) - k = n + m :=
160160
by { rw [nat.add_sub_assoc, nat.add_sub_cancel], apply k.le_add_left }
161161

162+
protected lemma sub_add_eq_add_sub {a b c : ℕ} (h : b ≤ a) : (a - b) + c = (a + c) - b :=
163+
by rw [add_comm a, nat.add_sub_assoc h, add_comm]
164+
162165
theorem sub_min (n m : ℕ) : n - min n m = n - m :=
163166
nat.sub_eq_of_eq_add $ by rw [add_comm, sub_add_min]
164167

@@ -286,6 +289,13 @@ iff.intro eq_zero_of_mul_eq_zero (by simp [or_imp_distrib] {contextual := tt})
286289
@[simp] protected theorem zero_eq_mul {a b : ℕ} : 0 = a * b ↔ a = 0 ∨ b = 0 :=
287290
by rw [eq_comm, nat.mul_eq_zero]
288291

292+
lemma eq_zero_of_double_le {a : ℕ} (h : 2 * a ≤ a) : a = 0 :=
293+
nat.eq_zero_of_le_zero $
294+
by rwa [two_mul, nat.add_le_to_le_sub, nat.sub_self] at h; refl
295+
296+
lemma eq_zero_of_mul_le {a b : ℕ} (hb : 2 ≤ b) (h : b * a ≤ a) : a = 0 :=
297+
eq_zero_of_double_le $ le_trans (nat.mul_le_mul_right _ hb) h
298+
289299
lemma le_mul_of_pos_left {m n : ℕ} (h : n > 0) : m ≤ n * m :=
290300
begin
291301
conv {to_lhs, rw [← one_mul(m)]},
@@ -409,11 +419,21 @@ lt_of_mul_lt_mul_left
409419
... < n * k : h)
410420
(nat.zero_le n)
411421

422+
lemma lt_mul_of_div_lt {a b c : ℕ} (h : a / c < b) (w : 0 < c) : a < b * c :=
423+
lt_of_not_ge $ not_le_of_gt h ∘ (nat.le_div_iff_mul_le _ _ w).2
424+
412425
protected lemma div_eq_zero_iff {a b : ℕ} (hb : 0 < b) : a / b = 0 ↔ a < b :=
413426
⟨λ h, by rw [← mod_add_div a b, h, mul_zero, add_zero]; exact mod_lt _ hb,
414427
λ h, by rw [← nat.mul_left_inj hb, ← @add_left_cancel_iff _ _ (a % b), mod_add_div,
415428
mod_eq_of_lt h, mul_zero, add_zero]⟩
416429

430+
lemma eq_zero_of_le_div {a b : ℕ} (hb : 2 ≤ b) (h : a ≤ a / b) : a = 0 :=
431+
eq_zero_of_mul_le hb $
432+
by rw mul_comm; exact (nat.le_div_iff_mul_le' (lt_of_lt_of_le dec_trivial hb)).1 h
433+
434+
lemma eq_zero_of_le_half {a : ℕ} (h : a ≤ a / 2) : a = 0 :=
435+
eq_zero_of_le_div (le_refl _) h
436+
417437
lemma mod_mul_right_div_self (a b c : ℕ) : a % (b * c) / b = (a / b) % c :=
418438
if hb : b = 0 then by simp [hb] else if hc : c = 0 then by simp [hc]
419439
else by conv {to_rhs, rw ← mod_add_div a (b * c)};
@@ -1032,6 +1052,33 @@ dvd_trans this hdiv
10321052
lemma dvd_of_pow_dvd {p k m : ℕ} (hk : 1 ≤ k) (hpk : p^k ∣ m) : p ∣ m :=
10331053
by rw ←nat.pow_one p; exact pow_dvd_of_le_of_pow_dvd hk hpk
10341054

1055+
lemma eq_of_dvd_quot_one {a b : ℕ} (w : a ∣ b) (h : b / a = 1) : a = b :=
1056+
begin
1057+
rcases w with ⟨b, rfl⟩,
1058+
rw [nat.mul_comm, nat.mul_div_cancel] at h,
1059+
{ simp [h] },
1060+
{ by_contradiction, simp * at * }
1061+
end
1062+
1063+
lemma div_le_div_left {a b c : ℕ} (h₁ : c ≤ b) (h₂ : 0 < c) : a / b ≤ a / c :=
1064+
(nat.le_div_iff_mul_le _ _ h₂).2 $
1065+
le_trans (mul_le_mul_left _ h₁) (div_mul_le_self _ _)
1066+
1067+
lemma div_eq_self {a b : ℕ} : a / b = a ↔ a = 0 ∨ b = 1 :=
1068+
begin
1069+
split,
1070+
{ intro,
1071+
cases b,
1072+
{ simp * at * },
1073+
{ cases b,
1074+
{ right, refl },
1075+
{ left,
1076+
have : a / (b + 2) ≤ a / 2 := div_le_div_left (by simp) dec_trivial,
1077+
refine eq_zero_of_le_half _,
1078+
simp * at * } } },
1079+
{ rintros (rfl|rfl); simp }
1080+
end
1081+
10351082
end div
10361083

10371084
lemma exists_eq_add_of_le : ∀ {m n : ℕ}, m ≤ n → ∃ k : ℕ, n = m + k

0 commit comments

Comments
 (0)