76143
|
1 |
(* Author: Florian Haftmann, TU Muenchen
|
|
2 |
*)
|
|
3 |
|
|
4 |
subsection \<open>Rounded division: modulus centered towars zero.\<close>
|
|
5 |
|
|
6 |
theory Rounded_Division
|
|
7 |
imports Main
|
|
8 |
begin
|
|
9 |
|
|
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>
|
|
12 |
|
|
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>
|
|
15 |
|
|
16 |
lemma rdiv_mult_rmod_eq:
|
|
17 |
\<open>k rdiv l * l + k rmod l = k\<close>
|
|
18 |
by (simp add: rounded_divide_def rounded_modulo_def)
|
|
19 |
|
|
20 |
lemma mult_rdiv_rmod_eq:
|
|
21 |
\<open>l * (k rdiv l) + k rmod l = k\<close>
|
|
22 |
using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps)
|
|
23 |
|
|
24 |
lemma rmod_rdiv_mult_eq:
|
|
25 |
\<open>k rmod l + k rdiv l * l = k\<close>
|
|
26 |
using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps)
|
|
27 |
|
|
28 |
lemma rmod_mult_rdiv_eq:
|
|
29 |
\<open>k rmod l + l * (k rdiv l) = k\<close>
|
|
30 |
using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps)
|
|
31 |
|
|
32 |
lemma minus_rdiv_mult_eq_rmod:
|
|
33 |
\<open>k - k rdiv l * l = k rmod l\<close>
|
|
34 |
by (rule add_implies_diff [symmetric]) (fact rmod_rdiv_mult_eq)
|
|
35 |
|
|
36 |
lemma minus_mult_rdiv_eq_rmod:
|
|
37 |
\<open>k - l * (k rdiv l) = k rmod l\<close>
|
|
38 |
by (rule add_implies_diff [symmetric]) (fact rmod_mult_rdiv_eq)
|
|
39 |
|
|
40 |
lemma minus_rmod_eq_rdiv_mult:
|
|
41 |
\<open>k - k rmod l = k rdiv l * l\<close>
|
|
42 |
by (rule add_implies_diff [symmetric]) (fact rdiv_mult_rmod_eq)
|
|
43 |
|
|
44 |
lemma minus_rmod_eq_mult_rdiv:
|
|
45 |
\<open>k - k rmod l = l * (k rdiv l)\<close>
|
|
46 |
by (rule add_implies_diff [symmetric]) (fact mult_rdiv_rmod_eq)
|
|
47 |
|
|
48 |
lemma rdiv_0_eq [simp]:
|
|
49 |
\<open>k rdiv 0 = 0\<close>
|
|
50 |
by (simp add: rounded_divide_def)
|
|
51 |
|
|
52 |
lemma rmod_0_eq [simp]:
|
|
53 |
\<open>k rmod 0 = k\<close>
|
|
54 |
by (simp add: rounded_modulo_def)
|
|
55 |
|
|
56 |
lemma rdiv_1_eq [simp]:
|
|
57 |
\<open>k rdiv 1 = k\<close>
|
|
58 |
by (simp add: rounded_divide_def)
|
|
59 |
|
|
60 |
lemma rmod_1_eq [simp]:
|
|
61 |
\<open>k rmod 1 = 0\<close>
|
|
62 |
by (simp add: rounded_modulo_def)
|
|
63 |
|
|
64 |
lemma zero_rdiv_eq [simp]:
|
|
65 |
\<open>0 rdiv k = 0\<close>
|
|
66 |
by (auto simp add: rounded_divide_def not_less zdiv_eq_0_iff)
|
|
67 |
|
|
68 |
lemma zero_rmod_eq [simp]:
|
|
69 |
\<open>0 rmod k = 0\<close>
|
|
70 |
by (simp add: rounded_modulo_def)
|
|
71 |
|
|
72 |
lemma nonzero_mult_rdiv_cancel_right:
|
|
73 |
\<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)
|
|
75 |
|
|
76 |
lemma rdiv_self_eq [simp]:
|
|
77 |
\<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
|
|
79 |
|
|
80 |
lemma rmod_self_eq [simp]:
|
|
81 |
\<open>k rmod k = 0\<close>
|
|
82 |
by (cases \<open>k = 0\<close>) (simp_all add: rounded_modulo_def)
|
|
83 |
|
|
84 |
end
|