Skip to content

Commit aa8559b

Browse files
committed
feat: gcd and coprime sub (#7051)
Co-authored-by: Moritz Firsching <firsching@google.com>
1 parent 56e5b36 commit aa8559b

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

Mathlib/Data/Nat/GCD/Basic.lean

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Jeremy Avigad, Leonardo de Moura
66
import Mathlib.Algebra.GroupPower.Basic
77
import Mathlib.Algebra.GroupWithZero.Divisibility
88
import Mathlib.Data.Nat.Order.Lemmas
9+
import Mathlib.Tactic.NthRewrite
910

1011
#align_import data.nat.gcd.basic from "leanprover-community/mathlib"@"e8638a0fcaf73e4500469f368ef9494e495099b3"
1112

@@ -88,6 +89,30 @@ theorem gcd_self_add_right (m n : ℕ) : gcd m (m + n) = gcd m n := by
8889
rw [add_comm, gcd_add_self_right]
8990
#align nat.gcd_self_add_right Nat.gcd_self_add_right
9091

92+
-- Lemmas where one argument consists of a subtraction of the other
93+
@[simp]
94+
theorem gcd_sub_self_left {m n : ℕ} (h : m ≤ n) : gcd (n - m) m = gcd n m := by
95+
calc
96+
gcd (n - m) m = gcd (n - m + m) m := by rw [← gcd_add_self_left (n - m) m]
97+
_ = gcd n m := by rw [Nat.sub_add_cancel h]
98+
99+
@[simp]
100+
theorem gcd_sub_self_right {m n : ℕ} (h : m ≤ n) : gcd m (n - m) = gcd m n := by
101+
rw [gcd_comm, gcd_sub_self_left h, gcd_comm]
102+
103+
@[simp]
104+
theorem gcd_self_sub_left {m n : ℕ} (h : m ≤ n) : gcd (n - m) n = gcd m n := by
105+
have := Nat.sub_add_cancel h
106+
rw [gcd_comm m n, ← this, gcd_add_self_left (n - m) m]
107+
have : gcd (n - m) n = gcd (n - m) m := by
108+
nth_rw 2 [← Nat.add_sub_cancel' h]
109+
rw [gcd_add_self_right, gcd_comm]
110+
convert this
111+
112+
@[simp]
113+
theorem gcd_self_sub_right {m n : ℕ} (h : m ≤ n) : gcd n (n - m) = gcd n m := by
114+
rw [gcd_comm, gcd_self_sub_left h, gcd_comm]
115+
91116
/-! ### `lcm` -/
92117

93118
theorem lcm_dvd_mul (m n : ℕ) : lcm m n ∣ m * n :=
@@ -186,6 +211,22 @@ theorem coprime_mul_left_add_left (m n k : ℕ) : coprime (n * k + m) n ↔ copr
186211
rw [coprime, coprime, gcd_mul_left_add_left]
187212
#align nat.coprime_mul_left_add_left Nat.coprime_mul_left_add_left
188213

214+
@[simp]
215+
theorem coprime_sub_self_left {m n : ℕ} (h : m ≤ n) : coprime (n - m) m ↔ coprime n m := by
216+
rw [coprime, coprime, gcd_sub_self_left h]
217+
218+
@[simp]
219+
theorem coprime_sub_self_right {m n : ℕ} (h : m ≤ n) : coprime m (n - m) ↔ coprime m n:= by
220+
rw [coprime, coprime, gcd_sub_self_right h]
221+
222+
@[simp]
223+
theorem coprime_self_sub_left {m n : ℕ} (h : m ≤ n) : coprime (n - m) n ↔ coprime m n := by
224+
rw [coprime, coprime, gcd_self_sub_left h]
225+
226+
@[simp]
227+
theorem coprime_self_sub_right {m n : ℕ} (h : m ≤ n) : coprime n (n - m) ↔ coprime n m := by
228+
rw [coprime, coprime, gcd_self_sub_right h]
229+
189230
@[simp]
190231
theorem coprime_pow_left_iff {n : ℕ} (hn : 0 < n) (a b : ℕ) :
191232
Nat.coprime (a ^ n) b ↔ Nat.coprime a b := by

0 commit comments

Comments
 (0)