src/HOL/Parity.thy
changeset 71759 816e52bbfa60
parent 71757 02c50bba9304
child 71799 e00712b4e2c2
equal deleted inserted replaced
71758:2e3fa4e7cd73 71759:816e52bbfa60
  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