Skip to content

Commit d160aa4

Browse files
Refactor lcm (#818)
1 parent cafc3db commit d160aa4

File tree

8 files changed

+406
-202
lines changed

8 files changed

+406
-202
lines changed

CHANGELOG.md

Lines changed: 54 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ Bug-fixes
7272
Non-backwards compatible changes
7373
--------------------------------
7474

75-
* The function `gcd` in `Data.Nat.GCD` has been reimplemented so it is much
76-
faster when compiled. The function `gcd` now has type `ℕ → ℕ → ℕ`. The old
77-
function of type `(m n : ℕ) → ∃ λ d → GCD m n d` has been renamed `mkGCD`,
78-
and `gcd′` in `Data.Nat.Coprimality` has been renamed `mkGCD′`. All other
79-
functionality is untouched.
75+
* The functions `gcd` and `lcm` in `Data.Nat.GCD/LCM` have been reimplemented
76+
so that they run much faster when compiled. The functions now have type `ℕ → ℕ → ℕ`.
77+
The old functions of type `(m n : ℕ) → ∃ λ d → GCD/LCM m n d` has been renamed
78+
`mkGCD`/`mkLCM`, and `gcd′` in `Data.Nat.Coprimality` has been deprecated. All
79+
other functionality is untouched.
8080

8181
* The module `IsDistributiveLattice` in `Algebra.Structures` has had its field
8282
renamed from `∨-∧-distribʳ` to `∨-distribʳ-∧` in order to match the conventions
@@ -285,6 +285,17 @@ been attached to all deprecated names.
285285
/-cong ↦ *-cancelˡ-∣
286286
```
287287

288+
* In `Data.Nat.DivMod`:
289+
```agda
290+
a≡a%n+[a/n]*n ↦ m≡m%n+[m/n]*n
291+
a%1≡0 ↦ n%1≡0
292+
a%n%n≡a%n ↦ m%n%n≡m%n
293+
[a+n]%n≡a%n ↦ [m+n]%n≡m%n
294+
[a+kn]%n≡a%n ↦ [m+kn]%n≡m%n
295+
kn%n≡0 ↦ m*n%n≡0
296+
a%n<n ↦ m%n<n
297+
```
298+
288299
* In `Data.Nat.Properties`:
289300
```agda
290301
m≢0⇒suc[pred[m]]≡m ↦ suc[pred[n]]≡n
@@ -617,20 +628,19 @@ Other minor additions
617628
_>>=_ : Maybe A → (A → Maybe B) → Maybe B
618629
```
619630

620-
* Added new proofs to `Data.Nat.GCD`:
621-
```agda
622-
gcd-comm : gcd m n ≡ gcd n m
623-
gcd[m,n]∣m : gcd m n ∣ m
624-
gcd[m,n]∣n : gcd m n ∣ n
625-
gcd-greatest : c ∣ m → c ∣ n → c ∣ gcd m n
626-
gcd≢0 : m ≢ 0 ⊎ n ≢ 0 → gcd m n ≢ 0
627-
```
628-
629631
* Added new proofs to `Data.Nat.Divisibility`:
630632
```agda
631-
∣m∸n∣n⇒∣m : n ≤ m → i ∣ m ∸ n → i ∣ n → i ∣ m
632-
∣n∣m%n⇒∣m : d ∣ n → d ∣ (m % n) → d ∣ m
633-
%-presˡ-∣ : d ∣ m → d ∣ n → d ∣ (m % n)
633+
∣m∸n∣n⇒∣m : n ≤ m → i ∣ m ∸ n → i ∣ n → i ∣ m
634+
∣n∣m%n⇒∣m : d ∣ n → d ∣ (m % n) → d ∣ m
635+
*-monoˡ-∣ : i ∣ j → i * k ∣ j * k
636+
%-presˡ-∣ : d ∣ m → d ∣ n → d ∣ (m % n)
637+
m/n∣m : n ∣ m → m / n ∣ m
638+
m*n∣o⇒m∣o/n : m * n ∣ o → m ∣ o / n
639+
m*n∣o⇒n∣o/m : m * n ∣ o → n ∣ o / m
640+
m∣n/o⇒m*o∣n : o ∣ n → m ∣ n / o → m * o ∣ n
641+
m∣n/o⇒o*m∣n : o ∣ n → m ∣ n / o → o * m ∣ n
642+
m/n∣o⇒m∣o*n : n ∣ m → m / n ∣ o → m ∣ o * n
643+
m∣n*o⇒m/n∣o : n ∣ m → m ∣ o * n → m / n ∣ o
634644
```
635645

636646
* Added new operator and proofs to `Data.Nat.DivMod`:
@@ -643,13 +653,14 @@ Other minor additions
643653
%-remove-+ʳ : d ∣ n → (m + n) % d ≡ m % d
644654
%-pred-≡0 : suc m % n ≡ 0 → m % n ≡ n ∸ 1
645655
m<[1+n%d]⇒m≤[n%d] : m < suc n % d → m ≤ n % d
646-
[1+a%n]≤1+m⇒[a%n]≤m : 0 < suc n % d → suc n % d ≤ suc mn % d ≤ m
656+
[1+m%d]≤1+n⇒[m%d]≤n : 0 < suc m % d → suc m % d ≤ suc nm % d ≤ n
647657
648658
0/n≡0 : 0 / n ≡ 0
649-
n/1≡a : n / 1 ≡ n
659+
n/1≡n : n / 1 ≡ n
650660
n/n≡1 : n / n ≡ 1
651661
m*n/n≡m : m * n / n ≡ m
652662
m/n*n≡m : n ∣ m → m / n * n ≡ m
663+
m*[n/m]≡n : m ∣ n → m * (n / m) ≡ n
653664
m/n*n≤m : m / n * n ≤ m
654665
m/n<m : m ≥ 1 → n ≥ 2 → m / n < m
655666
*-/-assoc : d ∣ n → (m * n) / d ≡ m * (n / d)
@@ -661,6 +672,30 @@ Other minor additions
661672
division and modulus functions has been marked irrelevant. This means
662673
that the operations `_%_`, `_/_` etc. can now be used with `cong`.
663674

675+
* Added new proofs to `Data.Nat.GCD`:
676+
```agda
677+
gcd[m,n]∣m : gcd m n ∣ m
678+
gcd[m,n]∣n : gcd m n ∣ n
679+
gcd-greatest : c ∣ m → c ∣ n → c ∣ gcd m n
680+
gcd[0,0]≡0 : gcd 0 0 ≡ 0
681+
gcd[m,n]≢0 : m ≢ 0 ⊎ n ≢ 0 → gcd m n ≢ 0
682+
gcd-comm : gcd m n ≡ gcd n m
683+
gcd-universality : (∀ {d} → d ∣ m × d ∣ n → d ∣ g) → (∀ {d} → d ∣ g → d ∣ m × d ∣ n) → g ≡ gcd m n
684+
gcd[cm,cn]/c≡gcd[m,n] : gcd (c * m) (c * n) / c ≡ gcd m n
685+
c*gcd[m,n]≡gcd[cm,cn] : c * gcd m n ≡ gcd (c * m) (c * n)
686+
```
687+
688+
* Added new proofs to `Data.Nat.LCM`:
689+
```agda
690+
m∣lcm[m,n] : m ∣ lcm m n
691+
n∣lcm[m,n] : n ∣ lcm m n
692+
lcm-least : m ∣ c → n ∣ c → lcm m n ∣ c
693+
lcm[0,n]≡0 : lcm 0 n ≡ 0
694+
lcm[n,0]≡0 : lcm n 0 ≡ 0
695+
lcm-comm : lcm m n ≡ lcm n m
696+
gcd*lcm : gcd m n * lcm m n ≡ m * n
697+
```
698+
664699
* Added new proofs to `Data.Nat.Properties`:
665700
```agda
666701
≤-<-connex : Connex _≤_ _<_

src/Data/Integer/DivMod.agda

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ _mod_ : (dividend divisor : ℤ) {≠0 : False (∣ divisor ∣ ℕ.≟ 0)} →
4141
(n mod d) {d≢0} = (n modℕ ∣ d ∣) {d≢0}
4242

4343
n%ℕd<d : n d {d≢0} (n modℕ d) {d≢0} ℕ.< d
44-
n%ℕd<d (+ n) sd@(ℕ.suc d) = NDM.a%n<n n d
44+
n%ℕd<d (+ n) sd@(ℕ.suc d) = NDM.m%n<n n d
4545
n%ℕd<d -[1+ n ] sd@(ℕ.suc d) with ℕ.suc n NDM.divMod sd
4646
... | NDM.result q Fin.zero eq = ℕ.s≤s ℕ.z≤n
4747
... | NDM.result q (Fin.suc r) eq = ℕ.s≤s (NProp.n∸m≤n (Fin.toℕ r) d)
@@ -52,7 +52,7 @@ n%d<d n -[1+ d ] = n%ℕd<d n (ℕ.suc d)
5252

5353
a≡a%ℕn+[a/ℕn]*n : n d {d≢0} n ≡ + (n modℕ d) {d≢0} + (n divℕ d) {d≢0} * + d
5454
a≡a%ℕn+[a/ℕn]*n (+ n) sd@(ℕ.suc d) = let q = n NDM./ sd; r = n NDM.% sd in begin
55-
+ n ≡⟨ cong +_ (NDM.a≡a%n+[a/n]*n n d) ⟩
55+
+ n ≡⟨ cong +_ (NDM.m≡m%n+[m/n]*n n d) ⟩
5656
+ (r ℕ.+ q ℕ.* sd) ≡⟨ pos-+-commute r (q ℕ.* sd) ⟩
5757
+ r + + (q ℕ.* sd) ≡⟨ cong (_+_ (+ (+ n modℕ sd))) (sym (pos-distrib-* q sd)) ⟩
5858
+ r + + q * + sd ∎ where open ≡-Reasoning

src/Data/Nat/Coprimality.agda

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
{-# OPTIONS --without-K --safe #-}
88

9+
-- Disabled to prevent warnings from deprecated names
10+
{-# OPTIONS --warn=noUserWarning #-}
11+
912
module Data.Nat.Coprimality where
1013

1114
open import Data.Empty
@@ -148,28 +151,38 @@ prime⇒coprime (suc (suc m)) p (suc n) _ 1+n<2+m {suc (suc i)}
148151
(P.sym (cong (2 +_) (toℕ-fromℕ≤ i<m)))
149152
2+i∣2+m
150153

154+
155+
------------------------------------------------------------------------
156+
-- DEPRECATED NAMES
151157
------------------------------------------------------------------------
152-
-- A variant of GCD.
158+
-- Please use GCD from `Data.Nat.GCD` as continued support for the
159+
-- proofs below is not guaranteed.
160+
161+
-- Version 1.1.
153162

154163
data GCD′ : Set where
155164
gcd-* : {d} q₁ q₂ (c : Coprime q₁ q₂)
156165
GCD′ (q₁ * d) (q₂ * d) d
157-
158-
-- The two definitions are equivalent.
159-
166+
{-# WARNING_ON_USAGE GCD′
167+
"Warning: GCD′ was deprecated in v1.1."
168+
#-}
160169
gcd-gcd′ : {d m n} GCD m n d GCD′ m n d
161170
gcd-gcd′ g with GCD.commonDivisor g
162171
gcd-gcd′ {zero} g | (divides q₁ refl , divides q₂ refl)
163172
with q₁ * 0 | *-comm 0 q₁ | q₂ * 0 | *-comm 0 q₂
164173
... | .0 | refl | .0 | refl = gcd-* 1 1 (1-coprimeTo 1)
165174
gcd-gcd′ {suc d} g | (divides q₁ refl , divides q₂ refl) =
166175
gcd-* q₁ q₂ (Bézout-coprime (Bézout.identity g))
167-
176+
{-# WARNING_ON_USAGE gcd-gcd′
177+
"Warning: gcd-gcd′ was deprecated in v1.1."
178+
#-}
168179
gcd′-gcd : {m n d} GCD′ m n d GCD m n d
169180
gcd′-gcd (gcd-* q₁ q₂ c) = GCD.is (n∣m*n q₁ , n∣m*n q₂) (coprime-factors c)
170-
171-
-- Calculates (the alternative representation of) the gcd of the
172-
-- arguments.
173-
181+
{-# WARNING_ON_USAGE gcd′-gcd
182+
"Warning: gcd′-gcd was deprecated in v1.1."
183+
#-}
174184
mkGCD′ : m n λ d GCD′ m n d
175185
mkGCD′ m n = Prod.map id gcd-gcd′ (mkGCD m n)
186+
{-# WARNING_ON_USAGE mkGCD′
187+
"Warning: mkGCD′ was deprecated in v1.1."
188+
#-}

0 commit comments

Comments
 (0)