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

Commit 78493c9

Browse files
feat(data/nat/modeq): add missing lemmas for int and nat regarding dvd (#5752)
Adding lemmas `(a+b)/c=a/c+b/c` if `c` divides `a` for `a b c : nat` and `a b c : int` after discussion on Zulip https://leanprover.zulipchat.com/#narrow/stream/113489-new-members/topic/nat_add_div Co-authored-by: Julian-Kuelshammer <68201724+Julian-Kuelshammer@users.noreply.github.com>
1 parent e4da493 commit 78493c9

File tree

4 files changed

+29
-14
lines changed

4 files changed

+29
-14
lines changed

src/data/int/basic.lean

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,22 @@ protected theorem add_mul_div_left (a : ℤ) {b : ℤ} (c : ℤ) (H : b ≠ 0) :
380380
(a + b * c) / b = a / b + c :=
381381
by rw [mul_comm, int.add_mul_div_right _ _ H]
382382

383+
protected theorem add_div_of_dvd_right {a b c : ℤ} (H : c ∣ b) :
384+
(a + b) / c = a / c + b / c :=
385+
begin
386+
by_cases h1 : c = 0,
387+
{ simp [h1] },
388+
cases H with k hk,
389+
rw hk,
390+
change c ≠ 0 at h1,
391+
rw [mul_comm c k, int.add_mul_div_right _ _ h1, ←zero_add (k * c), int.add_mul_div_right _ _ h1,
392+
int.zero_div, zero_add]
393+
end
394+
395+
protected theorem add_div_of_dvd_left {a b c : ℤ} (H : c ∣ a) :
396+
(a + b) / c = a / c + b / c :=
397+
by rw [add_comm, int.add_div_of_dvd_right H, add_comm]
398+
383399
@[simp] protected theorem mul_div_cancel (a : ℤ) {b : ℤ} (H : b ≠ 0) : a * b / b = a :=
384400
by have := int.add_mul_div_right 0 a H;
385401
rwa [zero_add, int.zero_div, zero_add] at this
@@ -720,18 +736,6 @@ theorem neg_div_of_dvd : ∀ {a b : ℤ} (H : b ∣ a), -a / b = -(a / b)
720736
| ._ b ⟨c, rfl⟩ := if bz : b = 0 then by simp [bz] else
721737
by rw [neg_mul_eq_mul_neg, int.mul_div_cancel_left _ bz, int.mul_div_cancel_left _ bz]
722738

723-
lemma add_div_of_dvd {a b c : ℤ} :
724-
c ∣ a → c ∣ b → (a + b) / c = a / c + b / c :=
725-
begin
726-
intros h1 h2,
727-
by_cases h3 : c = 0,
728-
{ rw [h3, zero_dvd_iff] at *,
729-
rw [h1, h2, h3], refl },
730-
{ apply mul_right_cancel' h3,
731-
rw add_mul, repeat {rw [int.div_mul_cancel]};
732-
try {apply dvd_add}; assumption }
733-
end
734-
735739
theorem div_sign : ∀ a b, a / sign b = a * sign b
736740
| a (n+1:ℕ) := by unfold sign; simp
737741
| a 0 := by simp [sign]

src/data/nat/modeq.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,17 @@ lemma add_div_eq_of_add_mod_lt {a b c : ℕ} (hc : a % c + b % c < c) :
209209
if hc0 : c = 0 then by simp [hc0]
210210
else by rw [add_div (nat.pos_of_ne_zero hc0), if_neg (not_le_of_lt hc), add_zero]
211211

212+
protected lemma add_div_of_dvd_right {a b c : ℕ} (hca : c ∣ a) :
213+
(a + b) / c = a / c + b / c :=
214+
if h : c = 0 then by simp [h] else add_div_eq_of_add_mod_lt begin
215+
rw [nat.mod_eq_zero_of_dvd hca, zero_add],
216+
exact nat.mod_lt _ (pos_iff_ne_zero.mpr h),
217+
end
218+
219+
protected lemma add_div_of_dvd_left {a b c : ℕ} (hca : c ∣ b) :
220+
(a + b) / c = a / c + b / c :=
221+
by rwa [add_comm, nat.add_div_of_dvd_right, add_comm]
222+
212223
lemma add_div_eq_of_le_mod_add_mod {a b c : ℕ} (hc : c ≤ a % c + b % c) (hc0 : 0 < c) :
213224
(a + b) / c = a / c + b / c + 1 :=
214225
by rw [add_div hc0, if_pos hc]

src/tactic/omega/coeffs.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ lemma dvd_val {as : list int} {i : int} :
290290
| (m+1) :=
291291
begin
292292
unfold val_between,
293-
rw [@val_between_map_div m, int.add_div_of_dvd (dvd_val_between h1)],
293+
rw [@val_between_map_div m, int.add_div_of_dvd_right],
294294
apply fun_mono_2 rfl,
295295
{ apply calc get (l + m) (list.map (λ (x : ℤ), x / i) as) * v (l + m)
296296
= ((get (l + m) as) / i) * v (l + m) :

src/tactic/omega/term.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ lemma val_div {v : nat → int} {i b : int} {as : list int} :
7474
i ∣ b → (∀ x ∈ as, i ∣ x) → (div i (b,as)).val v = (val v (b,as)) / i :=
7575
begin
7676
intros h1 h2, simp only [val, div, list.map],
77-
rw [int.add_div_of_dvd h1 (coeffs.dvd_val h2)],
77+
rw [int.add_div_of_dvd_left h1],
7878
apply fun_mono_2 rfl,
7979
rw ← coeffs.val_map_div h2
8080
end

0 commit comments

Comments
 (0)