equal
deleted
inserted
replaced
2070 |
2070 |
2071 context unique_euclidean_semiring_with_bit_shifts |
2071 context unique_euclidean_semiring_with_bit_shifts |
2072 begin |
2072 begin |
2073 |
2073 |
2074 lemma take_bit_sum: |
2074 lemma take_bit_sum: |
2075 "take_bit n a = (\<Sum>k = 0..<n. push_bit k (of_bool (odd (drop_bit k a))))" |
2075 "take_bit n a = (\<Sum>k = 0..<n. push_bit k (of_bool (bit a k)))" |
2076 for n :: nat |
2076 for n :: nat |
2077 proof (induction n arbitrary: a) |
2077 proof (induction n arbitrary: a) |
2078 case 0 |
2078 case 0 |
2079 then show ?case |
2079 then show ?case |
2080 by simp |
2080 by simp |
2081 next |
2081 next |
2082 case (Suc n) |
2082 case (Suc n) |
2083 have "(\<Sum>k = 0..<Suc n. push_bit k (of_bool (odd (drop_bit k a)))) = |
2083 have "(\<Sum>k = 0..<Suc n. push_bit k (of_bool (bit a k))) = |
2084 of_bool (odd a) + (\<Sum>k = Suc 0..<Suc n. push_bit k (of_bool (odd (drop_bit k a))))" |
2084 of_bool (odd a) + (\<Sum>k = Suc 0..<Suc n. push_bit k (of_bool (bit a k)))" |
2085 by (simp add: sum.atLeast_Suc_lessThan ac_simps) |
2085 by (simp add: sum.atLeast_Suc_lessThan ac_simps) |
2086 also have "(\<Sum>k = Suc 0..<Suc n. push_bit k (of_bool (odd (drop_bit k a)))) |
2086 also have "(\<Sum>k = Suc 0..<Suc n. push_bit k (of_bool (bit a k))) |
2087 = (\<Sum>k = 0..<n. push_bit k (of_bool (odd (drop_bit k (a div 2))))) * 2" |
2087 = (\<Sum>k = 0..<n. push_bit k (of_bool (bit (a div 2) k))) * 2" |
2088 by (simp only: sum.atLeast_Suc_lessThan_Suc_shift) (simp add: sum_distrib_right push_bit_double) |
2088 by (simp only: sum.atLeast_Suc_lessThan_Suc_shift) (simp add: sum_distrib_right push_bit_double drop_bit_Suc bit_Suc) |
2089 finally show ?case |
2089 finally show ?case |
2090 using Suc [of "a div 2"] by (simp add: ac_simps) |
2090 using Suc [of "a div 2"] by (simp add: ac_simps take_bit_Suc) |
2091 qed |
2091 qed |
2092 |
2092 |
2093 end |
2093 end |
2094 |
2094 |
2095 |
2095 |