diff -r e5cfb05d312e -r 3ae579092045 src/HOL/Divides.thy --- a/src/HOL/Divides.thy Sun Sep 11 23:50:36 2022 +0200 +++ b/src/HOL/Divides.thy Sun Sep 11 16:21:20 2022 +0000 @@ -427,14 +427,6 @@ by simp qed -lemma euclidean_relation_intI' [case_names by0 pos neg]: - \(k div l, k mod l) = (q, r)\ - if \l = 0 \ q = 0 \ r = k\ - and \l > 0 \ 0 \ r \ r < l \ k = q * l + r\ - and \l < 0 \ l < r \ r \ 0 \ k = q * l + r\ for k l q r :: int - by (cases l \0::int\ rule: linorder_cases) - (auto dest: that) - subsubsection \Computing \div\ and \mod\ with shifting\ @@ -465,13 +457,21 @@ if \0 \ a\ for a b :: int proof - have \((1 + 2 * b) div (2 * a), (1 + 2 * b) mod (2 * a)) = (b div a, 1 + 2 * (b mod a))\ - proof (cases \2 * a\ \b div a\ \1 + 2 * (b mod a)\ \1 + 2 * b\ rule: euclidean_relation_intI') + proof (cases \2 * a\ \b div a\ \1 + 2 * (b mod a)\ \1 + 2 * b\ rule: euclidean_relation_intI) case by0 then show ?case by simp next - case pos - then have \a > 0\ + case divides + have \even (2 * a)\ + by simp + then have \even (1 + 2 * b)\ + using \2 * a dvd 1 + 2 * b\ by (rule dvd_trans) + then show ?case + by simp + next + case euclidean_relation + with that have \a > 0\ by simp moreover have \b mod a < a\ using \a > 0\ by simp @@ -479,12 +479,10 @@ by simp moreover have \2 * (b mod a) + a * (2 * (b div a)) = 2 * (b div a * a + b mod a)\ by (simp only: algebra_simps) + moreover have \0 \ 2 * (b mod a)\ + using \a > 0\ by simp ultimately show ?case by (simp add: algebra_simps) - next - case neg - with that show ?case - by simp qed then show ?Q and ?R by simp_all @@ -495,17 +493,21 @@ if \a \ 0\ for a b :: int proof - have \((1 + 2 * b) div (2 * a), (1 + 2 * b) mod (2 * a)) = ((b + 1) div a, 2 * ((b + 1) mod a) - 1)\ - proof (cases \2 * a\ \(b + 1) div a\ \2 * ((b + 1) mod a) - 1\ \1 + 2 * b\ rule: euclidean_relation_intI') + proof (cases \2 * a\ \(b + 1) div a\ \2 * ((b + 1) mod a) - 1\ \1 + 2 * b\ rule: euclidean_relation_intI) case by0 then show ?case by simp next - case pos - with that show ?case + case divides + have \even (2 * a)\ + by simp + then have \even (1 + 2 * b)\ + using \2 * a dvd 1 + 2 * b\ by (rule dvd_trans) + then show ?case by simp next - case neg - then have \a < 0\ + case euclidean_relation + with that have \a < 0\ by simp moreover have \(b + 1) mod a > a\ using \a < 0\ by simp @@ -519,7 +521,7 @@ 2 * ((1 + b) div a * a + (1 + b) mod a)\ by (simp only: algebra_simps) ultimately show ?case - by (simp add: algebra_simps) + by (simp add: algebra_simps sgn_mult abs_mult) qed then show ?Q and ?R by simp_all