@@ -61,8 +61,7 @@ theorem modeq_iff_dvd : a ≡ b [MOD n] ↔ (n:ℤ) ∣ b - a :=
61
61
by rw [modeq, eq_comm, ← int.coe_nat_inj', int.coe_nat_mod, int.coe_nat_mod,
62
62
int.mod_eq_mod_iff_mod_sub_eq_zero, int.dvd_iff_mod_eq_zero]
63
63
64
- protected theorem modeq.dvd : a ≡ b [MOD n] → (n:ℤ) ∣ b - a := modeq_iff_dvd.1
65
- theorem modeq_of_dvd : (n:ℤ) ∣ b - a → a ≡ b [MOD n] := modeq_iff_dvd.2
64
+ alias modeq_iff_dvd ↔ modeq.dvd modeq_of_dvd
66
65
67
66
/-- A variant of `modeq_iff_dvd` with `nat` divisibility -/
68
67
theorem modeq_iff_dvd' (h : a ≤ b) : a ≡ b [MOD n] ↔ n ∣ b - a :=
@@ -72,14 +71,14 @@ theorem mod_modeq (a n) : a % n ≡ a [MOD n] := mod_mod _ _
72
71
73
72
namespace modeq
74
73
75
- protected theorem modeq_of_dvd (d : m ∣ n) (h : a ≡ b [MOD n]) : a ≡ b [MOD m] :=
74
+ protected theorem of_dvd (d : m ∣ n) (h : a ≡ b [MOD n]) : a ≡ b [MOD m] :=
76
75
modeq_of_dvd ((int.coe_nat_dvd.2 d).trans h.dvd)
77
76
78
77
protected theorem mul_left' (c : ℕ) (h : a ≡ b [MOD n]) : c * a ≡ c * b [MOD (c * n)] :=
79
78
by unfold modeq at *; rw [mul_mod_mul_left, mul_mod_mul_left, h]
80
79
81
80
protected theorem mul_left (c : ℕ) (h : a ≡ b [MOD n]) : c * a ≡ c * b [MOD n] :=
82
- (h.mul_left' _ ).modeq_of_dvd (dvd_mul_left _ _)
81
+ (h.mul_left' _ ).of_dvd (dvd_mul_left _ _)
83
82
84
83
protected theorem mul_right' (c : ℕ) (h : a ≡ b [MOD n]) : a * c ≡ b * c [MOD (n * c)] :=
85
84
by rw [mul_comm a, mul_comm b, mul_comm n]; exact h.mul_left' c
@@ -128,6 +127,9 @@ by { rw [add_comm a, add_comm b] at h₂, exact h₁.add_left_cancel h₂ }
128
127
protected theorem add_right_cancel' (c : ℕ) (h : a + c ≡ b + c [MOD n]) : a ≡ b [MOD n] :=
129
128
modeq.rfl.add_right_cancel h
130
129
130
+ /-- Cancel left multiplication on both sides of the `≡` and in the modulus.
131
+
132
+ For cancelling left multiplication in the modulus, see `nat.modeq.of_mul_left`. -/
131
133
protected theorem mul_left_cancel' {a b c m : ℕ} (hc : c ≠ 0 ) :
132
134
c * a ≡ c * b [MOD c * m] → a ≡ b [MOD m] :=
133
135
by simp [modeq_iff_dvd, ←mul_sub, mul_dvd_mul_iff_left (by simp [hc] : (c : ℤ) ≠ 0 )]
@@ -136,6 +138,9 @@ protected theorem mul_left_cancel_iff' {a b c m : ℕ} (hc : c ≠ 0) :
136
138
c * a ≡ c * b [MOD c * m] ↔ a ≡ b [MOD m] :=
137
139
⟨modeq.mul_left_cancel' hc, modeq.mul_left' _⟩
138
140
141
+ /-- Cancel right multiplication on both sides of the `≡` and in the modulus.
142
+
143
+ For cancelling right multiplication in the modulus, see `nat.modeq.of_mul_right`. -/
139
144
protected theorem mul_right_cancel' {a b c m : ℕ} (hc : c ≠ 0 ) :
140
145
a * c ≡ b * c [MOD m * c] → a ≡ b [MOD m] :=
141
146
by simp [modeq_iff_dvd, ←sub_mul, mul_dvd_mul_iff_right (by simp [hc] : (c : ℤ) ≠ 0 )]
@@ -144,26 +149,27 @@ protected theorem mul_right_cancel_iff' {a b c m : ℕ} (hc : c ≠ 0) :
144
149
a * c ≡ b * c [MOD m * c] ↔ a ≡ b [MOD m] :=
145
150
⟨modeq.mul_right_cancel' hc, modeq.mul_right' _⟩
146
151
147
- theorem of_modeq_mul_left (m : ℕ) (h : a ≡ b [MOD m * n]) : a ≡ b [MOD n] :=
152
+ /-- Cancel left multiplication in the modulus.
153
+
154
+ For cancelling left multiplication on both sides of the `≡`, see `nat.modeq.mul_left_cancel'`. -/
155
+ theorem of_mul_left (m : ℕ) (h : a ≡ b [MOD m * n]) : a ≡ b [MOD n] :=
148
156
by { rw [modeq_iff_dvd] at *, exact (dvd_mul_left (n : ℤ) (m : ℤ)).trans h }
149
157
150
- theorem of_modeq_mul_right (m : ℕ) : a ≡ b [MOD n * m] → a ≡ b [MOD n] :=
151
- mul_comm m n ▸ of_modeq_mul_left _
158
+ /-- Cancel right multiplication in the modulus.
159
+
160
+ For cancelling right multiplication on both sides of the `≡`, see `nat.modeq.mul_right_cancel'`. -/
161
+ theorem of_mul_right (m : ℕ) : a ≡ b [MOD n * m] → a ≡ b [MOD n] := mul_comm m n ▸ of_mul_left _
152
162
153
163
end modeq
154
164
155
- theorem modeq_one : a ≡ b [MOD 1 ] := modeq_of_dvd (one_dvd _)
165
+ lemma modeq_sub (h : b ≤ a) : a ≡ b [MOD a - b ] := ( modeq_of_dvd $ by rw [int.coe_nat_sub h]).symm
156
166
157
- lemma modeq_sub (h : b ≤ a) : a ≡ b [MOD a - b] :=
158
- (modeq_of_dvd $ by rw [int.coe_nat_sub h]).symm
167
+ lemma modeq_one : a ≡ b [MOD 1 ] := modeq_of_dvd $ one_dvd _
159
168
160
- @[simp] lemma modeq_zero_iff {a b : ℕ} : a ≡ b [MOD 0 ] ↔ a = b :=
161
- by rw [nat.modeq, nat.mod_zero, nat.mod_zero]
169
+ @[simp] lemma modeq_zero_iff : a ≡ b [MOD 0 ] ↔ a = b := by rw [modeq, mod_zero, mod_zero]
162
170
163
- @[simp] lemma add_modeq_left {a n : ℕ} : n + a ≡ a [MOD n] :=
164
- by rw [nat.modeq, nat.add_mod_left]
165
- @[simp] lemma add_modeq_right {a n : ℕ} : a + n ≡ a [MOD n] :=
166
- by rw [nat.modeq, nat.add_mod_right]
171
+ @[simp] lemma add_modeq_left : n + a ≡ a [MOD n] := by rw [modeq, add_mod_left]
172
+ @[simp] lemma add_modeq_right : a + n ≡ a [MOD n] := by rw [modeq, add_mod_right]
167
173
168
174
namespace modeq
169
175
@@ -174,33 +180,36 @@ lemma le_of_lt_add (h1 : a ≡ b [MOD m]) (h2 : a < b + m) : a ≤ b :=
174
180
lemma add_le_of_lt (h1 : a ≡ b [MOD m]) (h2 : a < b) : a + m ≤ b :=
175
181
le_of_lt_add (add_modeq_right.trans h1) (add_lt_add_right h2 m)
176
182
177
- lemma dvd_iff_of_modeq_of_dvd {a b d m : ℕ} (h : a ≡ b [MOD m]) (hdm : d ∣ m) :
178
- d ∣ a ↔ d ∣ b :=
183
+ lemma dvd_iff (h : a ≡ b [MOD m]) (hdm : d ∣ m) : d ∣ a ↔ d ∣ b :=
179
184
begin
180
185
simp only [←modeq_zero_iff_dvd],
181
- replace h := h.modeq_of_dvd hdm,
186
+ replace h := h.of_dvd hdm,
182
187
exact ⟨h.symm.trans, h.trans⟩,
183
188
end
184
189
185
- lemma gcd_eq_of_modeq {a b m : ℕ} (h : a ≡ b [MOD m]) : gcd a m = gcd b m :=
190
+ lemma gcd_eq (h : a ≡ b [MOD m]) : gcd a m = gcd b m :=
186
191
begin
187
192
have h1 := gcd_dvd_right a m,
188
193
have h2 := gcd_dvd_right b m,
189
194
exact dvd_antisymm
190
- (dvd_gcd ((dvd_iff_of_modeq_of_dvd h h1).mp (gcd_dvd_left a m)) h1)
191
- (dvd_gcd ((dvd_iff_of_modeq_of_dvd h h2).mpr (gcd_dvd_left b m)) h2),
195
+ (dvd_gcd ((h.dvd_iff h1).mp (gcd_dvd_left a m)) h1)
196
+ (dvd_gcd ((h.dvd_iff h2).mpr (gcd_dvd_left b m)) h2),
192
197
end
193
198
194
- lemma eq_of_modeq_of_abs_lt {a b m : ℕ} (h : a ≡ b [MOD m]) (h2 : | (b:ℤ) - a | < m) : a = b :=
199
+ lemma eq_of_abs_lt (h : a ≡ b [MOD m]) (h2 : |(b - a : ℤ) | < m) : a = b :=
195
200
begin
196
201
apply int.coe_nat_inj,
197
202
rw [eq_comm, ←sub_eq_zero],
198
203
exact int.eq_zero_of_abs_lt_dvd (modeq_iff_dvd.mp h) h2,
199
204
end
200
205
206
+ lemma eq_of_lt_of_lt (h : a ≡ b [MOD m]) (ha : a < m) (hb : b < m) : a = b :=
207
+ h.eq_of_abs_lt $ abs_sub_lt_iff.2
208
+ ⟨(sub_le_self _ $ int.coe_nat_nonneg _).trans_lt $ cast_lt.2 hb,
209
+ (sub_le_self _ $ int.coe_nat_nonneg _).trans_lt $ cast_lt.2 ha⟩
210
+
201
211
/-- To cancel a common factor `c` from a `modeq` we must divide the modulus `m` by `gcd m c` -/
202
- lemma modeq_cancel_left_div_gcd {a b c m : ℕ} (hm : 0 < m) (h : c * a ≡ c * b [MOD m]) :
203
- a ≡ b [MOD m / gcd m c] :=
212
+ lemma cancel_left_div_gcd (hm : 0 < m) (h : c * a ≡ c * b [MOD m]) : a ≡ b [MOD m / gcd m c] :=
204
213
begin
205
214
let d := gcd m c,
206
215
have hmd := gcd_dvd_left m c,
@@ -217,35 +226,30 @@ begin
217
226
nat.div_self (gcd_pos_of_pos_left c hm)] },
218
227
end
219
228
220
- lemma modeq_cancel_right_div_gcd {a b c m : ℕ} (hm : 0 < m) (h : a * c ≡ b * c [MOD m]) :
221
- a ≡ b [MOD m / gcd m c] :=
222
- by { apply modeq_cancel_left_div_gcd hm, simpa [mul_comm] using h }
229
+ lemma cancel_right_div_gcd (hm : 0 < m) (h : a * c ≡ b * c [MOD m]) : a ≡ b [MOD m / gcd m c] :=
230
+ by { apply cancel_left_div_gcd hm, simpa [mul_comm] using h }
223
231
224
- lemma modeq_cancel_left_div_gcd' {a b c d m : ℕ} (hm : 0 < m) (hcd : c ≡ d [MOD m])
225
- (h : c * a ≡ d * b [MOD m]) :
232
+ lemma cancel_left_div_gcd' (hm : 0 < m) (hcd : c ≡ d [MOD m]) (h : c * a ≡ d * b [MOD m]) :
226
233
a ≡ b [MOD m / gcd m c] :=
227
- modeq_cancel_left_div_gcd hm (h.trans (modeq.mul_right b hcd).symm)
234
+ (h.trans (modeq.mul_right b hcd).symm).cancel_left_div_gcd hm
228
235
229
- lemma modeq_cancel_right_div_gcd' {a b c d m : ℕ} (hm : 0 < m) (hcd : c ≡ d [MOD m])
230
- (h : a * c ≡ b * d [MOD m]) :
236
+ lemma cancel_right_div_gcd' (hm : 0 < m) (hcd : c ≡ d [MOD m]) (h : a * c ≡ b * d [MOD m]) :
231
237
a ≡ b [MOD m / gcd m c] :=
232
- by { apply modeq_cancel_left_div_gcd ' hm hcd, simpa [mul_comm] using h }
238
+ hcd.cancel_left_div_gcd ' hm $ by simpa [mul_comm] using h
233
239
234
240
/-- A common factor that's coprime with the modulus can be cancelled from a `modeq` -/
235
- lemma modeq_cancel_left_of_coprime {a b c m : ℕ} (hmc : gcd m c = 1 ) (h : c * a ≡ c * b [MOD m]) :
236
- a ≡ b [MOD m] :=
241
+ lemma cancel_left_of_coprime (hmc : gcd m c = 1 ) (h : c * a ≡ c * b [MOD m]) : a ≡ b [MOD m] :=
237
242
begin
238
243
rcases m.eq_zero_or_pos with rfl | hm,
239
244
{ simp only [gcd_zero_left] at hmc,
240
245
simp only [gcd_zero_left, hmc, one_mul, modeq_zero_iff] at h,
241
246
subst h },
242
- simpa [hmc] using modeq_cancel_left_div_gcd hm h
247
+ simpa [hmc] using h.cancel_left_div_gcd hm
243
248
end
244
249
245
250
/-- A common factor that's coprime with the modulus can be cancelled from a `modeq` -/
246
- lemma modeq_cancel_right_of_coprime {a b c m : ℕ} (hmc : gcd m c = 1 ) (h : a * c ≡ b * c [MOD m]) :
247
- a ≡ b [MOD m] :=
248
- by { apply modeq_cancel_left_of_coprime hmc, simpa [mul_comm] using h }
251
+ lemma cancel_right_of_coprime (hmc : gcd m c = 1 ) (h : a * c ≡ b * c [MOD m]) : a ≡ b [MOD m] :=
252
+ cancel_left_of_coprime hmc $ by simpa [mul_comm] using h
249
253
250
254
end modeq
251
255
@@ -306,22 +310,22 @@ lemma modeq_and_modeq_iff_modeq_mul {a b m n : ℕ} (hmn : coprime m n) :
306
310
rw [nat.modeq_iff_dvd, ← int.dvd_nat_abs, int.coe_nat_dvd],
307
311
exact hmn.mul_dvd_of_dvd_of_dvd h.1 h.2
308
312
end ,
309
- λ h, ⟨h.of_modeq_mul_right _, h.of_modeq_mul_left _⟩⟩
313
+ λ h, ⟨h.of_mul_right _, h.of_mul_left _⟩⟩
310
314
311
315
lemma coprime_of_mul_modeq_one (b : ℕ) {a n : ℕ} (h : a * b ≡ 1 [MOD n]) : coprime a n :=
312
316
begin
313
317
obtain ⟨g, hh⟩ := nat.gcd_dvd_right a n,
314
318
rw [nat.coprime_iff_gcd_eq_one, ← nat.dvd_one, ← nat.modeq_zero_iff_dvd],
315
- calc 1 ≡ a * b [MOD a.gcd n] : nat.modeq.of_modeq_mul_right g (hh.subst h).symm
319
+ calc 1 ≡ a * b [MOD a.gcd n] : nat.modeq.of_mul_right g (hh.subst h).symm
316
320
... ≡ 0 * b [MOD a.gcd n] : (nat.modeq_zero_iff_dvd.mpr (nat.gcd_dvd_left _ _)).mul_right b
317
321
... = 0 : by rw zero_mul,
318
322
end
319
323
320
324
@[simp] lemma mod_mul_right_mod (a b c : ℕ) : a % (b * c) % b = a % b :=
321
- (mod_modeq _ _).of_modeq_mul_right _
325
+ (mod_modeq _ _).of_mul_right _
322
326
323
327
@[simp] lemma mod_mul_left_mod (a b c : ℕ) : a % (b * c) % c = a % c :=
324
- (mod_modeq _ _).of_modeq_mul_left _
328
+ (mod_modeq _ _).of_mul_left _
325
329
326
330
lemma div_mod_eq_mod_mul_div (a b c : ℕ) : a / b % c = a % (b * c) / b :=
327
331
if hb0 : b = 0 then by simp [hb0]
@@ -414,11 +418,11 @@ by rw [mul_add, two_mul_odd_div_two hm1, mul_left_comm, two_mul_odd_div_two hn1,
414
418
tsub_add_cancel_of_le (le_mul_of_one_le_right (nat.zero_le _) hn0)]
415
419
416
420
lemma odd_of_mod_four_eq_one {n : ℕ} : n % 4 = 1 → n % 2 = 1 :=
417
- by simpa [modeq, show 2 * 2 = 4 , by norm_num] using @modeq.of_modeq_mul_left 2 n 1 2
421
+ by simpa [modeq, show 2 * 2 = 4 , by norm_num] using @modeq.of_mul_left 2 n 1 2
418
422
419
423
lemma odd_of_mod_four_eq_three {n : ℕ} : n % 4 = 3 → n % 2 = 1 :=
420
424
by simpa [modeq, show 2 * 2 = 4 , by norm_num, show 3 % 4 = 3 , by norm_num]
421
- using @modeq.of_modeq_mul_left 2 n 3 2
425
+ using @modeq.of_mul_left 2 n 3 2
422
426
423
427
/-- A natural number is odd iff it has residue `1` or `3` mod `4`-/
424
428
lemma odd_mod_four_iff {n : ℕ} : n % 2 = 1 ↔ n % 4 = 1 ∨ n % 4 = 3 :=
0 commit comments