460 hence "p^k = p^j*d" using H(2) by (simp add: power_add) |
460 hence "p^k = p^j*d" using H(2) by (simp add: power_add) |
461 hence "d dvd p^k" unfolding dvd_def by auto} |
461 hence "d dvd p^k" unfolding dvd_def by auto} |
462 thus "\<exists>i\<le>k. d = p ^ i \<Longrightarrow> d dvd p ^ k" by blast |
462 thus "\<exists>i\<le>k. d = p ^ i \<Longrightarrow> d dvd p ^ k" by blast |
463 qed |
463 qed |
464 |
464 |
|
465 subsection {*Chinese Remainder Theorem Variants*} |
|
466 |
|
467 lemma bezout_gcd_nat: |
|
468 fixes a::nat shows "\<exists>x y. a * x - b * y = gcd a b \<or> b * x - a * y = gcd a b" |
|
469 using bezout_nat[of a b] |
|
470 by (metis bezout_nat diff_add_inverse gcd_add_mult_nat gcd_nat.commute |
|
471 gcd_nat.right_neutral mult_0) |
|
472 |
|
473 lemma gcd_bezout_sum_nat: |
|
474 fixes a::nat |
|
475 assumes "a * x + b * y = d" |
|
476 shows "gcd a b dvd d" |
|
477 proof- |
|
478 let ?g = "gcd a b" |
|
479 have dv: "?g dvd a*x" "?g dvd b * y" |
|
480 by simp_all |
|
481 from dvd_add[OF dv] assms |
|
482 show ?thesis by auto |
|
483 qed |
|
484 |
|
485 |
|
486 text {* A binary form of the Chinese Remainder Theorem. *} |
|
487 |
|
488 lemma chinese_remainder: |
|
489 fixes a::nat assumes ab: "coprime a b" and a: "a \<noteq> 0" and b: "b \<noteq> 0" |
|
490 shows "\<exists>x q1 q2. x = u + q1 * a \<and> x = v + q2 * b" |
|
491 proof- |
|
492 from bezout_add_strong_nat[OF a, of b] bezout_add_strong_nat[OF b, of a] |
|
493 obtain d1 x1 y1 d2 x2 y2 where dxy1: "d1 dvd a" "d1 dvd b" "a * x1 = b * y1 + d1" |
|
494 and dxy2: "d2 dvd b" "d2 dvd a" "b * x2 = a * y2 + d2" by blast |
|
495 then have d12: "d1 = 1" "d2 =1" |
|
496 by (metis ab coprime_nat)+ |
|
497 let ?x = "v * a * x1 + u * b * x2" |
|
498 let ?q1 = "v * x1 + u * y2" |
|
499 let ?q2 = "v * y1 + u * x2" |
|
500 from dxy2(3)[simplified d12] dxy1(3)[simplified d12] |
|
501 have "?x = u + ?q1 * a" "?x = v + ?q2 * b" |
|
502 apply (auto simp add: algebra_simps) |
|
503 apply (metis mult_Suc_right nat_mult_assoc nat_mult_commute)+ |
|
504 done |
|
505 thus ?thesis by blast |
|
506 qed |
|
507 |
|
508 text {* Primality *} |
|
509 |
|
510 lemma coprime_bezout_strong: |
|
511 fixes a::nat assumes "coprime a b" "b \<noteq> 1" |
|
512 shows "\<exists>x y. a * x = b * y + 1" |
|
513 by (metis assms bezout_nat gcd_nat.left_neutral) |
|
514 |
|
515 lemma bezout_prime: |
|
516 assumes p: "prime p" and pa: "\<not> p dvd a" |
|
517 shows "\<exists>x y. a*x = Suc (p*y)" |
|
518 proof- |
|
519 have ap: "coprime a p" |
|
520 by (metis gcd_nat.commute p pa prime_imp_coprime_nat) |
|
521 from coprime_bezout_strong[OF ap] show ?thesis |
|
522 by (metis Suc_eq_plus1 gcd_lcm_complete_lattice_nat.bot.extremum pa) |
|
523 qed |
|
524 |
465 end |
525 end |