Skip to content

Commit 0a6954d

Browse files
committed
refactoring: comprehensive shift over to NonTrivial instances
1 parent 232b6d6 commit 0a6954d

File tree

1 file changed

+120
-80
lines changed

1 file changed

+120
-80
lines changed

src/Data/Nat/Primality.agda

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

77
{-# OPTIONS --cubical-compatible --safe #-}
88

9-
module Data.Nat.Primality where
9+
module Data.Nat.PrimalityINSTANCE where
1010

11+
open import Data.Bool.Base using (Bool; true; false; not; T)
1112
open import Data.Nat.Base
1213
open import Data.Nat.Divisibility
1314
open import Data.Nat.GCD using (module GCD; module Bézout)
@@ -26,60 +27,94 @@ private
2627
variable
2728
d k m n p :
2829

30+
------------------------------------------------------------------------
31+
-- Definitions for `Data.Nat.Base`
32+
33+
pattern 2+ n = suc (suc n)
34+
35+
trivial : Bool
36+
trivial 0 = true
37+
trivial 1 = true
38+
trivial (2+ _) = false
39+
40+
Unit NonUnit NonTrivial : Pred ℕ _
41+
Unit = T ∘ (_≡ᵇ 1)
42+
NonUnit = T ∘ not ∘ (_≡ᵇ 1)
43+
NonTrivial = T ∘ not ∘ trivial
44+
45+
instance
46+
nonUnit[0] : NonUnit 0
47+
nonUnit[0] = _
48+
49+
nonTrivial⇒nonUnit : .{{NonTrivial n}} NonUnit n
50+
nonTrivial⇒nonUnit {n = 2+ _} = _
51+
52+
nonUnit⇒≢1 : .{{NonUnit n}} n ≢ 1
53+
nonUnit⇒≢1 ⦃()⦄ refl
54+
instance
55+
nonTrivial : NonTrivial (2+ n)
56+
nonTrivial = _
57+
58+
nonTrivial⇒≢1 : .{{NonTrivial n}} n ≢ 1
59+
nonTrivial⇒≢1 ⦃()⦄ refl
60+
61+
nonTrivial⇒nonZero : .{{NonTrivial n}} NonZero n
62+
nonTrivial⇒nonZero {n = 2+ k} = _
63+
2964
pattern 1<2+n {n} = s<s (z<s {n})
3065

66+
nonTrivial⇒n>1 : .{{NonTrivial n}} 1 < n
67+
nonTrivial⇒n>1 {n = 2+ _} = 1<2+n
68+
69+
n>1⇒nonTrivial : 1 < n NonTrivial n
70+
n>1⇒nonTrivial 1<2+n = _
71+
3172

3273
------------------------------------------------------------------------
3374
-- Definitions
3475

3576
-- Definition of 'not rough'-ness
3677

37-
record BoundedCompositeAt (k n d : ℕ) : Set where
78+
record _BoundedComposite_ (k n d : ℕ) : Set where
3879
constructor boundedComposite
3980
field
40-
1<d : 1 < d
81+
{{nt}} : NonTrivial d
4182
d<k : d < k
4283
d∣n : d ∣ n
4384

44-
open BoundedCompositeAt public
85+
-- smart constructor
4586

46-
pattern boundedComposite>1 {d} d<k d∣n = boundedComposite (1<2+n {d}) d<k d∣n
87+
boundedComposite≢ : .{{NonZero n}} {{NonTrivial d}}
88+
d ≢ n d ∣ n (n BoundedComposite n) d
89+
boundedComposite≢ d≢n d∣n = boundedComposite (≤∧≢⇒< (∣⇒≤ d∣n) d≢n) d∣n
4790

4891
-- Definition of compositeness
4992

50-
CompositeAt : Pred ℕ _
51-
CompositeAt n = BoundedCompositeAt n n
93+
Composite : Pred ℕ _
94+
Composite n = ∃⟨ n BoundedComposite n ⟩
5295

53-
Composite : Set
54-
Composite n = ∃⟨ CompositeAt n ⟩
96+
-- smart constructor
5597

56-
-- Definition of 'rough': a number is k-rough
57-
-- if all its factors d > 1 are greater than or equal to k
98+
composite : .{{NonZero n}} {{NonTrivial d}}
99+
d ≢ n d ∣ n Composite n
100+
composite {d = d} d≢n d∣n = d , boundedComposite≢ d≢n d∣n
58101

59-
_RoughAt_ : Pred ℕ _
60-
k RoughAt n = ¬_ ∘ BoundedCompositeAt k n
102+
-- Definition of 'rough': a number is k-rough
103+
-- if all its non-trivial factors d 1 are greater than or equal to k
61104

62-
_Rough_ : Set
63-
k Rough n = ∀[ k RoughAt n ]
105+
_Rough_ : Pred ℕ _
106+
k Rough n = ∀[ ¬_ ∘ k BoundedComposite n ]
64107

65108
-- Definition of primality: complement of Composite
109+
-- Constructor: prime
110+
-- takes a proof isPrime that NonTrivial p is p-Rough
111+
-- and thereby enforces that p is a fortiori NonZero
66112

67-
PrimeAt : Pred ℕ _
68-
PrimeAt n = n RoughAt n
69-
70-
Prime : Set
71-
Prime n = 1 < n × ∀[ PrimeAt n ]
72-
73-
-- smart constructor: prime
74-
-- this takes a proof p that n = suc (suc _) is n-Rough
75-
-- and thereby enforces that n is a fortiori NonZero
76-
77-
pattern prime {n} r = 1<2+n {n} , r
78-
79-
-- smart destructor
80-
81-
prime⁻¹ : Prime n n Rough n
82-
prime⁻¹ (prime r) = r
113+
record Prime (p : ℕ) : Set where
114+
constructor prime
115+
field
116+
{{nt}} : NonTrivial p
117+
isPrime : p Rough p
83118

84119
-- Definition of irreducibility
85120

@@ -95,41 +130,37 @@ Irreducible n = ∀[ IrreducibleAt n ]
95130

96131
-- 1 is always rough
97132
_rough-1 : k k Rough 1
98-
(_ rough-1) (boundedComposite 1<d _ d∣1) = >⇒∤ 1<d d∣1
133+
(_ rough-1) {2+ _} (boundedComposite _ d∣1@(divides q@(suc _) ()))
99134

100135
-- Any number is 0-rough
101136
0-rough : 0 Rough n
102-
0-rough (boundedComposite 1<d d<0 _) with () d<0
137+
0-rough (boundedComposite () _)
103138

104139
-- Any number is 1-rough
105140
1-rough : 1 Rough n
106-
1-rough (boundedComposite 1<d d<1 _) = <-asym 1<d d<1
141+
1-rough (boundedComposite ⦃()⦄ z<s _)
107142

108143
-- Any number is 2-rough because all factors d > 1 are greater than or equal to 2
109144
2-rough : 2 Rough n
110-
2-rough (boundedComposite 1<d d<2 _) with () ≤⇒≯ 1<d d<2
145+
2-rough (boundedComposite ⦃()⦄ (s<s z<s) _)
111146

112147
-- If a number n is k-rough, and k ∤ n, then n is (suc k)-rough
113148
∤⇒rough-suc : k ∤ n k Rough n suc k Rough n
114-
∤⇒rough-suc k∤n r (boundedComposite 1<d d<1+k d∣n) with m<1+n⇒m<n∨m≡n d<1+k
115-
... | inj₁ d<k = r (boundedComposite 1<d d<k d∣n)
116-
... | inj₂ d≡k rewrite d≡k = contradiction d∣n k∤n
149+
∤⇒rough-suc k∤n r (boundedComposite d<1+k d∣n) with m<1+n⇒m<n∨m≡n d<1+k
150+
... | inj₁ d<k = r (boundedComposite d<k d∣n)
151+
... | inj₂ d≡k@refl = contradiction d∣n k∤n
117152

118153
-- If a number is k-rough, then so are all of its divisors
119154
rough⇒∣⇒rough : k Rough m n ∣ m k Rough n
120-
rough⇒∣⇒rough r n∣m (boundedComposite 1<d d<k d∣n)
121-
= r (boundedComposite 1<d d<k (∣-trans d∣n n∣m))
122-
123-
-- If a number n > 1 is k-rough, then k ≤ n
124-
rough⇒≤ : 1 < n k Rough n k ≤ n
125-
rough⇒≤ 1<n rough = ≮⇒≥ λ k>n rough (boundedComposite 1<n k>n ∣-refl)
155+
rough⇒∣⇒rough r n∣m (boundedComposite d<k d∣n)
156+
= r (boundedComposite d<k (∣-trans d∣n n∣m))
126157

127158
------------------------------------------------------------------------
128159
-- Corollary: relationship between roughness and primality
129160

130161
-- If a number n is p-rough, and p > 1 divides n, then p must be prime
131-
rough⇒∣⇒prime : 1 < p p Rough n p ∣ n Prime p
132-
rough⇒∣⇒prime 1<p r p∣n = 1<p , rough⇒∣⇒rough r p∣n
162+
rough⇒∣⇒prime : ⦃ NonTrivial p ⦄ p Rough n p ∣ n Prime p
163+
rough⇒∣⇒prime r p∣n = prime (rough⇒∣⇒rough r p∣n)
133164

134165
------------------------------------------------------------------------
135166
-- Basic (non-)instances of Composite
@@ -140,21 +171,17 @@ rough⇒∣⇒prime 1<p r p∣n = 1<p , rough⇒∣⇒rough r p∣n
140171
¬composite[1] : ¬ Composite 1
141172
¬composite[1] (_ , composite[1]) = 1-rough composite[1]
142173

143-
composite[2+k≢n≢0] : .{{NonZero n}} let d = suc (suc k) in
144-
d ≢ n d ∣ n CompositeAt n d
145-
composite[2+k≢n≢0] d≢n d∣n = boundedComposite>1 (≤∧≢⇒< (∣⇒≤ d∣n) d≢n) d∣n
146-
147174
composite[4] : Composite 4
148-
composite[4] = 2 , composite[2+k≢n≢0] (λ()) (divides-refl 2)
175+
composite[4] = composite {d = 2} (λ ()) (divides 2 refl)
149176

150177
------------------------------------------------------------------------
151178
-- Basic (non-)instances of Prime
152179

153180
¬prime[0] : ¬ Prime 0
154-
¬prime[0] (() , _)
181+
¬prime[0] ()
155182

156183
¬prime[1] : ¬ Prime 1
157-
¬prime[1] (s<s () , _)
184+
¬prime[1] ()
158185

159186
prime[2] : Prime 2
160187
prime[2] = prime 2-rough
@@ -174,23 +201,31 @@ irreducible[2] {suc _} d∣2 with ∣⇒≤ d∣2
174201
... | z<s = inj₁ refl
175202
... | s<s z<s = inj₂ refl
176203

204+
------------------------------------------------------------------------
205+
-- NonZero
206+
207+
composite⇒nonZero : Composite n NonZero n
208+
composite⇒nonZero {n@(suc _)} _ = _
209+
210+
prime⇒nonZero : Prime p NonZero p
211+
prime⇒nonZero (prime _) = nonTrivial⇒nonZero
212+
177213
------------------------------------------------------------------------
178214
-- Decidability
179215

180216
composite? : Decidable Composite
181217
composite? n = Dec.map′
182-
(map₂ λ (d<n , 1<d , d∣n) boundedComposite 1<d d<n d∣n)
183-
(map₂ λ (boundedComposite 1<d d<n d∣n) d<n , 1<d , d∣n)
218+
(map₂ λ (d<n , 1<d , d∣n) boundedComposite ⦃ n>1⇒nonTrivial 1<d ⦄ d<n d∣n)
219+
(map₂ λ (boundedComposite d<n d∣n) d<n , nonTrivial⇒n>1 , d∣n)
184220
(anyUpTo? (λ d 1 <? d ×-dec d ∣? n) n)
185221

186222
prime? : Decidable Prime
187-
prime? 0 = no ¬prime[0]
188-
prime? 1 = no ¬prime[1]
189-
prime? n@(suc (suc _))
190-
= (yes 1<2+n) ×-dec Dec.map′
191-
(λ h (boundedComposite 1<d d<n d∣n) h d<n 1<d d∣n)
192-
(λ h {d} d<n 1<d d∣n h (boundedComposite 1<d d<n d∣n))
193-
(allUpTo? (λ d 1 <? d →-dec ¬? (d ∣? n)) n)
223+
prime? 0 = no ¬prime[0]
224+
prime? 1 = no ¬prime[1]
225+
prime? n@(2+ _) = Dec.map′
226+
(λ r prime λ (boundedComposite d<n d∣n) r d<n nonTrivial⇒n>1 d∣n)
227+
(λ (prime p) {d} d<n 1<d d∣n p {d} (boundedComposite ⦃ n>1⇒nonTrivial 1<d ⦄ d<n d∣n))
228+
(allUpTo? (λ d 1 <? d →-dec ¬? (d ∣? n)) n)
194229

195230
irreducible? : Decidable Irreducible
196231
irreducible? zero = no ¬irreducible[0]
@@ -209,29 +244,32 @@ irreducible? n@(suc _) = Dec.map′ bounded-irr⇒irr irr⇒bounded-irr
209244
-- Relationships between compositeness, primality, and irreducibility
210245

211246
composite⇒¬prime : Composite n ¬ Prime n
212-
composite⇒¬prime (d , composite[d]) (prime r) = r composite[d]
247+
composite⇒¬prime (d , composite[d]) (prime p) = p composite[d]
213248

214-
¬composite⇒prime : 1 < n ¬ Composite n Prime n
215-
¬composite⇒prime 1<n ¬composite[n]
216-
= 1<n , λ {d} composite[d] ¬composite[n] (d , composite[d])
249+
¬composite⇒prime : ⦃ NonTrivial n ⦄ ¬ Composite n Prime n
250+
¬composite⇒prime ¬composite[n] = prime
251+
λ {d} composite[d] ¬composite[n] (d , composite[d])
217252

218253
prime⇒¬composite : Prime n ¬ Composite n
219-
prime⇒¬composite (prime r) (d , composite[d]) = r composite[d]
254+
prime⇒¬composite (prime p) (d , composite[d]) = p composite[d]
220255

221256
-- note that this has to recompute the factor!
222-
¬prime⇒composite : 1 < n ¬ Prime n Composite n
223-
¬prime⇒composite {n} 1<n ¬prime[n] =
224-
decidable-stable (composite? n) (¬prime[n] ∘′ ¬composite⇒prime 1<n)
257+
¬prime⇒composite : ⦃ NonTrivial n ⦄ ¬ Prime n Composite n
258+
¬prime⇒composite {n} ¬prime[n] =
259+
decidable-stable (composite? n) (¬prime[n] ∘′ ¬composite⇒prime)
225260

226261
prime⇒irreducible : Prime p Irreducible p
227-
prime⇒irreducible (prime r) {0} 0∣p = contradiction (0∣⇒≡0 0∣p) (≢-nonZero⁻¹ _)
228-
prime⇒irreducible p-prime {1} 1∣p = inj₁ refl
229-
prime⇒irreducible (prime r) {suc (suc _)} m∣p
230-
= inj₂ (≤∧≮⇒≡ (∣⇒≤ m∣p) λ m<p r (boundedComposite>1 m<p m∣p))
231-
232-
irreducible⇒prime : Irreducible p 1 < p Prime p
233-
irreducible⇒prime irr 1<p
234-
= 1<p , λ (boundedComposite 1<d d<p d∣p) [ (>⇒≢ 1<d) , (<⇒≢ d<p) ]′ (irr d∣p)
262+
prime⇒irreducible (prime ⦃ nt ⦄ r) {0} 0∣p
263+
= contradiction (0∣⇒≡0 0∣p) (≢-nonZero⁻¹ _)
264+
where instance _ = nonTrivial⇒nonZero
265+
prime⇒irreducible _ {1} 1∣p = inj₁ refl
266+
prime⇒irreducible (prime ⦃ nt ⦄ r) {m@(2+ k)} m∣p
267+
= inj₂ (≤∧≮⇒≡ (∣⇒≤ m∣p) λ m<p r (boundedComposite m<p m∣p))
268+
where instance _ = nonTrivial⇒nonZero
269+
270+
irreducible⇒prime : Irreducible p ⦃ NonTrivial p ⦄ Prime p
271+
irreducible⇒prime irr ⦃ nt ⦄
272+
= prime λ (boundedComposite d<p d∣p) [ nonTrivial⇒≢1 , (<⇒≢ d<p) ]′ (irr d∣p)
235273

236274
------------------------------------------------------------------------
237275
-- Euclid's lemma
@@ -244,6 +282,7 @@ euclidsLemma : ∀ m n {p} → Prime p → p ∣ m * n → p ∣ m ⊎ p ∣ n
244282
euclidsLemma m n {p} (prime pr) p∣m*n = result
245283
where
246284
open ∣-Reasoning
285+
instance _ = nonTrivial⇒nonZero -- for NonZero p
247286

248287
p∣rmn : r p ∣ r * m * n
249288
p∣rmn r = begin
@@ -256,7 +295,7 @@ euclidsLemma m n {p} (prime pr) p∣m*n = result
256295
result with Bézout.lemma m p
257296
-- if the GCD of m and p is zero then p must be zero, which is
258297
-- impossible as p is a prime
259-
... | Bézout.result 0 g _ = contradiction (0∣⇒≡0 (GCD.gcd∣n g)) λ()
298+
... | Bézout.result 0 g _ = contradiction (0∣⇒≡0 (GCD.gcd∣n g)) (≢-nonZero⁻¹ _)
260299
-- this should be a typechecker-rejectable case!?
261300

262301
-- if the GCD of m and p is one then m and p is coprime, and we know
@@ -279,7 +318,7 @@ euclidsLemma m n {p} (prime pr) p∣m*n = result
279318
-- if the GCD of m and p is greater than one, then it must be p and hence p ∣ m.
280319
... | Bézout.result d@(suc (suc _)) g _ with d ≟ p
281320
... | yes d≡p rewrite d≡p = inj₁ (GCD.gcd∣m g)
282-
... | no d≢p = contradiction d∣p λ d∣p pr (composite[2+k≢n≢0] d≢p d∣p)
321+
... | no d≢p = contradiction d∣p λ d∣p pr (boundedComposite≢ d≢p d∣p)
283322
where
284323
d∣p : d ∣ p
285324
d∣p = GCD.gcd∣n g
@@ -294,3 +333,4 @@ private
294333
-- Example: 6 is composite
295334
6-is-composite : Composite 6
296335
6-is-composite = from-yes (composite? 6)
336+

0 commit comments

Comments
 (0)