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

Commit e1192f3

Browse files
feat(data/nat/basic): add mod_add_mod and add_mod_mod (#2635)
Added the `mod_add_mod` and `add_mod_mod` lemmas for `data.nat.basic`. I copied them from `data.int.basic`, and just changed the data type. Would there be issues with it being labelled `@[simp]`? Also, would it make sense to refactor `add_mod` above it to use `mod_add_mod` and `add_mod_mod`? It'd make it considerably shorter. (Tangential note, there's a disparity between the `mod` lemmas for `nat` and the `mod` lemmas for `int`, for example `int` doesn't have `add_mod`, should that be added in a separate PR?)
1 parent 96efc22 commit e1192f3

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

src/data/int/basic.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,9 @@ by have := (add_mul_mod_self_left (m % n + k) n (m / n)).symm;
379379
@[simp] theorem add_mod_mod (m n k : ℤ) : (m + n % k) % k = (m + n) % k :=
380380
by rw [add_comm, mod_add_mod, add_comm]
381381

382+
lemma add_mod (a b n : ℤ) : (a + b) % n = ((a % n) + (b % n)) % n :=
383+
by rw [add_mod_mod, mod_add_mod]
384+
382385
theorem add_mod_eq_add_mod_right {m n k : ℤ} (i : ℤ) (H : m % n = k % n) :
383386
(m + i) % n = (k + i) % n :=
384387
by rw [← mod_add_mod, ← mod_add_mod k, H]
@@ -410,6 +413,14 @@ by rw [← zero_add (a * b), add_mul_mod_self, zero_mod]
410413
@[simp] theorem mul_mod_right (a b : ℤ) : (a * b) % a = 0 :=
411414
by rw [mul_comm, mul_mod_left]
412415

416+
lemma mul_mod (a b n : ℤ) : (a * b) % n = ((a % n) * (b % n)) % n :=
417+
begin
418+
conv_lhs {
419+
rw [←mod_add_div a n, ←mod_add_div b n, right_distrib, left_distrib, left_distrib,
420+
mul_assoc, mul_assoc, ←left_distrib n _ _, add_mul_mod_self_left,
421+
mul_comm _ (n * (b / n)), mul_assoc, add_mul_mod_self_left] }
422+
end
423+
413424
local attribute [simp] -- Will be generalized to Euclidean domains.
414425
theorem mod_self {a : ℤ} : a % a = 0 :=
415426
by have := mul_mod_left 1 a; rwa one_mul at this

src/data/nat/basic.lean

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -606,12 +606,23 @@ by rw [←nat.mod_add_div a c, ←nat.mod_add_div b c, ←h, ←nat.sub_sub, nat
606606
lemma dvd_sub_mod (k : ℕ) : n ∣ (k - (k % n)) :=
607607
⟨k / n, nat.sub_eq_of_eq_add (nat.mod_add_div k n).symm⟩
608608

609+
@[simp] theorem mod_add_mod (m n k : ℕ) : (m % n + k) % n = (m + k) % n :=
610+
by have := (add_mul_mod_self_left (m % n + k) n (m / n)).symm;
611+
rwa [add_right_comm, mod_add_div] at this
612+
613+
@[simp] theorem add_mod_mod (m n k : ℕ) : (m + n % k) % k = (m + n) % k :=
614+
by rw [add_comm, mod_add_mod, add_comm]
615+
609616
lemma add_mod (a b n : ℕ) : (a + b) % n = ((a % n) + (b % n)) % n :=
610-
begin
611-
conv_lhs {
612-
rw [←mod_add_div a n, ←mod_add_div b n, ←add_assoc, add_mul_mod_self_left,
613-
add_assoc, add_comm _ (b % n), ←add_assoc, add_mul_mod_self_left] }
614-
end
617+
by rw [add_mod_mod, mod_add_mod]
618+
619+
theorem add_mod_eq_add_mod_right {m n k : ℕ} (i : ℕ) (H : m % n = k % n) :
620+
(m + i) % n = (k + i) % n :=
621+
by rw [← mod_add_mod, ← mod_add_mod k, H]
622+
623+
theorem add_mod_eq_add_mod_left {m n k : ℕ} (i : ℕ) (H : m % n = k % n) :
624+
(i + m) % n = (i + k) % n :=
625+
by rw [add_comm, add_mod_eq_add_mod_right _ H, add_comm]
615626

616627
lemma mul_mod (a b n : ℕ) : (a * b) % n = ((a % n) * (b % n)) % n :=
617628
begin

0 commit comments

Comments
 (0)