src/HOL/Divides.thy
changeset 74101 d804e93ae9ff
parent 73535 0f33c7031ec9
child 75669 43f5dfb7fa35
equal deleted inserted replaced
74100:fb9c119e5b49 74101:d804e93ae9ff
  1103 end
  1103 end
  1104 
  1104 
  1105 lemma divmod_BitM_2_eq [simp]:
  1105 lemma divmod_BitM_2_eq [simp]:
  1106   \<open>divmod (Num.BitM m) (Num.Bit0 Num.One) = (numeral m - 1, (1 :: int))\<close>
  1106   \<open>divmod (Num.BitM m) (Num.Bit0 Num.One) = (numeral m - 1, (1 :: int))\<close>
  1107   by (cases m) simp_all
  1107   by (cases m) simp_all
  1108 
       
  1109 lemma bit_numeral_Bit0_Suc_iff [simp]:
       
  1110   \<open>bit (numeral (Num.Bit0 m) :: int) (Suc n) \<longleftrightarrow> bit (numeral m :: int) n\<close>
       
  1111   by (simp add: bit_Suc)
       
  1112 
       
  1113 lemma bit_numeral_Bit1_Suc_iff [simp]:
       
  1114   \<open>bit (numeral (Num.Bit1 m) :: int) (Suc n) \<longleftrightarrow> bit (numeral m :: int) n\<close>
       
  1115   by (simp add: bit_Suc)
       
  1116 
  1108 
  1117 lemma div_positive_int:
  1109 lemma div_positive_int:
  1118   "k div l > 0" if "k \<ge> l" and "l > 0" for k l :: int
  1110   "k div l > 0" if "k \<ge> l" and "l > 0" for k l :: int
  1119   using that div_positive [of l k] by blast
  1111   using that div_positive [of l k] by blast
  1120 
  1112 
  1223 
  1215 
  1224 code_identifier
  1216 code_identifier
  1225   code_module Divides \<rightharpoonup> (SML) Arith and (OCaml) Arith and (Haskell) Arith
  1217   code_module Divides \<rightharpoonup> (SML) Arith and (OCaml) Arith and (Haskell) Arith
  1226 
  1218 
  1227 
  1219 
  1228 subsection \<open>More on bit operations\<close>
       
  1229 
       
  1230 lemma take_bit_incr_eq:
       
  1231   \<open>take_bit n (k + 1) = 1 + take_bit n k\<close> if \<open>take_bit n k \<noteq> 2 ^ n - 1\<close>
       
  1232   for k :: int
       
  1233 proof -
       
  1234   from that have \<open>2 ^ n \<noteq> k mod 2 ^ n + 1\<close>
       
  1235     by (simp add: take_bit_eq_mod)
       
  1236   moreover have \<open>k mod 2 ^ n < 2 ^ n\<close>
       
  1237     by simp
       
  1238   ultimately have *: \<open>k mod 2 ^ n + 1 < 2 ^ n\<close>
       
  1239     by linarith
       
  1240   have \<open>(k + 1) mod 2 ^ n = (k mod 2 ^ n + 1) mod 2 ^ n\<close>
       
  1241     by (simp add: mod_simps)
       
  1242   also have \<open>\<dots> = k mod 2 ^ n + 1\<close>
       
  1243     using * by (simp add: zmod_trivial_iff)
       
  1244   finally have \<open>(k + 1) mod 2 ^ n = k mod 2 ^ n + 1\<close> .
       
  1245   then show ?thesis
       
  1246     by (simp add: take_bit_eq_mod)
       
  1247 qed
       
  1248 
       
  1249 lemma take_bit_decr_eq:
       
  1250   \<open>take_bit n (k - 1) = take_bit n k - 1\<close> if \<open>take_bit n k \<noteq> 0\<close>
       
  1251   for k :: int
       
  1252 proof -
       
  1253   from that have \<open>k mod 2 ^ n \<noteq> 0\<close>
       
  1254     by (simp add: take_bit_eq_mod)
       
  1255   moreover have \<open>k mod 2 ^ n \<ge> 0\<close> \<open>k mod 2 ^ n < 2 ^ n\<close>
       
  1256     by simp_all
       
  1257   ultimately have *: \<open>k mod 2 ^ n > 0\<close>
       
  1258     by linarith
       
  1259   have \<open>(k - 1) mod 2 ^ n = (k mod 2 ^ n - 1) mod 2 ^ n\<close>
       
  1260     by (simp add: mod_simps)
       
  1261   also have \<open>\<dots> = k mod 2 ^ n - 1\<close>
       
  1262     by (simp add: zmod_trivial_iff)
       
  1263       (use \<open>k mod 2 ^ n < 2 ^ n\<close> * in linarith)
       
  1264   finally have \<open>(k - 1) mod 2 ^ n = k mod 2 ^ n - 1\<close> .
       
  1265   then show ?thesis
       
  1266     by (simp add: take_bit_eq_mod)
       
  1267 qed
       
  1268 
       
  1269 lemma take_bit_int_greater_eq:
       
  1270   \<open>k + 2 ^ n \<le> take_bit n k\<close> if \<open>k < 0\<close> for k :: int
       
  1271 proof -
       
  1272   have \<open>k + 2 ^ n \<le> take_bit n (k + 2 ^ n)\<close>
       
  1273   proof (cases \<open>k > - (2 ^ n)\<close>)
       
  1274     case False
       
  1275     then have \<open>k + 2 ^ n \<le> 0\<close>
       
  1276       by simp
       
  1277     also note take_bit_nonnegative
       
  1278     finally show ?thesis .
       
  1279   next
       
  1280     case True
       
  1281     with that have \<open>0 \<le> k + 2 ^ n\<close> and \<open>k + 2 ^ n < 2 ^ n\<close>
       
  1282       by simp_all
       
  1283     then show ?thesis
       
  1284       by (simp only: take_bit_eq_mod mod_pos_pos_trivial)
       
  1285   qed
       
  1286   then show ?thesis
       
  1287     by (simp add: take_bit_eq_mod)
       
  1288 qed
       
  1289 
       
  1290 lemma take_bit_int_less_eq:
       
  1291   \<open>take_bit n k \<le> k - 2 ^ n\<close> if \<open>2 ^ n \<le> k\<close> and \<open>n > 0\<close> for k :: int
       
  1292   using that zmod_le_nonneg_dividend [of \<open>k - 2 ^ n\<close> \<open>2 ^ n\<close>]
       
  1293   by (simp add: take_bit_eq_mod)
       
  1294 
       
  1295 lemma take_bit_int_less_eq_self_iff:
       
  1296   \<open>take_bit n k \<le> k \<longleftrightarrow> 0 \<le> k\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>)
       
  1297   for k :: int
       
  1298 proof
       
  1299   assume ?P
       
  1300   show ?Q
       
  1301   proof (rule ccontr)
       
  1302     assume \<open>\<not> 0 \<le> k\<close>
       
  1303     then have \<open>k < 0\<close>
       
  1304       by simp
       
  1305     with \<open>?P\<close>
       
  1306     have \<open>take_bit n k < 0\<close>
       
  1307       by (rule le_less_trans)
       
  1308     then show False
       
  1309       by simp
       
  1310   qed
       
  1311 next
       
  1312   assume ?Q
       
  1313   then show ?P
       
  1314     by (simp add: take_bit_eq_mod zmod_le_nonneg_dividend)
       
  1315 qed
       
  1316 
       
  1317 lemma take_bit_int_less_self_iff:
       
  1318   \<open>take_bit n k < k \<longleftrightarrow> 2 ^ n \<le> k\<close>
       
  1319   for k :: int
       
  1320   by (auto simp add: less_le take_bit_int_less_eq_self_iff take_bit_int_eq_self_iff
       
  1321     intro: order_trans [of 0 \<open>2 ^ n\<close> k])
       
  1322 
       
  1323 lemma take_bit_int_greater_self_iff:
       
  1324   \<open>k < take_bit n k \<longleftrightarrow> k < 0\<close>
       
  1325   for k :: int
       
  1326   using take_bit_int_less_eq_self_iff [of n k] by auto
       
  1327 
       
  1328 lemma take_bit_int_greater_eq_self_iff:
       
  1329   \<open>k \<le> take_bit n k \<longleftrightarrow> k < 2 ^ n\<close>
       
  1330   for k :: int
       
  1331   by (auto simp add: le_less take_bit_int_greater_self_iff take_bit_int_eq_self_iff
       
  1332     dest: sym not_sym intro: less_trans [of k 0 \<open>2 ^ n\<close>])
       
  1333 
       
  1334 
       
  1335 subsection \<open>Lemmas of doubtful value\<close>
  1220 subsection \<open>Lemmas of doubtful value\<close>
  1336 
  1221 
  1337 lemma div_geq: "m div n = Suc ((m - n) div n)" if "0 < n" and " \<not> m < n" for m n :: nat
  1222 lemma div_geq: "m div n = Suc ((m - n) div n)" if "0 < n" and " \<not> m < n" for m n :: nat
  1338   by (rule le_div_geq) (use that in \<open>simp_all add: not_less\<close>)
  1223   by (rule le_div_geq) (use that in \<open>simp_all add: not_less\<close>)
  1339 
  1224