diff -r 77cbf472fcc9 -r 48d032035744 src/HOL/Divides.thy --- a/src/HOL/Divides.thy Thu Aug 18 09:29:11 2022 +0200 +++ b/src/HOL/Divides.thy Wed Aug 17 20:37:16 2022 +0000 @@ -11,6 +11,43 @@ subsection \More on division\ +subsubsection \Laws for div and mod with Unary Minus\ + +lemma zmod_zminus1_not_zero: + fixes k l :: int + shows "- k mod l \ 0 \ k mod l \ 0" + by (simp add: mod_eq_0_iff_dvd) + +lemma zmod_zminus2_not_zero: + fixes k l :: int + shows "k mod - l \ 0 \ k mod l \ 0" + by (simp add: mod_eq_0_iff_dvd) + +lemma zdiv_zminus1_eq_if: + \(- a) div b = (if a mod b = 0 then - (a div b) else - (a div b) - 1)\ + if \b \ 0\ for a b :: int + using that sgn_not_eq_imp [of b \- a\] + by (cases \a = 0\) (auto simp add: div_eq_div_abs [of \- a\ b] div_eq_div_abs [of a b] sgn_eq_0_iff) + +lemma zdiv_zminus2_eq_if: + \a div (- b) = (if a mod b = 0 then - (a div b) else - (a div b) - 1)\ + if \b \ 0\ for a b :: int + using that by (auto simp add: zdiv_zminus1_eq_if div_minus_right) + +lemma zmod_zminus1_eq_if: + \(- a) mod b = (if a mod b = 0 then 0 else b - (a mod b))\ + for a b :: int + by (cases \b = 0\) + (auto simp flip: minus_div_mult_eq_mod simp add: zdiv_zminus1_eq_if algebra_simps) + +lemma zmod_zminus2_eq_if: + \a mod (- b) = (if a mod b = 0 then 0 else (a mod b) - b)\ + for a b :: int + by (auto simp add: zmod_zminus1_eq_if mod_minus_right) + + +subsubsection \Monotonicity in the First Argument (Dividend)\ + inductive eucl_rel_int :: "int \ int \ int \ int \ bool" where eucl_rel_int_by0: "eucl_rel_int k 0 (0, k)" | eucl_rel_int_dividesI: "l \ 0 \ k = q * l \ eucl_rel_int k l (q, 0)" @@ -91,139 +128,20 @@ using unique_quotient [of k l] unique_remainder [of k l] by auto -lemma div_abs_eq_div_nat: - "\k\ div \l\ = int (nat \k\ div nat \l\)" - by (simp add: divide_int_def) - -lemma mod_abs_eq_div_nat: - "\k\ mod \l\ = int (nat \k\ mod nat \l\)" - by (simp add: modulo_int_def) - -lemma zdiv_int: - "int (a div b) = int a div int b" - by (simp add: divide_int_def) - -lemma zmod_int: - "int (a mod b) = int a mod int b" - by (simp add: modulo_int_def) - -lemma div_sgn_abs_cancel: - fixes k l v :: int - assumes "v \ 0" - shows "(sgn v * \k\) div (sgn v * \l\) = \k\ div \l\" -proof - - from assms have "sgn v = - 1 \ sgn v = 1" - by (cases "v \ 0") auto - then show ?thesis - using assms unfolding divide_int_def [of "sgn v * \k\" "sgn v * \l\"] - by (fastforce simp add: not_less div_abs_eq_div_nat) -qed - -lemma div_eq_sgn_abs: - fixes k l v :: int - assumes "sgn k = sgn l" - shows "k div l = \k\ div \l\" -proof (cases "l = 0") - case True - then show ?thesis - by simp -next - case False - with assms have "(sgn k * \k\) div (sgn l * \l\) = \k\ div \l\" - using div_sgn_abs_cancel [of l k l] by simp - then show ?thesis - by (simp add: sgn_mult_abs) -qed - -lemma div_dvd_sgn_abs: - fixes k l :: int - assumes "l dvd k" - shows "k div l = (sgn k * sgn l) * (\k\ div \l\)" -proof (cases "k = 0 \ l = 0") - case True - then show ?thesis - by auto -next - case False - then have "k \ 0" and "l \ 0" - by auto - show ?thesis - proof (cases "sgn l = sgn k") - case True - then show ?thesis - by (auto simp add: div_eq_sgn_abs) - next - case False - with \k \ 0\ \l \ 0\ - have "sgn l * sgn k = - 1" - by (simp add: sgn_if split: if_splits) - with assms show ?thesis - unfolding divide_int_def [of k l] - by (auto simp add: zdiv_int ac_simps) - qed -qed - -lemma div_noneq_sgn_abs: - fixes k l :: int - assumes "l \ 0" - assumes "sgn k \ sgn l" - shows "k div l = - (\k\ div \l\) - of_bool (\ l dvd k)" - using assms - by (simp only: divide_int_def [of k l], auto simp add: not_less zdiv_int) - - -subsubsection \Laws for div and mod with Unary Minus\ - lemma zminus1_lemma: "eucl_rel_int a b (q, r) ==> b \ 0 ==> eucl_rel_int (-a) b (if r=0 then -q else -q - 1, if r=0 then 0 else b-r)" by (force simp add: eucl_rel_int_iff right_diff_distrib) - -lemma zdiv_zminus1_eq_if: - "b \ (0::int) - \ (-a) div b = (if a mod b = 0 then - (a div b) else - (a div b) - 1)" -by (blast intro: eucl_rel_int [THEN zminus1_lemma, THEN div_int_unique]) - -lemma zmod_zminus1_eq_if: - "(-a::int) mod b = (if a mod b = 0 then 0 else b - (a mod b))" -proof (cases "b = 0") - case False - then show ?thesis - by (blast intro: eucl_rel_int [THEN zminus1_lemma, THEN mod_int_unique]) -qed auto - -lemma zmod_zminus1_not_zero: - fixes k l :: int - shows "- k mod l \ 0 \ k mod l \ 0" - by (simp add: mod_eq_0_iff_dvd) - -lemma zmod_zminus2_not_zero: - fixes k l :: int - shows "k mod - l \ 0 \ k mod l \ 0" - by (simp add: mod_eq_0_iff_dvd) - -lemma zdiv_zminus2_eq_if: - "b \ (0::int) - ==> a div (-b) = - (if a mod b = 0 then - (a div b) else - (a div b) - 1)" - by (auto simp add: zdiv_zminus1_eq_if div_minus_right) - -lemma zmod_zminus2_eq_if: - "a mod (-b::int) = (if a mod b = 0 then 0 else (a mod b) - b)" - by (auto simp add: zmod_zminus1_eq_if mod_minus_right) - - -subsubsection \Monotonicity in the First Argument (Dividend)\ - lemma zdiv_mono1: - fixes b::int - assumes "a \ a'" "0 < b" shows "a div b \ a' div b" + \a div b \ a' div b\ + if \a \ a'\ \0 < b\ + for a b b' :: int proof (rule unique_quotient_lemma) show "b * (a div b) + a mod b \ b * (a' div b) + a' mod b" - using assms(1) by auto -qed (use assms in auto) + using \a \ a'\ by auto +qed (use that in auto) lemma zdiv_mono1_neg: fixes b::int