equal
deleted
inserted
replaced
239 |
239 |
240 lemma zdiv_zmod_equality: "(b * (a div b) + (a mod b)) + k = (a::int)+k" |
240 lemma zdiv_zmod_equality: "(b * (a div b) + (a mod b)) + k = (a::int)+k" |
241 by(simp add: zmod_zdiv_equality[symmetric]) |
241 by(simp add: zmod_zdiv_equality[symmetric]) |
242 |
242 |
243 lemma zdiv_zmod_equality2: "((a div b) * b + (a mod b)) + k = (a::int)+k" |
243 lemma zdiv_zmod_equality2: "((a div b) * b + (a mod b)) + k = (a::int)+k" |
244 by(simp add: zmult_commute zmod_zdiv_equality[symmetric]) |
244 by(simp add: mult_commute zmod_zdiv_equality[symmetric]) |
245 |
245 |
246 use "IntDiv_setup.ML" |
246 use "IntDiv_setup.ML" |
247 |
247 |
248 lemma pos_mod_conj : "(0::int) < b ==> 0 \<le> a mod b & a mod b < b" |
248 lemma pos_mod_conj : "(0::int) < b ==> 0 \<le> a mod b & a mod b < b" |
249 apply (cut_tac a = a and b = b in divAlg_correct) |
249 apply (cut_tac a = a and b = b in divAlg_correct) |
604 |
604 |
605 lemma zmod_zmult1_eq': "(a*b) mod (c::int) = ((a mod c) * b) mod c" |
605 lemma zmod_zmult1_eq': "(a*b) mod (c::int) = ((a mod c) * b) mod c" |
606 apply (rule trans) |
606 apply (rule trans) |
607 apply (rule_tac s = "b*a mod c" in trans) |
607 apply (rule_tac s = "b*a mod c" in trans) |
608 apply (rule_tac [2] zmod_zmult1_eq) |
608 apply (rule_tac [2] zmod_zmult1_eq) |
609 apply (simp_all add: zmult_commute) |
609 apply (simp_all add: mult_commute) |
610 done |
610 done |
611 |
611 |
612 lemma zmod_zmult_distrib: "(a*b) mod (c::int) = ((a mod c) * (b mod c)) mod c" |
612 lemma zmod_zmult_distrib: "(a*b) mod (c::int) = ((a mod c) * (b mod c)) mod c" |
613 apply (rule zmod_zmult1_eq' [THEN trans]) |
613 apply (rule zmod_zmult1_eq' [THEN trans]) |
614 apply (rule zmod_zmult1_eq) |
614 apply (rule zmod_zmult1_eq) |
616 |
616 |
617 lemma zdiv_zmult_self1 [simp]: "b \<noteq> (0::int) ==> (a*b) div b = a" |
617 lemma zdiv_zmult_self1 [simp]: "b \<noteq> (0::int) ==> (a*b) div b = a" |
618 by (simp add: zdiv_zmult1_eq) |
618 by (simp add: zdiv_zmult1_eq) |
619 |
619 |
620 lemma zdiv_zmult_self2 [simp]: "b \<noteq> (0::int) ==> (b*a) div b = a" |
620 lemma zdiv_zmult_self2 [simp]: "b \<noteq> (0::int) ==> (b*a) div b = a" |
621 by (subst zmult_commute, erule zdiv_zmult_self1) |
621 by (subst mult_commute, erule zdiv_zmult_self1) |
622 |
622 |
623 lemma zmod_zmult_self1 [simp]: "(a*b) mod b = (0::int)" |
623 lemma zmod_zmult_self1 [simp]: "(a*b) mod b = (0::int)" |
624 by (simp add: zmod_zmult1_eq) |
624 by (simp add: zmod_zmult1_eq) |
625 |
625 |
626 lemma zmod_zmult_self2 [simp]: "(b*a) mod b = (0::int)" |
626 lemma zmod_zmult_self2 [simp]: "(b*a) mod b = (0::int)" |
627 by (simp add: zmult_commute zmod_zmult1_eq) |
627 by (simp add: mult_commute zmod_zmult1_eq) |
628 |
628 |
629 lemma zmod_eq_0_iff: "(m mod d = 0) = (EX q::int. m = d*q)" |
629 lemma zmod_eq_0_iff: "(m mod d = 0) = (EX q::int. m = d*q)" |
630 proof |
630 proof |
631 assume "m mod d = 0" |
631 assume "m mod d = 0" |
632 with zmod_zdiv_equality[of m d] show "EX q::int. m = d*q" by auto |
632 with zmod_zdiv_equality[of m d] show "EX q::int. m = d*q" by auto |
771 apply (auto simp add: linorder_neq_iff zdiv_zmult_zmult1_aux1 zdiv_zmult_zmult1_aux2) |
771 apply (auto simp add: linorder_neq_iff zdiv_zmult_zmult1_aux1 zdiv_zmult_zmult1_aux2) |
772 done |
772 done |
773 |
773 |
774 lemma zdiv_zmult_zmult2: "c \<noteq> (0::int) ==> (a*c) div (b*c) = a div b" |
774 lemma zdiv_zmult_zmult2: "c \<noteq> (0::int) ==> (a*c) div (b*c) = a div b" |
775 apply (drule zdiv_zmult_zmult1) |
775 apply (drule zdiv_zmult_zmult1) |
776 apply (auto simp add: zmult_commute) |
776 apply (auto simp add: mult_commute) |
777 done |
777 done |
778 |
778 |
779 |
779 |
780 |
780 |
781 subsection{*Distribution of Factors over mod*} |
781 subsection{*Distribution of Factors over mod*} |
796 apply (auto simp add: linorder_neq_iff zmod_zmult_zmult1_aux1 zmod_zmult_zmult1_aux2) |
796 apply (auto simp add: linorder_neq_iff zmod_zmult_zmult1_aux1 zmod_zmult_zmult1_aux2) |
797 done |
797 done |
798 |
798 |
799 lemma zmod_zmult_zmult2: "(a*c) mod (b*c) = (a mod b) * (c::int)" |
799 lemma zmod_zmult_zmult2: "(a*c) mod (b*c) = (a mod b) * (c::int)" |
800 apply (cut_tac c = c in zmod_zmult_zmult1) |
800 apply (cut_tac c = c in zmod_zmult_zmult1) |
801 apply (auto simp add: zmult_commute) |
801 apply (auto simp add: mult_commute) |
802 done |
802 done |
803 |
803 |
804 |
804 |
805 subsection {*Splitting Rules for div and mod*} |
805 subsection {*Splitting Rules for div and mod*} |
806 |
806 |
920 apply (case_tac "a = 0", simp) |
920 apply (case_tac "a = 0", simp) |
921 apply (subgoal_tac "1 < a * 2") |
921 apply (subgoal_tac "1 < a * 2") |
922 prefer 2 apply arith |
922 prefer 2 apply arith |
923 apply (subgoal_tac "2* (1 + b mod a) \<le> 2*a") |
923 apply (subgoal_tac "2* (1 + b mod a) \<le> 2*a") |
924 apply (rule_tac [2] mult_left_mono) |
924 apply (rule_tac [2] mult_left_mono) |
925 apply (auto simp add: add_commute [of 1] zmult_commute add1_zle_eq |
925 apply (auto simp add: add_commute [of 1] mult_commute add1_zle_eq |
926 pos_mod_bound) |
926 pos_mod_bound) |
927 apply (subst zmod_zadd1_eq) |
927 apply (subst zmod_zadd1_eq) |
928 apply (simp add: zmod_zmult_zmult2 mod_pos_pos_trivial) |
928 apply (simp add: zmod_zmult_zmult2 mod_pos_pos_trivial) |
929 apply (rule mod_pos_pos_trivial) |
929 apply (rule mod_pos_pos_trivial) |
930 apply (auto simp add: mod_pos_pos_trivial left_distrib) |
930 apply (auto simp add: mod_pos_pos_trivial left_distrib) |
1007 |
1007 |
1008 lemma zdvd_refl [simp]: "m dvd (m::int)" |
1008 lemma zdvd_refl [simp]: "m dvd (m::int)" |
1009 by (auto simp add: dvd_def intro: zmult_1_right [symmetric]) |
1009 by (auto simp add: dvd_def intro: zmult_1_right [symmetric]) |
1010 |
1010 |
1011 lemma zdvd_trans: "m dvd n ==> n dvd k ==> m dvd (k::int)" |
1011 lemma zdvd_trans: "m dvd n ==> n dvd k ==> m dvd (k::int)" |
1012 by (auto simp add: dvd_def intro: zmult_assoc) |
1012 by (auto simp add: dvd_def intro: mult_assoc) |
1013 |
1013 |
1014 lemma zdvd_zminus_iff: "(m dvd -n) = (m dvd (n::int))" |
1014 lemma zdvd_zminus_iff: "(m dvd -n) = (m dvd (n::int))" |
1015 apply (simp add: dvd_def, auto) |
1015 apply (simp add: dvd_def, auto) |
1016 apply (rule_tac [!] x = "-k" in exI, auto) |
1016 apply (rule_tac [!] x = "-k" in exI, auto) |
1017 done |
1017 done |
1022 done |
1022 done |
1023 |
1023 |
1024 lemma zdvd_anti_sym: |
1024 lemma zdvd_anti_sym: |
1025 "0 < m ==> 0 < n ==> m dvd n ==> n dvd m ==> m = (n::int)" |
1025 "0 < m ==> 0 < n ==> m dvd n ==> n dvd m ==> m = (n::int)" |
1026 apply (simp add: dvd_def, auto) |
1026 apply (simp add: dvd_def, auto) |
1027 apply (simp add: zmult_assoc zmult_eq_self_iff zero_less_mult_iff zmult_eq_1_iff) |
1027 apply (simp add: mult_assoc zero_less_mult_iff zmult_eq_1_iff) |
1028 done |
1028 done |
1029 |
1029 |
1030 lemma zdvd_zadd: "k dvd m ==> k dvd n ==> k dvd (m + n :: int)" |
1030 lemma zdvd_zadd: "k dvd m ==> k dvd n ==> k dvd (m + n :: int)" |
1031 apply (simp add: dvd_def) |
1031 apply (simp add: dvd_def) |
1032 apply (blast intro: right_distrib [symmetric]) |
1032 apply (blast intro: right_distrib [symmetric]) |
1047 apply (simp add: dvd_def) |
1047 apply (simp add: dvd_def) |
1048 apply (blast intro: mult_left_commute) |
1048 apply (blast intro: mult_left_commute) |
1049 done |
1049 done |
1050 |
1050 |
1051 lemma zdvd_zmult2: "k dvd (m::int) ==> k dvd m * n" |
1051 lemma zdvd_zmult2: "k dvd (m::int) ==> k dvd m * n" |
1052 apply (subst zmult_commute) |
1052 apply (subst mult_commute) |
1053 apply (erule zdvd_zmult) |
1053 apply (erule zdvd_zmult) |
1054 done |
1054 done |
1055 |
1055 |
1056 lemma [iff]: "(k::int) dvd m * k" |
1056 lemma [iff]: "(k::int) dvd m * k" |
1057 apply (rule zdvd_zmult) |
1057 apply (rule zdvd_zmult) |
1063 apply (rule zdvd_refl) |
1063 apply (rule zdvd_refl) |
1064 done |
1064 done |
1065 |
1065 |
1066 lemma zdvd_zmultD2: "j * k dvd n ==> j dvd (n::int)" |
1066 lemma zdvd_zmultD2: "j * k dvd n ==> j dvd (n::int)" |
1067 apply (simp add: dvd_def) |
1067 apply (simp add: dvd_def) |
1068 apply (simp add: zmult_assoc, blast) |
1068 apply (simp add: mult_assoc, blast) |
1069 done |
1069 done |
1070 |
1070 |
1071 lemma zdvd_zmultD: "j * k dvd n ==> k dvd (n::int)" |
1071 lemma zdvd_zmultD: "j * k dvd n ==> k dvd (n::int)" |
1072 apply (rule zdvd_zmultD2) |
1072 apply (rule zdvd_zmultD2) |
1073 apply (subst zmult_commute, assumption) |
1073 apply (subst mult_commute, assumption) |
1074 done |
1074 done |
1075 |
1075 |
1076 lemma zdvd_zmult_mono: "i dvd m ==> j dvd (n::int) ==> i * j dvd m * n" |
1076 lemma zdvd_zmult_mono: "i dvd m ==> j dvd (n::int) ==> i * j dvd m * n" |
1077 apply (simp add: dvd_def, clarify) |
1077 apply (simp add: dvd_def, clarify) |
1078 apply (rule_tac x = "k * ka" in exI) |
1078 apply (rule_tac x = "k * ka" in exI) |