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

Commit cbd88d6

Browse files
Julian-KuelshammerJulian
andcommitted
chore(*) add mod_add_div' and div_add_mod' and golf proofs (#5962)
Resolves issue #1534. Name of nat.mod_add_div shouldn't be changed as this is in core. Better name suggestions for mod_add_div' and div_add_mod' welcome. Co-authored-by: Julian <kuelsha@mathematik.uni-stuttgart.de>
1 parent 866e4fd commit cbd88d6

File tree

10 files changed

+51
-28
lines changed

10 files changed

+51
-28
lines changed

archive/imo/imo1962_q1.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ begin
4343
{ rw [problem_predicate, digits_def' (dec_trivial : 210) n.succ_pos,
4444
list.head, list.tail_cons, list.concat_eq_append] at h1,
4545
split,
46-
{ rw [← h1.left, add_comm, mod_add_div (n+1) 10], },
46+
{ rw [← h1.left, div_add_mod (n+1) 10], },
4747
{ rw [← h1.right, of_digits_append, of_digits_digits,
4848
of_digits_singleton, add_comm, mul_comm], }, },
4949
end

archive/imo/imo1964_q1.lean

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ begin
6363
split,
6464
{ intro h,
6565
let t := n % 3,
66-
rw [(show n = t + 3 * (n / 3), from (nat.mod_add_div n 3).symm), add_comm] at h,
66+
rw [(show n = 3 * (n / 3) + t, from (nat.div_add_mod n 3).symm)] at h,
6767
have ht : t < 3 := nat.mod_lt _ dec_trivial,
6868
interval_cases t with hr; rw hr at h,
6969
{ exact nat.dvd_of_mod_eq_zero hr },
@@ -82,22 +82,20 @@ end
8282
theorem imo1964_q1b (n : ℕ) : ¬ (72 ^ n + 1) :=
8383
begin
8484
let t := n % 3,
85-
rw [← modeq_zero_iff, (show n = t + 3 * (n / 3), from (nat.mod_add_div n 3).symm), add_comm],
85+
rw [← modeq_zero_iff, (show n = 3 * (n / 3) + t, from (nat.div_add_mod n 3).symm)],
8686
have ht : t < 3 := nat.mod_lt _ dec_trivial,
8787
interval_cases t with hr; rw hr,
88-
{ rw zero_add,
88+
{ rw add_zero,
8989
intro h,
90-
have := h.symm.trans (modeq_add (nat.modeq.refl _) (two_pow_three_mul_mod_seven _)),
90+
have := h.symm.trans (modeq_add (two_pow_three_mul_mod_seven _) (nat.modeq.refl _)),
9191
rw modeq_iff_dvd at this,
9292
norm_num at this },
93-
{ rw add_comm _ (3 * _),
94-
intro h,
95-
have := h.symm.trans (modeq_add (nat.modeq.refl _) (two_pow_three_mul_add_one_mod_seven _)),
93+
{ intro h,
94+
have := h.symm.trans (modeq_add (two_pow_three_mul_add_one_mod_seven _) (nat.modeq.refl _)),
9695
rw modeq_iff_dvd at this,
9796
norm_num at this },
98-
{ rw add_comm _ (3 * _),
99-
intro h,
100-
have := h.symm.trans (modeq_add (nat.modeq.refl _) (two_pow_three_mul_add_two_mod_seven _)),
97+
{ intro h,
98+
have := h.symm.trans (modeq_add (two_pow_three_mul_add_two_mod_seven _) (nat.modeq.refl _)),
10199
rw modeq_iff_dvd at this,
102100
norm_num at this },
103101
end

src/algebra/euclidean_domain.lean

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ class euclidean_domain (R : Type u) extends comm_ring R, nontrivial R :=
2323
(quotient : R → R → R)
2424
(quotient_zero : ∀ a, quotient a 0 = 0)
2525
(remainder : R → R → R)
26-
-- This could be changed to the same order as int.mod_add_div.
27-
-- We normally write `qb+r` rather than `r + qb` though.
2826
(quotient_mul_add_remainder_eq : ∀ a b, b * quotient a b + remainder a b = a)
2927
(r : R → R → Prop)
3028
(r_well_founded : well_founded r)
@@ -50,6 +48,12 @@ euclidean_domain.quotient_mul_add_remainder_eq _ _
5048
lemma mod_add_div (a b : R) : a % b + b * (a / b) = a :=
5149
(add_comm _ _).trans (div_add_mod _ _)
5250

51+
lemma mod_add_div' (m k : R) : m % k + (m / k) * k = m :=
52+
by { rw mul_comm, exact mod_add_div _ _ }
53+
54+
lemma div_add_mod' (m k : R) : (m / k) * k + m % k = m :=
55+
by { rw mul_comm, exact div_add_mod _ _ }
56+
5357
lemma mod_eq_sub_mul_div {R : Type*} [euclidean_domain R] (a b : R) :
5458
a % b = a - b * (a / b) :=
5559
calc a % b = b * (a / b) + a % b - b * (a / b) : (add_sub_cancel' _ _).symm
@@ -358,7 +362,7 @@ instance int.euclidean_domain : euclidean_domain ℤ :=
358362
quotient := (/),
359363
quotient_zero := int.div_zero,
360364
remainder := (%),
361-
quotient_mul_add_remainder_eq := λ a b, by rw add_comm; exact int.mod_add_div _ _,
365+
quotient_mul_add_remainder_eq := λ a b, int.div_add_mod _ _,
362366
r := λ a b, a.nat_abs < b.nat_abs,
363367
r_well_founded := measure_wf (λ a, int.nat_abs a),
364368
remainder_lt := λ a b b0, int.coe_nat_lt.1 $

src/data/int/basic.lean

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,12 @@ theorem mod_add_div : ∀ (a b : ℤ), a % b + b * (a / b) = a
479479
theorem div_add_mod (a b : ℤ) : b * (a / b) + a % b = a :=
480480
(add_comm _ _).trans (mod_add_div _ _)
481481

482+
lemma mod_add_div' (m k : ℤ) : m % k + (m / k) * k = m :=
483+
by { rw mul_comm, exact mod_add_div _ _ }
484+
485+
lemma div_add_mod' (m k : ℤ) : (m / k) * k + m % k = m :=
486+
by { rw mul_comm, exact div_add_mod _ _ }
487+
482488
theorem mod_def (a b : ℤ) : a % b = a - b * (a / b) :=
483489
eq_sub_of_add_eq (mod_add_div _ _)
484490

@@ -540,9 +546,9 @@ by rw [mul_comm, mul_mod_left]
540546
lemma mul_mod (a b n : ℤ) : (a * b) % n = ((a % n) * (b % n)) % n :=
541547
begin
542548
conv_lhs {
543-
rw [←mod_add_div a n, ←mod_add_div b n, right_distrib, left_distrib, left_distrib,
544-
mul_assoc, mul_assoc, ←left_distrib n _ _, add_mul_mod_self_left,
545-
mul_comm _ (n * (b / n)), mul_assoc, add_mul_mod_self_left] }
549+
rw [←mod_add_div a n, ←mod_add_div' b n, right_distrib, left_distrib, left_distrib,
550+
mul_assoc, mul_assoc, ←left_distrib n _ _, add_mul_mod_self_left, ← mul_assoc,
551+
add_mul_mod_self] }
546552
end
547553

548554
@[simp] lemma neg_mod_two (i : ℤ) : (-i) % 2 = i % 2 :=

src/data/nat/basic.lean

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -833,6 +833,15 @@ by rw [mul_comm,nat.div_mul_cancel Hd]
833833

834834
/-! ### `mod`, `dvd` -/
835835

836+
lemma div_add_mod (m k : ℕ) : k * (m / k) + m % k = m :=
837+
(nat.add_comm _ _).trans (mod_add_div _ _)
838+
839+
lemma mod_add_div' (m k : ℕ) : m % k + (m / k) * k = m :=
840+
by { rw mul_comm, exact mod_add_div _ _ }
841+
842+
lemma div_add_mod' (m k : ℕ) : (m / k) * k + m % k = m :=
843+
by { rw mul_comm, exact div_add_mod _ _ }
844+
836845
protected theorem div_mod_unique {n k m d : ℕ} (h : 0 < k) :
837846
n / k = d ∧ n % k = m ↔ m + k * d = n ∧ m < k :=
838847
⟨λ ⟨e₁, e₂⟩, e₁ ▸ e₂ ▸ ⟨mod_add_div _ _, mod_lt _ h⟩,
@@ -979,9 +988,9 @@ by rw [add_comm, add_mod_eq_add_mod_right _ H, add_comm]
979988
lemma mul_mod (a b n : ℕ) : (a * b) % n = ((a % n) * (b % n)) % n :=
980989
begin
981990
conv_lhs {
982-
rw [←mod_add_div a n, ←mod_add_div b n, right_distrib, left_distrib, left_distrib,
983-
mul_assoc, mul_assoc, ←left_distrib n _ _, add_mul_mod_self_left,
984-
mul_comm _ (n * (b / n)), mul_assoc, add_mul_mod_self_left] }
991+
rw [←mod_add_div a n, ←mod_add_div' b n, right_distrib, left_distrib, left_distrib,
992+
mul_assoc, mul_assoc, ←left_distrib n _ _, add_mul_mod_self_left, ← mul_assoc,
993+
add_mul_mod_self_right] }
985994
end
986995

987996
lemma dvd_div_of_mul_dvd {a b c : ℕ} (h : a * b ∣ c) : b ∣ c / a :=
@@ -1175,7 +1184,7 @@ begin
11751184
{ rw [div_lt_iff_lt_mul p _ b_pos],
11761185
simpa [pow_succ'] using h₁ },
11771186
rw [mod_eq_of_lt h₁, mod_eq_of_lt h₂],
1178-
simp [mod_add_div, nat.add_comm] },
1187+
simp [div_add_mod] },
11791188
-- step: p ≥ b^succ w
11801189
{ -- Generate condition for induction hypothesis
11811190
have h₂ : p - b^succ w < p,

src/data/nat/fib.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ begin
152152
{ simp },
153153
intros m n mpos h,
154154
rw ← gcd_rec m n at h,
155-
conv_rhs { rw ← mod_add_div n m },
156-
rwa [mul_comm, gcd_fib_add_mul_self m (n % m) (n / m), gcd_comm (fib m) _] },
155+
conv_rhs { rw ← mod_add_div' n m },
156+
rwa [gcd_fib_add_mul_self m (n % m) (n / m), gcd_comm (fib m) _] },
157157
rwa [gcd_comm, gcd_comm (fib m)]
158158
end
159159

src/data/pnat/basic.lean

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,12 @@ end
292292
theorem div_add_mod (m k : ℕ+) : (k * (div m k) + mod m k : ℕ) = m :=
293293
(add_comm _ _).trans (mod_add_div _ _)
294294

295+
lemma mod_add_div' (m k : ℕ+) : ((mod m k) + (div m k) * k : ℕ) = m :=
296+
by { rw mul_comm, exact mod_add_div _ _ }
297+
298+
lemma div_add_mod' (m k : ℕ+) : ((div m k) * k + mod m k : ℕ) = m :=
299+
by { rw mul_comm, exact div_add_mod _ _ }
300+
295301
theorem mod_coe (m k : ℕ+) :
296302
((mod m k) : ℕ) = ite ((m : ℕ) % (k : ℕ) = 0) (k : ℕ) ((m : ℕ) % (k : ℕ)) :=
297303
begin
@@ -354,7 +360,7 @@ theorem mul_div_exact {m k : ℕ+} (h : k ∣ m) : k * (div_exact m k) = m :=
354360
begin
355361
apply eq, rw [mul_coe],
356362
change (k : ℕ) * (div m k).succ = m,
357-
rw [← mod_add_div m k, dvd_iff'.mp h, nat.mul_succ, add_comm],
363+
rw [← div_add_mod m k, dvd_iff'.mp h, nat.mul_succ]
358364
end
359365

360366
theorem dvd_antisymm {m n : ℕ+} : m ∣ n → n ∣ m → m = n :=

src/number_theory/lucas_lehmer.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -505,9 +505,9 @@ Someone should do this, too!
505505
lemma modeq_mersenne (n k : ℕ) : k ≡ ((k / 2^n) + (k % 2^n)) [MOD 2^n - 1] :=
506506
-- See https://leanprover.zulipchat.com/#narrow/stream/113489-new-members/topic/help.20finding.20a.20lemma/near/177698446
507507
begin
508-
conv in k {rw [← nat.mod_add_div k (2^n), add_comm]},
508+
conv in k { rw ← nat.div_add_mod k (2^n) },
509509
refine nat.modeq.modeq_add _ (by refl),
510-
conv {congr, skip, skip, rw ← one_mul (k/2^n)},
510+
conv { congr, skip, skip, rw ← one_mul (k/2^n) },
511511
refine nat.modeq.modeq_mul _ (by refl),
512512
symmetry,
513513
rw [nat.modeq.modeq_iff_dvd, int.coe_nat_sub],

src/number_theory/quadratic_reciprocity.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ have hx2 : ∀ x ∈ Ico 1 (p / 2).succ, (2 * x : zmod p).val = 2 * x,
440440
from λ x hx, have h2xp : 2 * x < p,
441441
from calc 2 * x ≤ 2 * (p / 2) : mul_le_mul_of_nonneg_left
442442
(le_of_lt_succ $ by finish) dec_trivial
443-
... < _ : by conv_rhs {rw [← mod_add_div p 2, add_comm, show p % 2 = 1, from hp1]}; exact lt_succ_self _,
443+
... < _ : by conv_rhs {rw [← div_add_mod p 2, show p % 2 = 1, from hp1]}; exact lt_succ_self _,
444444
by rw [← nat.cast_two, ← nat.cast_mul, val_cast_of_lt h2xp],
445445
have hdisj : disjoint
446446
((Ico 1 (p / 2).succ).filter (λ x, p / 2 < ((2 : ℕ) * x : zmod p).val))

src/set_theory/ordinal_arithmetic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1344,7 +1344,7 @@ le_antisymm
13441344

13451345
@[simp] theorem nat_cast_mod {m n : ℕ} : ((m % n : ℕ) : ordinal) = m % n :=
13461346
by rw [← add_left_cancel (n*(m/n)), div_add_mod, ← nat_cast_div, ← nat_cast_mul, ← nat.cast_add,
1347-
add_comm, nat.mod_add_div]
1347+
nat.div_add_mod]
13481348

13491349
@[simp] theorem nat_le_card {o} {n : ℕ} : (n : cardinal) ≤ card o ↔ (n : ordinal) ≤ o :=
13501350
⟨λ h, by rwa [← cardinal.ord_le, cardinal.ord_nat] at h,

0 commit comments

Comments
 (0)