src/HOL/Parity.thy
changeset 72261 5193570b739a
parent 72239 12e94c2ff6c5
child 72262 a282abb07642
equal deleted inserted replaced
72260:d488d643e677 72261:5193570b739a
  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>