src/HOL/Library/Rounded_Division.thy
changeset 76248 da4e57d30579
parent 76247 e19d4c1c48ce
child 76251 fbde7d1211fc
equal deleted inserted replaced
76247:e19d4c1c48ce 76248:da4e57d30579
     6 theory Rounded_Division
     6 theory Rounded_Division
     7   imports Main
     7   imports Main
     8 begin
     8 begin
     9 
     9 
    10 definition rounded_divide :: \<open>int \<Rightarrow> int \<Rightarrow> int\<close>  (infixl \<open>rdiv\<close> 70)
    10 definition rounded_divide :: \<open>int \<Rightarrow> int \<Rightarrow> int\<close>  (infixl \<open>rdiv\<close> 70)
    11   where \<open>k rdiv l = (k + l div 2 + of_bool (l < 0)) div l\<close>
    11   where \<open>k rdiv l = sgn l * ((k + \<bar>l\<bar> div 2) div \<bar>l\<bar>)\<close>
    12 
    12 
    13 definition rounded_modulo :: \<open>int \<Rightarrow> int \<Rightarrow> int\<close>  (infixl \<open>rmod\<close> 70)
    13 definition rounded_modulo :: \<open>int \<Rightarrow> int \<Rightarrow> int\<close>  (infixl \<open>rmod\<close> 70)
    14   where \<open>k rmod l = k - k rdiv l * l\<close>
    14   where \<open>k rmod l = (k + \<bar>l\<bar> div 2) mod \<bar>l\<bar> - \<bar>l\<bar> div 2\<close>
    15 
    15 
    16 lemma rdiv_mult_rmod_eq:
    16 lemma rdiv_mult_rmod_eq:
    17   \<open>k rdiv l * l + k rmod l = k\<close>
    17   \<open>k rdiv l * l + k rmod l = k\<close>
    18   by (simp add: rounded_divide_def rounded_modulo_def)
    18 proof -
       
    19   have *: \<open>l * (sgn l * j) = \<bar>l\<bar> * j\<close> for j
       
    20     by (simp add: ac_simps abs_sgn)
       
    21   show ?thesis
       
    22     by (simp add: rounded_divide_def rounded_modulo_def algebra_simps *)
       
    23 qed
    19 
    24 
    20 lemma mult_rdiv_rmod_eq:
    25 lemma mult_rdiv_rmod_eq:
    21   \<open>l * (k rdiv l) + k rmod l = k\<close>
    26   \<open>l * (k rdiv l) + k rmod l = k\<close>
    22   using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps)
    27   using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps)
    23 
    28 
    65   \<open>0 rdiv k = 0\<close>
    70   \<open>0 rdiv k = 0\<close>
    66   by (auto simp add: rounded_divide_def not_less zdiv_eq_0_iff)
    71   by (auto simp add: rounded_divide_def not_less zdiv_eq_0_iff)
    67 
    72 
    68 lemma zero_rmod_eq [simp]:
    73 lemma zero_rmod_eq [simp]:
    69   \<open>0 rmod k = 0\<close>
    74   \<open>0 rmod k = 0\<close>
       
    75   by (auto simp add: rounded_modulo_def not_less zmod_trivial_iff)
       
    76 
       
    77 lemma rdiv_minus_eq:
       
    78   \<open>k rdiv - l = - (k rdiv l)\<close>
       
    79   by (simp add: rounded_divide_def)
       
    80 
       
    81 lemma rmod_minus_eq [simp]:
       
    82   \<open>k rmod - l = k rmod l\<close>
       
    83   by (simp add: rounded_modulo_def)
       
    84 
       
    85 lemma rdiv_abs_eq:
       
    86   \<open>k rdiv \<bar>l\<bar> = sgn l * (k rdiv l)\<close>
       
    87   by (simp add: rounded_divide_def)
       
    88 
       
    89 lemma rmod_abs_eq [simp]:
       
    90   \<open>k rmod \<bar>l\<bar> = k rmod l\<close>
    70   by (simp add: rounded_modulo_def)
    91   by (simp add: rounded_modulo_def)
    71 
    92 
    72 lemma nonzero_mult_rdiv_cancel_right:
    93 lemma nonzero_mult_rdiv_cancel_right:
    73   \<open>k * l rdiv l = k\<close> if \<open>l \<noteq> 0\<close>
    94   \<open>k * l rdiv l = k\<close> if \<open>l \<noteq> 0\<close>
    74   using that by (auto simp add: rounded_divide_def ac_simps)
    95 proof -
       
    96   have \<open>sgn l * k * \<bar>l\<bar> rdiv l = k\<close>
       
    97     using that by (simp add: rounded_divide_def)
       
    98   with that show ?thesis
       
    99     by (simp add: ac_simps abs_sgn)
       
   100 qed
    75 
   101 
    76 lemma rdiv_self_eq [simp]:
   102 lemma rdiv_self_eq [simp]:
    77   \<open>k rdiv k = 1\<close> if \<open>k \<noteq> 0\<close>
   103   \<open>k rdiv k = 1\<close> if \<open>k \<noteq> 0\<close>
    78   using that nonzero_mult_rdiv_cancel_right [of k 1] by simp
   104   using that nonzero_mult_rdiv_cancel_right [of k 1] by simp
    79 
   105 
    80 lemma rmod_self_eq [simp]:
   106 lemma rmod_self_eq [simp]:
    81   \<open>k rmod k = 0\<close>
   107   \<open>k rmod k = 0\<close>
    82   by (cases \<open>k = 0\<close>) (simp_all add: rounded_modulo_def)
   108 proof -
       
   109   have \<open>(sgn k * \<bar>k\<bar> + \<bar>k\<bar> div 2) mod \<bar>k\<bar> = \<bar>k\<bar> div 2\<close>
       
   110     by (auto simp add: zmod_trivial_iff)
       
   111   also have \<open>sgn k * \<bar>k\<bar> = k\<close>
       
   112     by (simp add: abs_sgn)
       
   113   finally show ?thesis
       
   114     by (simp add: rounded_modulo_def algebra_simps)
       
   115 qed
       
   116 
       
   117 lemma signed_take_bit_eq_rmod:
       
   118   \<open>signed_take_bit n k = k rmod (2 ^ Suc n)\<close>
       
   119   by (simp only: rounded_modulo_def power_abs abs_numeral flip: take_bit_eq_mod)
       
   120     (simp add: signed_take_bit_eq_take_bit_shift)
    83 
   121 
    84 end
   122 end