36 lemma mod_div_equality': "a mod b + a div b * b = a" |
36 lemma mod_div_equality': "a mod b + a div b * b = a" |
37 using mod_div_equality [of a b] |
37 using mod_div_equality [of a b] |
38 by (simp only: add_ac) |
38 by (simp only: add_ac) |
39 |
39 |
40 lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c" |
40 lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c" |
41 by (simp add: mod_div_equality) |
41 by (simp add: mod_div_equality) |
42 |
42 |
43 lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c" |
43 lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c" |
44 by (simp add: mod_div_equality2) |
44 by (simp add: mod_div_equality2) |
45 |
45 |
46 lemma mod_by_0 [simp]: "a mod 0 = a" |
46 lemma mod_by_0 [simp]: "a mod 0 = a" |
47 using mod_div_equality [of a zero] by simp |
47 using mod_div_equality [of a zero] by simp |
48 |
48 |
49 lemma mod_0 [simp]: "0 mod a = 0" |
49 lemma mod_0 [simp]: "0 mod a = 0" |
61 case False |
61 case False |
62 have "a + c * b = (a + c * b) div b * b + (a + c * b) mod b" |
62 have "a + c * b = (a + c * b) div b * b + (a + c * b) mod b" |
63 by (simp add: mod_div_equality) |
63 by (simp add: mod_div_equality) |
64 also from False div_mult_self1 [of b a c] have |
64 also from False div_mult_self1 [of b a c] have |
65 "\<dots> = (c + a div b) * b + (a + c * b) mod b" |
65 "\<dots> = (c + a div b) * b + (a + c * b) mod b" |
66 by (simp add: left_distrib add_ac) |
66 by (simp add: algebra_simps) |
67 finally have "a = a div b * b + (a + c * b) mod b" |
67 finally have "a = a div b * b + (a + c * b) mod b" |
68 by (simp add: add_commute [of a] add_assoc left_distrib) |
68 by (simp add: add_commute [of a] add_assoc left_distrib) |
69 then have "a div b * b + (a + c * b) mod b = a div b * b + a mod b" |
69 then have "a div b * b + (a + c * b) mod b = a div b * b + a mod b" |
70 by (simp add: mod_div_equality) |
70 by (simp add: mod_div_equality) |
71 then show ?thesis by simp |
71 then show ?thesis by simp |
72 qed |
72 qed |
73 |
73 |
74 lemma mod_mult_self2 [simp]: "(a + b * c) mod b = a mod b" |
74 lemma mod_mult_self2 [simp]: "(a + b * c) mod b = a mod b" |
75 by (simp add: mult_commute [of b]) |
75 by (simp add: mult_commute [of b]) |
76 |
76 |
77 lemma div_mult_self1_is_id [simp]: "b \<noteq> 0 \<Longrightarrow> b * a div b = a" |
77 lemma div_mult_self1_is_id [simp]: "b \<noteq> 0 \<Longrightarrow> b * a div b = a" |
78 using div_mult_self2 [of b 0 a] by simp |
78 using div_mult_self2 [of b 0 a] by simp |
79 |
79 |
80 lemma div_mult_self2_is_id [simp]: "b \<noteq> 0 \<Longrightarrow> a * b div b = a" |
80 lemma div_mult_self2_is_id [simp]: "b \<noteq> 0 \<Longrightarrow> a * b div b = a" |
215 lemma mod_mult_left_eq: "(a * b) mod c = ((a mod c) * b) mod c" |
215 lemma mod_mult_left_eq: "(a * b) mod c = ((a mod c) * b) mod c" |
216 proof - |
216 proof - |
217 have "(a * b) mod c = ((a div c * c + a mod c) * b) mod c" |
217 have "(a * b) mod c = ((a div c * c + a mod c) * b) mod c" |
218 by (simp only: mod_div_equality) |
218 by (simp only: mod_div_equality) |
219 also have "\<dots> = (a mod c * b + a div c * b * c) mod c" |
219 also have "\<dots> = (a mod c * b + a div c * b * c) mod c" |
220 by (simp only: left_distrib right_distrib add_ac mult_ac) |
220 by (simp only: algebra_simps) |
221 also have "\<dots> = (a mod c * b) mod c" |
221 also have "\<dots> = (a mod c * b) mod c" |
222 by (rule mod_mult_self1) |
222 by (rule mod_mult_self1) |
223 finally show ?thesis . |
223 finally show ?thesis . |
224 qed |
224 qed |
225 |
225 |
226 lemma mod_mult_right_eq: "(a * b) mod c = (a * (b mod c)) mod c" |
226 lemma mod_mult_right_eq: "(a * b) mod c = (a * (b mod c)) mod c" |
227 proof - |
227 proof - |
228 have "(a * b) mod c = (a * (b div c * c + b mod c)) mod c" |
228 have "(a * b) mod c = (a * (b div c * c + b mod c)) mod c" |
229 by (simp only: mod_div_equality) |
229 by (simp only: mod_div_equality) |
230 also have "\<dots> = (a * (b mod c) + a * (b div c) * c) mod c" |
230 also have "\<dots> = (a * (b mod c) + a * (b div c) * c) mod c" |
231 by (simp only: left_distrib right_distrib add_ac mult_ac) |
231 by (simp only: algebra_simps) |
232 also have "\<dots> = (a * (b mod c)) mod c" |
232 also have "\<dots> = (a * (b mod c)) mod c" |
233 by (rule mod_mult_self1) |
233 by (rule mod_mult_self1) |
234 finally show ?thesis . |
234 finally show ?thesis . |
235 qed |
235 qed |
236 |
236 |
566 |
566 |
567 |
567 |
568 subsubsection {* Quotient *} |
568 subsubsection {* Quotient *} |
569 |
569 |
570 lemma div_geq: "0 < n \<Longrightarrow> \<not> m < n \<Longrightarrow> m div n = Suc ((m - n) div n)" |
570 lemma div_geq: "0 < n \<Longrightarrow> \<not> m < n \<Longrightarrow> m div n = Suc ((m - n) div n)" |
571 by (simp add: le_div_geq linorder_not_less) |
571 by (simp add: le_div_geq linorder_not_less) |
572 |
572 |
573 lemma div_if: "0 < n \<Longrightarrow> m div n = (if m < n then 0 else Suc ((m - n) div n))" |
573 lemma div_if: "0 < n \<Longrightarrow> m div n = (if m < n then 0 else Suc ((m - n) div n))" |
574 by (simp add: div_geq) |
574 by (simp add: div_geq) |
575 |
575 |
576 lemma div_mult_self_is_m [simp]: "0<n ==> (m*n) div n = (m::nat)" |
576 lemma div_mult_self_is_m [simp]: "0<n ==> (m*n) div n = (m::nat)" |
577 by simp |
577 by simp |
578 |
578 |
579 lemma div_mult_self1_is_m [simp]: "0<n ==> (n*m) div n = (m::nat)" |
579 lemma div_mult_self1_is_m [simp]: "0<n ==> (n*m) div n = (m::nat)" |
580 by simp |
580 by simp |
581 |
581 |
582 |
582 |
583 subsubsection {* Remainder *} |
583 subsubsection {* Remainder *} |
584 |
584 |
585 lemma mod_less_divisor [simp]: |
585 lemma mod_less_divisor [simp]: |
595 from mod_div_equality have "m div n * n + m mod n = m" . |
595 from mod_div_equality have "m div n * n + m mod n = m" . |
596 then show "m div n * n + m mod n \<le> m" by auto |
596 then show "m div n * n + m mod n \<le> m" by auto |
597 qed |
597 qed |
598 |
598 |
599 lemma mod_geq: "\<not> m < (n\<Colon>nat) \<Longrightarrow> m mod n = (m - n) mod n" |
599 lemma mod_geq: "\<not> m < (n\<Colon>nat) \<Longrightarrow> m mod n = (m - n) mod n" |
600 by (simp add: le_mod_geq linorder_not_less) |
600 by (simp add: le_mod_geq linorder_not_less) |
601 |
601 |
602 lemma mod_if: "m mod (n\<Colon>nat) = (if m < n then m else (m - n) mod n)" |
602 lemma mod_if: "m mod (n\<Colon>nat) = (if m < n then m else (m - n) mod n)" |
603 by (simp add: le_mod_geq) |
603 by (simp add: le_mod_geq) |
604 |
604 |
605 lemma mod_1 [simp]: "m mod Suc 0 = 0" |
605 lemma mod_1 [simp]: "m mod Suc 0 = 0" |
606 by (induct m) (simp_all add: mod_geq) |
606 by (induct m) (simp_all add: mod_geq) |
607 |
607 |
608 lemma mod_mult_distrib: "(m mod n) * (k\<Colon>nat) = (m * k) mod (n * k)" |
608 lemma mod_mult_distrib: "(m mod n) * (k\<Colon>nat) = (m * k) mod (n * k)" |
609 apply (cases "n = 0", simp) |
609 apply (cases "n = 0", simp) |
610 apply (cases "k = 0", simp) |
610 apply (cases "k = 0", simp) |
611 apply (induct m rule: nat_less_induct) |
611 apply (induct m rule: nat_less_induct) |
612 apply (subst mod_if, simp) |
612 apply (subst mod_if, simp) |
613 apply (simp add: mod_geq diff_mult_distrib) |
613 apply (simp add: mod_geq diff_mult_distrib) |
614 done |
614 done |
615 |
615 |
616 lemma mod_mult_distrib2: "(k::nat) * (m mod n) = (k*m) mod (k*n)" |
616 lemma mod_mult_distrib2: "(k::nat) * (m mod n) = (k*m) mod (k*n)" |
617 by (simp add: mult_commute [of k] mod_mult_distrib) |
617 by (simp add: mult_commute [of k] mod_mult_distrib) |
618 |
618 |
619 (* a simple rearrangement of mod_div_equality: *) |
619 (* a simple rearrangement of mod_div_equality: *) |
620 lemma mult_div_cancel: "(n::nat) * (m div n) = m - (m mod n)" |
620 lemma mult_div_cancel: "(n::nat) * (m div n) = m - (m mod n)" |
621 by (cut_tac a = m and b = n in mod_div_equality2, arith) |
621 by (cut_tac a = m and b = n in mod_div_equality2, arith) |
622 |
622 |
623 lemma mod_le_divisor[simp]: "0 < n \<Longrightarrow> m mod n \<le> (n::nat)" |
623 lemma mod_le_divisor[simp]: "0 < n \<Longrightarrow> m mod n \<le> (n::nat)" |
624 apply (drule mod_less_divisor [where m = m]) |
624 apply (drule mod_less_divisor [where m = m]) |
625 apply simp |
625 apply simp |
626 done |
626 done |
628 subsubsection {* Quotient and Remainder *} |
628 subsubsection {* Quotient and Remainder *} |
629 |
629 |
630 lemma divmod_rel_mult1_eq: |
630 lemma divmod_rel_mult1_eq: |
631 "[| divmod_rel b c q r; c > 0 |] |
631 "[| divmod_rel b c q r; c > 0 |] |
632 ==> divmod_rel (a*b) c (a*q + a*r div c) (a*r mod c)" |
632 ==> divmod_rel (a*b) c (a*q + a*r div c) (a*r mod c)" |
633 by (auto simp add: split_ifs mult_ac divmod_rel_def add_mult_distrib2) |
633 by (auto simp add: split_ifs divmod_rel_def algebra_simps) |
634 |
634 |
635 lemma div_mult1_eq: "(a*b) div c = a*(b div c) + a*(b mod c) div (c::nat)" |
635 lemma div_mult1_eq: "(a*b) div c = a*(b div c) + a*(b mod c) div (c::nat)" |
636 apply (cases "c = 0", simp) |
636 apply (cases "c = 0", simp) |
637 apply (blast intro: divmod_rel [THEN divmod_rel_mult1_eq, THEN div_eq]) |
637 apply (blast intro: divmod_rel [THEN divmod_rel_mult1_eq, THEN div_eq]) |
638 done |
638 done |
639 |
639 |
640 lemma mod_mult1_eq: "(a*b) mod c = a*(b mod c) mod (c::nat)" |
640 lemma mod_mult1_eq: "(a*b) mod c = a*(b mod c) mod (c::nat)" |
641 by (rule mod_mult_right_eq) |
641 by (rule mod_mult_right_eq) |
642 |
642 |
643 lemma mod_mult1_eq': "(a*b) mod (c::nat) = ((a mod c) * b) mod c" |
643 lemma mod_mult1_eq': "(a*b) mod (c::nat) = ((a mod c) * b) mod c" |
644 by (rule mod_mult_left_eq) |
644 by (rule mod_mult_left_eq) |
645 |
645 |
646 lemma mod_mult_distrib_mod: |
646 lemma mod_mult_distrib_mod: |
647 "(a*b) mod (c::nat) = ((a mod c) * (b mod c)) mod c" |
647 "(a*b) mod (c::nat) = ((a mod c) * (b mod c)) mod c" |
648 by (rule mod_mult_eq) |
648 by (rule mod_mult_eq) |
649 |
649 |
650 lemma divmod_rel_add1_eq: |
650 lemma divmod_rel_add1_eq: |
651 "[| divmod_rel a c aq ar; divmod_rel b c bq br; c > 0 |] |
651 "[| divmod_rel a c aq ar; divmod_rel b c bq br; c > 0 |] |
652 ==> divmod_rel (a + b) c (aq + bq + (ar+br) div c) ((ar + br) mod c)" |
652 ==> divmod_rel (a + b) c (aq + bq + (ar+br) div c) ((ar + br) mod c)" |
653 by (auto simp add: split_ifs mult_ac divmod_rel_def add_mult_distrib2) |
653 by (auto simp add: split_ifs divmod_rel_def algebra_simps) |
654 |
654 |
655 (*NOT suitable for rewriting: the RHS has an instance of the LHS*) |
655 (*NOT suitable for rewriting: the RHS has an instance of the LHS*) |
656 lemma div_add1_eq: |
656 lemma div_add1_eq: |
657 "(a+b) div (c::nat) = a div c + b div c + ((a mod c + b mod c) div c)" |
657 "(a+b) div (c::nat) = a div c + b div c + ((a mod c + b mod c) div c)" |
658 apply (cases "c = 0", simp) |
658 apply (cases "c = 0", simp) |
659 apply (blast intro: divmod_rel_add1_eq [THEN div_eq] divmod_rel) |
659 apply (blast intro: divmod_rel_add1_eq [THEN div_eq] divmod_rel) |
660 done |
660 done |
661 |
661 |
662 lemma mod_add1_eq: "(a+b) mod (c::nat) = (a mod c + b mod c) mod c" |
662 lemma mod_add1_eq: "(a+b) mod (c::nat) = (a mod c + b mod c) mod c" |
663 by (rule mod_add_eq) |
663 by (rule mod_add_eq) |
664 |
664 |
665 lemma mod_lemma: "[| (0::nat) < c; r < b |] ==> b * (q mod c) + r < b * c" |
665 lemma mod_lemma: "[| (0::nat) < c; r < b |] ==> b * (q mod c) + r < b * c" |
666 apply (cut_tac m = q and n = c in mod_less_divisor) |
666 apply (cut_tac m = q and n = c in mod_less_divisor) |
667 apply (drule_tac [2] m = "q mod c" in less_imp_Suc_add, auto) |
667 apply (drule_tac [2] m = "q mod c" in less_imp_Suc_add, auto) |
668 apply (erule_tac P = "%x. ?lhs < ?rhs x" in ssubst) |
668 apply (erule_tac P = "%x. ?lhs < ?rhs x" in ssubst) |
669 apply (simp add: add_mult_distrib2) |
669 apply (simp add: add_mult_distrib2) |
670 done |
670 done |
671 |
671 |
672 lemma divmod_rel_mult2_eq: "[| divmod_rel a b q r; 0 < b; 0 < c |] |
672 lemma divmod_rel_mult2_eq: "[| divmod_rel a b q r; 0 < b; 0 < c |] |
673 ==> divmod_rel a (b*c) (q div c) (b*(q mod c) + r)" |
673 ==> divmod_rel a (b*c) (q div c) (b*(q mod c) + r)" |
674 by (auto simp add: mult_ac divmod_rel_def add_mult_distrib2 [symmetric] mod_lemma) |
674 by (auto simp add: mult_ac divmod_rel_def add_mult_distrib2 [symmetric] mod_lemma) |
675 |
675 |
676 lemma div_mult2_eq: "a div (b*c) = (a div b) div (c::nat)" |
676 lemma div_mult2_eq: "a div (b*c) = (a div b) div (c::nat)" |
677 apply (cases "b = 0", simp) |
677 apply (cases "b = 0", simp) |
678 apply (cases "c = 0", simp) |
678 apply (cases "c = 0", simp) |
679 apply (force simp add: divmod_rel [THEN divmod_rel_mult2_eq, THEN div_eq]) |
679 apply (force simp add: divmod_rel [THEN divmod_rel_mult2_eq, THEN div_eq]) |
778 apply (simp add: linorder_not_less le_Suc_eq mod_geq) |
778 apply (simp add: linorder_not_less le_Suc_eq mod_geq) |
779 apply (auto simp add: Suc_diff_le le_mod_geq) |
779 apply (auto simp add: Suc_diff_le le_mod_geq) |
780 done |
780 done |
781 |
781 |
782 lemma nat_mod_div_trivial: "m mod n div n = (0 :: nat)" |
782 lemma nat_mod_div_trivial: "m mod n div n = (0 :: nat)" |
783 by simp |
783 by simp |
784 |
784 |
785 lemma nat_mod_mod_trivial: "m mod n mod n = (m mod n :: nat)" |
785 lemma nat_mod_mod_trivial: "m mod n mod n = (m mod n :: nat)" |
786 by simp |
786 by simp |
787 |
787 |
788 |
788 |
789 subsubsection {* The Divides Relation *} |
789 subsubsection {* The Divides Relation *} |
790 |
790 |
791 lemma dvd_1_left [iff]: "Suc 0 dvd k" |
791 lemma dvd_1_left [iff]: "Suc 0 dvd k" |
792 unfolding dvd_def by simp |
792 unfolding dvd_def by simp |
793 |
793 |
794 lemma dvd_1_iff_1 [simp]: "(m dvd Suc 0) = (m = Suc 0)" |
794 lemma dvd_1_iff_1 [simp]: "(m dvd Suc 0) = (m = Suc 0)" |
795 by (simp add: dvd_def) |
795 by (simp add: dvd_def) |
796 |
796 |
797 lemma dvd_anti_sym: "[| m dvd n; n dvd m |] ==> m = (n::nat)" |
797 lemma dvd_anti_sym: "[| m dvd n; n dvd m |] ==> m = (n::nat)" |
798 unfolding dvd_def |
798 unfolding dvd_def |
799 by (force dest: mult_eq_self_implies_10 simp add: mult_assoc mult_eq_1_iff) |
799 by (force dest: mult_eq_self_implies_10 simp add: mult_assoc mult_eq_1_iff) |
800 |
800 |
811 apply (erule linorder_not_less [THEN iffD2, THEN add_diff_inverse, THEN subst]) |
811 apply (erule linorder_not_less [THEN iffD2, THEN add_diff_inverse, THEN subst]) |
812 apply (blast intro: dvd_add) |
812 apply (blast intro: dvd_add) |
813 done |
813 done |
814 |
814 |
815 lemma dvd_diffD1: "[| k dvd m-n; k dvd m; n\<le>m |] ==> k dvd (n::nat)" |
815 lemma dvd_diffD1: "[| k dvd m-n; k dvd m; n\<le>m |] ==> k dvd (n::nat)" |
816 by (drule_tac m = m in dvd_diff, auto) |
816 by (drule_tac m = m in dvd_diff, auto) |
817 |
817 |
818 lemma dvd_reduce: "(k dvd n + k) = (k dvd (n::nat))" |
818 lemma dvd_reduce: "(k dvd n + k) = (k dvd (n::nat))" |
819 apply (rule iffI) |
819 apply (rule iffI) |
820 apply (erule_tac [2] dvd_add) |
820 apply (erule_tac [2] dvd_add) |
821 apply (rule_tac [2] dvd_refl) |
821 apply (rule_tac [2] dvd_refl) |
892 apply (rule power_le_imp_le_exp, assumption) |
892 apply (rule power_le_imp_le_exp, assumption) |
893 apply (erule dvd_imp_le, simp) |
893 apply (erule dvd_imp_le, simp) |
894 done |
894 done |
895 |
895 |
896 lemma mod_eq_0_iff: "(m mod d = 0) = (\<exists>q::nat. m = d*q)" |
896 lemma mod_eq_0_iff: "(m mod d = 0) = (\<exists>q::nat. m = d*q)" |
897 by (auto simp add: dvd_eq_mod_eq_0 [symmetric] dvd_def) |
897 by (auto simp add: dvd_eq_mod_eq_0 [symmetric] dvd_def) |
898 |
898 |
899 lemmas mod_eq_0D [dest!] = mod_eq_0_iff [THEN iffD1] |
899 lemmas mod_eq_0D [dest!] = mod_eq_0_iff [THEN iffD1] |
900 |
900 |
901 (*Loses information, namely we also have r<d provided d is nonzero*) |
901 (*Loses information, namely we also have r<d provided d is nonzero*) |
902 lemma mod_eqD: "(m mod d = r) ==> \<exists>q::nat. m = r + q*d" |
902 lemma mod_eqD: "(m mod d = r) ==> \<exists>q::nat. m = r + q*d" |