From a7fd27125b8d44761f503ef4c95f9d71c1664060 Mon Sep 17 00:00:00 2001 From: jamesmckinna Date: Sun, 2 Jul 2023 12:20:32 +0100 Subject: [PATCH 1/7] added new pattern synonym --- CHANGELOG.md | 7 +++- src/Data/Nat/DivMod.agda | 18 ++++----- src/Data/Nat/Divisibility.agda | 58 ++++++++++++++--------------- src/Data/Nat/Divisibility/Core.agda | 3 ++ 4 files changed, 46 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5891740538..3954dd8fc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -901,7 +901,7 @@ Major improvements for them still live in `Data.Nat.DivMod` (which also publicly re-exports them to provide backwards compatability). -* Beneficieries of this change include `Data.Rational.Unnormalised.Base` whose +* Beneficiaries of this change include `Data.Rational.Unnormalised.Base` whose dependencies are now significantly smaller. ### Moved raw bundles from Data.X.Properties to Data.X.Base @@ -2200,6 +2200,11 @@ Other minor changes suc-injective : Injective _≡_ _≡_ suc ``` +* Added a new pattern synonym to `Data.Nat.Divisibility.Core`: + ```agda + pattern divides-refl q = divides q refl + ``` + * Added new definitions and proofs to `Data.Nat.Primality`: ```agda Composite : ℕ → Set diff --git a/src/Data/Nat/DivMod.agda b/src/Data/Nat/DivMod.agda index b4c225d6a4..6a1b4edff8 100644 --- a/src/Data/Nat/DivMod.agda +++ b/src/Data/Nat/DivMod.agda @@ -22,8 +22,6 @@ open import Relation.Binary.PropositionalEquality open import Relation.Nullary.Decidable using (yes; no) open import Relation.Nullary.Decidable using (False; toWitnessFalse) -import Algebra.Properties.CommutativeSemigroup *-commutativeSemigroup as *-CS - open ≤-Reasoning ------------------------------------------------------------------------ @@ -91,7 +89,7 @@ m*n≤o⇒[o∸m*n]%n≡o%n m {n} {o} m*n≤o = begin-equality m∣n⇒o%n%m≡o%m : ∀ m n o .⦃ _ : NonZero m ⦄ .⦃ _ : NonZero n ⦄ → m ∣ n → o % n % m ≡ o % m -m∣n⇒o%n%m≡o%m m n o (divides p refl) = begin-equality +m∣n⇒o%n%m≡o%m m n o (divides-refl p) = begin-equality o % pm % m ≡⟨ %-congˡ (m%n≡m∸m/n*n o pm) ⟩ (o ∸ o / pm * pm) % m ≡˘⟨ cong (λ # → (o ∸ #) % m) (*-assoc (o / pm) p m) ⟩ (o ∸ o / pm * p * m) % m ≡⟨ m*n≤o⇒[o∸m*n]%n≡o%n (o / pm * p) lem ⟩ @@ -171,7 +169,7 @@ m<[1+n%d]⇒m≤[n%d] {m} n (suc d-1) = k<1+a[modₕ]n⇒k≤a[modₕ]n 0 m n d- m′ * n′ + (m′ * j + (n′ + j * d) * k) * d ∎ %-remove-+ˡ : ∀ {m} n {d} .{{_ : NonZero d}} → d ∣ m → (m + n) % d ≡ n % d -%-remove-+ˡ {m} n {d@(suc d-1)} (divides p refl) = begin-equality +%-remove-+ˡ {m} n {d@(suc _)} (divides-refl p) = begin-equality (p * d + n) % d ≡⟨ cong (_% d) (+-comm (p * d) n) ⟩ (n + p * d) % d ≡⟨ [m+kn]%n≡m%n n p d ⟩ n % d ∎ @@ -191,7 +189,7 @@ m<[1+n%d]⇒m≤[n%d] {m} n (suc d-1) = k<1+a[modₕ]n⇒k≤a[modₕ]n 0 m n d- /-congʳ refl = refl 0/n≡0 : ∀ n .{{_ : NonZero n}} → 0 / n ≡ 0 -0/n≡0 (suc n-1) = refl +0/n≡0 (suc _) = refl n/1≡n : ∀ n → n / 1 ≡ n n/1≡n n = a[divₕ]1≡a 0 n @@ -203,7 +201,7 @@ m*n/n≡m : ∀ m n .{{_ : NonZero n}} → m * n / n ≡ m m*n/n≡m m (suc n-1) = a*n[divₕ]n≡a 0 m n-1 m/n*n≡m : ∀ {m n} .{{_ : NonZero n}} → n ∣ m → m / n * n ≡ m -m/n*n≡m {_} {n@(suc n-1)} (divides q refl) = cong (_* n) (m*n/n≡m q n) +m/n*n≡m {_} {n@(suc _)} (divides-refl q) = cong (_* n) (m*n/n≡m q n) m*[n/m]≡n : ∀ {m n} .{{_ : NonZero m}} → m ∣ n → m * (n / m) ≡ n m*[n/m]≡n {m} m∣n = trans (*-comm m (_ / m)) (m/n*n≡m m∣n) @@ -261,14 +259,14 @@ m≥n⇒m/n>0 {m@(suc _)} {n@(suc _)} m≥n = begin +-distrib-/-∣ˡ : ∀ {m} n {d} .{{_ : NonZero d}} → d ∣ m → (m + n) / d ≡ m / d + n / d -+-distrib-/-∣ˡ {m} n {d} (divides p refl) = +-distrib-/ m n (begin-strict ++-distrib-/-∣ˡ {m} n {d} (divides-refl p) = +-distrib-/ m n (begin-strict p * d % d + n % d ≡⟨ cong (_+ n % d) (m*n%n≡0 p d) ⟩ n % d <⟨ m%n Date: Sun, 2 Jul 2023 12:50:40 +0100 Subject: [PATCH 2/7] updated `GCD` to use new pattern synonym; plus systematic use of irrefutable `with` --- src/Data/Nat/GCD.agda | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/Data/Nat/GCD.agda b/src/Data/Nat/GCD.agda index fe90cc0282..09991244d0 100644 --- a/src/Data/Nat/GCD.agda +++ b/src/Data/Nat/GCD.agda @@ -56,8 +56,8 @@ gcd m n with <-cmp m n gcd′[m,n]∣m,n : ∀ {m n} rec n Date: Sun, 2 Jul 2023 12:56:35 +0100 Subject: [PATCH 3/7] updated `Coprimality` to use new pattern synonym; plus systematic use of irrefutable `with` --- src/Data/Nat/Coprimality.agda | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Data/Nat/Coprimality.agda b/src/Data/Nat/Coprimality.agda index 6f126a80d6..8bf92babbf 100644 --- a/src/Data/Nat/Coprimality.agda +++ b/src/Data/Nat/Coprimality.agda @@ -45,8 +45,8 @@ coprime⇒GCD≡1 : ∀ {m n} → Coprime m n → GCD m n 1 coprime⇒GCD≡1 {m} {n} c = GCD.is (1∣ m , 1∣ n) (∣-reflexive ∘ c) GCD≡1⇒coprime : ∀ {m n} → GCD m n 1 → Coprime m n -GCD≡1⇒coprime g cd with GCD.greatest g cd -... | divides q eq = m*n≡1⇒n≡1 q _ (P.sym eq) +GCD≡1⇒coprime g cd with divides q eq ← GCD.greatest g cd + = m*n≡1⇒n≡1 q _ (P.sym eq) coprime⇒gcd≡1 : ∀ {m n} → Coprime m n → gcd m n ≡ 1 coprime⇒gcd≡1 coprime = GCD.unique (gcd-GCD _ _) (coprime⇒GCD≡1 coprime) @@ -111,9 +111,9 @@ recompute {n} {d} c = Nullary.recompute (coprime? n d) c Bézout-coprime : ∀ {i j d} .{{_ : NonZero d}} → Bézout.Identity d (i * d) (j * d) → Coprime i j -Bézout-coprime {d = suc _} (Bézout.+- x y eq) (divides q₁ refl , divides q₂ refl) = +Bézout-coprime {d = suc _} (Bézout.+- x y eq) (divides-refl q₁ , divides-refl q₂) = lem₁₀ y q₂ x q₁ eq -Bézout-coprime {d = suc _} (Bézout.-+ x y eq) (divides q₁ refl , divides q₂ refl) = +Bézout-coprime {d = suc _} (Bézout.-+ x y eq) (divides-refl q₁ , divides-refl q₂) = lem₁₀ x q₁ y q₂ eq -- Coprime numbers satisfy Bézout's identity. From 438a196f7f522213f26f5244bdc8cad4cf278164 Mon Sep 17 00:00:00 2001 From: jamesmckinna Date: Thu, 6 Jul 2023 06:54:17 +0100 Subject: [PATCH 4/7] made certain dot patterns explicit --- src/Data/Nat/Divisibility.agda | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Data/Nat/Divisibility.agda b/src/Data/Nat/Divisibility.agda index 85df981039..bb93d5e9e2 100644 --- a/src/Data/Nat/Divisibility.agda +++ b/src/Data/Nat/Divisibility.agda @@ -183,7 +183,8 @@ m*n∣⇒n∣ : ∀ {i} m n → m * n ∣ i → n ∣ i m*n∣⇒n∣ m n rewrite *-comm m n = m*n∣⇒m∣ n m *-monoʳ-∣ : ∀ {i j} k → i ∣ j → k * i ∣ k * j -*-monoʳ-∣ {i} {j} k (divides-refl q) = divides q $ begin-equality +*-monoʳ-∣ {i} {j@.(q * i)} k (divides-refl q) = divides q $ begin-equality + k * j ≡⟨⟩ k * (q * i) ≡⟨ sym (*-assoc k q i) ⟩ (k * q) * i ≡⟨ cong (_* i) (*-comm k q) ⟩ (q * k) * i ≡⟨ *-assoc q k i ⟩ @@ -223,20 +224,23 @@ m*n∣⇒n∣ m n rewrite *-comm m n = m*n∣⇒m∣ n m -- Properties of _∣_ and _/_ m/n∣m : ∀ {m n} .{{_ : NonZero n}} → n ∣ m → m / n ∣ m -m/n∣m {m} {n} (divides-refl p) = begin +m/n∣m {m@.(p * n)} {n} (divides-refl p) = begin + m / n ≡⟨⟩ p * n / n ≡⟨ m*n/n≡m p n ⟩ p ∣⟨ m∣m*n n ⟩ - p * n ∎ + p * n ≡⟨⟩ + m ∎ where open ∣-Reasoning m*n∣o⇒m∣o/n : ∀ m n {o} .{{_ : NonZero n}} → m * n ∣ o → m ∣ o / n -m*n∣o⇒m∣o/n m n {_} (divides-refl p) = begin +m*n∣o⇒m∣o/n m n {o@.(p * (m * n))} (divides-refl p) = begin m ∣⟨ n∣m*n p ⟩ p * m ≡⟨ sym (*-identityʳ (p * m)) ⟩ p * m * 1 ≡⟨ sym (cong (p * m *_) (n/n≡1 n)) ⟩ p * m * (n / n) ≡⟨ sym (*-/-assoc (p * m) (n∣n {n})) ⟩ p * m * n / n ≡⟨ cong (_/ n) (*-assoc p m n) ⟩ - p * (m * n) / n ∎ + p * (m * n) / n ≡⟨⟩ + o / n ∎ where open ∣-Reasoning m*n∣o⇒n∣o/m : ∀ m n {o} .{{_ : NonZero m}} → m * n ∣ o → n ∣ (o / m) @@ -258,7 +262,8 @@ m/n∣o⇒m∣o*n {_} {n} {o} (divides-refl p) p*n/n∣o = begin where open ∣-Reasoning m∣n*o⇒m/n∣o : ∀ {m n o} .{{_ : NonZero n}} → n ∣ m → m ∣ o * n → m / n ∣ o -m∣n*o⇒m/n∣o {_} {n@(suc _)} {o} (divides-refl p) pn∣on = begin +m∣n*o⇒m/n∣o {m@.(p * n)} {n@(suc _)} {o} (divides-refl p) pn∣on = begin + m / n ≡⟨⟩ p * n / n ≡⟨ m*n/n≡m p n ⟩ p ∣⟨ *-cancelʳ-∣ n pn∣on ⟩ o ∎ From 097893d78963b53830918a5ecbaa3b8991f6a312 Mon Sep 17 00:00:00 2001 From: jamesmckinna Date: Thu, 6 Jul 2023 06:56:33 +0100 Subject: [PATCH 5/7] simplified imports --- src/Data/Nat/Coprimality.agda | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Data/Nat/Coprimality.agda b/src/Data/Nat/Coprimality.agda index 8bf92babbf..f07901cff7 100644 --- a/src/Data/Nat/Coprimality.agda +++ b/src/Data/Nat/Coprimality.agda @@ -9,8 +9,6 @@ module Data.Nat.Coprimality where open import Data.Empty -open import Data.Fin.Base using (toℕ; fromℕ<) -open import Data.Fin.Properties using (toℕ-fromℕ<) open import Data.Nat.Base open import Data.Nat.Divisibility open import Data.Nat.GCD From c4aa993daea1443a3606e2e036c79cc752aaa515 Mon Sep 17 00:00:00 2001 From: jamesmckinna Date: Thu, 6 Jul 2023 07:00:28 +0100 Subject: [PATCH 6/7] simplified imports --- src/Data/Nat/Primality.agda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Data/Nat/Primality.agda b/src/Data/Nat/Primality.agda index e634095eea..f2a9cb0d5f 100644 --- a/src/Data/Nat/Primality.agda +++ b/src/Data/Nat/Primality.agda @@ -21,7 +21,7 @@ open import Relation.Nullary.Decidable as Dec open import Relation.Nullary.Negation using (¬_; contradiction) open import Relation.Unary using (Decidable) open import Relation.Binary.PropositionalEquality - using (refl; sym; cong; subst) + using (refl; cong) private variable From 5e4a5e3010c74fb95a6f0b1f794ff067bd7b40a1 Mon Sep 17 00:00:00 2001 From: jamesmckinna Date: Thu, 6 Jul 2023 07:45:59 +0100 Subject: [PATCH 7/7] more explicit dot patterns --- src/Data/Nat/DivMod.agda | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Data/Nat/DivMod.agda b/src/Data/Nat/DivMod.agda index 6a1b4edff8..c879cec098 100644 --- a/src/Data/Nat/DivMod.agda +++ b/src/Data/Nat/DivMod.agda @@ -89,7 +89,8 @@ m*n≤o⇒[o∸m*n]%n≡o%n m {n} {o} m*n≤o = begin-equality m∣n⇒o%n%m≡o%m : ∀ m n o .⦃ _ : NonZero m ⦄ .⦃ _ : NonZero n ⦄ → m ∣ n → o % n % m ≡ o % m -m∣n⇒o%n%m≡o%m m n o (divides-refl p) = begin-equality +m∣n⇒o%n%m≡o%m m n@.(p * m) o (divides-refl p) = begin-equality + o % n % m ≡⟨⟩ o % pm % m ≡⟨ %-congˡ (m%n≡m∸m/n*n o pm) ⟩ (o ∸ o / pm * pm) % m ≡˘⟨ cong (λ # → (o ∸ #) % m) (*-assoc (o / pm) p m) ⟩ (o ∸ o / pm * p * m) % m ≡⟨ m*n≤o⇒[o∸m*n]%n≡o%n (o / pm * p) lem ⟩ @@ -169,7 +170,8 @@ m<[1+n%d]⇒m≤[n%d] {m} n (suc d-1) = k<1+a[modₕ]n⇒k≤a[modₕ]n 0 m n d- m′ * n′ + (m′ * j + (n′ + j * d) * k) * d ∎ %-remove-+ˡ : ∀ {m} n {d} .{{_ : NonZero d}} → d ∣ m → (m + n) % d ≡ n % d -%-remove-+ˡ {m} n {d@(suc _)} (divides-refl p) = begin-equality +%-remove-+ˡ {m@.(p * d)} n {d@(suc _)} (divides-refl p) = begin-equality + (m + n) % d ≡⟨⟩ (p * d + n) % d ≡⟨ cong (_% d) (+-comm (p * d) n) ⟩ (n + p * d) % d ≡⟨ [m+kn]%n≡m%n n p d ⟩ n % d ∎ @@ -259,14 +261,16 @@ m≥n⇒m/n>0 {m@(suc _)} {n@(suc _)} m≥n = begin +-distrib-/-∣ˡ : ∀ {m} n {d} .{{_ : NonZero d}} → d ∣ m → (m + n) / d ≡ m / d + n / d -+-distrib-/-∣ˡ {m} n {d} (divides-refl p) = +-distrib-/ m n (begin-strict ++-distrib-/-∣ˡ {m@.(p * d)} n {d} (divides-refl p) = +-distrib-/ m n (begin-strict + m % d + n % d ≡⟨⟩ p * d % d + n % d ≡⟨ cong (_+ n % d) (m*n%n≡0 p d) ⟩ n % d <⟨ m%n