src/HOL/Number_Theory/Residues.thy
changeset 63534 523b488b15c9
parent 63417 c184ec919c70
child 63537 831816778409
equal deleted inserted replaced
63525:f01d1e393f3f 63534:523b488b15c9
   200 
   200 
   201 
   201 
   202 subsection \<open>Prime residues\<close>
   202 subsection \<open>Prime residues\<close>
   203 
   203 
   204 locale residues_prime =
   204 locale residues_prime =
   205   fixes p and R (structure)
   205   fixes p :: nat and R (structure)
   206   assumes p_prime [intro]: "prime p"
   206   assumes p_prime [intro]: "prime p"
   207   defines "R \<equiv> residue_ring p"
   207   defines "R \<equiv> residue_ring (int p)"
   208 
   208 
   209 sublocale residues_prime < residues p
   209 sublocale residues_prime < residues p
   210   apply (unfold R_def residues_def)
   210   apply (unfold R_def residues_def)
   211   using p_prime apply auto
   211   using p_prime apply auto
   212   apply (metis (full_types) of_nat_1 of_nat_less_iff prime_gt_1_nat)
   212   apply (metis (full_types) of_nat_1 of_nat_less_iff prime_gt_1_nat)
   221   apply (auto simp add: res_carrier_eq res_one_eq res_zero_eq res_units_eq)
   221   apply (auto simp add: res_carrier_eq res_one_eq res_zero_eq res_units_eq)
   222   apply (rule classical)
   222   apply (rule classical)
   223   apply (erule notE)
   223   apply (erule notE)
   224   apply (subst gcd.commute)
   224   apply (subst gcd.commute)
   225   apply (rule prime_imp_coprime_int)
   225   apply (rule prime_imp_coprime_int)
   226   apply (rule p_prime)
   226   apply (simp add: p_prime)
   227   apply (rule notI)
   227   apply (rule notI)
   228   apply (frule zdvd_imp_le)
   228   apply (frule zdvd_imp_le)
   229   apply auto
   229   apply auto
   230   done
   230   done
   231 
   231 
   278     with \<open>x dvd p\<close> \<open>1 < x\<close> show ?thesis
   278     with \<open>x dvd p\<close> \<open>1 < x\<close> show ?thesis
   279       by auto
   279       by auto
   280   qed
   280   qed
   281   then show ?thesis
   281   then show ?thesis
   282     using \<open>2 \<le> p\<close>
   282     using \<open>2 \<le> p\<close>
   283     by (simp add: prime_def)
   283     by (simp add: is_prime_nat_iff)
   284        (metis One_nat_def dvd_pos_nat nat_dvd_not_less nat_neq_iff not_gr0
   284        (metis One_nat_def dvd_pos_nat nat_dvd_not_less nat_neq_iff not_gr0
   285               not_numeral_le_zero one_dvd)
   285               not_numeral_le_zero one_dvd)
   286 qed
   286 qed
   287 
   287 
   288 lemma phi_zero [simp]: "phi 0 = 0"
   288 lemma phi_zero [simp]: "phi 0 = 0"
   345   apply (subst phi_eq)
   345   apply (subst phi_eq)
   346   apply (subst res_prime_units_eq)
   346   apply (subst res_prime_units_eq)
   347   apply auto
   347   apply auto
   348   done
   348   done
   349 
   349 
   350 lemma phi_prime: "prime p \<Longrightarrow> phi p = nat p - 1"
   350 lemma phi_prime: "prime (int p) \<Longrightarrow> phi p = nat p - 1"
   351   apply (rule residues_prime.phi_prime)
   351   apply (rule residues_prime.phi_prime)
       
   352   apply simp
   352   apply (erule residues_prime.intro)
   353   apply (erule residues_prime.intro)
   353   done
   354   done
   354 
   355 
   355 lemma fermat_theorem:
   356 lemma fermat_theorem:
   356   fixes a :: int
   357   fixes a :: int
   357   assumes "prime p"
   358   assumes "prime (int p)"
   358     and "\<not> p dvd a"
   359     and "\<not> p dvd a"
   359   shows "[a^(p - 1) = 1] (mod p)"
   360   shows "[a^(p - 1) = 1] (mod p)"
   360 proof -
   361 proof -
   361   from assms have "[a ^ phi p = 1] (mod p)"
   362   from assms have "[a ^ phi p = 1] (mod p)"
   362     by (auto intro!: euler_theorem dest!: prime_imp_coprime_int simp add: ac_simps)
   363     by (auto intro!: euler_theorem intro!: prime_imp_coprime_int[of p]
       
   364              simp: gcd.commute[of _ "int p"])
   363   also have "phi p = nat p - 1"
   365   also have "phi p = nat p - 1"
   364     by (rule phi_prime) (rule assms)
   366     by (rule phi_prime) (rule assms)
   365   finally show ?thesis
   367   finally show ?thesis
   366     by (metis nat_int)
   368     by (metis nat_int)
   367 qed
   369 qed
   368 
   370 
   369 lemma fermat_theorem_nat:
   371 lemma fermat_theorem_nat:
   370   assumes "prime p" and "\<not> p dvd a"
   372   assumes "prime (int p)" and "\<not> p dvd a"
   371   shows "[a ^ (p - 1) = 1] (mod p)"
   373   shows "[a ^ (p - 1) = 1] (mod p)"
   372   using fermat_theorem [of p a] assms
   374   using fermat_theorem [of p a] assms
   373   by (metis of_nat_1 of_nat_power transfer_int_nat_cong zdvd_int)
   375   by (metis of_nat_1 of_nat_power transfer_int_nat_cong zdvd_int)
   374 
   376 
   375 
   377