Mercurial > hg > Members > kono > Proof > automaton
annotate automaton-in-agda/src/gcd.agda @ 237:709e63cb9d19
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 27 Jun 2021 23:13:07 +0900 |
parents | 9f7e4a4415f7 |
children | 3aad251b8d8b |
rev | line source |
---|---|
148 | 1 {-# OPTIONS --allow-unsolved-metas #-} |
2 module gcd where | |
57 | 3 |
141 | 4 open import Data.Nat |
5 open import Data.Nat.Properties | |
57 | 6 open import Data.Empty |
141 | 7 open import Data.Unit using (⊤ ; tt) |
57 | 8 open import Relation.Nullary |
9 open import Relation.Binary.PropositionalEquality | |
141 | 10 open import Relation.Binary.Definitions |
149 | 11 open import nat |
151 | 12 open import logic |
57 | 13 |
164 | 14 record Factor (n m : ℕ ) : Set where |
15 field | |
16 factor : ℕ | |
17 remain : ℕ | |
18 is-factor : factor * n + remain ≡ m | |
19 | |
165 | 20 record Dividable (n m : ℕ ) : Set where |
21 field | |
22 factor : ℕ | |
23 is-factor : factor * n + 0 ≡ m | |
24 | |
164 | 25 open Factor |
26 | |
193
875eb1fa9694
dividable reorganzaiton
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
192
diff
changeset
|
27 DtoF : {n m : ℕ} → Dividable n m → Factor n m |
195 | 28 DtoF {n} {m} record { factor = f ; is-factor = fa } = record { factor = f ; remain = 0 ; is-factor = fa } |
193
875eb1fa9694
dividable reorganzaiton
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
192
diff
changeset
|
29 |
195 | 30 FtoD : {n m : ℕ} → (fc : Factor n m) → remain fc ≡ 0 → Dividable n m |
31 FtoD {n} {m} record { factor = f ; remain = r ; is-factor = fa } refl = record { factor = f ; is-factor = fa } | |
164 | 32 |
199 | 33 --divdable^2 : ( n k : ℕ ) → Dividable k ( n * n ) → Dividable k n |
34 --divdable^2 n k dn2 = {!!} | |
35 | |
164 | 36 decf : { n k : ℕ } → ( x : Factor k (suc n) ) → Factor k n |
191 | 37 decf {n} {k} record { factor = f ; remain = r ; is-factor = fa } = |
38 decf1 {n} {k} f r fa where | |
39 decf1 : { n k : ℕ } → (f r : ℕ) → (f * k + r ≡ suc n) → Factor k n | |
40 decf1 {n} {k} f (suc r) fa = -- this case must be the first | |
187 | 41 record { factor = f ; remain = r ; is-factor = ( begin -- fa : f * k + suc r ≡ suc n |
189
6945d2aeb86a
expanding record does not work
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
188
diff
changeset
|
42 f * k + r ≡⟨ cong pred ( begin |
6945d2aeb86a
expanding record does not work
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
188
diff
changeset
|
43 suc ( f * k + r ) ≡⟨ +-comm _ r ⟩ |
6945d2aeb86a
expanding record does not work
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
188
diff
changeset
|
44 r + suc (f * k) ≡⟨ sym (+-assoc r 1 _) ⟩ |
6945d2aeb86a
expanding record does not work
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
188
diff
changeset
|
45 (r + 1) + f * k ≡⟨ cong (λ t → t + f * k ) (+-comm r 1) ⟩ |
6945d2aeb86a
expanding record does not work
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
188
diff
changeset
|
46 (suc r ) + f * k ≡⟨ +-comm (suc r) _ ⟩ |
6945d2aeb86a
expanding record does not work
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
188
diff
changeset
|
47 f * k + suc r ≡⟨ fa ⟩ |
187 | 48 suc n ∎ ) ⟩ |
191 | 49 n ∎ ) } where open ≡-Reasoning |
50 decf1 {n} {zero} (suc f) zero fa = ⊥-elim ( nat-≡< fa ( | |
51 begin suc (suc f * zero + zero) ≡⟨ cong suc (+-comm _ zero) ⟩ | |
52 suc (f * 0) ≡⟨ cong suc (*-comm f zero) ⟩ | |
53 suc zero ≤⟨ s≤s z≤n ⟩ | |
54 suc n ∎ )) where open ≤-Reasoning | |
55 decf1 {n} {suc k} (suc f) zero fa = | |
56 record { factor = f ; remain = k ; is-factor = ( begin -- fa : suc (k + f * suc k + zero) ≡ suc n | |
57 f * suc k + k ≡⟨ +-comm _ k ⟩ | |
58 k + f * suc k ≡⟨ +-comm zero _ ⟩ | |
59 (k + f * suc k) + zero ≡⟨ cong pred fa ⟩ | |
60 n ∎ ) } where open ≡-Reasoning | |
164 | 61 |
196 | 62 div0 : {k : ℕ} → Dividable k 0 |
63 div0 {k} = record { factor = 0; is-factor = refl } | |
64 | |
209 | 65 div= : {k : ℕ} → Dividable k k |
66 div= {k} = record { factor = 1; is-factor = ( begin | |
67 k + 0 * k + 0 ≡⟨ trans ( +-comm _ 0) ( +-comm _ 0) ⟩ | |
68 k ∎ ) } where open ≡-Reasoning | |
69 | |
165 | 70 gcd1 : ( i i0 j j0 : ℕ ) → ℕ |
71 gcd1 zero i0 zero j0 with <-cmp i0 j0 | |
72 ... | tri< a ¬b ¬c = i0 | |
73 ... | tri≈ ¬a refl ¬c = i0 | |
74 ... | tri> ¬a ¬b c = j0 | |
75 gcd1 zero i0 (suc zero) j0 = 1 | |
76 gcd1 zero zero (suc (suc j)) j0 = j0 | |
77 gcd1 zero (suc i0) (suc (suc j)) j0 = gcd1 i0 (suc i0) (suc j) (suc (suc j)) | |
78 gcd1 (suc zero) i0 zero j0 = 1 | |
79 gcd1 (suc (suc i)) i0 zero zero = i0 | |
80 gcd1 (suc (suc i)) i0 zero (suc j0) = gcd1 (suc i) (suc (suc i)) j0 (suc j0) | |
81 gcd1 (suc i) i0 (suc j) j0 = gcd1 i i0 j j0 | |
82 | |
83 gcd : ( i j : ℕ ) → ℕ | |
84 gcd i j = gcd1 i i j j | |
85 | |
209 | 86 gcd20 : (i : ℕ) → gcd i 0 ≡ i |
87 gcd20 zero = refl | |
88 gcd20 (suc i) = gcd201 (suc i) where | |
89 gcd201 : (i : ℕ ) → gcd1 i i zero zero ≡ i | |
90 gcd201 zero = refl | |
91 gcd201 (suc zero) = refl | |
92 gcd201 (suc (suc i)) = refl | |
93 | |
94 gcd22 : ( i i0 o o0 : ℕ ) → gcd1 (suc i) i0 (suc o) o0 ≡ gcd1 i i0 o o0 | |
95 gcd22 zero i0 zero o0 = refl | |
96 gcd22 zero i0 (suc o) o0 = refl | |
97 gcd22 (suc i) i0 zero o0 = refl | |
98 gcd22 (suc i) i0 (suc o) o0 = refl | |
99 | |
100 gcdmm : (n m : ℕ) → gcd1 n m n m ≡ m | |
101 gcdmm zero m with <-cmp m m | |
102 ... | tri< a ¬b ¬c = refl | |
103 ... | tri≈ ¬a refl ¬c = refl | |
104 ... | tri> ¬a ¬b c = refl | |
105 gcdmm (suc n) m = subst (λ k → k ≡ m) (sym (gcd22 n m n m )) (gcdmm n m ) | |
106 | |
107 gcdsym2 : (i j : ℕ) → gcd1 zero i zero j ≡ gcd1 zero j zero i | |
108 gcdsym2 i j with <-cmp i j | <-cmp j i | |
109 ... | tri< a ¬b ¬c | tri< a₁ ¬b₁ ¬c₁ = ⊥-elim (nat-<> a a₁) | |
110 ... | tri< a ¬b ¬c | tri≈ ¬a b ¬c₁ = ⊥-elim (nat-≡< (sym b) a) | |
111 ... | tri< a ¬b ¬c | tri> ¬a ¬b₁ c = refl | |
112 ... | tri≈ ¬a b ¬c | tri< a ¬b ¬c₁ = ⊥-elim (nat-≡< (sym b) a) | |
113 ... | tri≈ ¬a refl ¬c | tri≈ ¬a₁ refl ¬c₁ = refl | |
114 ... | tri≈ ¬a b ¬c | tri> ¬a₁ ¬b c = ⊥-elim (nat-≡< b c) | |
115 ... | tri> ¬a ¬b c | tri< a ¬b₁ ¬c = refl | |
116 ... | tri> ¬a ¬b c | tri≈ ¬a₁ b ¬c = ⊥-elim (nat-≡< b c) | |
117 ... | tri> ¬a ¬b c | tri> ¬a₁ ¬b₁ c₁ = ⊥-elim (nat-<> c c₁) | |
118 gcdsym1 : ( i i0 j j0 : ℕ ) → gcd1 i i0 j j0 ≡ gcd1 j j0 i i0 | |
119 gcdsym1 zero zero zero zero = refl | |
120 gcdsym1 zero zero zero (suc j0) = refl | |
121 gcdsym1 zero (suc i0) zero zero = refl | |
122 gcdsym1 zero (suc i0) zero (suc j0) = gcdsym2 (suc i0) (suc j0) | |
123 gcdsym1 zero zero (suc zero) j0 = refl | |
124 gcdsym1 zero zero (suc (suc j)) j0 = refl | |
125 gcdsym1 zero (suc i0) (suc zero) j0 = refl | |
126 gcdsym1 zero (suc i0) (suc (suc j)) j0 = gcdsym1 i0 (suc i0) (suc j) (suc (suc j)) | |
127 gcdsym1 (suc zero) i0 zero j0 = refl | |
128 gcdsym1 (suc (suc i)) i0 zero zero = refl | |
129 gcdsym1 (suc (suc i)) i0 zero (suc j0) = gcdsym1 (suc i) (suc (suc i))j0 (suc j0) | |
130 gcdsym1 (suc i) i0 (suc j) j0 = subst₂ (λ j k → j ≡ k ) (sym (gcd22 i _ _ _)) (sym (gcd22 j _ _ _)) (gcdsym1 i i0 j j0 ) | |
131 | |
132 gcdsym : { n m : ℕ} → gcd n m ≡ gcd m n | |
133 gcdsym {n} {m} = gcdsym1 n n m m | |
134 | |
135 gcd11 : ( i : ℕ ) → gcd i i ≡ i | |
136 gcd11 i = gcdmm i i | |
137 | |
212 | 138 |
139 gcd203 : (i : ℕ) → gcd1 (suc i) (suc i) i i ≡ 1 | |
140 gcd203 zero = refl | |
141 gcd203 (suc i) = gcd205 (suc i) where | |
142 gcd205 : (j : ℕ) → gcd1 (suc j) (suc (suc i)) j (suc i) ≡ 1 | |
143 gcd205 zero = refl | |
144 gcd205 (suc j) = subst (λ k → k ≡ 1) (gcd22 (suc j) (suc (suc i)) j (suc i)) (gcd205 j) | |
145 | |
146 gcd204 : (i : ℕ) → gcd1 1 1 i i ≡ 1 | |
147 gcd204 zero = refl | |
148 gcd204 (suc zero) = refl | |
149 gcd204 (suc (suc zero)) = refl | |
150 gcd204 (suc (suc (suc i))) = gcd204 (suc (suc i)) | |
151 | |
152 gcd+j : ( i j : ℕ ) → gcd (i + j) j ≡ gcd i j | |
153 gcd+j i j = gcd200 i i j j refl refl where | |
154 gcd202 : (i j1 : ℕ) → (i + suc j1) ≡ suc (i + j1) | |
155 gcd202 zero j1 = refl | |
156 gcd202 (suc i) j1 = cong suc (gcd202 i j1) | |
157 gcd201 : (i i0 j j0 j1 : ℕ) → gcd1 (i + j1) (i0 + suc j) j1 j0 ≡ gcd1 i (i0 + suc j) zero j0 | |
158 gcd201 i i0 j j0 zero = subst (λ k → gcd1 k (i0 + suc j) zero j0 ≡ gcd1 i (i0 + suc j) zero j0 ) (+-comm zero i) refl | |
159 gcd201 i i0 j j0 (suc j1) = begin | |
160 gcd1 (i + suc j1) (i0 + suc j) (suc j1) j0 ≡⟨ cong (λ k → gcd1 k (i0 + suc j) (suc j1) j0 ) (gcd202 i j1) ⟩ | |
161 gcd1 (suc (i + j1)) (i0 + suc j) (suc j1) j0 ≡⟨ gcd22 (i + j1) (i0 + suc j) j1 j0 ⟩ | |
162 gcd1 (i + j1) (i0 + suc j) j1 j0 ≡⟨ gcd201 i i0 j j0 j1 ⟩ | |
163 gcd1 i (i0 + suc j) zero j0 ∎ where open ≡-Reasoning | |
164 gcd200 : (i i0 j j0 : ℕ) → i ≡ i0 → j ≡ j0 → gcd1 (i + j) (i0 + j) j j0 ≡ gcd1 i i j0 j0 | |
165 gcd200 i .i zero .0 refl refl = subst (λ k → gcd1 k k zero zero ≡ gcd1 i i zero zero ) (+-comm zero i) refl | |
166 gcd200 (suc (suc i)) i0 (suc j) (suc j0) i=i0 j=j0 = gcd201 (suc (suc i)) i0 j (suc j0) (suc j) | |
167 gcd200 zero zero (suc zero) .1 i=i0 refl = refl | |
168 gcd200 zero zero (suc (suc j)) .(suc (suc j)) i=i0 refl = begin | |
169 gcd1 (zero + suc (suc j)) (zero + suc (suc j)) (suc (suc j)) (suc (suc j)) ≡⟨ gcdmm (suc (suc j)) (suc (suc j)) ⟩ | |
170 suc (suc j) ≡⟨ sym (gcd20 (suc (suc j))) ⟩ | |
171 gcd1 zero zero (suc (suc j)) (suc (suc j)) ∎ where open ≡-Reasoning | |
172 gcd200 zero (suc i0) (suc j) .(suc j) () refl | |
173 gcd200 (suc zero) .1 (suc j) .(suc j) refl refl = begin | |
174 gcd1 (1 + suc j) (1 + suc j) (suc j) (suc j) ≡⟨ gcd203 (suc j) ⟩ | |
175 1 ≡⟨ sym ( gcd204 (suc j)) ⟩ | |
176 gcd1 1 1 (suc j) (suc j) ∎ where open ≡-Reasoning | |
177 gcd200 (suc (suc i)) i0 (suc j) zero i=i0 () | |
178 | |
196 | 179 div1 : { k : ℕ } → k > 1 → ¬ Dividable k 1 |
180 div1 {k} k>1 record { factor = (suc f) ; is-factor = fa } = ⊥-elim ( nat-≡< (sym fa) ( begin | |
181 2 ≤⟨ k>1 ⟩ | |
182 k ≡⟨ +-comm 0 _ ⟩ | |
183 k + 0 ≡⟨ refl ⟩ | |
184 1 * k ≤⟨ *-mono-≤ {1} {suc f} (s≤s z≤n ) ≤-refl ⟩ | |
185 suc f * k ≡⟨ +-comm 0 _ ⟩ | |
186 suc f * k + 0 ∎ )) where open ≤-Reasoning | |
187 | |
213 | 188 div+div : { i j k : ℕ } → Dividable k i → Dividable k j → Dividable k (i + j) ∧ Dividable k (j + i) |
189 div+div {i} {j} {k} di dj = ⟪ div+div1 , subst (λ g → Dividable k g) (+-comm i j) div+div1 ⟫ where | |
190 fki = Dividable.factor di | |
191 fkj = Dividable.factor dj | |
192 div+div1 : Dividable k (i + j) | |
193 div+div1 = record { factor = fki + fkj ; is-factor = ( begin | |
194 (fki + fkj) * k + 0 ≡⟨ +-comm _ 0 ⟩ | |
195 (fki + fkj) * k ≡⟨ *-distribʳ-+ k fki _ ⟩ | |
196 fki * k + fkj * k ≡⟨ cong₂ ( λ i j → i + j ) (+-comm 0 (fki * k)) (+-comm 0 (fkj * k)) ⟩ | |
197 (fki * k + 0) + (fkj * k + 0) ≡⟨ cong₂ ( λ i j → i + j ) (Dividable.is-factor di) (Dividable.is-factor dj) ⟩ | |
198 i + j ∎ ) } where | |
199 open ≡-Reasoning | |
200 | |
197 | 201 div-div : { i j k : ℕ } → k > 1 → Dividable k i → Dividable k j → Dividable k (i - j) ∧ Dividable k (j - i) |
213 | 202 div-div {i} {j} {k} k>1 di dj = ⟪ div-div1 di dj , div-div1 dj di ⟫ where |
203 div-div1 : {i j : ℕ } → Dividable k i → Dividable k j → Dividable k (i - j) | |
204 div-div1 {i} {j} di dj = record { factor = fki - fkj ; is-factor = ( begin | |
205 (fki - fkj) * k + 0 ≡⟨ +-comm _ 0 ⟩ | |
206 (fki - fkj) * k ≡⟨ distr-minus-* {fki} {fkj} ⟩ | |
207 (fki * k) - (fkj * k) ≡⟨ cong₂ ( λ i j → i - j ) (+-comm 0 (fki * k)) (+-comm 0 (fkj * k)) ⟩ | |
208 (fki * k + 0) - (fkj * k + 0) ≡⟨ cong₂ ( λ i j → i - j ) (Dividable.is-factor di) (Dividable.is-factor dj) ⟩ | |
209 i - j ∎ ) } where | |
197 | 210 open ≡-Reasoning |
213 | 211 fki = Dividable.factor di |
212 fkj = Dividable.factor dj | |
197 | 213 |
196 | 214 open _∧_ |
192 | 215 |
215 | 216 div+1 : { i k : ℕ } → k > 1 → Dividable k i → ¬ Dividable k (suc i) |
217 div+1 {i} {k} k>1 d d1 = div1 k>1 div+11 where | |
218 div+11 : Dividable k 1 | |
219 div+11 = subst (λ g → Dividable k g) (minus+y-y {1} {i} ) ( proj2 (div-div k>1 d d1 ) ) | |
220 | |
221 div<k : { m k : ℕ } → k > 1 → m > 0 → m < k → ¬ Dividable k m | |
222 div<k {m} {k} k>1 m>0 m<k d = ⊥-elim ( nat-≤> (div<k1 (Dividable.factor d) (Dividable.is-factor d)) m<k ) where | |
223 div<k1 : (f : ℕ ) → f * k + 0 ≡ m → k ≤ m | |
224 div<k1 zero eq = ⊥-elim (nat-≡< eq m>0 ) | |
225 div<k1 (suc f) eq = begin | |
226 k ≤⟨ x≤x+y ⟩ | |
227 k + (f * k + 0) ≡⟨ sym (+-assoc k _ _) ⟩ | |
228 k + f * k + 0 ≡⟨ eq ⟩ | |
229 m ∎ where open ≤-Reasoning | |
230 | |
227 | 231 div→k≤m : { m k : ℕ } → k > 1 → m > 0 → Dividable k m → m ≥ k |
232 div→k≤m {m} {k} k>1 m>0 d with <-cmp m k | |
233 ... | tri< a ¬b ¬c = ⊥-elim ( div<k k>1 m>0 a d ) | |
234 ... | tri≈ ¬a refl ¬c = ≤-refl | |
235 ... | tri> ¬a ¬b c = <to≤ c | |
236 | |
215 | 237 div1*k+0=k : {k : ℕ } → 1 * k + 0 ≡ k |
238 div1*k+0=k {k} = begin | |
239 1 * k + 0 ≡⟨ cong (λ g → g + 0) (+-comm _ 0) ⟩ | |
240 k + 0 ≡⟨ +-comm _ 0 ⟩ | |
241 k ∎ where open ≡-Reasoning | |
242 | |
220 | 243 decD : {k m : ℕ} → k > 1 → Dec (Dividable k m ) |
244 decD {k} {m} k>1 = n-induction {_} {_} {ℕ} {λ m → Dec (Dividable k m ) } F I m where | |
215 | 245 F : ℕ → ℕ |
216 | 246 F m = m |
220 | 247 F0 : ( m : ℕ ) → F (m - k) ≡ 0 → Dec (Dividable k m ) |
248 F0 0 eq = yes record { factor = 0 ; is-factor = refl } | |
215 | 249 F0 (suc m) eq with <-cmp k (suc m) |
220 | 250 ... | tri< a ¬b ¬c = yes record { factor = 1 ; is-factor = |
251 subst (λ g → 1 * k + 0 ≡ g ) (sym (i-j=0→i=j (<to≤ a) eq )) div1*k+0=k } where -- (suc m - k) ≡ 0 → k ≡ suc m, k ≤ suc m | |
252 ... | tri≈ ¬a refl ¬c = yes record { factor = 1 ; is-factor = div1*k+0=k } | |
253 ... | tri> ¬a ¬b c = no ( λ d → ⊥-elim (div<k k>1 (s≤s z≤n ) c d) ) | |
216 | 254 decl : {m : ℕ } → 0 < m → m - k < m |
217 | 255 decl {m} 0<m = y-x<y (<-trans a<sa k>1 ) 0<m |
220 | 256 ind : (p : ℕ ) → Dec (Dividable k (p - k) ) → Dec (Dividable k p ) |
257 ind p (yes y) with <-cmp p k | |
258 ... | tri≈ ¬a refl ¬c = yes (subst (λ g → Dividable k g) (minus+n ≤-refl ) (proj1 ( div+div y div= ))) | |
259 ... | tri> ¬a ¬b k<p = yes (subst (λ g → Dividable k g) (minus+n (<-trans k<p a<sa)) (proj1 ( div+div y div= ))) | |
221 | 260 ... | tri< a ¬b ¬c with <-cmp p 0 |
261 ... | tri≈ ¬a refl ¬c₁ = yes div0 | |
262 ... | tri> ¬a ¬b₁ c = no (λ d → not-div p (Dividable.factor d) a c (Dividable.is-factor d) ) where | |
263 not-div : (p f : ℕ) → p < k → 0 < p → f * k + 0 ≡ p → ⊥ | |
264 not-div (suc p) (suc f) p<k 0<p eq = nat-≡< (sym eq) ( begin -- ≤-trans p<k {!!}) -- suc p ≤ k | |
265 suc (suc p) ≤⟨ p<k ⟩ | |
266 k ≤⟨ x≤x+y ⟩ | |
267 k + (f * k + 0) ≡⟨ sym (+-assoc k _ _) ⟩ | |
268 suc f * k + 0 ∎ ) where open ≤-Reasoning | |
220 | 269 ind p (no n) = no (λ d → n (proj1 (div-div k>1 d div=)) ) |
216 | 270 I : Ninduction ℕ _ F |
215 | 271 I = record { |
216 | 272 pnext = λ p → p - k |
217 | 273 ; fzero = λ {m} eq → F0 m eq |
219 | 274 ; decline = λ {m} lt → decl lt |
217 | 275 ; ind = λ {p} prev → ind p prev |
215 | 276 } |
277 | |
193
875eb1fa9694
dividable reorganzaiton
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
192
diff
changeset
|
278 gcd-gt : ( i i0 j j0 k : ℕ ) → k > 1 → (if : Factor k i) (i0f : Dividable k i0 ) (jf : Factor k j ) (j0f : Dividable k j0) |
196 | 279 → Dividable k (i - j) ∧ Dividable k (j - i) |
165 | 280 → Dividable k ( gcd1 i i0 j j0 ) |
196 | 281 gcd-gt zero i0 zero j0 k k>1 if i0f jf j0f i-j with <-cmp i0 j0 |
194 | 282 ... | tri< a ¬b ¬c = i0f |
283 ... | tri≈ ¬a refl ¬c = i0f | |
284 ... | tri> ¬a ¬b c = j0f | |
196 | 285 gcd-gt zero i0 (suc zero) j0 k k>1 if i0f jf j0f i-j = ⊥-elim (div1 k>1 (proj2 i-j)) -- can't happen |
286 gcd-gt zero zero (suc (suc j)) j0 k k>1 if i0f jf j0f i-j = j0f | |
287 gcd-gt zero (suc i0) (suc (suc j)) j0 k k>1 if i0f jf j0f i-j = | |
197 | 288 gcd-gt i0 (suc i0) (suc j) (suc (suc j)) k k>1 (decf (DtoF i0f)) i0f (decf jf) (proj2 i-j) (div-div k>1 i0f (proj2 i-j)) |
196 | 289 gcd-gt (suc zero) i0 zero j0 k k>1 if i0f jf j0f i-j = ⊥-elim (div1 k>1 (proj1 i-j)) -- can't happen |
290 gcd-gt (suc (suc i)) i0 zero zero k k>1 if i0f jf j0f i-j = i0f | |
291 gcd-gt (suc (suc i)) i0 zero (suc j0) k k>1 if i0f jf j0f i-j = -- | |
197 | 292 gcd-gt (suc i) (suc (suc i)) j0 (suc j0) k k>1 (decf if) (proj1 i-j) (decf (DtoF j0f)) j0f (div-div k>1 (proj1 i-j) j0f ) |
196 | 293 gcd-gt (suc zero) i0 (suc j) j0 k k>1 if i0f jf j0f i-j = |
294 gcd-gt zero i0 j j0 k k>1 (decf if) i0f (decf jf) j0f i-j | |
295 gcd-gt (suc (suc i)) i0 (suc j) j0 k k>1 if i0f jf j0f i-j = | |
296 gcd-gt (suc i) i0 j j0 k k>1 (decf if) i0f (decf jf) j0f i-j | |
164 | 297 |
194 | 298 gcd-div : ( i j k : ℕ ) → k > 1 → (if : Dividable k i) (jf : Dividable k j ) |
186 | 299 → Dividable k ( gcd i j ) |
197 | 300 gcd-div i j k k>1 if jf = gcd-gt i i j j k k>1 (DtoF if) if (DtoF jf) jf (div-div k>1 if jf) |
143 | 301 |
237 | 302 -- gcd loop invariant |
303 -- | |
304 record GCD ( i i0 j j0 : ℕ ) : Set where | |
305 i<i0 : i ≤ i0 | |
306 j<j0 : j ≤ j0 | |
307 div-i : Dividable i0 (j0 + i - j ) | |
308 div-j : Dividable j0 (i0 + j - i) | |
309 | |
310 gcd-next : {i i0 j j0 : ℕ} → GCD (suc i) i0 (suc j) j0 → GCD i i0 j j0 | |
311 gcd-next = ? | |
312 | |
235 | 313 di-next : {i i0 j j0 : ℕ} → Dividable i0 ((j0 + suc i) - suc j ) ∧ Dividable j0 ((i0 + suc j) - suc i) → |
314 Dividable i0 ((j0 + i) - j ) ∧ Dividable j0 ((i0 + j) - i) | |
315 di-next {i} {i0} {j} {j0} x = | |
316 ⟪ ( subst (λ k → Dividable i0 (k - suc j)) ( begin | |
317 j0 + suc i ≡⟨ sym (+-assoc j0 1 i ) ⟩ | |
318 (j0 + 1) + i ≡⟨ cong (λ k → k + i) (+-comm j0 _ ) ⟩ | |
319 suc (j0 + i) ∎ ) (proj1 x) ) , | |
320 ( subst (λ k → Dividable j0 (k - suc i)) ( begin | |
321 i0 + suc j ≡⟨ sym (+-assoc i0 1 j ) ⟩ | |
322 (i0 + 1) + j ≡⟨ cong (λ k → k + j) (+-comm i0 _ ) ⟩ | |
323 suc (i0 + j) ∎ ) (proj2 x) ) ⟫ | |
324 where open ≡-Reasoning | |
325 | |
237 | 326 gcd-next1 : {i0 j j0 : ℕ} → GCD 0 (suc i0) (suc (suc j)) j0 → GCD (suc (suc j)) (suc i0) (suc i0 + suc j) (suc (suc j)) |
327 gcd-next1 = ? | |
328 | |
235 | 329 di-next1 : {i0 j j0 : ℕ} → Dividable (suc i0) ((j0 + 0) - (suc (suc j))) ∧ Dividable j0 (suc (i0 + suc (suc j))) |
330 → Dividable (suc i0) ((suc (suc j) + i0) - suc j) ∧ Dividable (suc (suc j)) ((suc i0 + suc j) - i0) | |
331 di-next1 {i0} {j} {j0} x = | |
332 ⟪ record { factor = 1 ; is-factor = begin | |
333 1 * suc i0 + 0 ≡⟨ cong suc ( trans (+-comm _ 0) (+-comm _ 0) ) ⟩ | |
334 suc i0 ≡⟨ sym (minus+y-y {suc i0} {j}) ⟩ | |
335 (suc i0 + j) - j ≡⟨ cong (λ k → k - j ) (+-comm (suc i0) _ ) ⟩ | |
336 (suc j + suc i0 ) - suc j ≡⟨ cong (λ k → k - suc j) (sym (+-assoc (suc j) 1 i0 )) ⟩ | |
337 ((suc j + 1) + i0) - suc j ≡⟨ cong (λ k → (k + i0) - suc j) (+-comm _ 1) ⟩ | |
338 (suc (suc j) + i0) - suc j ∎ } , | |
339 subst (λ k → Dividable (suc (suc j)) k) ( begin | |
340 suc (suc j) ≡⟨ sym ( minus+y-y {suc (suc j)}{i0} ) ⟩ | |
341 (suc (suc j) + i0 ) - i0 ≡⟨ cong (λ k → (k + i0) - i0) (cong suc (+-comm 1 _ )) ⟩ | |
342 ((suc j + 1) + i0 ) - i0 ≡⟨ cong (λ k → k - i0) (+-assoc (suc j) 1 _ ) ⟩ | |
343 (suc j + suc i0 ) - i0 ≡⟨ cong (λ k → k - i0) (+-comm (suc j) _) ⟩ | |
344 ((suc i0 + suc j) - i0) ∎ ) div= ⟫ | |
345 where open ≡-Reasoning | |
346 | |
231 | 347 -- gcd-dividable1 : ( i i0 j j0 : ℕ ) |
348 -- → Dividable i0 (j0 + i - j ) ∨ Dividable j0 (i0 + j - i) | |
349 -- → Dividable ( gcd1 i i0 j j0 ) i0 ∧ Dividable ( gcd1 i i0 j j0 ) j0 | |
350 -- gcd-dividable1 zero i0 zero j0 with <-cmp i0 j0 | |
351 -- ... | tri< a ¬b ¬c = ⟪ div= , {!!} ⟫ -- Dividable i0 (j0 + i - j ) ∧ Dividable j0 (i0 + j - i) | |
352 -- ... | tri≈ ¬a refl ¬c = {!!} | |
353 -- ... | tri> ¬a ¬b c = {!!} | |
354 -- gcd-dividable1 zero i0 (suc zero) j0 = {!!} | |
355 -- gcd-dividable1 i i0 j j0 = {!!} | |
356 | |
227 | 357 gcd-dividable : ( i j : ℕ ) |
212 | 358 → Dividable ( gcd i j ) i ∧ Dividable ( gcd i j ) j |
227 | 359 gcd-dividable i j = f-induction {_} {_} {ℕ ∧ ℕ} |
209 | 360 {λ p → Dividable ( gcd (proj1 p) (proj2 p) ) (proj1 p) ∧ Dividable ( gcd (proj1 p) (proj2 p) ) (proj2 p)} F I ⟪ i , j ⟫ where |
361 F : ℕ ∧ ℕ → ℕ | |
224 | 362 F ⟪ 0 , 0 ⟫ = 0 |
363 F ⟪ 0 , suc j ⟫ = 0 | |
222 | 364 F ⟪ suc i , 0 ⟫ = 0 |
224 | 365 F ⟪ suc i , suc j ⟫ with <-cmp i j |
366 ... | tri< a ¬b ¬c = suc j | |
209 | 367 ... | tri≈ ¬a b ¬c = 0 |
224 | 368 ... | tri> ¬a ¬b c = suc i |
209 | 369 F0 : { i j : ℕ } → F ⟪ i , j ⟫ ≡ 0 → (i ≡ j) ∨ (i ≡ 0 ) ∨ (j ≡ 0) |
370 F0 {zero} {zero} p = case1 refl | |
371 F0 {zero} {suc j} p = case2 (case1 refl) | |
372 F0 {suc i} {zero} p = case2 (case2 refl) | |
373 F0 {suc i} {suc j} p with <-cmp i j | |
224 | 374 ... | tri< a ¬b ¬c = ⊥-elim ( nat-≡< (sym p) (s≤s z≤n )) |
375 ... | tri≈ ¬a refl ¬c = case1 refl | |
376 ... | tri> ¬a ¬b c = ⊥-elim ( nat-≡< (sym p) (s≤s z≤n )) | |
377 F00 : {p : ℕ ∧ ℕ} → F p ≡ zero → Dividable (gcd (proj1 p) (proj2 p)) (proj1 p) ∧ Dividable (gcd (proj1 p) (proj2 p)) (proj2 p) | |
378 F00 {⟪ i , j ⟫} eq with F0 {i} {j} eq | |
379 ... | case1 refl = ⟪ subst (λ k → Dividable k i) (sym (gcdmm i i)) div= , subst (λ k → Dividable k i) (sym (gcdmm i i)) div= ⟫ | |
380 ... | case2 (case1 refl) = ⟪ subst (λ k → Dividable k i) (sym (trans (gcdsym {0} {j} ) (gcd20 j)))div0 | |
381 , subst (λ k → Dividable k j) (sym (trans (gcdsym {0} {j}) (gcd20 j))) div= ⟫ | |
382 ... | case2 (case2 refl) = ⟪ subst (λ k → Dividable k i) (sym (gcd20 i)) div= | |
383 , subst (λ k → Dividable k j) (sym (gcd20 i)) div0 ⟫ | |
384 Fsym : {i j : ℕ } → F ⟪ i , j ⟫ ≡ F ⟪ j , i ⟫ | |
385 Fsym {0} {0} = refl | |
386 Fsym {0} {suc j} = refl | |
387 Fsym {suc i} {0} = refl | |
388 Fsym {suc i} {suc j} with <-cmp i j | <-cmp j i | |
389 ... | tri< a ¬b ¬c | tri< a₁ ¬b₁ ¬c₁ = ⊥-elim (nat-<> a a₁) | |
390 ... | tri< a ¬b ¬c | tri≈ ¬a b ¬c₁ = ⊥-elim (¬b (sym b)) | |
391 ... | tri< a ¬b ¬c | tri> ¬a ¬b₁ c = refl | |
392 ... | tri≈ ¬a refl ¬c | tri< a ¬b ¬c₁ = ⊥-elim (¬b refl) | |
393 ... | tri≈ ¬a refl ¬c | tri≈ ¬a₁ refl ¬c₁ = refl | |
394 ... | tri≈ ¬a refl ¬c | tri> ¬a₁ ¬b c = ⊥-elim (¬b refl) | |
395 ... | tri> ¬a ¬b c | tri< a ¬b₁ ¬c = refl | |
396 ... | tri> ¬a ¬b c | tri≈ ¬a₁ b ¬c = ⊥-elim (¬b (sym b)) | |
397 ... | tri> ¬a ¬b c | tri> ¬a₁ ¬b₁ c₁ = ⊥-elim (nat-<> c c₁) | |
398 | |
399 record Fdec ( i j : ℕ ) : Set where | |
400 field | |
401 ni : ℕ | |
402 nj : ℕ | |
403 fdec : 0 < F ⟪ i , j ⟫ → F ⟪ ni , nj ⟫ < F ⟪ i , j ⟫ | |
214 | 404 |
224 | 405 fd1 : ( i j k : ℕ ) → i < j → k ≡ j - i → F ⟪ suc i , k ⟫ < F ⟪ suc i , suc j ⟫ |
406 fd1 i j 0 i<j eq = ⊥-elim ( nat-≡< eq (minus>0 {i} {j} i<j )) | |
407 fd1 i j (suc k) i<j eq = fd2 i j k i<j eq where | |
408 fd2 : ( i j k : ℕ ) → i < j → suc k ≡ j - i → F ⟪ suc i , suc k ⟫ < F ⟪ suc i , suc j ⟫ | |
409 fd2 i j k i<j eq with <-cmp i k | <-cmp i j | |
410 ... | tri< a ¬b ¬c | tri< a₁ ¬b₁ ¬c₁ = fd3 where | |
411 fd3 : suc k < suc j -- suc j - suc i < suc j | |
412 fd3 = subst (λ g → g < suc j) (sym eq) (y-x<y {suc i} {suc j} (s≤s z≤n) (s≤s z≤n)) | |
413 ... | tri< a ¬b ¬c | tri≈ ¬a b ¬c₁ = ⊥-elim (⊥-elim (¬a i<j)) | |
414 ... | tri< a ¬b ¬c | tri> ¬a ¬b₁ c = ⊥-elim (⊥-elim (¬a i<j)) | |
415 ... | tri≈ ¬a b ¬c | tri< a ¬b ¬c₁ = s≤s z≤n | |
416 ... | tri≈ ¬a b ¬c | tri≈ ¬a₁ b₁ ¬c₁ = ⊥-elim (¬a₁ i<j) | |
417 ... | tri≈ ¬a b ¬c | tri> ¬a₁ ¬b c = s≤s z≤n -- i > j | |
418 ... | tri> ¬a ¬b c | tri< a ¬b₁ ¬c = fd4 where | |
419 fd4 : suc i < suc j | |
420 fd4 = s≤s a | |
421 ... | tri> ¬a ¬b c | tri≈ ¬a₁ b ¬c = ⊥-elim (¬a₁ i<j) | |
422 ... | tri> ¬a ¬b c | tri> ¬a₁ ¬b₁ c₁ = ⊥-elim (¬a₁ i<j) | |
423 | |
424 fedc0 : (i j : ℕ ) → Fdec i j | |
425 fedc0 0 0 = record { ni = 0 ; nj = 0 ; fdec = λ () } | |
426 fedc0 (suc i) 0 = record { ni = suc i ; nj = 0 ; fdec = λ () } | |
427 fedc0 0 (suc j) = record { ni = 0 ; nj = suc j ; fdec = λ () } | |
428 fedc0 (suc i) (suc j) with <-cmp i j | |
429 ... | tri< i<j ¬b ¬c = record { ni = suc i ; nj = j - i ; fdec = λ lt → fd1 i j (j - i) i<j refl } | |
430 ... | tri≈ ¬a refl ¬c = record { ni = suc i ; nj = suc j ; fdec = λ lt → ⊥-elim (nat-≡< fd0 lt) } where | |
431 fd0 : {i : ℕ } → 0 ≡ F ⟪ suc i , suc i ⟫ | |
432 fd0 {i} with <-cmp i i | |
433 ... | tri< a ¬b ¬c = ⊥-elim ( ¬b refl ) | |
434 ... | tri≈ ¬a b ¬c = refl | |
435 ... | tri> ¬a ¬b c = ⊥-elim ( ¬b refl ) | |
436 ... | tri> ¬a ¬b c = record { ni = i - j ; nj = suc j ; fdec = λ lt → | |
437 subst₂ (λ s t → s < t) (Fsym {suc j} {i - j}) (Fsym {suc j} {suc i}) (fd1 j i (i - j) c refl ) } | |
214 | 438 |
439 ind3 : {i j : ℕ } → i < j | |
440 → Dividable (gcd (suc i) (j - i)) (suc i) | |
441 → Dividable (gcd (suc i) (suc j)) (suc i) | |
442 ind3 {i} {j} a prev = | |
443 subst (λ k → Dividable k (suc i)) ( begin | |
444 gcd (suc i) (j - i) ≡⟨ gcdsym {suc i} {j - i} ⟩ | |
445 gcd (j - i ) (suc i) ≡⟨ sym (gcd+j (j - i) (suc i)) ⟩ | |
446 gcd ((j - i) + suc i) (suc i) ≡⟨ cong (λ k → gcd k (suc i)) ( begin | |
447 (suc j - suc i) + suc i ≡⟨ minus+n {suc j} {suc i} (<-trans ( s≤s a) a<sa ) ⟩ -- i ≤ n → suc (suc i) ≤ suc (suc (suc n)) | |
448 suc j ∎ ) ⟩ | |
449 gcd (suc j) (suc i) ≡⟨ gcdsym {suc j} {suc i} ⟩ | |
450 gcd (suc i) (suc j) ∎ ) prev where open ≡-Reasoning | |
451 ind7 : {i j : ℕ } → (i < j ) → (j - i) + suc i ≡ suc j | |
452 ind7 {i} {j} a = begin (suc j - suc i) + suc i ≡⟨ minus+n {suc j} {suc i} (<-trans (s≤s a) a<sa) ⟩ | |
453 suc j ∎ where open ≡-Reasoning | |
454 ind6 : {i j k : ℕ } → i < j | |
455 → Dividable k (j - i) | |
456 → Dividable k (suc i) | |
457 → Dividable k (suc j) | |
458 ind6 {i} {j} {k} i<j dj di = subst (λ g → Dividable k g ) (ind7 i<j) (proj1 (div+div dj di)) | |
459 ind4 : {i j : ℕ } → i < j | |
460 → Dividable (gcd (suc i) (j - i)) (j - i) | |
461 → Dividable (gcd (suc i) (suc j)) (j - i) | |
462 ind4 {i} {j} i<j prev = subst (λ k → k) ( begin | |
463 Dividable (gcd (suc i) (j - i)) (j - i) ≡⟨ cong (λ k → Dividable k (j - i)) (gcdsym {suc i} ) ⟩ | |
464 Dividable (gcd (j - i ) (suc i) ) (j - i) ≡⟨ cong (λ k → Dividable k (j - i)) ( sym (gcd+j (j - i) (suc i))) ⟩ | |
465 Dividable (gcd ((j - i) + suc i) (suc i)) (j - i) ≡⟨ cong (λ k → Dividable (gcd k (suc i)) (j - i)) (ind7 i<j ) ⟩ | |
466 Dividable (gcd (suc j) (suc i)) (j - i) ≡⟨ cong (λ k → Dividable k (j - i)) (gcdsym {suc j} ) ⟩ | |
467 Dividable (gcd (suc i) (suc j)) (j - i) ∎ ) prev where open ≡-Reasoning | |
468 | |
224 | 469 ind : ( i j : ℕ ) → |
470 Dividable (gcd (Fdec.ni (fedc0 i j)) (Fdec.nj (fedc0 i j))) (Fdec.ni (fedc0 i j)) | |
471 ∧ Dividable (gcd (Fdec.ni (fedc0 i j)) (Fdec.nj (fedc0 i j))) (Fdec.nj (fedc0 i j)) | |
472 → Dividable (gcd i j) i ∧ Dividable (gcd i j) j | |
473 ind zero zero prev = ind0 where | |
210 | 474 ind0 : Dividable (gcd zero zero) zero ∧ Dividable (gcd zero zero) zero |
212 | 475 ind0 = ⟪ div0 , div0 ⟫ |
224 | 476 ind zero (suc j) prev = ind1 where |
210 | 477 ind1 : Dividable (gcd zero (suc j)) zero ∧ Dividable (gcd zero (suc j)) (suc j) |
212 | 478 ind1 = ⟪ div0 , subst (λ k → Dividable k (suc j)) (sym (trans (gcdsym {zero} {suc j}) (gcd20 (suc j)))) div= ⟫ |
224 | 479 ind (suc i) zero prev = ind2 where |
210 | 480 ind2 : Dividable (gcd (suc i) zero) (suc i) ∧ Dividable (gcd (suc i) zero) zero |
212 | 481 ind2 = ⟪ subst (λ k → Dividable k (suc i)) (sym (trans refl (gcd20 (suc i)))) div= , div0 ⟫ |
224 | 482 ind (suc i) (suc j) prev with <-cmp i j |
483 ... | tri< a ¬b ¬c = ⟪ ind3 a (proj1 prev) , ind6 a (ind4 a (proj2 prev)) (ind3 a (proj1 prev) ) ⟫ where | |
213 | 484 ... | tri≈ ¬a refl ¬c = ⟪ ind5 , ind5 ⟫ where |
485 ind5 : Dividable (gcd (suc i) (suc i)) (suc i) | |
486 ind5 = subst (λ k → Dividable k (suc j)) (sym (gcdmm (suc i) (suc i))) div= | |
224 | 487 ... | tri> ¬a ¬b c = ⟪ ind8 c (proj1 prev) (proj2 prev) , ind10 c (proj2 prev) ⟫ where |
214 | 488 ind9 : {i j : ℕ} → i < j → gcd (j - i) (suc i) ≡ gcd (suc j) (suc i) |
489 ind9 {i} {j} i<j = begin | |
490 gcd (j - i ) (suc i) ≡⟨ sym (gcd+j (j - i ) (suc i) ) ⟩ | |
491 gcd (j - i + suc i) (suc i) ≡⟨ cong (λ k → gcd k (suc i)) (ind7 i<j ) ⟩ | |
492 gcd (suc j) (suc i) ∎ where open ≡-Reasoning | |
493 ind8 : { i j : ℕ } → i < j | |
494 → Dividable (gcd (j - i) (suc i)) (j - i) | |
495 → Dividable (gcd (j - i) (suc i)) (suc i) | |
496 → Dividable (gcd (suc j) (suc i)) (suc j) | |
497 ind8 {i} {j} i<j dji di = ind6 i<j (subst (λ k → Dividable k (j - i)) (ind9 i<j) dji) (subst (λ k → Dividable k (suc i)) (ind9 i<j) di) | |
498 ind10 : { i j : ℕ } → j < i | |
499 → Dividable (gcd (i - j) (suc j)) (suc j) | |
500 → Dividable (gcd (suc i) (suc j)) (suc j) | |
501 ind10 {i} {j} j<i dji = subst (λ g → Dividable g (suc j) ) (begin | |
502 gcd (i - j) (suc j) ≡⟨ sym (gcd+j (i - j) (suc j)) ⟩ | |
503 gcd (i - j + suc j) (suc j) ≡⟨ cong (λ k → gcd k (suc j)) (ind7 j<i ) ⟩ | |
504 gcd (suc i) (suc j) ∎ ) dji where open ≡-Reasoning | |
210 | 505 |
224 | 506 I : Finduction (ℕ ∧ ℕ) _ F |
209 | 507 I = record { |
224 | 508 fzero = F00 |
509 ; pnext = λ p → ⟪ Fdec.ni (fedc0 (proj1 p) (proj2 p)) , Fdec.nj (fedc0 (proj1 p) (proj2 p)) ⟫ | |
510 ; decline = λ {p} lt → Fdec.fdec (fedc0 (proj1 p) (proj2 p)) lt | |
511 ; ind = λ {p} prev → ind (proj1 p ) ( proj2 p ) prev | |
209 | 512 } |
513 | |
233 | 514 record Equlid (i j gcd : ℕ ) : Set where |
515 field | |
516 eqa : ℕ | |
517 eqb : ℕ | |
235 | 518 is-equ< : (eqa * i) > (eqb * j) → ((eqa * i) - (eqb * j) ≡ gcd ) |
519 is-equ> : (eqb * j) > (eqa * i) → ((eqb * j) - (eqa * i) ≡ gcd ) | |
234 | 520 |
521 postulate | |
522 gcd-equlid : ( p q r : ℕ ) → 1 < p → ((i : ℕ ) → i < p → 0 < i → gcd p i ≡ 1) → Dividable p (q * r) → Dividable p q ∨ Dividable p r | |
523 -- gcd-equlid1 : ( i i0 j j0 : ℕ ) → Dividable i0 ((j0 + i) - j ) ∧ Dividable j0 ((i0 + j) - i) → Equlid i0 j0 (gcd1 i i0 j j0) | |
233 | 524 |
235 | 525 ge3 : {a b c d : ℕ } → b > a → b - a ≡ d - c → d > c |
526 ge3 {a} {b} {c} {d} b>a eq = minus>0→x<y (subst (λ k → 0 < k ) eq (minus>0 b>a)) | |
234 | 527 |
528 gcd-equlid1 : ( i i0 j j0 : ℕ ) → Dividable i0 ((j0 + i) - j ) ∧ Dividable j0 ((i0 + j) - i) → Equlid i0 j0 (gcd1 i i0 j j0) | |
529 gcd-equlid1 zero i0 zero j0 di with <-cmp i0 j0 | |
530 ... | tri< a' ¬b ¬c = record { eqa = 1 ; eqb = 0 ; is-equ< = {!!} ; is-equ> = {!!} } | |
531 ... | tri≈ ¬a refl ¬c = record { eqa = 1 ; eqb = 0 ; is-equ< = {!!} ; is-equ> = {!!} } | |
532 ... | tri> ¬a ¬b c = record { eqa = 0 ; eqb = 1 ; is-equ< = {!!} ; is-equ> = {!!} } | |
533 gcd-equlid1 zero i0 (suc zero) j0 di = record { eqa = 1 ; eqb = 1 ; is-equ< = {!!} ; is-equ> = {!!} } | |
534 gcd-equlid1 zero zero (suc (suc j)) j0 di = record { eqa = 0 ; eqb = 1 ; is-equ< = {!!} ; is-equ> = {!!} } | |
535 gcd-equlid1 zero (suc i0) (suc (suc j)) j0 di with gcd-equlid1 i0 (suc i0) (suc j) (suc (suc j)) ( di-next1 di ) | |
235 | 536 ... | e = record { eqa = ea + eb * f ; eqb = eb ; is-equ< = ge0 ; is-equ> = {!!} } where |
234 | 537 ea = Equlid.eqa e |
538 eb = Equlid.eqb e | |
539 f = Dividable.factor (proj1 di) | |
236 | 540 ge4 : suc (j0 + 0) > suc (suc j) |
541 ge4 = {!!} | |
235 | 542 ge0 : (ea + eb * f) * suc i0 > eb * j0 → (((ea + eb * f) * suc i0) - (eb * j0)) ≡ gcd1 i0 (suc i0) (suc j) (suc (suc j)) |
543 ge0 lt = subst (λ k → ((ea + eb * f) * suc i0) - (eb * j0) ≡ k ) (Equlid.is-equ< e ge2 ) ge1 where | |
544 ge1 : ((ea + eb * f) * suc i0) - (eb * j0) ≡ (ea * suc i0) - (eb * suc (suc j)) | |
545 ge1 = begin | |
236 | 546 ((ea + eb * f ) * suc i0) - (eb * j0) ≡⟨ cong (λ k → ((ea + eb * f ) * suc i0) - (eb * k)) (+-comm 0 _) ⟩ |
547 ((ea + eb * f ) * suc i0) - (eb * (j0 + 0) ) ≡⟨ cong (λ k → ((ea + eb * f ) * suc i0) - (eb * k)) (sym (minus+n {j0 + 0} {suc (suc j)} {!!} )) ⟩ | |
548 ((ea + eb * f ) * suc i0) - (eb * (((j0 + 0) - suc (suc j)) + suc (suc j) )) ≡⟨ cong (λ k → ((ea + eb * f ) * suc i0) - (eb * k)) (+-comm _ (suc (suc j)) ) ⟩ | |
235 | 549 ((ea + eb * f ) * suc i0) - (eb * (suc (suc j) + ((j0 + 0) - suc (suc j)))) |
550 ≡⟨ cong (λ k → ((ea + eb * f ) * suc i0) - (eb * (suc (suc j) + k) )) (sym (Dividable.is-factor (proj1 di))) ⟩ | |
236 | 551 ((ea + eb * f ) * suc i0) - (eb * (suc (suc j) + (f * suc i0 + 0) )) ≡⟨ cong (λ k → ((ea + eb * f ) * suc i0) - (eb * (suc (suc j) + k))) (+-comm _ 0) ⟩ |
552 ((ea + eb * f ) * suc i0) - (eb * (suc (suc j) + (f * suc i0 ) )) ≡⟨ cong (λ k → ((ea + eb * f ) * suc i0) - k) (*-distribˡ-+ eb (suc (suc j)) (f * suc i0)) ⟩ | |
553 ((ea + eb * f ) * suc i0) - (eb * suc (suc j) + eb * (f * suc i0)) ≡⟨ cong (λ k → k - (eb * suc (suc j) + eb * (f * suc i0))) (*-distribʳ-+ (suc i0) ea _) ⟩ | |
554 (ea * suc i0 + (eb * f ) * suc i0 ) - ( eb * suc (suc j) + (eb * (f * (suc i0))) ) | |
555 ≡⟨ cong (λ k → (ea * suc i0 + (eb * f ) * suc i0 ) - ( eb * suc (suc j) + k )) (sym (*-assoc eb _ _ )) ⟩ | |
556 (ea * suc i0 + (eb * f ) * suc i0 ) - ( eb * suc (suc j) + ((eb * f) * (suc i0)) ) ≡⟨ minus+xy-zy {ea * suc i0} {(eb * f ) * suc i0} {eb * suc (suc j)} ⟩ | |
234 | 557 (ea * suc i0) - (eb * suc (suc j)) ∎ where open ≡-Reasoning |
235 | 558 ge2 : ea * suc i0 > eb * suc (suc j) |
559 ge2 = ge3 lt ge1 | |
560 gcd-equlid1 (suc zero) i0 zero j0 di = subst (λ k → {!!}) {!!} ( gcd-equlid1 zero j0 (suc zero) i0 (∧-exch di)) | |
234 | 561 gcd-equlid1 (suc (suc i)) i0 zero zero di = {!!} |
562 gcd-equlid1 (suc (suc i)) i0 zero (suc j0) di with gcd-equlid1 (suc i) (suc (suc i)) j0 (suc j0) (∧-exch (di-next1 (∧-exch di))) | |
563 ... | e = {!!} | |
564 gcd-equlid1 (suc zero) i0 (suc j) j0 di = | |
565 gcd-equlid1 zero i0 j j0 (di-next di) | |
566 gcd-equlid1 (suc (suc i)) i0 (suc j) j0 di = | |
567 gcd-equlid1 (suc i) i0 j j0 (di-next di) | |
233 | 568 |
231 | 569 |
233 | 570 div→gcd : {n k : ℕ } → k > 1 → Dividable k n → gcd n k ≡ k |
571 div→gcd {n} {k} k>1 = n-induction {_} {_} {ℕ} {λ m → Dividable k m → gcd m k ≡ k } (λ x → x) I n where | |
572 decl : {m : ℕ } → 0 < m → m - k < m | |
573 decl {m} 0<m = y-x<y (<-trans a<sa k>1 ) 0<m | |
574 ind : (m : ℕ ) → (Dividable k (m - k) → gcd (m - k) k ≡ k) → Dividable k m → gcd m k ≡ k | |
575 ind m prev d with <-cmp (suc m) k | |
576 ... | tri≈ ¬a refl ¬c = ⊥-elim ( div+1 k>1 d div= ) | |
577 ... | tri> ¬a ¬b c = subst (λ g → g ≡ k) ind1 ( prev (proj2 (div-div k>1 div= d))) where | |
578 ind1 : gcd (m - k) k ≡ gcd m k | |
579 ind1 = begin | |
580 gcd (m - k) k ≡⟨ sym (gcd+j (m - k) _) ⟩ | |
581 gcd (m - k + k) k ≡⟨ cong (λ g → gcd g k) (minus+n {m} {k} c) ⟩ | |
582 gcd m k ∎ where open ≡-Reasoning | |
583 ... | tri< a ¬b ¬c with <-cmp 0 m | |
584 ... | tri< a₁ ¬b₁ ¬c₁ = ⊥-elim ( div<k k>1 a₁ (<-trans a<sa a) d ) | |
585 ... | tri≈ ¬a refl ¬c₁ = subst (λ g → g ≡ k ) (gcdsym {k} {0} ) (gcd20 k) | |
586 fzero : (m : ℕ) → (m - k) ≡ zero → Dividable k m → gcd m k ≡ k | |
587 fzero 0 eq d = trans (gcdsym {0} {k} ) (gcd20 k) | |
588 fzero (suc m) eq d with <-cmp (suc m) k | |
589 ... | tri< a ¬b ¬c = ⊥-elim ( div<k k>1 (s≤s z≤n) a d ) | |
590 ... | tri≈ ¬a refl ¬c = gcdmm k k | |
591 ... | tri> ¬a ¬b c = ⊥-elim ( nat-≡< (sym eq) (minus>0 c) ) | |
592 I : Ninduction ℕ _ (λ x → x) | |
593 I = record { | |
594 pnext = λ p → p - k | |
595 ; fzero = λ {m} eq → fzero m eq | |
596 ; decline = λ {m} lt → decl lt | |
597 ; ind = λ {p} prev → ind p prev | |
598 } | |
206 | 599 |
167 | 600 gcdmul+1 : ( m n : ℕ ) → gcd (m * n + 1) n ≡ 1 |
601 gcdmul+1 zero n = gcd204 n | |
602 gcdmul+1 (suc m) n = begin | |
603 gcd (suc m * n + 1) n ≡⟨⟩ | |
604 gcd (n + m * n + 1) n ≡⟨ cong (λ k → gcd k n ) (begin | |
605 n + m * n + 1 ≡⟨ cong (λ k → k + 1) (+-comm n _) ⟩ | |
606 m * n + n + 1 ≡⟨ +-assoc (m * n) _ _ ⟩ | |
607 m * n + (n + 1) ≡⟨ cong (λ k → m * n + k) (+-comm n _) ⟩ | |
608 m * n + (1 + n) ≡⟨ sym ( +-assoc (m * n) _ _ ) ⟩ | |
609 m * n + 1 + n ∎ | |
610 ) ⟩ | |
212 | 611 gcd (m * n + 1 + n) n ≡⟨ gcd+j (m * n + 1) n ⟩ |
167 | 612 gcd (m * n + 1) n ≡⟨ gcdmul+1 m n ⟩ |
613 1 ∎ where open ≡-Reasoning | |
614 | |
205 | 615 gcd>0 : ( i j : ℕ ) → 0 < i → 0 < j → 0 < gcd i j |
616 gcd>0 i j 0<i 0<j = gcd>01 i i j j 0<i 0<j where | |
617 gcd>01 : ( i i0 j j0 : ℕ ) → 0 < i0 → 0 < j0 → gcd1 i i0 j j0 > 0 | |
618 gcd>01 zero i0 zero j0 0<i 0<j with <-cmp i0 j0 | |
619 ... | tri< a ¬b ¬c = 0<i | |
620 ... | tri≈ ¬a refl ¬c = 0<i | |
621 ... | tri> ¬a ¬b c = 0<j | |
622 gcd>01 zero i0 (suc zero) j0 0<i 0<j = s≤s z≤n | |
623 gcd>01 zero zero (suc (suc j)) j0 0<i 0<j = 0<j | |
624 gcd>01 zero (suc i0) (suc (suc j)) j0 0<i 0<j = gcd>01 i0 (suc i0) (suc j) (suc (suc j)) 0<i (s≤s z≤n) -- 0 < suc (suc j) | |
625 gcd>01 (suc zero) i0 zero j0 0<i 0<j = s≤s z≤n | |
626 gcd>01 (suc (suc i)) i0 zero zero 0<i 0<j = 0<i | |
627 gcd>01 (suc (suc i)) i0 zero (suc j0) 0<i 0<j = gcd>01 (suc i) (suc (suc i)) j0 (suc j0) (s≤s z≤n) 0<j | |
628 gcd>01 (suc i) i0 (suc j) j0 0<i 0<j = subst (λ k → 0 < k ) (sym (gcd033 i i0 j j0 )) (gcd>01 i i0 j j0 0<i 0<j ) where | |
629 gcd033 : (i i0 j j0 : ℕ) → gcd1 (suc i) i0 (suc j) j0 ≡ gcd1 i i0 j j0 | |
630 gcd033 zero zero zero zero = refl | |
631 gcd033 zero zero (suc j) zero = refl | |
632 gcd033 (suc i) zero j zero = refl | |
633 gcd033 zero zero zero (suc j0) = refl | |
634 gcd033 (suc i) zero zero (suc j0) = refl | |
635 gcd033 zero zero (suc j) (suc j0) = refl | |
636 gcd033 (suc i) zero (suc j) (suc j0) = refl | |
637 gcd033 zero (suc i0) j j0 = refl | |
638 gcd033 (suc i) (suc i0) j j0 = refl | |
227 | 639 |
640 --gcd-dividable : ( i j : ℕ ) | |
641 -- → Dividable ( gcd i j ) i ∧ Dividable ( gcd i j ) j | |
642 | |
643 f-div>0 : { k i : ℕ } → (d : Dividable k i ) → 0 < i → 0 < Dividable.factor d | |
644 f-div>0 {k} {i} d 0<i with <-cmp 0 (Dividable.factor d) | |
645 ... | tri< a ¬b ¬c = a | |
646 ... | tri≈ ¬a b ¬c = ⊥-elim ( nat-≡< (begin | |
647 0 * k + 0 ≡⟨ cong (λ g → g * k + 0) b ⟩ | |
648 Dividable.factor d * k + 0 ≡⟨ Dividable.is-factor d ⟩ | |
649 i ∎ ) 0<i ) where open ≡-Reasoning | |
650 | |
230 | 651 m*n=m→n : {m n : ℕ } → 0 < m → m * n ≡ m * 1 → n ≡ 1 |
652 m*n=m→n {suc m} {n} (s≤s lt) eq = *-cancelˡ-≡ m eq | |
653 | |
654 gcd-≤ : ( i j : ℕ ) → 0 < i → i ≤ j → gcd i j ≤ i | |
655 gcd-≤ zero _ () z≤n | |
656 gcd-≤ (suc i) (suc j) _ (s≤s i<j) = begin | |
227 | 657 gcd (suc i) (suc j) ≡⟨ sym m*1=m ⟩ |
658 gcd (suc i) (suc j) * 1 ≤⟨ *-monoʳ-≤ (gcd (suc i) (suc j)) (f-div>0 d (s≤s z≤n)) ⟩ | |
659 gcd (suc i) (suc j) * f ≡⟨ +-comm 0 _ ⟩ | |
660 gcd (suc i) (suc j) * f + 0 ≡⟨ cong (λ k → k + 0) (*-comm (gcd (suc i) (suc j)) _ ) ⟩ | |
230 | 661 Dividable.factor (proj1 (gcd-dividable (suc i) (suc j))) * gcd (suc i) (suc j) + 0 ≡⟨ Dividable.is-factor (proj1 (gcd-dividable (suc i) (suc j))) ⟩ |
662 suc i ∎ where | |
663 d = proj1 (gcd-dividable (suc i) (suc j)) | |
664 f = Dividable.factor (proj1 (gcd-dividable (suc i) (suc j))) | |
227 | 665 open ≤-Reasoning |
666 | |
230 | 667 gcd-≥ : ( i j : ℕ ) → 0 < i → i ≤ j → gcd j i ≤ i |
668 gcd-≥ i j 0<i i≤j = subst (λ k → k ≤ i) (gcdsym {i} {j}) ( gcd-≤ i j 0<i i≤j ) |