1216 |
1216 |
1217 lemma take_bit_rec: |
1217 lemma take_bit_rec: |
1218 \<open>take_bit n a = (if n = 0 then 0 else take_bit (n - 1) (a div 2) * 2 + of_bool (odd a))\<close> |
1218 \<open>take_bit n a = (if n = 0 then 0 else take_bit (n - 1) (a div 2) * 2 + of_bool (odd a))\<close> |
1219 by (cases n) (simp_all add: take_bit_Suc) |
1219 by (cases n) (simp_all add: take_bit_Suc) |
1220 |
1220 |
|
1221 lemma take_bit_Suc_0 [simp]: |
|
1222 \<open>take_bit (Suc 0) a = a mod 2\<close> |
|
1223 by (simp add: take_bit_eq_mod) |
|
1224 |
1221 lemma take_bit_of_0 [simp]: |
1225 lemma take_bit_of_0 [simp]: |
1222 "take_bit n 0 = 0" |
1226 "take_bit n 0 = 0" |
1223 by (simp add: take_bit_eq_mod) |
1227 by (simp add: take_bit_eq_mod) |
1224 |
1228 |
1225 lemma take_bit_of_1 [simp]: |
1229 lemma take_bit_of_1 [simp]: |
1534 lemma take_bit_nonnegative [simp]: |
1538 lemma take_bit_nonnegative [simp]: |
1535 "take_bit n k \<ge> 0" |
1539 "take_bit n k \<ge> 0" |
1536 for k :: int |
1540 for k :: int |
1537 by (simp add: take_bit_eq_mod) |
1541 by (simp add: take_bit_eq_mod) |
1538 |
1542 |
|
1543 lemma take_bit_minus_small_eq: |
|
1544 \<open>take_bit n (- k) = 2 ^ n - k\<close> if \<open>0 < k\<close> \<open>k \<le> 2 ^ n\<close> for k :: int |
|
1545 proof - |
|
1546 define m where \<open>m = nat k\<close> |
|
1547 with that have \<open>k = int m\<close> and \<open>0 < m\<close> and \<open>m \<le> 2 ^ n\<close> |
|
1548 by simp_all |
|
1549 have \<open>(2 ^ n - m) mod 2 ^ n = 2 ^ n - m\<close> |
|
1550 using \<open>0 < m\<close> by simp |
|
1551 then have \<open>int ((2 ^ n - m) mod 2 ^ n) = int (2 ^ n - m)\<close> |
|
1552 by simp |
|
1553 then have \<open>(2 ^ n - int m) mod 2 ^ n = 2 ^ n - int m\<close> |
|
1554 using \<open>m \<le> 2 ^ n\<close> by (simp only: of_nat_mod of_nat_diff) simp |
|
1555 with \<open>k = int m\<close> have \<open>(2 ^ n - k) mod 2 ^ n = 2 ^ n - k\<close> |
|
1556 by simp |
|
1557 then show ?thesis |
|
1558 by (simp add: take_bit_eq_mod) |
|
1559 qed |
|
1560 |
1539 lemma drop_bit_push_bit_int: |
1561 lemma drop_bit_push_bit_int: |
1540 \<open>drop_bit m (push_bit n k) = drop_bit (m - n) (push_bit (n - m) k)\<close> for k :: int |
1562 \<open>drop_bit m (push_bit n k) = drop_bit (m - n) (push_bit (n - m) k)\<close> for k :: int |
1541 by (cases \<open>m \<le> n\<close>) (auto simp add: mult.left_commute [of _ \<open>2 ^ n\<close>] mult.commute [of _ \<open>2 ^ n\<close>] mult.assoc |
1563 by (cases \<open>m \<le> n\<close>) (auto simp add: mult.left_commute [of _ \<open>2 ^ n\<close>] mult.commute [of _ \<open>2 ^ n\<close>] mult.assoc |
1542 mult.commute [of k] drop_bit_eq_div push_bit_eq_mult not_le power_add dest!: le_Suc_ex less_imp_Suc_add) |
1564 mult.commute [of k] drop_bit_eq_div push_bit_eq_mult not_le power_add dest!: le_Suc_ex less_imp_Suc_add) |
1543 |
1565 |