|
2 | 2 | Copyright (c) 2017 Mario Carneiro. All rights reserved.
|
3 | 3 | Released under Apache 2.0 license as described in the file LICENSE.
|
4 | 4 | Authors: Mario Carneiro
|
5 |
| -
|
6 |
| -Modular equality relation. |
7 | 5 | -/
|
8 | 6 | import data.int.gcd
|
9 | 7 | import tactic.abel
|
10 | 8 | import data.list.rotate
|
| 9 | +/- |
| 10 | +# Congruences modulo a natural number |
| 11 | +
|
| 12 | +This file defines the equivalence relation `a ≡ b [MOD n]` on the natural numbers, |
| 13 | +and proves basic properties about it such as the Chinese Remainder Theorem |
| 14 | +`modeq_and_modeq_iff_modeq_mul`. |
| 15 | +
|
| 16 | +## Notations |
11 | 17 |
|
| 18 | +`a ≡ b [MOD n]` is notation for `modeq n a b`, which is defined to mean `a % n = b % n`. |
| 19 | +
|
| 20 | +## Tags |
| 21 | +
|
| 22 | +modeq, congruence, mod, MOD, modulo |
| 23 | +-/ |
12 | 24 | namespace nat
|
13 | 25 |
|
14 | 26 | /-- Modular equality. `modeq n a b`, or `a ≡ b [MOD n]`, means
|
@@ -37,6 +49,10 @@ by rw [modeq, eq_comm, ← int.coe_nat_inj', int.coe_nat_mod, int.coe_nat_mod,
|
37 | 49 | theorem modeq_of_dvd : (n:ℤ) ∣ b - a → a ≡ b [MOD n] := modeq_iff_dvd.2
|
38 | 50 | theorem dvd_of_modeq : a ≡ b [MOD n] → (n:ℤ) ∣ b - a := modeq_iff_dvd.1
|
39 | 51 |
|
| 52 | +/-- A variant of `modeq_iff_dvd` with `nat` divisibility -/ |
| 53 | +theorem modeq_iff_dvd' (h : a ≤ b) : a ≡ b [MOD n] ↔ n ∣ b - a := |
| 54 | +by rw [modeq_iff_dvd, ←int.coe_nat_dvd, int.coe_nat_sub h] |
| 55 | + |
40 | 56 | theorem mod_modeq (a n) : a % n ≡ a [MOD n] := nat.mod_mod _ _
|
41 | 57 |
|
42 | 58 | theorem modeq_of_dvd_of_modeq (d : m ∣ n) (h : a ≡ b [MOD n]) : a ≡ b [MOD m] :=
|
@@ -80,6 +96,7 @@ by rw [modeq_iff_dvd] at *; exact dvd.trans (dvd_mul_left (n : ℤ) (m : ℤ)) h
|
80 | 96 | theorem modeq_of_modeq_mul_right (m : ℕ) : a ≡ b [MOD n * m] → a ≡ b [MOD n] :=
|
81 | 97 | mul_comm m n ▸ modeq_of_modeq_mul_left _
|
82 | 98 |
|
| 99 | +/-- The natural number less than `n*m` congruent to `a` mod `n` and `b` mod `m` -/ |
83 | 100 | def chinese_remainder (co : coprime n m) (a b : ℕ) : {k // k ≡ a [MOD n] ∧ k ≡ b [MOD m]} :=
|
84 | 101 | ⟨let (c, d) := xgcd n m in int.to_nat ((b * c * n + a * d * m) % (n * m)), begin
|
85 | 102 | rw xgcd_val, dsimp [chinese_remainder._match_1],
|
|
0 commit comments