src/HOL/NumberTheory/IntPrimes.thy
changeset 27651 16a26996c30e
parent 27569 c8419e8a2d83
child 29412 4085a531153d
equal deleted inserted replaced
27650:7a4baad05495 27651:16a26996c30e
   125 
   125 
   126 lemma zcong_refl [simp]: "[k = k] (mod m)"
   126 lemma zcong_refl [simp]: "[k = k] (mod m)"
   127   by (unfold zcong_def, auto)
   127   by (unfold zcong_def, auto)
   128 
   128 
   129 lemma zcong_sym: "[a = b] (mod m) = [b = a] (mod m)"
   129 lemma zcong_sym: "[a = b] (mod m) = [b = a] (mod m)"
   130   apply (unfold zcong_def dvd_def, auto)
   130   unfolding zcong_def minus_diff_eq [of a, symmetric] zdvd_zminus_iff ..
   131    apply (rule_tac [!] x = "-k" in exI, auto)
       
   132   done
       
   133 
   131 
   134 lemma zcong_zadd:
   132 lemma zcong_zadd:
   135     "[a = b] (mod m) ==> [c = d] (mod m) ==> [a + c = b + d] (mod m)"
   133     "[a = b] (mod m) ==> [c = d] (mod m) ==> [a + c = b + d] (mod m)"
   136   apply (unfold zcong_def)
   134   apply (unfold zcong_def)
   137   apply (rule_tac s = "(a - b) + (c - d)" in subst)
   135   apply (rule_tac s = "(a - b) + (c - d)" in subst)
   145    apply (rule_tac [2] zdvd_zdiff, auto)
   143    apply (rule_tac [2] zdvd_zdiff, auto)
   146   done
   144   done
   147 
   145 
   148 lemma zcong_trans:
   146 lemma zcong_trans:
   149     "[a = b] (mod m) ==> [b = c] (mod m) ==> [a = c] (mod m)"
   147     "[a = b] (mod m) ==> [b = c] (mod m) ==> [a = c] (mod m)"
   150   apply (unfold zcong_def dvd_def, auto)
   148   unfolding zcong_def
   151   apply (rule_tac x = "k + ka" in exI)
   149   apply (auto elim!: dvdE simp add: ring_simps)
   152   apply (simp add: zadd_ac zadd_zmult_distrib2)
   150   unfolding left_distrib [symmetric]
       
   151   apply (rule dvd_mult dvd_refl)+
   153   done
   152   done
   154 
   153 
   155 lemma zcong_zmult:
   154 lemma zcong_zmult:
   156     "[a = b] (mod m) ==> [c = d] (mod m) ==> [a * c = b * d] (mod m)"
   155     "[a = b] (mod m) ==> [c = d] (mod m) ==> [a * c = b * d] (mod m)"
   157   apply (rule_tac b = "b * c" in zcong_trans)
   156   apply (rule_tac b = "b * c" in zcong_trans)
   205   by (simp add: zmult_commute zcong_cancel)
   204   by (simp add: zmult_commute zcong_cancel)
   206 
   205 
   207 lemma zcong_zgcd_zmult_zmod:
   206 lemma zcong_zgcd_zmult_zmod:
   208   "[a = b] (mod m) ==> [a = b] (mod n) ==> zgcd m n = 1
   207   "[a = b] (mod m) ==> [a = b] (mod n) ==> zgcd m n = 1
   209     ==> [a = b] (mod m * n)"
   208     ==> [a = b] (mod m * n)"
   210   apply (unfold zcong_def dvd_def, auto)
   209   apply (auto simp add: zcong_def dvd_def)
   211   apply (subgoal_tac "m dvd n * ka")
   210   apply (subgoal_tac "m dvd n * ka")
   212    apply (subgoal_tac "m dvd ka")
   211    apply (subgoal_tac "m dvd ka")
   213     apply (case_tac [2] "0 \<le> ka")
   212     apply (case_tac [2] "0 \<le> ka")
   214   apply (metis zdvd_mult_div_cancel zdvd_refl zdvd_zminus2_iff zdvd_zmultD2 zgcd_zminus zmult_commute zmult_zminus zrelprime_zdvd_zmult)
   213   apply (metis zdvd_mult_div_cancel zdvd_refl zdvd_zminus2_iff zdvd_zmultD2 zgcd_zminus zmult_commute zmult_zminus zrelprime_zdvd_zmult)
   215   apply (metis IntDiv.zdvd_abs1 abs_of_nonneg zadd_0 zgcd_0_left zgcd_commute zgcd_zadd_zmult zgcd_zdvd_zgcd_zmult zgcd_zmult_distrib2_abs zmult_1_right zmult_commute)
   214   apply (metis IntDiv.zdvd_abs1 abs_of_nonneg zadd_0 zgcd_0_left zgcd_commute zgcd_zadd_zmult zgcd_zdvd_zgcd_zmult zgcd_zmult_distrib2_abs zmult_1_right zmult_commute)
   253   apply (rule_tac x = "a mod m" in exI, auto)
   252   apply (rule_tac x = "a mod m" in exI, auto)
   254   apply (metis zmult_div_cancel)
   253   apply (metis zmult_div_cancel)
   255   done
   254   done
   256 
   255 
   257 lemma zcong_iff_lin: "([a = b] (mod m)) = (\<exists>k. b = a + m * k)"
   256 lemma zcong_iff_lin: "([a = b] (mod m)) = (\<exists>k. b = a + m * k)"
   258   apply (unfold zcong_def dvd_def, auto)
   257   unfolding zcong_def
   259    apply (rule_tac [!] x = "-k" in exI, auto)
   258   apply (auto elim!: dvdE simp add: ring_simps)
       
   259   apply (rule_tac x = "-k" in exI) apply simp
   260   done
   260   done
   261 
   261 
   262 lemma zgcd_zcong_zgcd:
   262 lemma zgcd_zcong_zgcd:
   263   "0 < m ==>
   263   "0 < m ==>
   264     zgcd a m = 1 ==> [a = b] (mod m) ==> zgcd b m = 1"
   264     zgcd a m = 1 ==> [a = b] (mod m) ==> zgcd b m = 1"
   304 
   304 
   305 subsection {* Modulo *}
   305 subsection {* Modulo *}
   306 
   306 
   307 lemma zmod_zdvd_zmod:
   307 lemma zmod_zdvd_zmod:
   308     "0 < (m::int) ==> m dvd b ==> (a mod b mod m) = (a mod m)"
   308     "0 < (m::int) ==> m dvd b ==> (a mod b mod m) = (a mod m)"
   309   apply (unfold dvd_def, auto)
   309   by (rule zmod_zmod_cancel) 
   310   apply (subst zcong_zmod_eq [symmetric])
       
   311    prefer 2
       
   312    apply (subst zcong_iff_lin)
       
   313    apply (rule_tac x = "k * (a div (m * k))" in exI)
       
   314    apply (simp add:zmult_assoc [symmetric], assumption)
       
   315   done
       
   316 
   310 
   317 
   311 
   318 subsection {* Extended GCD *}
   312 subsection {* Extended GCD *}
   319 
   313 
   320 declare xzgcda.simps [simp del]
   314 declare xzgcda.simps [simp del]