equal
deleted
inserted
replaced
9 imports Parity |
9 imports Parity |
10 begin |
10 begin |
11 |
11 |
12 subsection \<open>Abstract division in commutative semirings.\<close> |
12 subsection \<open>Abstract division in commutative semirings.\<close> |
13 |
13 |
14 class semiring_div = semidom + modulo + |
14 class semiring_div = semidom + semiring_modulo + |
15 assumes mod_div_equality: "a div b * b + a mod b = a" |
15 assumes div_by_0: "a div 0 = 0" |
16 and div_by_0: "a div 0 = 0" |
|
17 and div_0: "0 div a = 0" |
16 and div_0: "0 div a = 0" |
18 and div_mult_self1 [simp]: "b \<noteq> 0 \<Longrightarrow> (a + c * b) div b = c + a div b" |
17 and div_mult_self1 [simp]: "b \<noteq> 0 \<Longrightarrow> (a + c * b) div b = c + a div b" |
19 and div_mult_mult1 [simp]: "c \<noteq> 0 \<Longrightarrow> (c * a) div (c * b) = a div b" |
18 and div_mult_mult1 [simp]: "c \<noteq> 0 \<Longrightarrow> (c * a) div (c * b) = a div b" |
20 begin |
19 begin |
21 |
20 |
38 lemma div_mult_self2_is_id: |
37 lemma div_mult_self2_is_id: |
39 "b \<noteq> 0 \<Longrightarrow> a * b div b = a" |
38 "b \<noteq> 0 \<Longrightarrow> a * b div b = a" |
40 by (fact nonzero_mult_divide_cancel_right) |
39 by (fact nonzero_mult_divide_cancel_right) |
41 |
40 |
42 text \<open>@{const divide} and @{const modulo}\<close> |
41 text \<open>@{const divide} and @{const modulo}\<close> |
43 |
|
44 lemma mod_div_equality2: "b * (a div b) + a mod b = a" |
|
45 unfolding mult.commute [of b] |
|
46 by (rule mod_div_equality) |
|
47 |
|
48 lemma mod_div_equality': "a mod b + a div b * b = a" |
|
49 using mod_div_equality [of a b] |
|
50 by (simp only: ac_simps) |
|
51 |
42 |
52 lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c" |
43 lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c" |
53 by (simp add: mod_div_equality) |
44 by (simp add: mod_div_equality) |
54 |
45 |
55 lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c" |
46 lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c" |
141 |
132 |
142 lemma mod_add_self2 [simp]: |
133 lemma mod_add_self2 [simp]: |
143 "(a + b) mod b = a mod b" |
134 "(a + b) mod b = a mod b" |
144 using mod_mult_self1 [of a 1 b] by simp |
135 using mod_mult_self1 [of a 1 b] by simp |
145 |
136 |
146 lemma mod_div_decomp: |
|
147 fixes a b |
|
148 obtains q r where "q = a div b" and "r = a mod b" |
|
149 and "a = q * b + r" |
|
150 proof - |
|
151 from mod_div_equality have "a = a div b * b + a mod b" by simp |
|
152 moreover have "a div b = a div b" .. |
|
153 moreover have "a mod b = a mod b" .. |
|
154 note that ultimately show thesis by blast |
|
155 qed |
|
156 |
|
157 lemma dvd_imp_mod_0 [simp]: |
137 lemma dvd_imp_mod_0 [simp]: |
158 assumes "a dvd b" |
138 assumes "a dvd b" |
159 shows "b mod a = 0" |
139 shows "b mod a = 0" |
160 proof - |
140 proof - |
161 from assms obtain c where "b = a * c" .. |
141 from assms obtain c where "b = a * c" .. |
187 next |
167 next |
188 assume "b \<noteq> 0" |
168 assume "b \<noteq> 0" |
189 hence "a div b + a mod b div b = (a mod b + a div b * b) div b" |
169 hence "a div b + a mod b div b = (a mod b + a div b * b) div b" |
190 by (rule div_mult_self1 [symmetric]) |
170 by (rule div_mult_self1 [symmetric]) |
191 also have "\<dots> = a div b" |
171 also have "\<dots> = a div b" |
192 by (simp only: mod_div_equality') |
172 by (simp only: mod_div_equality3) |
193 also have "\<dots> = a div b + 0" |
173 also have "\<dots> = a div b + 0" |
194 by simp |
174 by simp |
195 finally show ?thesis |
175 finally show ?thesis |
196 by (rule add_left_imp_eq) |
176 by (rule add_left_imp_eq) |
197 qed |
177 qed |
200 "a mod b mod b = a mod b" |
180 "a mod b mod b = a mod b" |
201 proof - |
181 proof - |
202 have "a mod b mod b = (a mod b + a div b * b) mod b" |
182 have "a mod b mod b = (a mod b + a div b * b) mod b" |
203 by (simp only: mod_mult_self1) |
183 by (simp only: mod_mult_self1) |
204 also have "\<dots> = a mod b" |
184 also have "\<dots> = a mod b" |
205 by (simp only: mod_div_equality') |
185 by (simp only: mod_div_equality3) |
206 finally show ?thesis . |
186 finally show ?thesis . |
207 qed |
187 qed |
208 |
188 |
209 lemma dvd_mod_imp_dvd: |
189 lemma dvd_mod_imp_dvd: |
210 assumes "k dvd m mod n" and "k dvd n" |
190 assumes "k dvd m mod n" and "k dvd n" |