6
6
7
7
{-# OPTIONS --cubical-compatible --safe #-}
8
8
9
- module Data.Nat.Primality where
9
+ module Data.Nat.PrimalityINSTANCE where
10
10
11
+ open import Data.Bool.Base using (Bool; true; false; not; T)
11
12
open import Data.Nat.Base
12
13
open import Data.Nat.Divisibility
13
14
open import Data.Nat.GCD using (module GCD ; module Bézout )
@@ -26,60 +27,94 @@ private
26
27
variable
27
28
d k m n p : ℕ
28
29
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
+
29
64
pattern 1<2+n {n} = s<s (z<s {n})
30
65
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
+
31
72
32
73
------------------------------------------------------------------------
33
74
-- Definitions
34
75
35
76
-- Definition of 'not rough'-ness
36
77
37
- record BoundedCompositeAt (k n d : ℕ) : Set where
78
+ record _BoundedComposite_ (k n d : ℕ) : Set where
38
79
constructor boundedComposite
39
80
field
40
- 1<d : 1 < d
81
+ {{nt}} : NonTrivial d
41
82
d<k : d < k
42
83
d∣n : d ∣ n
43
84
44
- open BoundedCompositeAt public
85
+ -- smart constructor
45
86
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
47
90
48
91
-- Definition of compositeness
49
92
50
- CompositeAt : ℕ → Pred ℕ _
51
- CompositeAt n = BoundedCompositeAt n n
93
+ Composite : Pred ℕ _
94
+ Composite n = ∃⟨ n BoundedComposite n ⟩
52
95
53
- Composite : ℕ → Set
54
- Composite n = ∃⟨ CompositeAt n ⟩
96
+ -- smart constructor
55
97
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
58
101
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
61
104
62
- _Rough_ : ℕ → ℕ → Set
63
- k Rough n = ∀[ k RoughAt n ]
105
+ _Rough_ : ℕ → Pred ℕ _
106
+ k Rough n = ∀[ ¬_ ∘ k BoundedComposite n ]
64
107
65
108
-- 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
66
112
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
83
118
84
119
-- Definition of irreducibility
85
120
@@ -95,41 +130,37 @@ Irreducible n = ∀[ IrreducibleAt n ]
95
130
96
131
-- 1 is always rough
97
132
_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 _) ()))
99
134
100
135
-- Any number is 0-rough
101
136
0-rough : 0 Rough n
102
- 0-rough (boundedComposite 1<d d<0 _) with () ← d<0
137
+ 0-rough (boundedComposite () _)
103
138
104
139
-- Any number is 1-rough
105
140
1-rough : 1 Rough n
106
- 1-rough (boundedComposite 1<d d<1 _) = <-asym 1<d d<1
141
+ 1-rough (boundedComposite ⦃()⦄ z<s _)
107
142
108
143
-- Any number is 2-rough because all factors d > 1 are greater than or equal to 2
109
144
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) _)
111
146
112
147
-- If a number n is k-rough, and k ∤ n, then n is (suc k)-rough
113
148
∤⇒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
117
152
118
153
-- If a number is k-rough, then so are all of its divisors
119
154
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))
126
157
127
158
------------------------------------------------------------------------
128
159
-- Corollary: relationship between roughness and primality
129
160
130
161
-- 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)
133
164
134
165
------------------------------------------------------------------------
135
166
-- Basic (non-)instances of Composite
@@ -140,21 +171,17 @@ rough⇒∣⇒prime 1<p r p∣n = 1<p , rough⇒∣⇒rough r p∣n
140
171
¬composite[1] : ¬ Composite 1
141
172
¬composite[1] (_ , composite[1]) = 1-rough composite[1]
142
173
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
-
147
174
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 )
149
176
150
177
------------------------------------------------------------------------
151
178
-- Basic (non-)instances of Prime
152
179
153
180
¬prime[0] : ¬ Prime 0
154
- ¬prime[0] (() , _ )
181
+ ¬prime[0] ()
155
182
156
183
¬prime[1] : ¬ Prime 1
157
- ¬prime[1] (s<s () , _ )
184
+ ¬prime[1] ()
158
185
159
186
prime[2] : Prime 2
160
187
prime[2] = prime 2-rough
@@ -174,23 +201,31 @@ irreducible[2] {suc _} d∣2 with ∣⇒≤ d∣2
174
201
... | z<s = inj₁ refl
175
202
... | s<s z<s = inj₂ refl
176
203
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
+
177
213
------------------------------------------------------------------------
178
214
-- Decidability
179
215
180
216
composite? : Decidable Composite
181
217
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)
184
220
(anyUpTo? (λ d → 1 <? d ×-dec d ∣? n) n)
185
221
186
222
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)
194
229
195
230
irreducible? : Decidable Irreducible
196
231
irreducible? zero = no ¬irreducible[0]
@@ -209,29 +244,32 @@ irreducible? n@(suc _) = Dec.map′ bounded-irr⇒irr irr⇒bounded-irr
209
244
-- Relationships between compositeness, primality, and irreducibility
210
245
211
246
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]
213
248
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])
217
252
218
253
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]
220
255
221
256
-- 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)
225
260
226
261
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)
235
273
236
274
------------------------------------------------------------------------
237
275
-- Euclid's lemma
@@ -244,6 +282,7 @@ euclidsLemma : ∀ m n {p} → Prime p → p ∣ m * n → p ∣ m ⊎ p ∣ n
244
282
euclidsLemma m n {p} (prime pr) p∣m*n = result
245
283
where
246
284
open ∣-Reasoning
285
+ instance _ = nonTrivial⇒nonZero -- for NonZero p
247
286
248
287
p∣rmn : ∀ r → p ∣ r * m * n
249
288
p∣rmn r = begin
@@ -256,7 +295,7 @@ euclidsLemma m n {p} (prime pr) p∣m*n = result
256
295
result with Bézout.lemma m p
257
296
-- if the GCD of m and p is zero then p must be zero, which is
258
297
-- 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⁻¹ _ )
260
299
-- this should be a typechecker-rejectable case!?
261
300
262
301
-- 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
279
318
-- if the GCD of m and p is greater than one, then it must be p and hence p ∣ m.
280
319
... | Bézout.result d@(suc (suc _)) g _ with d ≟ p
281
320
... | 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)
283
322
where
284
323
d∣p : d ∣ p
285
324
d∣p = GCD.gcd∣n g
@@ -294,3 +333,4 @@ private
294
333
-- Example: 6 is composite
295
334
6-is-composite : Composite 6
296
335
6-is-composite = from-yes (composite? 6 )
336
+
0 commit comments