src/HOL/Divides.thy
changeset 66837 6ba663ff2b1c
parent 66817 0b12755ccbb2
child 66886 960509bfd47e
equal deleted inserted replaced
66836:4eb431c3f974 66837:6ba663ff2b1c
  1162 apply (subgoal_tac "nat x div nat k < nat x")
  1162 apply (subgoal_tac "nat x div nat k < nat x")
  1163  apply (simp add: nat_div_distrib [symmetric])
  1163  apply (simp add: nat_div_distrib [symmetric])
  1164 apply (rule div_less_dividend, simp_all)
  1164 apply (rule div_less_dividend, simp_all)
  1165 done
  1165 done
  1166 
  1166 
  1167 lemma nat_mod_eq_lemma: assumes xyn: "(x::nat) mod n = y mod n" and xy:"y \<le> x"
  1167 lemma mod_eq_dvd_iff_nat:
       
  1168   "m mod q = n mod q \<longleftrightarrow> q dvd m - n" if "m \<ge> n" for m n q :: nat
       
  1169 proof -
       
  1170   have "int m mod int q = int n mod int q \<longleftrightarrow> int q dvd int m - int n"
       
  1171     by (simp add: mod_eq_dvd_iff)
       
  1172   with that have "int (m mod q) = int (n mod q) \<longleftrightarrow> int q dvd int (m - n)"
       
  1173     by (simp only: of_nat_mod of_nat_diff)
       
  1174   then show ?thesis
       
  1175     by (simp add: zdvd_int)
       
  1176 qed
       
  1177 
       
  1178 lemma mod_eq_nat1E:
       
  1179   fixes m n q :: nat
       
  1180   assumes "m mod q = n mod q" and "m \<ge> n"
       
  1181   obtains s where "m = n + q * s"
       
  1182 proof -
       
  1183   from assms have "q dvd m - n"
       
  1184     by (simp add: mod_eq_dvd_iff_nat)
       
  1185   then obtain s where "m - n = q * s" ..
       
  1186   with \<open>m \<ge> n\<close> have "m = n + q * s"
       
  1187     by simp
       
  1188   with that show thesis .
       
  1189 qed
       
  1190 
       
  1191 lemma mod_eq_nat2E:
       
  1192   fixes m n q :: nat
       
  1193   assumes "m mod q = n mod q" and "n \<ge> m"
       
  1194   obtains s where "n = m + q * s"
       
  1195   using assms mod_eq_nat1E [of n q m] by (auto simp add: ac_simps)
       
  1196 
       
  1197 lemma nat_mod_eq_lemma:
       
  1198   assumes "(x::nat) mod n = y mod n" and "y \<le> x"
  1168   shows "\<exists>q. x = y + n * q"
  1199   shows "\<exists>q. x = y + n * q"
  1169 proof-
  1200   using assms by (rule mod_eq_nat1E) rule
  1170   from xy have th: "int x - int y = int (x - y)" by simp
       
  1171   from xyn have "int x mod int n = int y mod int n"
       
  1172     by (simp add: zmod_int [symmetric])
       
  1173   hence "int n dvd int x - int y" by (simp only: mod_eq_dvd_iff [symmetric])
       
  1174   hence "n dvd x - y" by (simp add: th zdvd_int)
       
  1175   then show ?thesis using xy unfolding dvd_def apply clarsimp apply (rule_tac x="k" in exI) by arith
       
  1176 qed
       
  1177 
  1201 
  1178 lemma nat_mod_eq_iff: "(x::nat) mod n = y mod n \<longleftrightarrow> (\<exists>q1 q2. x + n * q1 = y + n * q2)"
  1202 lemma nat_mod_eq_iff: "(x::nat) mod n = y mod n \<longleftrightarrow> (\<exists>q1 q2. x + n * q1 = y + n * q2)"
  1179   (is "?lhs = ?rhs")
  1203   (is "?lhs = ?rhs")
  1180 proof
  1204 proof
  1181   assume H: "x mod n = y mod n"
  1205   assume H: "x mod n = y mod n"