161 declare wset.simps [simp del] |
159 declare wset.simps [simp del] |
162 |
160 |
163 lemma wset_induct: |
161 lemma wset_induct: |
164 assumes "!!a p. P {} a p" |
162 assumes "!!a p. P {} a p" |
165 and "!!a p. 1 < (a::int) \<Longrightarrow> |
163 and "!!a p. 1 < (a::int) \<Longrightarrow> |
166 P (wset (a - 1, p)) (a - 1) p ==> P (wset (a, p)) a p" |
164 P (wset (a - 1) p) (a - 1) p ==> P (wset a p) a p" |
167 shows "P (wset (u, v)) u v" |
165 shows "P (wset u v) u v" |
168 apply (rule wset.induct, safe) |
166 apply (rule wset.induct) |
169 prefer 2 |
167 apply (case_tac "1 < a") |
170 apply (case_tac "1 < a") |
168 apply (rule assms) |
171 apply (rule prems) |
169 apply (simp_all add: wset.simps assms) |
172 apply simp_all |
|
173 apply (simp_all add: wset.simps prems) |
|
174 done |
170 done |
175 |
171 |
176 lemma wset_mem_imp_or [rule_format]: |
172 lemma wset_mem_imp_or [rule_format]: |
177 "1 < a \<Longrightarrow> b \<notin> wset (a - 1, p) |
173 "1 < a \<Longrightarrow> b \<notin> wset (a - 1) p |
178 ==> b \<in> wset (a, p) --> b = a \<or> b = inv p a" |
174 ==> b \<in> wset a p --> b = a \<or> b = inv p a" |
179 apply (subst wset.simps) |
175 apply (subst wset.simps) |
180 apply (unfold Let_def, simp) |
176 apply (unfold Let_def, simp) |
181 done |
177 done |
182 |
178 |
183 lemma wset_mem_mem [simp]: "1 < a ==> a \<in> wset (a, p)" |
179 lemma wset_mem_mem [simp]: "1 < a ==> a \<in> wset a p" |
184 apply (subst wset.simps) |
180 apply (subst wset.simps) |
185 apply (unfold Let_def, simp) |
181 apply (unfold Let_def, simp) |
186 done |
182 done |
187 |
183 |
188 lemma wset_subset: "1 < a \<Longrightarrow> b \<in> wset (a - 1, p) ==> b \<in> wset (a, p)" |
184 lemma wset_subset: "1 < a \<Longrightarrow> b \<in> wset (a - 1) p ==> b \<in> wset a p" |
189 apply (subst wset.simps) |
185 apply (subst wset.simps) |
190 apply (unfold Let_def, auto) |
186 apply (unfold Let_def, auto) |
191 done |
187 done |
192 |
188 |
193 lemma wset_g_1 [rule_format]: |
189 lemma wset_g_1 [rule_format]: |
194 "zprime p --> a < p - 1 --> b \<in> wset (a, p) --> 1 < b" |
190 "zprime p --> a < p - 1 --> b \<in> wset a p --> 1 < b" |
195 apply (induct a p rule: wset_induct, auto) |
191 apply (induct a p rule: wset_induct, auto) |
196 apply (case_tac "b = a") |
192 apply (case_tac "b = a") |
197 apply (case_tac [2] "b = inv p a") |
193 apply (case_tac [2] "b = inv p a") |
198 apply (subgoal_tac [3] "b = a \<or> b = inv p a") |
194 apply (subgoal_tac [3] "b = a \<or> b = inv p a") |
199 apply (rule_tac [4] wset_mem_imp_or) |
195 apply (rule_tac [4] wset_mem_imp_or) |
201 apply simp |
197 apply simp |
202 apply (rule inv_g_1, auto) |
198 apply (rule inv_g_1, auto) |
203 done |
199 done |
204 |
200 |
205 lemma wset_less [rule_format]: |
201 lemma wset_less [rule_format]: |
206 "zprime p --> a < p - 1 --> b \<in> wset (a, p) --> b < p - 1" |
202 "zprime p --> a < p - 1 --> b \<in> wset a p --> b < p - 1" |
207 apply (induct a p rule: wset_induct, auto) |
203 apply (induct a p rule: wset_induct, auto) |
208 apply (case_tac "b = a") |
204 apply (case_tac "b = a") |
209 apply (case_tac [2] "b = inv p a") |
205 apply (case_tac [2] "b = inv p a") |
210 apply (subgoal_tac [3] "b = a \<or> b = inv p a") |
206 apply (subgoal_tac [3] "b = a \<or> b = inv p a") |
211 apply (rule_tac [4] wset_mem_imp_or) |
207 apply (rule_tac [4] wset_mem_imp_or) |
214 apply (rule inv_less_p_minus_1, auto) |
210 apply (rule inv_less_p_minus_1, auto) |
215 done |
211 done |
216 |
212 |
217 lemma wset_mem [rule_format]: |
213 lemma wset_mem [rule_format]: |
218 "zprime p --> |
214 "zprime p --> |
219 a < p - 1 --> 1 < b --> b \<le> a --> b \<in> wset (a, p)" |
215 a < p - 1 --> 1 < b --> b \<le> a --> b \<in> wset a p" |
220 apply (induct a p rule: wset.induct, auto) |
216 apply (induct a p rule: wset.induct, auto) |
221 apply (rule_tac wset_subset) |
217 apply (rule_tac wset_subset) |
222 apply (simp (no_asm_simp)) |
218 apply (simp (no_asm_simp)) |
223 apply auto |
219 apply auto |
224 done |
220 done |
225 |
221 |
226 lemma wset_mem_inv_mem [rule_format]: |
222 lemma wset_mem_inv_mem [rule_format]: |
227 "zprime p --> 5 \<le> p --> a < p - 1 --> b \<in> wset (a, p) |
223 "zprime p --> 5 \<le> p --> a < p - 1 --> b \<in> wset a p |
228 --> inv p b \<in> wset (a, p)" |
224 --> inv p b \<in> wset a p" |
229 apply (induct a p rule: wset_induct, auto) |
225 apply (induct a p rule: wset_induct, auto) |
230 apply (case_tac "b = a") |
226 apply (case_tac "b = a") |
231 apply (subst wset.simps) |
227 apply (subst wset.simps) |
232 apply (unfold Let_def) |
228 apply (unfold Let_def) |
233 apply (rule_tac [3] wset_subset, auto) |
229 apply (rule_tac [3] wset_subset, auto) |
238 apply (rule_tac [7] wset_mem_imp_or, auto) |
234 apply (rule_tac [7] wset_mem_imp_or, auto) |
239 done |
235 done |
240 |
236 |
241 lemma wset_inv_mem_mem: |
237 lemma wset_inv_mem_mem: |
242 "zprime p \<Longrightarrow> 5 \<le> p \<Longrightarrow> a < p - 1 \<Longrightarrow> 1 < b \<Longrightarrow> b < p - 1 |
238 "zprime p \<Longrightarrow> 5 \<le> p \<Longrightarrow> a < p - 1 \<Longrightarrow> 1 < b \<Longrightarrow> b < p - 1 |
243 \<Longrightarrow> inv p b \<in> wset (a, p) \<Longrightarrow> b \<in> wset (a, p)" |
239 \<Longrightarrow> inv p b \<in> wset a p \<Longrightarrow> b \<in> wset a p" |
244 apply (rule_tac s = "inv p (inv p b)" and t = b in subst) |
240 apply (rule_tac s = "inv p (inv p b)" and t = b in subst) |
245 apply (rule_tac [2] wset_mem_inv_mem) |
241 apply (rule_tac [2] wset_mem_inv_mem) |
246 apply (rule inv_inv, simp_all) |
242 apply (rule inv_inv, simp_all) |
247 done |
243 done |
248 |
244 |
249 lemma wset_fin: "finite (wset (a, p))" |
245 lemma wset_fin: "finite (wset a p)" |
250 apply (induct a p rule: wset_induct) |
246 apply (induct a p rule: wset_induct) |
251 prefer 2 |
247 prefer 2 |
252 apply (subst wset.simps) |
248 apply (subst wset.simps) |
253 apply (unfold Let_def, auto) |
249 apply (unfold Let_def, auto) |
254 done |
250 done |
255 |
251 |
256 lemma wset_zcong_prod_1 [rule_format]: |
252 lemma wset_zcong_prod_1 [rule_format]: |
257 "zprime p --> |
253 "zprime p --> |
258 5 \<le> p --> a < p - 1 --> [(\<Prod>x\<in>wset(a, p). x) = 1] (mod p)" |
254 5 \<le> p --> a < p - 1 --> [(\<Prod>x\<in>wset a p. x) = 1] (mod p)" |
259 apply (induct a p rule: wset_induct) |
255 apply (induct a p rule: wset_induct) |
260 prefer 2 |
256 prefer 2 |
261 apply (subst wset.simps) |
257 apply (subst wset.simps) |
262 apply (unfold Let_def, auto) |
258 apply (auto, unfold Let_def, auto) |
263 apply (subst setprod_insert) |
259 apply (subst setprod_insert) |
264 apply (tactic {* stac (thm "setprod_insert") 3 *}) |
260 apply (tactic {* stac (thm "setprod_insert") 3 *}) |
265 apply (subgoal_tac [5] |
261 apply (subgoal_tac [5] |
266 "zcong (a * inv p a * (\<Prod>x\<in> wset(a - 1, p). x)) (1 * 1) p") |
262 "zcong (a * inv p a * (\<Prod>x\<in>wset (a - 1) p. x)) (1 * 1) p") |
267 prefer 5 |
263 prefer 5 |
268 apply (simp add: zmult_assoc) |
264 apply (simp add: zmult_assoc) |
269 apply (rule_tac [5] zcong_zmult) |
265 apply (rule_tac [5] zcong_zmult) |
270 apply (rule_tac [5] inv_is_inv) |
266 apply (rule_tac [5] inv_is_inv) |
271 apply (tactic "clarify_tac @{claset} 4") |
267 apply (tactic "clarify_tac @{claset} 4") |
272 apply (subgoal_tac [4] "a \<in> wset (a - 1, p)") |
268 apply (subgoal_tac [4] "a \<in> wset (a - 1) p") |
273 apply (rule_tac [5] wset_inv_mem_mem) |
269 apply (rule_tac [5] wset_inv_mem_mem) |
274 apply (simp_all add: wset_fin) |
270 apply (simp_all add: wset_fin) |
275 apply (rule inv_distinct, auto) |
271 apply (rule inv_distinct, auto) |
276 done |
272 done |
277 |
273 |
278 lemma d22set_eq_wset: "zprime p ==> d22set (p - 2) = wset (p - 2, p)" |
274 lemma d22set_eq_wset: "zprime p ==> d22set (p - 2) = wset (p - 2) p" |
279 apply safe |
275 apply safe |
280 apply (erule wset_mem) |
276 apply (erule wset_mem) |
281 apply (rule_tac [2] d22set_g_1) |
277 apply (rule_tac [2] d22set_g_1) |
282 apply (rule_tac [3] d22set_le) |
278 apply (rule_tac [3] d22set_le) |
283 apply (rule_tac [4] d22set_mem) |
279 apply (rule_tac [4] d22set_mem) |