mathlib documentation

data.​nat.​gcd

data.​nat.​gcd

theorem nat.​gcd_dvd (m n : ℕ) :
m.gcd n ∣ m ∧ m.gcd n ∣ n

theorem nat.​gcd_dvd_left (m n : ℕ) :
m.gcd n ∣ m

theorem nat.​gcd_dvd_right (m n : ℕ) :
m.gcd n ∣ n

theorem nat.​gcd_le_left {m : ℕ} (n : ℕ) :
0 < m → m.gcd n ≤ m

theorem nat.​gcd_le_right (m : ℕ) {n : ℕ} :
0 < n → m.gcd n ≤ n

theorem nat.​dvd_gcd {m n k : ℕ} :
k ∣ m → k ∣ n → k ∣ m.gcd n

theorem nat.​dvd_gcd_iff {m n k : ℕ} :
k ∣ m.gcd n ↔ k ∣ m ∧ k ∣ n

theorem nat.​gcd_comm (m n : ℕ) :
m.gcd n = n.gcd m

theorem nat.​gcd_eq_left_iff_dvd {m n : ℕ} :
m ∣ n ↔ m.gcd n = m

theorem nat.​gcd_eq_right_iff_dvd {m n : ℕ} :
m ∣ n ↔ n.gcd m = m

theorem nat.​gcd_assoc (m n k : ℕ) :
(m.gcd n).gcd k = m.gcd (n.gcd k)

@[simp]
theorem nat.​gcd_one_right (n : ℕ) :
n.gcd 1 = 1

theorem nat.​gcd_mul_left (m n k : ℕ) :
(m * n).gcd (m * k) = m * n.gcd k

theorem nat.​gcd_mul_right (m n k : ℕ) :
(m * n).gcd (k * n) = m.gcd k * n

theorem nat.​gcd_pos_of_pos_left {m : ℕ} (n : ℕ) :
0 < m → 0 < m.gcd n

theorem nat.​gcd_pos_of_pos_right (m : ℕ) {n : ℕ} :
0 < n → 0 < m.gcd n

theorem nat.​eq_zero_of_gcd_eq_zero_left {m n : ℕ} :
m.gcd n = 0 → m = 0

theorem nat.​eq_zero_of_gcd_eq_zero_right {m n : ℕ} :
m.gcd n = 0 → n = 0

theorem nat.​gcd_div {m n k : ℕ} :
k ∣ m → k ∣ n → (m / k).gcd (n / k) = m.gcd n / k

theorem nat.​gcd_dvd_gcd_of_dvd_left {m k : ℕ} (n : ℕ) :
m ∣ k → m.gcd n ∣ k.gcd n

theorem nat.​gcd_dvd_gcd_of_dvd_right {m k : ℕ} (n : ℕ) :
m ∣ k → n.gcd m ∣ n.gcd k

theorem nat.​gcd_dvd_gcd_mul_left (m n k : ℕ) :
m.gcd n ∣ (k * m).gcd n

theorem nat.​gcd_dvd_gcd_mul_right (m n k : ℕ) :
m.gcd n ∣ (m * k).gcd n

theorem nat.​gcd_dvd_gcd_mul_left_right (m n k : ℕ) :
m.gcd n ∣ m.gcd (k * n)

theorem nat.​gcd_dvd_gcd_mul_right_right (m n k : ℕ) :
m.gcd n ∣ m.gcd (n * k)

theorem nat.​gcd_eq_left {m n : ℕ} :
m ∣ n → m.gcd n = m

theorem nat.​gcd_eq_right {m n : ℕ} :
n ∣ m → m.gcd n = n

@[simp]
theorem nat.​gcd_mul_left_left (m n : ℕ) :
(m * n).gcd n = n

@[simp]
theorem nat.​gcd_mul_left_right (m n : ℕ) :
n.gcd (m * n) = n

@[simp]
theorem nat.​gcd_mul_right_left (m n : ℕ) :
(n * m).gcd n = n

@[simp]
theorem nat.​gcd_mul_right_right (m n : ℕ) :
n.gcd (n * m) = n

@[simp]
theorem nat.​gcd_gcd_self_right_left (m n : ℕ) :
m.gcd (m.gcd n) = m.gcd n

@[simp]
theorem nat.​gcd_gcd_self_right_right (m n : ℕ) :
m.gcd (n.gcd m) = n.gcd m

@[simp]
theorem nat.​gcd_gcd_self_left_right (m n : ℕ) :
(n.gcd m).gcd m = n.gcd m

@[simp]
theorem nat.​gcd_gcd_self_left_left (m n : ℕ) :
(m.gcd n).gcd m = m.gcd n

theorem nat.​lcm_comm (m n : ℕ) :
m.lcm n = n.lcm m

theorem nat.​lcm_zero_left (m : ℕ) :
0.lcm m = 0

theorem nat.​lcm_zero_right (m : ℕ) :
m.lcm 0 = 0

theorem nat.​lcm_one_left (m : ℕ) :
1.lcm m = m

theorem nat.​lcm_one_right (m : ℕ) :
m.lcm 1 = m

theorem nat.​lcm_self (m : ℕ) :
m.lcm m = m

theorem nat.​dvd_lcm_left (m n : ℕ) :
m ∣ m.lcm n

theorem nat.​dvd_lcm_right (m n : ℕ) :
n ∣ m.lcm n

theorem nat.​gcd_mul_lcm (m n : ℕ) :
m.gcd n * m.lcm n = m * n

theorem nat.​lcm_dvd {m n k : ℕ} :
m ∣ k → n ∣ k → m.lcm n ∣ k

theorem nat.​lcm_assoc (m n k : ℕ) :
(m.lcm n).lcm k = m.lcm (n.lcm k)

@[instance]
def nat.​decidable (m n : ℕ) :

Equations
theorem nat.​coprime.​gcd_eq_one {m n : ℕ} :
m.coprime n → m.gcd n = 1

theorem nat.​coprime.​symm {m n : ℕ} :
n.coprime m → m.coprime n

theorem nat.​coprime_of_dvd {m n : ℕ} :
(∀ (k : ℕ), 1 < k → k ∣ m → ¬k ∣ n) → m.coprime n

theorem nat.​coprime_of_dvd' {m n : ℕ} :
(∀ (k : ℕ), k ∣ m → k ∣ n → k ∣ 1) → m.coprime n

theorem nat.​coprime.​dvd_of_dvd_mul_right {m n k : ℕ} :
k.coprime n → k ∣ m * n → k ∣ m

theorem nat.​coprime.​dvd_of_dvd_mul_left {m n k : ℕ} :
k.coprime m → k ∣ m * n → k ∣ n

theorem nat.​coprime.​gcd_mul_left_cancel {k : ℕ} (m : ℕ) {n : ℕ} :
k.coprime n → (k * m).gcd n = m.gcd n

theorem nat.​coprime.​gcd_mul_right_cancel (m : ℕ) {k n : ℕ} :
k.coprime n → (m * k).gcd n = m.gcd n

theorem nat.​coprime.​gcd_mul_left_cancel_right {k m : ℕ} (n : ℕ) :
k.coprime m → m.gcd (k * n) = m.gcd n

theorem nat.​coprime.​gcd_mul_right_cancel_right {k m : ℕ} (n : ℕ) :
k.coprime m → m.gcd (n * k) = m.gcd n

theorem nat.​coprime_div_gcd_div_gcd {m n : ℕ} :
0 < m.gcd n → (m / m.gcd n).coprime (n / m.gcd n)

theorem nat.​not_coprime_of_dvd_of_dvd {m n d : ℕ} :
1 < d → d ∣ m → d ∣ n → ¬m.coprime n

theorem nat.​exists_coprime {m n : ℕ} :
0 < m.gcd n → (∃ (m' n' : ℕ), m'.coprime n' ∧ m = m' * m.gcd n ∧ n = n' * m.gcd n)

theorem nat.​exists_coprime' {m n : ℕ} :
0 < m.gcd n → (∃ (g m' n' : ℕ), 0 < g ∧ m'.coprime n' ∧ m = m' * g ∧ n = n' * g)

theorem nat.​coprime.​mul {m n k : ℕ} :
m.coprime k → n.coprime k → (m * n).coprime k

theorem nat.​coprime.​mul_right {k m n : ℕ} :
k.coprime m → k.coprime n → k.coprime (m * n)

theorem nat.​coprime.​coprime_dvd_left {m k n : ℕ} :
m ∣ k → k.coprime n → m.coprime n

theorem nat.​coprime.​coprime_dvd_right {m k n : ℕ} :
n ∣ m → k.coprime m → k.coprime n

theorem nat.​coprime.​coprime_mul_left {k m n : ℕ} :
(k * m).coprime n → m.coprime n

theorem nat.​coprime.​coprime_mul_right {k m n : ℕ} :
(m * k).coprime n → m.coprime n

theorem nat.​coprime.​coprime_mul_left_right {k m n : ℕ} :
m.coprime (k * n) → m.coprime n

theorem nat.​coprime.​coprime_mul_right_right {k m n : ℕ} :
m.coprime (n * k) → m.coprime n

theorem nat.​coprime.​coprime_div_left {m n a : ℕ} :
m.coprime n → a ∣ m → (m / a).coprime n

theorem nat.​coprime.​coprime_div_right {m n a : ℕ} :
m.coprime n → a ∣ n → m.coprime (n / a)

theorem nat.​coprime_mul_iff_left {k m n : ℕ} :
(m * n).coprime k ↔ m.coprime k ∧ n.coprime k

theorem nat.​coprime_mul_iff_right {k m n : ℕ} :
k.coprime (m * n) ↔ k.coprime m ∧ k.coprime n

theorem nat.​coprime.​gcd_left (k : ℕ) {m n : ℕ} :
m.coprime n → (k.gcd m).coprime n

theorem nat.​coprime.​gcd_right (k : ℕ) {m n : ℕ} :
m.coprime n → m.coprime (k.gcd n)

theorem nat.​coprime.​gcd_both (k l : ℕ) {m n : ℕ} :
m.coprime n → (k.gcd m).coprime (l.gcd n)

theorem nat.​coprime.​mul_dvd_of_dvd_of_dvd {a n m : ℕ} :
m.coprime n → m ∣ a → n ∣ a → m * n ∣ a

theorem nat.​coprime_one_left (n : ℕ) :

theorem nat.​coprime.​pow_left {m k : ℕ} (n : ℕ) :
m.coprime k → (m ^ n).coprime k

theorem nat.​coprime.​pow_right {m k : ℕ} (n : ℕ) :
k.coprime m → k.coprime (m ^ n)

theorem nat.​coprime.​pow {k l : ℕ} (m n : ℕ) :
k.coprime l → (k ^ m).coprime (l ^ n)

theorem nat.​coprime.​eq_one_of_dvd {k m : ℕ} :
k.coprime m → k ∣ m → k = 1

@[simp]
theorem nat.​coprime_zero_left (n : ℕ) :
0.coprime n ↔ n = 1

@[simp]
theorem nat.​coprime_zero_right (n : ℕ) :
n.coprime 0 ↔ n = 1

@[simp]

@[simp]

@[simp]
theorem nat.​coprime_self (n : ℕ) :
n.coprime n ↔ n = 1

def nat.​prod_dvd_and_dvd_of_dvd_prod {m n k : ℕ} :
k ∣ m * n → {d // k = ↑(d.fst) * ↑(d.snd)}

Represent a divisor of m * n as a product of a divisor of m and a divisor of n.

Equations
theorem nat.​gcd_mul_dvd_mul_gcd (k m n : ℕ) :
k.gcd (m * n) ∣ k.gcd m * k.gcd n

theorem nat.​coprime.​gcd_mul (k : ℕ) {m n : ℕ} :
m.coprime n → k.gcd (m * n) = k.gcd m * k.gcd n

theorem nat.​pow_dvd_pow_iff {a b n : ℕ} :
0 < n → (a ^ n ∣ b ^ n ↔ a ∣ b)