@@ -159,6 +159,9 @@ by rw [nat.sub_sub, ←nat.add_sub_assoc h₂, nat.add_sub_cancel_left]
159
159
lemma add_sub_cancel_right (n m k : ℕ) : n + (m + k) - k = n + m :=
160
160
by { rw [nat.add_sub_assoc, nat.add_sub_cancel], apply k.le_add_left }
161
161
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
+
162
165
theorem sub_min (n m : ℕ) : n - min n m = n - m :=
163
166
nat.sub_eq_of_eq_add $ by rw [add_comm, sub_add_min]
164
167
@@ -286,6 +289,13 @@ iff.intro eq_zero_of_mul_eq_zero (by simp [or_imp_distrib] {contextual := tt})
286
289
@[simp] protected theorem zero_eq_mul {a b : ℕ} : 0 = a * b ↔ a = 0 ∨ b = 0 :=
287
290
by rw [eq_comm, nat.mul_eq_zero]
288
291
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
+
289
299
lemma le_mul_of_pos_left {m n : ℕ} (h : n > 0 ) : m ≤ n * m :=
290
300
begin
291
301
conv {to_lhs, rw [← one_mul(m)]},
@@ -409,11 +419,21 @@ lt_of_mul_lt_mul_left
409
419
... < n * k : h)
410
420
(nat.zero_le n)
411
421
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
+
412
425
protected lemma div_eq_zero_iff {a b : ℕ} (hb : 0 < b) : a / b = 0 ↔ a < b :=
413
426
⟨λ h, by rw [← mod_add_div a b, h, mul_zero, add_zero]; exact mod_lt _ hb,
414
427
λ h, by rw [← nat.mul_left_inj hb, ← @add_left_cancel_iff _ _ (a % b), mod_add_div,
415
428
mod_eq_of_lt h, mul_zero, add_zero]⟩
416
429
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
+
417
437
lemma mod_mul_right_div_self (a b c : ℕ) : a % (b * c) / b = (a / b) % c :=
418
438
if hb : b = 0 then by simp [hb] else if hc : c = 0 then by simp [hc]
419
439
else by conv {to_rhs, rw ← mod_add_div a (b * c)};
@@ -1032,6 +1052,33 @@ dvd_trans this hdiv
1032
1052
lemma dvd_of_pow_dvd {p k m : ℕ} (hk : 1 ≤ k) (hpk : p^k ∣ m) : p ∣ m :=
1033
1053
by rw ←nat.pow_one p; exact pow_dvd_of_le_of_pow_dvd hk hpk
1034
1054
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
+
1035
1082
end div
1036
1083
1037
1084
lemma exists_eq_add_of_le : ∀ {m n : ℕ}, m ≤ n → ∃ k : ℕ, n = m + k
0 commit comments