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 |