equal
deleted
inserted
replaced
1294 |
1294 |
1295 lemma drop_bit_of_bool [simp]: |
1295 lemma drop_bit_of_bool [simp]: |
1296 "drop_bit n (of_bool b) = of_bool (n = 0 \<and> b)" |
1296 "drop_bit n (of_bool b) = of_bool (n = 0 \<and> b)" |
1297 by (cases n) simp_all |
1297 by (cases n) simp_all |
1298 |
1298 |
1299 lemma take_bit_eq_0_imp_dvd: |
|
1300 "take_bit n a = 0 \<Longrightarrow> 2 ^ n dvd a" |
|
1301 by (simp add: take_bit_eq_mod mod_0_imp_dvd) |
|
1302 |
|
1303 lemma even_take_bit_eq [simp]: |
1299 lemma even_take_bit_eq [simp]: |
1304 \<open>even (take_bit n a) \<longleftrightarrow> n = 0 \<or> even a\<close> |
1300 \<open>even (take_bit n a) \<longleftrightarrow> n = 0 \<or> even a\<close> |
1305 by (simp add: take_bit_rec [of n a]) |
1301 by (simp add: take_bit_rec [of n a]) |
1306 |
1302 |
1307 lemma take_bit_take_bit [simp]: |
1303 lemma take_bit_take_bit [simp]: |
1386 assume \<open>2 ^ m \<noteq> 0\<close> |
1382 assume \<open>2 ^ m \<noteq> 0\<close> |
1387 with that show \<open>bit (take_bit n a) m \<longleftrightarrow> bit (if even a then 0 else 2 ^ n - 1) m\<close> |
1383 with that show \<open>bit (take_bit n a) m \<longleftrightarrow> bit (if even a then 0 else 2 ^ n - 1) m\<close> |
1388 by (simp add: bit_take_bit_iff bit_mask_iff stable_imp_bit_iff_odd) |
1384 by (simp add: bit_take_bit_iff bit_mask_iff stable_imp_bit_iff_odd) |
1389 qed |
1385 qed |
1390 |
1386 |
|
1387 lemma exp_dvdE: |
|
1388 assumes \<open>2 ^ n dvd a\<close> |
|
1389 obtains b where \<open>a = push_bit n b\<close> |
|
1390 proof - |
|
1391 from assms obtain b where \<open>a = 2 ^ n * b\<close> .. |
|
1392 then have \<open>a = push_bit n b\<close> |
|
1393 by (simp add: push_bit_eq_mult ac_simps) |
|
1394 with that show thesis . |
|
1395 qed |
|
1396 |
|
1397 lemma take_bit_eq_0_iff: |
|
1398 \<open>take_bit n a = 0 \<longleftrightarrow> 2 ^ n dvd a\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>) |
|
1399 proof |
|
1400 assume ?P |
|
1401 then show ?Q |
|
1402 by (simp add: take_bit_eq_mod mod_0_imp_dvd) |
|
1403 next |
|
1404 assume ?Q |
|
1405 then obtain b where \<open>a = push_bit n b\<close> |
|
1406 by (rule exp_dvdE) |
|
1407 then show ?P |
|
1408 by (simp add: take_bit_push_bit) |
|
1409 qed |
|
1410 |
1391 end |
1411 end |
1392 |
1412 |
1393 instantiation nat :: semiring_bit_shifts |
1413 instantiation nat :: semiring_bit_shifts |
1394 begin |
1414 begin |
1395 |
1415 |
1463 by (simp add: push_bit_eq_mult Parity.push_bit_eq_mult) |
1483 by (simp add: push_bit_eq_mult Parity.push_bit_eq_mult) |
1464 |
1484 |
1465 lemma take_bit_add: |
1485 lemma take_bit_add: |
1466 "take_bit n (take_bit n a + take_bit n b) = take_bit n (a + b)" |
1486 "take_bit n (take_bit n a + take_bit n b) = take_bit n (a + b)" |
1467 by (simp add: take_bit_eq_mod mod_simps) |
1487 by (simp add: take_bit_eq_mod mod_simps) |
1468 |
|
1469 lemma take_bit_eq_0_iff: |
|
1470 "take_bit n a = 0 \<longleftrightarrow> 2 ^ n dvd a" |
|
1471 by (simp add: take_bit_eq_mod mod_eq_0_iff_dvd) |
|
1472 |
1488 |
1473 lemma take_bit_of_1_eq_0_iff [simp]: |
1489 lemma take_bit_of_1_eq_0_iff [simp]: |
1474 "take_bit n 1 = 0 \<longleftrightarrow> n = 0" |
1490 "take_bit n 1 = 0 \<longleftrightarrow> n = 0" |
1475 by (simp add: take_bit_eq_mod) |
1491 by (simp add: take_bit_eq_mod) |
1476 |
1492 |