annotate automaton-in-agda/src/prime.agda @ 405:af8f630b7e60

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 24 Sep 2023 18:02:04 +0900
parents a3fb231feeb9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
405
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
1 {-# OPTIONS --cubical-compatible --safe #-}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
2
160
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 159
diff changeset
3 module prime where
57
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
5 open import Data.Nat
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
6 open import Data.Nat.Properties
57
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 open import Data.Empty
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
8 open import Data.Unit using (⊤ ; tt)
57
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 open import Relation.Nullary
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 open import Relation.Binary.PropositionalEquality
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
11 open import Relation.Binary.Definitions
57
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
148
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 147
diff changeset
13 open import gcd
142
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
14 open import nat
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
15
160
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 159
diff changeset
16 record Prime (i : ℕ ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 159
diff changeset
17 field
205
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
18 p>1 : i > 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
19 isPrime : ( j : ℕ ) → j < i → 0 < j → gcd i j ≡ 1
159
5530b3789e0c add even
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 148
diff changeset
20
5530b3789e0c add even
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 148
diff changeset
21
169
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 168
diff changeset
22 record NonPrime ( n : ℕ ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 168
diff changeset
23 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 168
diff changeset
24 factor : ℕ
171
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 170
diff changeset
25 prime : Prime factor
169
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 168
diff changeset
26 dividable : Dividable factor n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 168
diff changeset
27
199
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
28 PrimeP : ( n : ℕ ) → Dec ( Prime n )
205
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
29 PrimeP 0 = no (λ p → ⊥-elim ( nat-<> (Prime.p>1 p) (s≤s z≤n)))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
30 PrimeP 1 = no (λ p → ⊥-elim ( nat-≤> (Prime.p>1 p) (s≤s (≤-refl))))
225
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
31 PrimeP (suc (suc n)) = isPrime1 (suc (suc n)) (suc n) (s≤s (s≤s z≤n)) a<sa (λ i m<i i<n → isp0 (suc n) i (<to≤ m<i) i<n ) where
205
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
32 isp0 : (n : ℕ) (i : ℕ) ( n<i : n ≤ i) ( i<n : i < suc n ) → gcd (suc n) i ≡ 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
33 isp0 n i n<i i<n with <-cmp i n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
34 ... | tri< a ¬b ¬c = ⊥-elim ( nat-≤> n<i a)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
35 ... | tri≈ ¬a refl ¬c = gcd203 i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
36 ... | tri> ¬a ¬b c = ⊥-elim ( nat-≤> c i<n )
225
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
37 isPrime1 : ( n m : ℕ ) → n > 1 → m < n → ( (i : ℕ) → m < i → i < n → gcd n i ≡ 1 ) → Dec ( Prime n )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
38 isPrime1 n zero n>1 m<n lt = yes record { isPrime = λ j j<i 0<j → lt j 0<j j<i ; p>1 = n>1 }
205
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
39 isPrime1 n (suc m) n>1 m<n lt with <-cmp (gcd n (suc m)) 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
40 ... | tri< a ¬b ¬c = ⊥-elim ( nat-≤> ( gcd>0 n (suc m) (<-trans (s≤s z≤n) n>1) (s≤s z≤n)) a )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
41 ... | tri≈ ¬a b ¬c = isPrime1 n m n>1 (<-trans a<sa m<n) isp1 where
225
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
42 -- lt : (i : ℕ) → suc m ≤ i → suc i ≤ n → gcd1 n n i i ≡ 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
43 isp1 : (i : ℕ) → m < i → i < n → gcd n i ≡ 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
44 isp1 i m<i i<n with <-cmp (suc m) i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
45 ... | tri< a ¬b ¬c = lt i a i<n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
46 ... | tri≈ ¬a m=i ¬c = subst (λ k → gcd n k ≡ 1) m=i b -- gcd n (suc m) ≡ 1 → gcd n i ≡ 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
47 ... | tri> ¬a ¬b c = ⊥-elim ( nat-≤> m<i c) -- suc i ≤ suc m → i < m
205
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
48 ... | tri> ¬a ¬b c = no ( λ p → nat-≡< (sym (Prime.isPrime p (suc m) m<n (s≤s z≤n) )) c )
172
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 171
diff changeset
49
225
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
50 open import logic
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
51 open _∧_
226
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 225
diff changeset
52
255
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 252
diff changeset
53 -- find prime factor
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 252
diff changeset
54
229
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 228
diff changeset
55 data Factoring (m : ℕ ) : (n : ℕ) → Set where
230
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
56 findFactor : (n : ℕ) → m ≤ n → ( (j : ℕ ) → m ≤ j → j < n → gcd n j ≡ 1 ) → Factoring m n
229
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 228
diff changeset
57 skipFactor : (n : ℕ) → n < m → Factoring m n
226
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 225
diff changeset
58
205
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
59 nonPrime : { n : ℕ } → 1 < n → ¬ Prime n → NonPrime n
230
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
60 nonPrime {n} 1<n np = np1 n n np 1<n (findFactor n ≤-refl (λ j n≤j j<n → ⊥-elim (nat-≤> n≤j j<n ) )) where
229
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 228
diff changeset
61 mg1 : (n m : ℕ )→ ( (j : ℕ ) → m < j → j < n → gcd n j ≡ 1 ) → gcd n m ≡ 1 → (j : ℕ) → m ≤ j → j < n → gcd n j ≡ 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 228
diff changeset
62 mg1 n m mg gcd j m<j j<n with <-cmp m j
228
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 227
diff changeset
63 ... | tri< a ¬b ¬c = mg j a j<n
225
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
64 ... | tri≈ ¬a refl ¬c = gcd
228
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 227
diff changeset
65 ... | tri> ¬a ¬b c = ⊥-elim ( nat-≤> m<j c)
229
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 228
diff changeset
66 np1 : ( n m : ℕ ) → ¬ Prime n → 1 < n → Factoring m n → NonPrime n
230
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
67 np1 n zero np 1<n (findFactor n m≤n mg ) = ⊥-elim ( np record { isPrime = λ j lt _ → mg j z≤n lt ; p>1 = 1<n } ) -- zero < j , j < n
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
68 np1 n (suc m) np 1<n (findFactor n m≤n mg) with <-cmp ( gcd n m ) 1
228
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 227
diff changeset
69 ... | tri< a ¬b ¬c = ⊥-elim ( nat-≤> ( gcd>0 n m (<-trans (s≤s z≤n) 1<n) 0<m ) a ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 227
diff changeset
70 0<m : 0 < m
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 227
diff changeset
71 0<m with <-cmp 0 m
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 227
diff changeset
72 ... | tri< a ¬b ¬c = a
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 227
diff changeset
73 ... | tri≈ ¬a refl ¬c = ⊥-elim ( nat-<> a (subst (λ k → 1 < k) (sym (gcd20 n)) 1<n ))
230
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
74 ... | tri≈ ¬a b ¬c = np1 n m np 1<n (findFactor n (≤-trans refl-≤s m≤n) (mg1 n m mg b ) )
228
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 227
diff changeset
75 ... | tri> ¬a ¬b c with PrimeP ( gcd n m )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 227
diff changeset
76 ... | yes y = record { factor = gcd n m ; prime = y ; dividable = proj1 (gcd-dividable n m ) }
230
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
77 ... | no ngcd = np2 where
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
78 skip-case : NonPrime (gcd n m) → NonPrime n
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
79 skip-case cc = record { factor = NonPrime.factor cc ; prime = NonPrime.prime cc ; dividable =
229
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 228
diff changeset
80 record { factor = (Dividable.factor (proj1 (gcd-dividable n m))) * (Dividable.factor (NonPrime.dividable cc))
230
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
81 ; is-factor = begin
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
82 Dividable.factor (proj1 (gcd-dividable n m)) * Dividable.factor (NonPrime.dividable cc) * NonPrime.factor cc + 0 ≡⟨ refl ⟩
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
83 g * d * p + 0 ≡⟨ +-comm _ 0 ⟩
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
84 g * d * p ≡⟨ *-assoc g d p ⟩
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
85 g * (d * p) ≡⟨ cong (λ k → g * k ) (+-comm 0 _) ⟩
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
86 g * (d * p + 0) ≡⟨ cong (λ k → g * k ) (Dividable.is-factor (NonPrime.dividable cc) ) ⟩
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
87 g * gcd n m ≡⟨ +-comm 0 _ ⟩
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
88 g * gcd n m + 0 ≡⟨ Dividable.is-factor (proj1 (gcd-dividable n m)) ⟩
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
89 n ∎ }} where
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
90 open ≡-Reasoning
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
91 g = Dividable.factor (proj1 (gcd-dividable n m))
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
92 d = Dividable.factor (NonPrime.dividable cc)
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
93 p = NonPrime.factor cc
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
94 np2 : NonPrime n
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
95 np2 with <-cmp (gcd n m) m
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
96 ... | tri< a ¬b ¬c = skip-case (np1 (gcd n m) m ngcd c (skipFactor (gcd n m) a ))
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
97 ... | tri≈ ¬a b ¬c = skip-case (np1 (gcd n m) m ngcd c
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
98 (subst (λ k → Factoring m k) (sym b) (findFactor m ≤-refl (λ j n≤j j<n → ⊥-elim (nat-≤> n≤j j<n) ))))
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
99 ... | tri> ¬a ¬b' c with <-cmp 0 m
250
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 231
diff changeset
100 ... | tri< a ¬b ¬c = ⊥-elim ( nat-≤> (subst (λ k → k ≤ m) (gcdsym {m} {n}) (gcd-≤ a (<-trans a m≤n))) c )
230
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
101 ... | tri≈ ¬a' b' ¬c = ⊥-elim ( np record { isPrime = λ j lt 0<j → mg j (subst (λ k → k < j) b' 0<j) lt ; p>1 = 1<n } ) -- suc m ≤ j
229
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 228
diff changeset
102 np1 n zero np 1<n (skipFactor n ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 228
diff changeset
103 np1 n (suc m) np 1<n (skipFactor n n<m) with <-cmp m n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 228
diff changeset
104 ... | tri< a ¬b ¬c = ⊥-elim ( nat-≤> a n<m)
230
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
105 ... | tri> ¬a ¬b c = np1 n m np 1<n (skipFactor n c)
a72bcc6eadad prime done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 229
diff changeset
106 ... | tri≈ ¬a refl ¬c = np1 n m np 1<n (findFactor m ≤-refl (λ j n≤j j<n → ⊥-elim (nat-≤> n≤j j<n) ))
199
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
107
252
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
108 factorial : (n : ℕ) → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
109 factorial zero = 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
110 factorial (suc n) = (suc n) * (factorial n)
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 255
diff changeset
111
252
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
112 factorial-mono : (n : ℕ) → factorial n ≤ factorial (suc n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
113 factorial-mono n = begin
200
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
114 factorial n ≤⟨ x≤x+y ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
115 factorial n + n * factorial n ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
116 (suc n) * factorial n ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
117 factorial (suc n) ∎ where open ≤-Reasoning
252
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
118 factorial≥1 : {m : ℕ} → 1 ≤ factorial m
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
119 factorial≥1 {zero} = ≤-refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
120 factorial≥1 {suc m} = begin
200
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
121 1 ≤⟨ s≤s z≤n ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
122 (suc m) * 1 ≤⟨ *-monoʳ-≤ (suc m) (factorial≥1 {m}) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
123 (suc m) * factorial m ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
124 factorial (suc m) ∎ where open ≤-Reasoning
252
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
125 m<factorial : (m : ℕ) → m ≤ factorial m
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
126 m<factorial zero = z≤n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
127 m<factorial (suc m) = begin
200
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
128 suc m ≡⟨ cong suc (+-comm 0 _) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
129 1 * suc m ≡⟨ *-comm 1 _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
130 (suc m) * 1 ≤⟨ *-monoʳ-≤ (suc m) (factorial≥1 {m}) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
131 (suc m) * factorial m ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 199
diff changeset
132 factorial (suc m) ∎ where open ≤-Reasoning
252
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
133 -- *-monoˡ-≤ (suc m) {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
134 fact< : (m n : ℕ) → 0 < n → n < suc (suc m) → Dividable n ( factorial (suc m) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
135 fact< zero 1 0<n (s≤s (s≤s z≤n)) = record { factor = 1 ; is-factor = refl }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
136 fact< (suc m) (suc zero) 0<n n<m = record { factor = factorial (suc (suc m)) ; is-factor = begin
204
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
137 factorial (suc (suc m)) * 1 + 0 ≡⟨ +-comm _ 0 ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
138 factorial (suc (suc m)) * 1 ≡⟨ m*1=m ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
139 (suc (suc m)) * factorial (suc m) ≡⟨ refl ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
140 factorial (suc (suc m)) ∎ } where open ≡-Reasoning
252
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
141 fact< (suc m) (suc (suc n)) 0<n n<m with <-cmp (suc (suc n)) (suc (suc m))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
142 ... | tri< a ¬b ¬c = record { factor = suc (suc m) * Dividable.factor fact1 ; is-factor = fact2 } where
203
f1ee71c7c93a another method on fact<
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 202
diff changeset
143 fact1 : Dividable (suc (suc n)) (factorial (suc m ))
f1ee71c7c93a another method on fact<
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 202
diff changeset
144 fact1 = fact< m (suc (suc n)) 0<n a
204
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
145 d = (fact< m (suc (suc n)) 0<n a)
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
146 fact2 : suc (suc m) * Dividable.factor d * suc (suc n) + 0 ≡ factorial (suc (suc m))
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
147 fact2 = begin
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
148 suc (suc m) * Dividable.factor d * suc (suc n) + 0 ≡⟨ +-comm _ 0 ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
149 suc (suc m) * Dividable.factor d * suc (suc n) ≡⟨ *-assoc (suc (suc m)) (Dividable.factor d) ( suc (suc n)) ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
150 suc (suc m) * (Dividable.factor d * suc (suc n)) ≡⟨ cong (λ k → suc (suc m) * k ) ( +-comm 0 (Dividable.factor d * suc (suc n)) ) ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
151 suc (suc m) * (Dividable.factor d * suc (suc n) + 0) ≡⟨ cong (λ k → suc (suc m) * k ) (Dividable.is-factor d) ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
152 suc (suc m) * factorial (suc m) ≡⟨ refl ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
153 factorial (suc (suc m)) ∎ where open ≡-Reasoning
252
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
154 ... | tri≈ ¬a b ¬c = record { factor = factorial (suc m) ; is-factor = begin
204
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
155 factorial (suc m) * suc (suc n) + 0 ≡⟨ +-comm _ 0 ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
156 factorial (suc m) * suc (suc n) ≡⟨ *-comm (factorial (suc m)) (suc (suc n)) ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
157 (suc (suc n)) * factorial (suc m) ≡⟨ cong (λ k → k * factorial (suc m) ) b ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
158 (suc (suc m)) * factorial (suc m) ≡⟨ refl ⟩
a366f36b1ce9 <fact done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 203
diff changeset
159 factorial (suc (suc m)) ∎ } where open ≡-Reasoning
252
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
160 ... | tri> ¬a ¬b c = ⊥-elim ( nat-≤> c n<m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
161
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
162 f>m : {m : ℕ} → suc m < suc (factorial (suc m))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
163 f>m {m} = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
164 suc (suc m) ≡⟨ cong (λ k → 1 + suc k ) (+-comm _ m) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
165 suc (1 + 1 * m) ≡⟨ cong (λ k → suc (1 + k )) (*-comm 1 m) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
166 suc (1 + m * 1) ≤⟨ s≤s (s≤s (*-monoʳ-≤ m (factorial≥1 {m}) )) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
167 suc (1 + m * factorial m) ≤⟨ s≤s (+-monoˡ-≤ _ (factorial≥1 {m})) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
168 suc (factorial m + m * factorial m) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
169 suc (factorial (suc m)) ∎ where open ≤-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
170
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
171 prime-is-infinite : (max-prime : ℕ ) → ¬ ( (j : ℕ) → max-prime < j → ¬ Prime j )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
172 prime-is-infinite zero pmax = pmax 3 (s≤s z≤n) record { isPrime = λ n lt 0<j → pif3 n lt 0<j ; p>1 = s≤s (s≤s z≤n) } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
173 pif3 : (n : ℕ) → n < 3 → 0 < n → gcd 3 n ≡ 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
174 pif3 .1 (s≤s (s≤s z≤n)) _ = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
175 pif3 .2 (s≤s (s≤s (s≤s z≤n))) _ = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
176 prime-is-infinite (suc m) pmax = newPrime where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
177 prime<max : (n : ℕ ) → Prime n → n < suc (suc m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
178 prime<max n p with <-cmp n (suc m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
179 ... | tri< a ¬b ¬c = ≤-trans a refl-≤s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
180 ... | tri≈ ¬a refl ¬c = ≤-refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 250
diff changeset
181 ... | tri> ¬a ¬b c = ⊥-elim ( pmax n c p )
199
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
182 fact : (n : ℕ) → Prime n → Dividable n ( factorial (suc m) )
205
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
183 fact n p = fact< m n (<-trans (s≤s z≤n) (Prime.p>1 p)) ( prime<max n p )
199
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
184 -- div+1 : { i k : ℕ } → k > 1 → Dividable k i → ¬ Dividable k (suc i)
231
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 230
diff changeset
185 newPrime : ⊥
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 230
diff changeset
186 newPrime with PrimeP ( suc (factorial (suc m)) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 230
diff changeset
187 ... | yes p = pmax _ f>m p -- yes, we found a prime not in list
205
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 204
diff changeset
188 ... | no np = div+1 (Prime.p>1 (NonPrime.prime p1)) (fact (NonPrime.factor p1) (NonPrime.prime p1) ) (NonPrime.dividable p1) where
231
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 230
diff changeset
189 -- n!+1 cannot be dividable, because n! is dividable
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 230
diff changeset
190 -- the factor need not be a prime, but anyway we prove that there is a prime factor in NonPrime
199
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
191 p1 : NonPrime ( suc (factorial (suc m)) )
225
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
192 p1 = nonPrime (begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
193 2 ≤⟨ s≤s ( s≤s z≤n) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
194 suc (suc m) ≤⟨ s≤s (m<factorial (suc m)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 205
diff changeset
195 suc (factorial (suc m)) ∎ ) np where open ≤-Reasoning