131 finally show ?thesis . |
131 finally show ?thesis . |
132 qed |
132 qed |
133 then show ?thesis by auto |
133 then show ?thesis by auto |
134 qed |
134 qed |
135 |
135 |
136 lemma SetS_setprod_prop: "[| zprime p; 2 < p; ~([a = 0] (mod p)); |
136 lemma SetS_prod_prop: "[| zprime p; 2 < p; ~([a = 0] (mod p)); |
137 ~(QuadRes p a); x \<in> (SetS a p) |] ==> |
137 ~(QuadRes p a); x \<in> (SetS a p) |] ==> |
138 [\<Prod>x = a] (mod p)" |
138 [\<Prod>x = a] (mod p)" |
139 apply (auto simp add: SetS_def MultInvPair_def) |
139 apply (auto simp add: SetS_def MultInvPair_def) |
140 apply (frule StandardRes_SRStar_prop1a) |
140 apply (frule StandardRes_SRStar_prop1a) |
141 apply hypsubst_thin |
141 apply hypsubst_thin |
172 apply (simp add: d22set.simps) |
172 apply (simp add: d22set.simps) |
173 apply (frule d22set_le) |
173 apply (frule d22set_le) |
174 apply (frule d22set_g_1, auto) |
174 apply (frule d22set_g_1, auto) |
175 done |
175 done |
176 |
176 |
177 lemma Union_SetS_setprod_prop1: |
177 lemma Union_SetS_prod_prop1: |
178 assumes "zprime p" and "2 < p" and "~([a = 0] (mod p))" and |
178 assumes "zprime p" and "2 < p" and "~([a = 0] (mod p))" and |
179 "~(QuadRes p a)" |
179 "~(QuadRes p a)" |
180 shows "[\<Prod>(\<Union>(SetS a p)) = a ^ nat ((p - 1) div 2)] (mod p)" |
180 shows "[\<Prod>(\<Union>(SetS a p)) = a ^ nat ((p - 1) div 2)] (mod p)" |
181 proof - |
181 proof - |
182 from assms have "[\<Prod>(\<Union>(SetS a p)) = setprod (setprod (%x. x)) (SetS a p)] (mod p)" |
182 from assms have "[\<Prod>(\<Union>(SetS a p)) = prod (prod (%x. x)) (SetS a p)] (mod p)" |
183 by (auto simp add: SetS_finite SetS_elems_finite |
183 by (auto simp add: SetS_finite SetS_elems_finite |
184 MultInvPair_prop1c setprod.Union_disjoint) |
184 MultInvPair_prop1c prod.Union_disjoint) |
185 also have "[setprod (setprod (%x. x)) (SetS a p) = |
185 also have "[prod (prod (%x. x)) (SetS a p) = |
186 setprod (%x. a) (SetS a p)] (mod p)" |
186 prod (%x. a) (SetS a p)] (mod p)" |
187 by (rule setprod_same_function_zcong) |
187 by (rule prod_same_function_zcong) |
188 (auto simp add: assms SetS_setprod_prop SetS_finite) |
188 (auto simp add: assms SetS_prod_prop SetS_finite) |
189 also (zcong_trans) have "[setprod (%x. a) (SetS a p) = |
189 also (zcong_trans) have "[prod (%x. a) (SetS a p) = |
190 a^(card (SetS a p))] (mod p)" |
190 a^(card (SetS a p))] (mod p)" |
191 by (auto simp add: assms SetS_finite setprod_constant) |
191 by (auto simp add: assms SetS_finite prod_constant) |
192 finally (zcong_trans) show ?thesis |
192 finally (zcong_trans) show ?thesis |
193 apply (rule zcong_trans) |
193 apply (rule zcong_trans) |
194 apply (subgoal_tac "card(SetS a p) = nat((p - 1) div 2)", auto) |
194 apply (subgoal_tac "card(SetS a p) = nat((p - 1) div 2)", auto) |
195 apply (subgoal_tac "nat(int(card(SetS a p))) = nat((p - 1) div 2)", force) |
195 apply (subgoal_tac "nat(int(card(SetS a p))) = nat((p - 1) div 2)", force) |
196 apply (auto simp add: assms SetS_card) |
196 apply (auto simp add: assms SetS_card) |
197 done |
197 done |
198 qed |
198 qed |
199 |
199 |
200 lemma Union_SetS_setprod_prop2: |
200 lemma Union_SetS_prod_prop2: |
201 assumes "zprime p" and "2 < p" and "~([a = 0](mod p))" |
201 assumes "zprime p" and "2 < p" and "~([a = 0](mod p))" |
202 shows "\<Prod>(\<Union>(SetS a p)) = zfact (p - 1)" |
202 shows "\<Prod>(\<Union>(SetS a p)) = zfact (p - 1)" |
203 proof - |
203 proof - |
204 from assms have "\<Prod>(\<Union>(SetS a p)) = \<Prod>(SRStar p)" |
204 from assms have "\<Prod>(\<Union>(SetS a p)) = \<Prod>(SRStar p)" |
205 by (auto simp add: MultInvPair_prop2) |
205 by (auto simp add: MultInvPair_prop2) |
217 finally show ?thesis . |
217 finally show ?thesis . |
218 qed |
218 qed |
219 |
219 |
220 lemma zfact_prop: "[| zprime p; 2 < p; ~([a = 0] (mod p)); ~(QuadRes p a) |] ==> |
220 lemma zfact_prop: "[| zprime p; 2 < p; ~([a = 0] (mod p)); ~(QuadRes p a) |] ==> |
221 [zfact (p - 1) = a ^ nat ((p - 1) div 2)] (mod p)" |
221 [zfact (p - 1) = a ^ nat ((p - 1) div 2)] (mod p)" |
222 apply (frule Union_SetS_setprod_prop1) |
222 apply (frule Union_SetS_prod_prop1) |
223 apply (auto simp add: Union_SetS_setprod_prop2) |
223 apply (auto simp add: Union_SetS_prod_prop2) |
224 done |
224 done |
225 |
225 |
226 text \<open>\medskip Prove the first part of Euler's Criterion:\<close> |
226 text \<open>\medskip Prove the first part of Euler's Criterion:\<close> |
227 |
227 |
228 lemma Euler_part1: "[| 2 < p; zprime p; ~([x = 0](mod p)); |
228 lemma Euler_part1: "[| 2 < p; zprime p; ~([x = 0](mod p)); |