src/HOL/Divides.thy
changeset 68157 057d5b4ce47e
parent 68100 b2d84b1114fa
child 68253 a8660a39e304
equal deleted inserted replaced
68156:7da3af31ca4d 68157:057d5b4ce47e
  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