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 |