1020 also have \<open>\<dots> \<longleftrightarrow> bit (a div 2) n \<or> bit (b div 2) n\<close> |
1020 also have \<open>\<dots> \<longleftrightarrow> bit (a div 2) n \<or> bit (b div 2) n\<close> |
1021 using bit \<open>2 ^ n \<noteq> 0\<close> by (rule Suc.IH) |
1021 using bit \<open>2 ^ n \<noteq> 0\<close> by (rule Suc.IH) |
1022 finally show ?case |
1022 finally show ?case |
1023 by (simp add: bit_Suc) |
1023 by (simp add: bit_Suc) |
1024 qed |
1024 qed |
|
1025 qed |
|
1026 |
|
1027 lemma |
|
1028 exp_add_not_zero_imp_left: \<open>2 ^ m \<noteq> 0\<close> |
|
1029 and exp_add_not_zero_imp_right: \<open>2 ^ n \<noteq> 0\<close> |
|
1030 if \<open>2 ^ (m + n) \<noteq> 0\<close> |
|
1031 proof - |
|
1032 have \<open>\<not> (2 ^ m = 0 \<or> 2 ^ n = 0)\<close> |
|
1033 proof (rule notI) |
|
1034 assume \<open>2 ^ m = 0 \<or> 2 ^ n = 0\<close> |
|
1035 then have \<open>2 ^ (m + n) = 0\<close> |
|
1036 by (rule disjE) (simp_all add: power_add) |
|
1037 with that show False .. |
|
1038 qed |
|
1039 then show \<open>2 ^ m \<noteq> 0\<close> and \<open>2 ^ n \<noteq> 0\<close> |
|
1040 by simp_all |
|
1041 qed |
|
1042 |
|
1043 lemma exp_not_zero_imp_exp_diff_not_zero: |
|
1044 \<open>2 ^ (n - m) \<noteq> 0\<close> if \<open>2 ^ n \<noteq> 0\<close> |
|
1045 proof (cases \<open>m \<le> n\<close>) |
|
1046 case True |
|
1047 moreover define q where \<open>q = n - m\<close> |
|
1048 ultimately have \<open>n = m + q\<close> |
|
1049 by simp |
|
1050 with that show ?thesis |
|
1051 by (simp add: exp_add_not_zero_imp_right) |
|
1052 next |
|
1053 case False |
|
1054 with that show ?thesis |
|
1055 by simp |
1025 qed |
1056 qed |
1026 |
1057 |
1027 end |
1058 end |
1028 |
1059 |
1029 lemma nat_bit_induct [case_names zero even odd]: |
1060 lemma nat_bit_induct [case_names zero even odd]: |
1145 have "P (1 + (- int (Suc n) * 2))" |
1176 have "P (1 + (- int (Suc n) * 2))" |
1146 by (rule odd_int) (use even in \<open>simp_all add: algebra_simps\<close>) |
1177 by (rule odd_int) (use even in \<open>simp_all add: algebra_simps\<close>) |
1147 also have "\<dots> = - int (2 * n) - 1" |
1178 also have "\<dots> = - int (2 * n) - 1" |
1148 by (simp add: algebra_simps) |
1179 by (simp add: algebra_simps) |
1149 finally show ?case |
1180 finally show ?case |
1150 using even by simp |
1181 using even.prems by simp |
1151 next |
1182 next |
1152 case (odd n) |
1183 case (odd n) |
1153 have "P (- int (Suc n) * 2)" |
1184 have "P (- int (Suc n) * 2)" |
1154 by (rule even_int) (use odd in \<open>simp_all add: algebra_simps\<close>) |
1185 by (rule even_int) (use odd in \<open>simp_all add: algebra_simps\<close>) |
1155 also have "\<dots> = - int (Suc (2 * n)) - 1" |
1186 also have "\<dots> = - int (Suc (2 * n)) - 1" |
1156 by (simp add: algebra_simps) |
1187 by (simp add: algebra_simps) |
1157 finally show ?case |
1188 finally show ?case |
1158 using odd by simp |
1189 using odd.prems by simp |
1159 qed |
1190 qed |
1160 qed |
1191 qed |
1161 |
1192 |
1162 context semiring_bits |
1193 context semiring_bits |
1163 begin |
1194 begin |
1582 |
1613 |
1583 lemma bit_push_bit_iff_int: |
1614 lemma bit_push_bit_iff_int: |
1584 \<open>bit (push_bit m k) n \<longleftrightarrow> m \<le> n \<and> bit k (n - m)\<close> for k :: int |
1615 \<open>bit (push_bit m k) n \<longleftrightarrow> m \<le> n \<and> bit k (n - m)\<close> for k :: int |
1585 by (auto simp add: bit_push_bit_iff) |
1616 by (auto simp add: bit_push_bit_iff) |
1586 |
1617 |
|
1618 lemma take_bit_nat_less_exp: |
|
1619 \<open>take_bit n m < 2 ^ n\<close> for n m ::nat |
|
1620 by (simp add: take_bit_eq_mod) |
|
1621 |
|
1622 lemma take_bit_nat_eq_self_iff: |
|
1623 \<open>take_bit n m = m \<longleftrightarrow> m < 2 ^ n\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>) |
|
1624 for n m :: nat |
|
1625 proof |
|
1626 assume ?P |
|
1627 moreover note take_bit_nat_less_exp [of n m] |
|
1628 ultimately show ?Q |
|
1629 by simp |
|
1630 next |
|
1631 assume ?Q |
|
1632 then show ?P |
|
1633 by (simp add: take_bit_eq_mod) |
|
1634 qed |
|
1635 |
|
1636 lemma take_bit_nat_less_eq_self: |
|
1637 \<open>take_bit n m \<le> m\<close> for n m :: nat |
|
1638 by (simp add: take_bit_eq_mod) |
|
1639 |
|
1640 lemma take_bit_nonnegative [simp]: |
|
1641 \<open>take_bit n k \<ge> 0\<close> |
|
1642 for k :: int |
|
1643 by (simp add: take_bit_eq_mod) |
|
1644 |
|
1645 lemma not_take_bit_negative [simp]: |
|
1646 \<open>\<not> take_bit n k < 0\<close> |
|
1647 for k :: int |
|
1648 by (simp add: not_less) |
|
1649 |
|
1650 lemma take_bit_int_less_exp: |
|
1651 \<open>take_bit n k < 2 ^ n\<close> for k :: int |
|
1652 by (simp add: take_bit_eq_mod) |
|
1653 |
|
1654 lemma take_bit_int_eq_self_iff: |
|
1655 \<open>take_bit n k = k \<longleftrightarrow> 0 \<le> k \<and> k < 2 ^ n\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>) |
|
1656 for k :: int |
|
1657 proof |
|
1658 assume ?P |
|
1659 moreover note take_bit_int_less_exp [of n k] take_bit_nonnegative [of n k] |
|
1660 ultimately show ?Q |
|
1661 by simp |
|
1662 next |
|
1663 assume ?Q |
|
1664 then show ?P |
|
1665 by (simp add: take_bit_eq_mod) |
|
1666 qed |
|
1667 |
1587 class unique_euclidean_semiring_with_bit_shifts = |
1668 class unique_euclidean_semiring_with_bit_shifts = |
1588 unique_euclidean_semiring_with_nat + semiring_bit_shifts |
1669 unique_euclidean_semiring_with_nat + semiring_bit_shifts |
1589 begin |
1670 begin |
1590 |
1671 |
1591 lemma take_bit_of_exp [simp]: |
1672 lemma take_bit_of_exp [simp]: |
1750 |
1831 |
1751 lemma drop_bit_of_Suc_0 [simp]: |
1832 lemma drop_bit_of_Suc_0 [simp]: |
1752 "drop_bit n (Suc 0) = of_bool (n = 0)" |
1833 "drop_bit n (Suc 0) = of_bool (n = 0)" |
1753 using drop_bit_of_1 [where ?'a = nat] by simp |
1834 using drop_bit_of_1 [where ?'a = nat] by simp |
1754 |
1835 |
1755 lemma take_bit_eq_self: |
|
1756 \<open>take_bit n m = m\<close> if \<open>m < 2 ^ n\<close> for n m :: nat |
|
1757 using that by (simp add: take_bit_eq_mod) |
|
1758 |
|
1759 lemma push_bit_minus_one: |
1836 lemma push_bit_minus_one: |
1760 "push_bit n (- 1 :: int) = - (2 ^ n)" |
1837 "push_bit n (- 1 :: int) = - (2 ^ n)" |
1761 by (simp add: push_bit_eq_mult) |
1838 by (simp add: push_bit_eq_mult) |
1762 |
1839 |
1763 lemma minus_1_div_exp_eq_int: |
1840 lemma minus_1_div_exp_eq_int: |
1779 |
1856 |
1780 lemma take_bit_diff: |
1857 lemma take_bit_diff: |
1781 \<open>take_bit n (take_bit n k - take_bit n l) = take_bit n (k - l)\<close> |
1858 \<open>take_bit n (take_bit n k - take_bit n l) = take_bit n (k - l)\<close> |
1782 for k l :: int |
1859 for k l :: int |
1783 by (simp add: take_bit_eq_mod mod_diff_eq) |
1860 by (simp add: take_bit_eq_mod mod_diff_eq) |
1784 |
|
1785 lemma take_bit_nonnegative [simp]: |
|
1786 \<open>take_bit n k \<ge> 0\<close> |
|
1787 for k :: int |
|
1788 by (simp add: take_bit_eq_mod) |
|
1789 |
|
1790 lemma not_take_bit_negative [simp]: |
|
1791 \<open>\<not> take_bit n k < 0\<close> |
|
1792 for k :: int |
|
1793 by (simp add: not_less) |
|
1794 |
|
1795 lemma take_bit_int_less_exp: |
|
1796 \<open>take_bit n k < 2 ^ n\<close> for k :: int |
|
1797 by (simp add: take_bit_eq_mod) |
|
1798 |
|
1799 lemma take_bit_int_eq_self: |
|
1800 \<open>take_bit n k = k\<close> if \<open>0 \<le> k\<close> \<open>k < 2 ^ n\<close> for k :: int |
|
1801 using that by (simp add: take_bit_eq_mod) |
|
1802 |
1861 |
1803 lemma bit_imp_take_bit_positive: |
1862 lemma bit_imp_take_bit_positive: |
1804 \<open>0 < take_bit m k\<close> if \<open>n < m\<close> and \<open>bit k n\<close> for k :: int |
1863 \<open>0 < take_bit m k\<close> if \<open>n < m\<close> and \<open>bit k n\<close> for k :: int |
1805 proof (rule ccontr) |
1864 proof (rule ccontr) |
1806 assume \<open>\<not> 0 < take_bit m k\<close> |
1865 assume \<open>\<not> 0 < take_bit m k\<close> |