745 by simp |
745 by simp |
746 from divmod_rel_div [OF this `l \<noteq> 0`] divmod_rel_mod [OF this `l \<noteq> 0`] |
746 from divmod_rel_div [OF this `l \<noteq> 0`] divmod_rel_mod [OF this `l \<noteq> 0`] |
747 show ?thesis by simp |
747 show ?thesis by simp |
748 qed |
748 qed |
749 |
749 |
750 lemma zdiv_zadd_self1: "a \<noteq> (0::int) ==> (a+b) div a = b div a + 1" |
|
751 by (rule div_add_self1) (* already declared [simp] *) |
|
752 |
|
753 lemma zdiv_zadd_self2: "a \<noteq> (0::int) ==> (b+a) div a = b div a + 1" |
|
754 by (rule div_add_self2) (* already declared [simp] *) |
|
755 |
|
756 lemma zdiv_zmult_self2: "b \<noteq> (0::int) ==> (b*a) div b = a" |
|
757 by (rule div_mult_self1_is_id) (* already declared [simp] *) |
|
758 |
|
759 lemma zmod_zmult_self1: "(a*b) mod b = (0::int)" |
|
760 by (rule mod_mult_self2_is_0) (* already declared [simp] *) |
|
761 |
|
762 lemma zmod_zmult_self2: "(b*a) mod b = (0::int)" |
|
763 by (rule mod_mult_self1_is_0) (* already declared [simp] *) |
|
764 |
|
765 lemma zmod_eq_0_iff: "(m mod d = 0) = (EX q::int. m = d*q)" |
750 lemma zmod_eq_0_iff: "(m mod d = 0) = (EX q::int. m = d*q)" |
766 by (simp add: dvd_eq_mod_eq_0 [symmetric] dvd_def) |
751 by (simp add: dvd_eq_mod_eq_0 [symmetric] dvd_def) |
767 |
752 |
768 (* REVISIT: should this be generalized to all semiring_div types? *) |
753 (* REVISIT: should this be generalized to all semiring_div types? *) |
769 lemmas zmod_eq_0D [dest!] = zmod_eq_0_iff [THEN iffD1] |
754 lemmas zmod_eq_0D [dest!] = zmod_eq_0_iff [THEN iffD1] |
770 |
755 |
771 lemma zmod_zadd_left_eq: "(a+b) mod (c::int) = ((a mod c) + b) mod c" |
|
772 by (rule mod_add_left_eq) |
|
773 |
|
774 lemma zmod_zadd_right_eq: "(a+b) mod (c::int) = (a + (b mod c)) mod c" |
|
775 by (rule mod_add_right_eq) |
|
776 |
|
777 lemma zmod_zadd_self1: "(a+b) mod a = b mod (a::int)" |
|
778 by (rule mod_add_self1) (* already declared [simp] *) |
|
779 |
|
780 lemma zmod_zadd_self2: "(b+a) mod a = b mod (a::int)" |
|
781 by (rule mod_add_self2) (* already declared [simp] *) |
|
782 |
|
783 lemma zmod_zdiff1_eq: "(a - b) mod c = (a mod c - b mod c) mod (c::int)" |
|
784 by (rule mod_diff_eq) |
|
785 |
756 |
786 subsection{*Proving @{term "a div (b*c) = (a div b) div c"} *} |
757 subsection{*Proving @{term "a div (b*c) = (a div b) div c"} *} |
787 |
758 |
788 (*The condition c>0 seems necessary. Consider that 7 div ~6 = ~2 but |
759 (*The condition c>0 seems necessary. Consider that 7 div ~6 = ~2 but |
789 7 div 2 div ~3 = 3 div ~3 = ~1. The subcase (a div b) mod c = 0 seems |
760 7 div 2 div ~3 = 3 div ~3 = ~1. The subcase (a div b) mod c = 0 seems |
893 |
864 |
894 lemma zmod_zmult_zmult2: "(a*c) mod (b*c) = (a mod b) * (c::int)" |
865 lemma zmod_zmult_zmult2: "(a*c) mod (b*c) = (a mod b) * (c::int)" |
895 apply (cut_tac c = c in zmod_zmult_zmult1) |
866 apply (cut_tac c = c in zmod_zmult_zmult1) |
896 apply (auto simp add: mult_commute) |
867 apply (auto simp add: mult_commute) |
897 done |
868 done |
898 |
|
899 lemma zmod_zmod_cancel: "n dvd m \<Longrightarrow> (k::int) mod m mod n = k mod n" |
|
900 by (rule mod_mod_cancel) |
|
901 |
869 |
902 |
870 |
903 subsection {*Splitting Rules for div and mod*} |
871 subsection {*Splitting Rules for div and mod*} |
904 |
872 |
905 text{*The proofs of the two lemmas below are essentially identical*} |
873 text{*The proofs of the two lemmas below are essentially identical*} |
1348 |
1316 |
1349 lemma zdiff_zmod_right: "(x - y mod m) mod m = (x - y) mod (m::int)" |
1317 lemma zdiff_zmod_right: "(x - y mod m) mod m = (x - y) mod (m::int)" |
1350 by (rule mod_diff_right_eq [symmetric]) |
1318 by (rule mod_diff_right_eq [symmetric]) |
1351 |
1319 |
1352 lemmas zmod_simps = |
1320 lemmas zmod_simps = |
1353 IntDiv.zmod_zadd_left_eq [symmetric] |
1321 mod_add_left_eq [symmetric] |
1354 IntDiv.zmod_zadd_right_eq [symmetric] |
1322 mod_add_right_eq [symmetric] |
1355 IntDiv.zmod_zmult1_eq [symmetric] |
1323 IntDiv.zmod_zmult1_eq [symmetric] |
1356 mod_mult_left_eq [symmetric] |
1324 mod_mult_left_eq [symmetric] |
1357 IntDiv.zpower_zmod |
1325 IntDiv.zpower_zmod |
1358 zminus_zmod zdiff_zmod_left zdiff_zmod_right |
1326 zminus_zmod zdiff_zmod_left zdiff_zmod_right |
1359 |
1327 |
1424 lemma zmod_eq_dvd_iff: "(x::int) mod n = y mod n \<longleftrightarrow> n dvd x - y" |
1392 lemma zmod_eq_dvd_iff: "(x::int) mod n = y mod n \<longleftrightarrow> n dvd x - y" |
1425 proof |
1393 proof |
1426 assume H: "x mod n = y mod n" |
1394 assume H: "x mod n = y mod n" |
1427 hence "x mod n - y mod n = 0" by simp |
1395 hence "x mod n - y mod n = 0" by simp |
1428 hence "(x mod n - y mod n) mod n = 0" by simp |
1396 hence "(x mod n - y mod n) mod n = 0" by simp |
1429 hence "(x - y) mod n = 0" by (simp add: zmod_zdiff1_eq[symmetric]) |
1397 hence "(x - y) mod n = 0" by (simp add: mod_diff_eq[symmetric]) |
1430 thus "n dvd x - y" by (simp add: zdvd_iff_zmod_eq_0) |
1398 thus "n dvd x - y" by (simp add: zdvd_iff_zmod_eq_0) |
1431 next |
1399 next |
1432 assume H: "n dvd x - y" |
1400 assume H: "n dvd x - y" |
1433 then obtain k where k: "x-y = n*k" unfolding dvd_def by blast |
1401 then obtain k where k: "x-y = n*k" unfolding dvd_def by blast |
1434 hence "x = n*k + y" by simp |
1402 hence "x = n*k + y" by simp |
1435 hence "x mod n = (n*k + y) mod n" by simp |
1403 hence "x mod n = (n*k + y) mod n" by simp |
1436 thus "x mod n = y mod n" by (simp add: zmod_zadd_left_eq) |
1404 thus "x mod n = y mod n" by (simp add: mod_add_left_eq) |
1437 qed |
1405 qed |
1438 |
1406 |
1439 lemma nat_mod_eq_lemma: assumes xyn: "(x::nat) mod n = y mod n" and xy:"y \<le> x" |
1407 lemma nat_mod_eq_lemma: assumes xyn: "(x::nat) mod n = y mod n" and xy:"y \<le> x" |
1440 shows "\<exists>q. x = y + n * q" |
1408 shows "\<exists>q. x = y + n * q" |
1441 proof- |
1409 proof- |