src/HOL/Number_Theory/Primes.thy
changeset 55238 7ddb889e23bd
parent 55215 b6c926e67350
child 55242 413ec965f95d
equal deleted inserted replaced
55237:1e341728bae9 55238:7ddb889e23bd
   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