148 by auto |
148 by auto |
149 qed; |
149 qed; |
150 |
150 |
151 lemma SetS_setprod_prop: "[| p \<in> zprime; 2 < p; ~([a = 0] (mod p)); |
151 lemma SetS_setprod_prop: "[| p \<in> zprime; 2 < p; ~([a = 0] (mod p)); |
152 ~(QuadRes p a); x \<in> (SetS a p) |] ==> |
152 ~(QuadRes p a); x \<in> (SetS a p) |] ==> |
153 [setprod x = a] (mod p)"; |
153 [\<Prod>x = a] (mod p)"; |
154 apply (auto simp add: SetS_def MultInvPair_def) |
154 apply (auto simp add: SetS_def MultInvPair_def) |
155 apply (frule StandardRes_SRStar_prop1a) |
155 apply (frule StandardRes_SRStar_prop1a) |
156 apply (subgoal_tac "StandardRes p x \<noteq> StandardRes p (a * MultInv p x)"); |
156 apply (subgoal_tac "StandardRes p x \<noteq> StandardRes p (a * MultInv p x)"); |
157 apply (auto simp add: StandardRes_prop2 MultInvPair_distinct) |
157 apply (auto simp add: StandardRes_prop2 MultInvPair_distinct) |
158 apply (frule_tac m = p and x = x and y = "(a * MultInv p x)" in |
158 apply (frule_tac m = p and x = x and y = "(a * MultInv p x)" in |
184 apply (frule d22set_le) |
184 apply (frule d22set_le) |
185 apply (frule d22set_g_1, auto) |
185 apply (frule d22set_g_1, auto) |
186 done |
186 done |
187 |
187 |
188 lemma Union_SetS_setprod_prop1: "[| p \<in> zprime; 2 < p; ~([a = 0] (mod p)); ~(QuadRes p a) |] ==> |
188 lemma Union_SetS_setprod_prop1: "[| p \<in> zprime; 2 < p; ~([a = 0] (mod p)); ~(QuadRes p a) |] ==> |
189 [setprod (Union (SetS a p)) = a ^ nat ((p - 1) div 2)] (mod p)"; |
189 [\<Prod>(Union (SetS a p)) = a ^ nat ((p - 1) div 2)] (mod p)" |
190 proof -; |
190 proof - |
191 assume "p \<in> zprime" and "2 < p" and "~([a = 0] (mod p))" and "~(QuadRes p a)"; |
191 assume "p \<in> zprime" and "2 < p" and "~([a = 0] (mod p))" and "~(QuadRes p a)" |
192 then have "[setprod (Union (SetS a p)) = |
192 then have "[\<Prod>(Union (SetS a p)) = |
193 gsetprod setprod (SetS a p)] (mod p)"; |
193 setprod (setprod (%x. x)) (SetS a p)] (mod p)" |
194 by (auto simp add: SetS_finite SetS_elems_finite |
194 by (auto simp add: SetS_finite SetS_elems_finite |
195 MultInvPair_prop1c setprod_disj_sets) |
195 MultInvPair_prop1c setprod_Union_disjoint) |
196 also; have "[gsetprod setprod (SetS a p) = |
196 also have "[setprod (setprod (%x. x)) (SetS a p) = |
197 gsetprod (%x. a) (SetS a p)] (mod p)"; |
197 setprod (%x. a) (SetS a p)] (mod p)" |
198 apply (rule gsetprod_same_function_zcong) |
198 apply (rule setprod_same_function_zcong) |
199 by (auto simp add: prems SetS_setprod_prop SetS_finite) |
199 by (auto simp add: prems SetS_setprod_prop SetS_finite) |
200 also (zcong_trans) have "[gsetprod (%x. a) (SetS a p) = |
200 also (zcong_trans) have "[setprod (%x. a) (SetS a p) = |
201 a^(card (SetS a p))] (mod p)"; |
201 a^(card (SetS a p))] (mod p)" |
202 by (auto simp add: prems SetS_finite gsetprod_const) |
202 by (auto simp add: prems SetS_finite setprod_constant) |
203 finally (zcong_trans) show ?thesis; |
203 finally (zcong_trans) show ?thesis |
204 apply (rule zcong_trans) |
204 apply (rule zcong_trans) |
205 apply (subgoal_tac "card(SetS a p) = nat((p - 1) div 2)", auto); |
205 apply (subgoal_tac "card(SetS a p) = nat((p - 1) div 2)", auto) |
206 apply (subgoal_tac "nat(int(card(SetS a p))) = nat((p - 1) div 2)", force); |
206 apply (subgoal_tac "nat(int(card(SetS a p))) = nat((p - 1) div 2)", force) |
207 apply (auto simp add: prems SetS_card) |
207 apply (auto simp add: prems SetS_card) |
208 done |
208 done |
209 qed; |
209 qed |
210 |
210 |
211 lemma Union_SetS_setprod_prop2: "[| p \<in> zprime; 2 < p; ~([a = 0](mod p)) |] ==> |
211 lemma Union_SetS_setprod_prop2: "[| p \<in> zprime; 2 < p; ~([a = 0](mod p)) |] ==> |
212 setprod (Union (SetS a p)) = zfact (p - 1)"; |
212 \<Prod>(Union (SetS a p)) = zfact (p - 1)"; |
213 proof -; |
213 proof -; |
214 assume "p \<in> zprime" and "2 < p" and "~([a = 0](mod p))"; |
214 assume "p \<in> zprime" and "2 < p" and "~([a = 0](mod p))"; |
215 then have "setprod (Union (SetS a p)) = setprod (SRStar p)"; |
215 then have "\<Prod>(Union (SetS a p)) = \<Prod>(SRStar p)" |
216 by (auto simp add: MultInvPair_prop2) |
216 by (auto simp add: MultInvPair_prop2) |
217 also have "... = setprod ({1} \<union> (d22set (p - 1)))"; |
217 also have "... = \<Prod>({1} \<union> (d22set (p - 1)))" |
218 by (auto simp add: prems SRStar_d22set_prop) |
218 by (auto simp add: prems SRStar_d22set_prop) |
219 also have "... = zfact(p - 1)"; |
219 also have "... = zfact(p - 1)" |
220 proof -; |
220 proof - |
221 have "~(1 \<in> d22set (p - 1)) & finite( d22set (p - 1))"; |
221 have "~(1 \<in> d22set (p - 1)) & finite( d22set (p - 1))" |
222 apply (insert prems, auto) |
222 apply (insert prems, auto) |
223 apply (drule d22set_g_1) |
223 apply (drule d22set_g_1) |
224 apply (auto simp add: d22set_fin) |
224 apply (auto simp add: d22set_fin) |
225 done |
225 done |
226 then have "setprod({1} \<union> (d22set (p - 1))) = setprod (d22set (p - 1))"; |
226 then have "\<Prod>({1} \<union> (d22set (p - 1))) = \<Prod>(d22set (p - 1))"; |
227 by auto |
227 by auto |
228 then show ?thesis |
228 then show ?thesis |
229 by (auto simp add: d22set_prod_zfact) |
229 by (auto simp add: d22set_prod_zfact) |
230 qed; |
230 qed; |
231 finally show ?thesis .; |
231 finally show ?thesis . |
232 qed; |
232 qed; |
233 |
233 |
234 lemma zfact_prop: "[| p \<in> zprime; 2 < p; ~([a = 0] (mod p)); ~(QuadRes p a) |] ==> |
234 lemma zfact_prop: "[| p \<in> zprime; 2 < p; ~([a = 0] (mod p)); ~(QuadRes p a) |] ==> |
235 [zfact (p - 1) = a ^ nat ((p - 1) div 2)] (mod p)"; |
235 [zfact (p - 1) = a ^ nat ((p - 1) div 2)] (mod p)"; |
236 apply (frule Union_SetS_setprod_prop1) |
236 apply (frule Union_SetS_setprod_prop1) |