1284 by simp_all |
1284 by simp_all |
1285 |
1285 |
1286 code_identifier |
1286 code_identifier |
1287 code_module Divides \<rightharpoonup> (SML) Arith and (OCaml) Arith and (Haskell) Arith |
1287 code_module Divides \<rightharpoonup> (SML) Arith and (OCaml) Arith and (Haskell) Arith |
1288 |
1288 |
1289 lemma dvd_eq_mod_eq_0_numeral: |
|
1290 "numeral x dvd (numeral y :: 'a) \<longleftrightarrow> numeral y mod numeral x = (0 :: 'a::semidom_modulo)" |
|
1291 by (fact dvd_eq_mod_eq_0) |
|
1292 |
|
1293 declare minus_div_mult_eq_mod [symmetric, nitpick_unfold] |
1289 declare minus_div_mult_eq_mod [symmetric, nitpick_unfold] |
1294 |
1290 |
1295 |
1291 |
1296 subsubsection \<open>Lemmas of doubtful value\<close> |
1292 subsubsection \<open>Lemmas of doubtful value\<close> |
1297 |
|
1298 lemma mod_Suc_eq_Suc_mod: |
|
1299 "Suc m mod n = Suc (m mod n) mod n" |
|
1300 by (simp add: mod_simps) |
|
1301 |
1293 |
1302 lemma div_geq: |
1294 lemma div_geq: |
1303 "m div n = Suc ((m - n) div n)" if "0 < n" and " \<not> m < n" for m n :: nat |
1295 "m div n = Suc ((m - n) div n)" if "0 < n" and " \<not> m < n" for m n :: nat |
1304 by (rule le_div_geq) (use that in \<open>simp_all add: not_less\<close>) |
1296 by (rule le_div_geq) (use that in \<open>simp_all add: not_less\<close>) |
1305 |
1297 |
1306 lemma mod_geq: |
1298 lemma mod_geq: |
1307 "m mod n = (m - n) mod n" if "\<not> m < n" for m n :: nat |
1299 "m mod n = (m - n) mod n" if "\<not> m < n" for m n :: nat |
1308 by (rule le_mod_geq) (use that in \<open>simp add: not_less\<close>) |
1300 by (rule le_mod_geq) (use that in \<open>simp add: not_less\<close>) |
1309 |
1301 |
1310 lemma mod_eq_0_iff: "(m mod d = 0) = (\<exists>q::nat. m = d*q)" |
1302 lemma mod_eq_0D [dest!]: |
1311 by (auto simp add: dvd_eq_mod_eq_0 [symmetric] dvd_def) |
1303 "\<exists>q. m = d * q" if "m mod d = 0" for m d :: nat |
1312 |
1304 using that by (auto simp add: mod_eq_0_iff_dvd elim: dvdE) |
1313 lemmas mod_eq_0D [dest!] = mod_eq_0_iff [THEN iffD1] |
|
1314 |
|
1315 (*Loses information, namely we also have r<d provided d is nonzero*) |
|
1316 lemma mod_eqD: |
|
1317 fixes m d r q :: nat |
|
1318 assumes "m mod d = r" |
|
1319 shows "\<exists>q. m = r + q * d" |
|
1320 proof - |
|
1321 from div_mult_mod_eq obtain q where "q * d + m mod d = m" by blast |
|
1322 with assms have "m = r + q * d" by simp |
|
1323 then show ?thesis .. |
|
1324 qed |
|
1325 |
|
1326 lemma is_unit_int: |
|
1327 "is_unit (k::int) \<longleftrightarrow> k = 1 \<or> k = - 1" |
|
1328 by auto |
|
1329 |
1305 |
1330 end |
1306 end |