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" |