src/HOL/NumberTheory/Euler.thy
changeset 15392 290bc97038c7
parent 15047 fa62de5862b9
child 15402 97204f3b4705
equal deleted inserted replaced
15391:797ed46d724b 15392:290bc97038c7
   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)