src/HOL/Old_Number_Theory/Euler.thy
changeset 64272 f76b6dda2e56
parent 64267 b9a1486e79be
equal deleted inserted replaced
64269:c939cc16b605 64272:f76b6dda2e56
   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));