529 obtains |
529 obtains |
530 (divides) q where "b \<noteq> 0" |
530 (divides) q where "b \<noteq> 0" |
531 and "a div b = q" |
531 and "a div b = q" |
532 and "a mod b = 0" |
532 and "a mod b = 0" |
533 and "a = q * b" |
533 and "a = q * b" |
534 | (remainder) q r where "b \<noteq> 0" and "r \<noteq> 0" |
534 | (remainder) q r where "b \<noteq> 0" |
535 and "uniqueness_constraint r b" |
535 and "uniqueness_constraint r b" |
536 and "euclidean_size r < euclidean_size b" |
536 and "euclidean_size r < euclidean_size b" |
|
537 and "r \<noteq> 0" |
537 and "a div b = q" |
538 and "a div b = q" |
538 and "a mod b = r" |
539 and "a mod b = r" |
539 and "a = q * b + r" |
540 and "a = q * b + r" |
540 | (by0) "b = 0" |
541 | (by0) "b = 0" |
541 proof (cases "b = 0") |
542 proof (cases "b = 0") |
626 by (simp_all add: uniqueness_constraint_mono_mult uniqueness_constraint_mod size_mono_mult) |
627 by (simp_all add: uniqueness_constraint_mono_mult uniqueness_constraint_mod size_mono_mult) |
627 with remainder show ?thesis |
628 with remainder show ?thesis |
628 by (auto intro!: div_eqI [of _ "c * (a mod b)"] simp add: algebra_simps) |
629 by (auto intro!: div_eqI [of _ "c * (a mod b)"] simp add: algebra_simps) |
629 (use \<open>b * c \<noteq> 0\<close> in simp) |
630 (use \<open>b * c \<noteq> 0\<close> in simp) |
630 qed |
631 qed |
|
632 qed |
|
633 |
|
634 lemma div_mult1_eq: |
|
635 "(a * b) div c = a * (b div c) + a * (b mod c) div c" |
|
636 proof (cases "a * (b mod c)" c rule: divmod_cases) |
|
637 case (divides q) |
|
638 have "a * b = a * (b div c * c + b mod c)" |
|
639 by (simp add: div_mult_mod_eq) |
|
640 also have "\<dots> = (a * (b div c) + q) * c" |
|
641 using divides by (simp add: algebra_simps) |
|
642 finally have "(a * b) div c = \<dots> div c" |
|
643 by simp |
|
644 with divides show ?thesis |
|
645 by simp |
|
646 next |
|
647 case (remainder q r) |
|
648 from remainder(1-3) show ?thesis |
|
649 proof (rule div_eqI) |
|
650 have "a * b = a * (b div c * c + b mod c)" |
|
651 by (simp add: div_mult_mod_eq) |
|
652 also have "\<dots> = a * c * (b div c) + q * c + r" |
|
653 using remainder by (simp add: algebra_simps) |
|
654 finally show "(a * (b div c) + a * (b mod c) div c) * c + r = a * b" |
|
655 using remainder(5-7) by (simp add: algebra_simps) |
|
656 qed |
|
657 next |
|
658 case by0 |
|
659 then show ?thesis |
|
660 by simp |
|
661 qed |
|
662 |
|
663 lemma div_add1_eq: |
|
664 "(a + b) div c = a div c + b div c + (a mod c + b mod c) div c" |
|
665 proof (cases "a mod c + b mod c" c rule: divmod_cases) |
|
666 case (divides q) |
|
667 have "a + b = (a div c * c + a mod c) + (b div c * c + b mod c)" |
|
668 using mod_mult_div_eq [of a c] mod_mult_div_eq [of b c] by (simp add: ac_simps) |
|
669 also have "\<dots> = (a div c + b div c) * c + (a mod c + b mod c)" |
|
670 by (simp add: algebra_simps) |
|
671 also have "\<dots> = (a div c + b div c + q) * c" |
|
672 using divides by (simp add: algebra_simps) |
|
673 finally have "(a + b) div c = (a div c + b div c + q) * c div c" |
|
674 by simp |
|
675 with divides show ?thesis |
|
676 by simp |
|
677 next |
|
678 case (remainder q r) |
|
679 from remainder(1-3) show ?thesis |
|
680 proof (rule div_eqI) |
|
681 have "(a div c + b div c + q) * c + r + (a mod c + b mod c) = |
|
682 (a div c * c + a mod c) + (b div c * c + b mod c) + q * c + r" |
|
683 by (simp add: algebra_simps) |
|
684 also have "\<dots> = a + b + (a mod c + b mod c)" |
|
685 by (simp add: div_mult_mod_eq remainder) (simp add: ac_simps) |
|
686 finally show "(a div c + b div c + (a mod c + b mod c) div c) * c + r = a + b" |
|
687 using remainder by simp |
|
688 qed |
|
689 next |
|
690 case by0 |
|
691 then show ?thesis |
|
692 by simp |
631 qed |
693 qed |
632 |
694 |
633 end |
695 end |
634 |
696 |
635 class unique_euclidean_ring = euclidean_ring + unique_euclidean_semiring |
697 class unique_euclidean_ring = euclidean_ring + unique_euclidean_semiring |
944 Suc_mod_mult_self1 [simp]: "Suc (m + k * n) mod n = Suc m mod n" |
1006 Suc_mod_mult_self1 [simp]: "Suc (m + k * n) mod n = Suc m mod n" |
945 and Suc_mod_mult_self2 [simp]: "Suc (m + n * k) mod n = Suc m mod n" |
1007 and Suc_mod_mult_self2 [simp]: "Suc (m + n * k) mod n = Suc m mod n" |
946 and Suc_mod_mult_self3 [simp]: "Suc (k * n + m) mod n = Suc m mod n" |
1008 and Suc_mod_mult_self3 [simp]: "Suc (k * n + m) mod n = Suc m mod n" |
947 and Suc_mod_mult_self4 [simp]: "Suc (n * k + m) mod n = Suc m mod n" |
1009 and Suc_mod_mult_self4 [simp]: "Suc (n * k + m) mod n = Suc m mod n" |
948 by (subst mod_Suc_eq [symmetric], simp add: mod_simps)+ |
1010 by (subst mod_Suc_eq [symmetric], simp add: mod_simps)+ |
949 |
|
950 lemma div_mult1_eq: -- \<open>TODO: Generalization candidate\<close> |
|
951 "(a * b) div c = a * (b div c) + a * (b mod c) div c" for a b c :: nat |
|
952 apply (cases "c = 0") |
|
953 apply simp |
|
954 apply (rule div_eqI [of _ "(a * (b mod c)) mod c"]) |
|
955 apply (auto simp add: algebra_simps distrib_left [symmetric]) |
|
956 done |
|
957 |
|
958 lemma div_add1_eq: -- \<open>NOT suitable for rewriting: the RHS has an instance of the LHS\<close> |
|
959 -- \<open>TODO: Generalization candidate\<close> |
|
960 "(a + b) div c = a div c + b div c + ((a mod c + b mod c) div c)" for a b c :: nat |
|
961 apply (cases "c = 0") |
|
962 apply simp |
|
963 apply (rule div_eqI [of _ "(a mod c + b mod c) mod c"]) |
|
964 apply (auto simp add: algebra_simps) |
|
965 done |
|
966 |
1011 |
967 context |
1012 context |
968 fixes m n q :: nat |
1013 fixes m n q :: nat |
969 begin |
1014 begin |
970 |
1015 |