# HG changeset patch # User haftmann # Date 1580070932 0 # Node ID 554385d4cf59499ee20fc2eb005cf8c3b5af8d60 # Parent 2525e28e4b8b56dc355728ea27358c9a1538f80f more theorems diff -r 2525e28e4b8b -r 554385d4cf59 src/HOL/Euclidean_Division.thy --- a/src/HOL/Euclidean_Division.thy Sun Jan 26 20:35:31 2020 +0000 +++ b/src/HOL/Euclidean_Division.thy Sun Jan 26 20:35:32 2020 +0000 @@ -1933,6 +1933,35 @@ by (simp add: of_nat_mod) qed +lemma range_mod_exp: + \(2 ^ n - 1) mod 2 ^ m = 2 ^ min m n - 1\ +proof - + have \(2 ^ n - 1) mod 2 ^ m = 2 ^ min m n - (1::nat)\ (is \?lhs = ?rhs\) + proof (cases \n \ m\) + case True + then show ?thesis + by (simp add: Suc_le_lessD min.absorb2) + next + case False + then have \m < n\ + by simp + then obtain q where n: \n = Suc q + m\ + by (auto dest: less_imp_Suc_add) + then have \min m n = m\ + by simp + moreover have \(2::nat) ^ m \ 2 * 2 ^ q * 2 ^ m\ + using mult_le_mono1 [of 1 \2 * 2 ^ q\ \2 ^ m\] by simp + with n have \2 ^ n - 1 = (2 ^ Suc q - 1) * 2 ^ m + (2 ^ m - (1::nat))\ + by (simp add: monoid_mult_class.power_add algebra_simps) + ultimately show ?thesis + by (simp only: euclidean_semiring_cancel_class.mod_mult_self3) simp + qed + then have \of_nat ?lhs = of_nat ?rhs\ + by simp + then show ?thesis + by (simp add: of_nat_mod of_nat_diff) +qed + end class unique_euclidean_ring_with_nat = ring + unique_euclidean_semiring_with_nat diff -r 2525e28e4b8b -r 554385d4cf59 src/HOL/Parity.thy --- a/src/HOL/Parity.thy Sun Jan 26 20:35:31 2020 +0000 +++ b/src/HOL/Parity.thy Sun Jan 26 20:35:32 2020 +0000 @@ -763,6 +763,14 @@ \bit (2 ^ m) n \ 2 ^ m \ 0 \ m = n\ by (auto simp add: bit_def exp_div_exp_eq) +lemma bit_1_iff: + \bit 1 n \ 1 \ 0 \ n = 0\ + using bit_exp_iff [of 0 n] by simp + +lemma bit_2_iff: + \bit 2 n \ 2 \ 0 \ n = 1\ + using bit_exp_iff [of 1 n] by auto + end lemma nat_bit_induct [case_names zero even odd]: @@ -960,6 +968,14 @@ differently wrt. code generation. \ +lemma bit_iff_odd_drop_bit: + \bit a n \ odd (drop_bit n a)\ + by (simp add: bit_def drop_bit_eq_div) + +lemma even_drop_bit_iff_not_bit: + \even (drop_bit n a) \ \ bit a n\ + by (simp add: bit_iff_odd_drop_bit) + lemma bits_ident: "push_bit n (drop_bit n a) + take_bit n a = a" using div_mult_mod_eq by (simp add: push_bit_eq_mult take_bit_eq_mod drop_bit_eq_div) @@ -1158,6 +1174,10 @@ \take_bit n 2 = of_bool (2 \ n) * 2\ using take_bit_of_exp [of n 1] by simp +lemma take_bit_of_range: + \take_bit m (2 ^ n - 1) = 2 ^ min m n - 1\ + by (simp add: take_bit_eq_mod range_mod_exp) + lemma push_bit_eq_0_iff [simp]: "push_bit n a = 0 \ a = 0" by (simp add: push_bit_eq_mult)