diff --git a/src/HOL/Library/Rounded_Division.thy b/src/HOL/Library/Rounded_Division.thy --- a/src/HOL/Library/Rounded_Division.thy +++ b/src/HOL/Library/Rounded_Division.thy @@ -1,84 +1,122 @@ (* Author: Florian Haftmann, TU Muenchen *) subsection \Rounded division: modulus centered towards zero.\ theory Rounded_Division imports Main begin definition rounded_divide :: \int \ int \ int\ (infixl \rdiv\ 70) - where \k rdiv l = (k + l div 2 + of_bool (l < 0)) div l\ + where \k rdiv l = sgn l * ((k + \l\ div 2) div \l\)\ definition rounded_modulo :: \int \ int \ int\ (infixl \rmod\ 70) - where \k rmod l = k - k rdiv l * l\ + where \k rmod l = (k + \l\ div 2) mod \l\ - \l\ div 2\ lemma rdiv_mult_rmod_eq: \k rdiv l * l + k rmod l = k\ - by (simp add: rounded_divide_def rounded_modulo_def) +proof - + have *: \l * (sgn l * j) = \l\ * j\ for j + by (simp add: ac_simps abs_sgn) + show ?thesis + by (simp add: rounded_divide_def rounded_modulo_def algebra_simps *) +qed lemma mult_rdiv_rmod_eq: \l * (k rdiv l) + k rmod l = k\ using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps) lemma rmod_rdiv_mult_eq: \k rmod l + k rdiv l * l = k\ using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps) lemma rmod_mult_rdiv_eq: \k rmod l + l * (k rdiv l) = k\ using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps) lemma minus_rdiv_mult_eq_rmod: \k - k rdiv l * l = k rmod l\ by (rule add_implies_diff [symmetric]) (fact rmod_rdiv_mult_eq) lemma minus_mult_rdiv_eq_rmod: \k - l * (k rdiv l) = k rmod l\ by (rule add_implies_diff [symmetric]) (fact rmod_mult_rdiv_eq) lemma minus_rmod_eq_rdiv_mult: \k - k rmod l = k rdiv l * l\ by (rule add_implies_diff [symmetric]) (fact rdiv_mult_rmod_eq) lemma minus_rmod_eq_mult_rdiv: \k - k rmod l = l * (k rdiv l)\ by (rule add_implies_diff [symmetric]) (fact mult_rdiv_rmod_eq) lemma rdiv_0_eq [simp]: \k rdiv 0 = 0\ by (simp add: rounded_divide_def) lemma rmod_0_eq [simp]: \k rmod 0 = k\ by (simp add: rounded_modulo_def) lemma rdiv_1_eq [simp]: \k rdiv 1 = k\ by (simp add: rounded_divide_def) lemma rmod_1_eq [simp]: \k rmod 1 = 0\ by (simp add: rounded_modulo_def) lemma zero_rdiv_eq [simp]: \0 rdiv k = 0\ by (auto simp add: rounded_divide_def not_less zdiv_eq_0_iff) lemma zero_rmod_eq [simp]: \0 rmod k = 0\ + by (auto simp add: rounded_modulo_def not_less zmod_trivial_iff) + +lemma rdiv_minus_eq: + \k rdiv - l = - (k rdiv l)\ + by (simp add: rounded_divide_def) + +lemma rmod_minus_eq [simp]: + \k rmod - l = k rmod l\ + by (simp add: rounded_modulo_def) + +lemma rdiv_abs_eq: + \k rdiv \l\ = sgn l * (k rdiv l)\ + by (simp add: rounded_divide_def) + +lemma rmod_abs_eq [simp]: + \k rmod \l\ = k rmod l\ by (simp add: rounded_modulo_def) lemma nonzero_mult_rdiv_cancel_right: \k * l rdiv l = k\ if \l \ 0\ - using that by (auto simp add: rounded_divide_def ac_simps) +proof - + have \sgn l * k * \l\ rdiv l = k\ + using that by (simp add: rounded_divide_def) + with that show ?thesis + by (simp add: ac_simps abs_sgn) +qed lemma rdiv_self_eq [simp]: \k rdiv k = 1\ if \k \ 0\ using that nonzero_mult_rdiv_cancel_right [of k 1] by simp lemma rmod_self_eq [simp]: \k rmod k = 0\ - by (cases \k = 0\) (simp_all add: rounded_modulo_def) +proof - + have \(sgn k * \k\ + \k\ div 2) mod \k\ = \k\ div 2\ + by (auto simp add: zmod_trivial_iff) + also have \sgn k * \k\ = k\ + by (simp add: abs_sgn) + finally show ?thesis + by (simp add: rounded_modulo_def algebra_simps) +qed + +lemma signed_take_bit_eq_rmod: + \signed_take_bit n k = k rmod (2 ^ Suc n)\ + by (simp only: rounded_modulo_def power_abs abs_numeral flip: take_bit_eq_mod) + (simp add: signed_take_bit_eq_take_bit_shift) end