350 by (simp add: zmod_zminus1_eq_if zmod_zminus2) |
350 by (simp add: zmod_zminus1_eq_if zmod_zminus2) |
351 |
351 |
352 |
352 |
353 (*** division of a number by itself ***) |
353 (*** division of a number by itself ***) |
354 |
354 |
355 lemma lemma1: "[| (0::int) < a; a = r + a*q; r < a |] ==> 1 <= q" |
355 lemma self_quotient_aux1: "[| (0::int) < a; a = r + a*q; r < a |] ==> 1 <= q" |
356 apply (subgoal_tac "0 < a*q") |
356 apply (subgoal_tac "0 < a*q") |
357 apply (simp add: int_0_less_mult_iff, arith) |
357 apply (simp add: int_0_less_mult_iff, arith) |
358 done |
358 done |
359 |
359 |
360 lemma lemma2: "[| (0::int) < a; a = r + a*q; 0 <= r |] ==> q <= 1" |
360 lemma self_quotient_aux2: "[| (0::int) < a; a = r + a*q; 0 <= r |] ==> q <= 1" |
361 apply (subgoal_tac "0 <= a* (1-q) ") |
361 apply (subgoal_tac "0 <= a* (1-q) ") |
362 apply (simp add: int_0_le_mult_iff) |
362 apply (simp add: int_0_le_mult_iff) |
363 apply (simp add: zdiff_zmult_distrib2) |
363 apply (simp add: zdiff_zmult_distrib2) |
364 done |
364 done |
365 |
365 |
366 lemma self_quotient: "[| quorem((a,a),(q,r)); a ~= (0::int) |] ==> q = 1" |
366 lemma self_quotient: "[| quorem((a,a),(q,r)); a ~= (0::int) |] ==> q = 1" |
367 apply (simp add: split_ifs quorem_def linorder_neq_iff) |
367 apply (simp add: split_ifs quorem_def linorder_neq_iff) |
368 apply (rule order_antisym, auto) |
368 apply (rule order_antisym, auto) |
369 apply (rule_tac [3] a = "-a" and r = "-r" in lemma1) |
369 apply (rule_tac [3] a = "-a" and r = "-r" in self_quotient_aux1) |
370 apply (rule_tac a = "-a" and r = "-r" in lemma2) |
370 apply (rule_tac a = "-a" and r = "-r" in self_quotient_aux2) |
371 apply (force intro: lemma1 lemma2 simp add: zadd_commute zmult_zminus)+ |
371 apply (force intro: self_quotient_aux1 self_quotient_aux2 simp add: zadd_commute zmult_zminus)+ |
372 done |
372 done |
373 |
373 |
374 lemma self_remainder: "[| quorem((a,a),(q,r)); a ~= (0::int) |] ==> r = 0" |
374 lemma self_remainder: "[| quorem((a,a),(q,r)); a ~= (0::int) |] ==> r = 0" |
375 apply (frule self_quotient, assumption) |
375 apply (frule self_quotient, assumption) |
376 apply (simp add: quorem_def) |
376 apply (simp add: quorem_def) |
697 7 div 2 div ~3 = 3 div ~3 = ~1. The subcase (a div b) mod c = 0 seems |
697 7 div 2 div ~3 = 3 div ~3 = ~1. The subcase (a div b) mod c = 0 seems |
698 to cause particular problems.*) |
698 to cause particular problems.*) |
699 |
699 |
700 (** first, four lemmas to bound the remainder for the cases b<0 and b>0 **) |
700 (** first, four lemmas to bound the remainder for the cases b<0 and b>0 **) |
701 |
701 |
702 lemma lemma1: "[| (0::int) < c; b < r; r <= 0 |] ==> b*c < b*(q mod c) + r" |
702 lemma zmult2_lemma_aux1: "[| (0::int) < c; b < r; r <= 0 |] ==> b*c < b*(q mod c) + r" |
703 apply (subgoal_tac "b * (c - q mod c) < r * 1") |
703 apply (subgoal_tac "b * (c - q mod c) < r * 1") |
704 apply (simp add: zdiff_zmult_distrib2) |
704 apply (simp add: zdiff_zmult_distrib2) |
705 apply (rule order_le_less_trans) |
705 apply (rule order_le_less_trans) |
706 apply (erule_tac [2] zmult_zless_mono1) |
706 apply (erule_tac [2] zmult_zless_mono1) |
707 apply (rule zmult_zle_mono2_neg) |
707 apply (rule zmult_zle_mono2_neg) |
708 apply (auto simp add: zcompare_rls zadd_commute [of 1] |
708 apply (auto simp add: zcompare_rls zadd_commute [of 1] |
709 add1_zle_eq pos_mod_bound) |
709 add1_zle_eq pos_mod_bound) |
710 done |
710 done |
711 |
711 |
712 lemma lemma2: "[| (0::int) < c; b < r; r <= 0 |] ==> b * (q mod c) + r <= 0" |
712 lemma zmult2_lemma_aux2: "[| (0::int) < c; b < r; r <= 0 |] ==> b * (q mod c) + r <= 0" |
713 apply (subgoal_tac "b * (q mod c) <= 0") |
713 apply (subgoal_tac "b * (q mod c) <= 0") |
714 apply arith |
714 apply arith |
715 apply (simp add: zmult_le_0_iff pos_mod_sign) |
715 apply (simp add: zmult_le_0_iff pos_mod_sign) |
716 done |
716 done |
717 |
717 |
718 lemma lemma3: "[| (0::int) < c; 0 <= r; r < b |] ==> 0 <= b * (q mod c) + r" |
718 lemma zmult2_lemma_aux3: "[| (0::int) < c; 0 <= r; r < b |] ==> 0 <= b * (q mod c) + r" |
719 apply (subgoal_tac "0 <= b * (q mod c) ") |
719 apply (subgoal_tac "0 <= b * (q mod c) ") |
720 apply arith |
720 apply arith |
721 apply (simp add: int_0_le_mult_iff pos_mod_sign) |
721 apply (simp add: int_0_le_mult_iff pos_mod_sign) |
722 done |
722 done |
723 |
723 |
724 lemma lemma4: "[| (0::int) < c; 0 <= r; r < b |] ==> b * (q mod c) + r < b * c" |
724 lemma zmult2_lemma_aux4: "[| (0::int) < c; 0 <= r; r < b |] ==> b * (q mod c) + r < b * c" |
725 apply (subgoal_tac "r * 1 < b * (c - q mod c) ") |
725 apply (subgoal_tac "r * 1 < b * (c - q mod c) ") |
726 apply (simp add: zdiff_zmult_distrib2) |
726 apply (simp add: zdiff_zmult_distrib2) |
727 apply (rule order_less_le_trans) |
727 apply (rule order_less_le_trans) |
728 apply (erule zmult_zless_mono1) |
728 apply (erule zmult_zless_mono1) |
729 apply (rule_tac [2] zmult_zle_mono2) |
729 apply (rule_tac [2] zmult_zle_mono2) |
733 |
733 |
734 lemma zmult2_lemma: "[| quorem ((a,b), (q,r)); b ~= 0; 0 < c |] |
734 lemma zmult2_lemma: "[| quorem ((a,b), (q,r)); b ~= 0; 0 < c |] |
735 ==> quorem ((a, b*c), (q div c, b*(q mod c) + r))" |
735 ==> quorem ((a, b*c), (q div c, b*(q mod c) + r))" |
736 by (auto simp add: zmult_ac quorem_def linorder_neq_iff |
736 by (auto simp add: zmult_ac quorem_def linorder_neq_iff |
737 int_0_less_mult_iff zadd_zmult_distrib2 [symmetric] |
737 int_0_less_mult_iff zadd_zmult_distrib2 [symmetric] |
738 lemma1 lemma2 lemma3 lemma4) |
738 zmult2_lemma_aux1 zmult2_lemma_aux2 zmult2_lemma_aux3 zmult2_lemma_aux4) |
739 |
739 |
740 lemma zdiv_zmult2_eq: "(0::int) < c ==> a div (b*c) = (a div b) div c" |
740 lemma zdiv_zmult2_eq: "(0::int) < c ==> a div (b*c) = (a div b) div c" |
741 apply (case_tac "b = 0", simp add: DIVISION_BY_ZERO) |
741 apply (case_tac "b = 0", simp add: DIVISION_BY_ZERO) |
742 apply (force simp add: quorem_div_mod [THEN zmult2_lemma, THEN quorem_div]) |
742 apply (force simp add: quorem_div_mod [THEN zmult2_lemma, THEN quorem_div]) |
743 done |
743 done |
749 done |
749 done |
750 |
750 |
751 |
751 |
752 (*** Cancellation of common factors in div ***) |
752 (*** Cancellation of common factors in div ***) |
753 |
753 |
754 lemma lemma1: "[| (0::int) < b; c ~= 0 |] ==> (c*a) div (c*b) = a div b" |
754 lemma zdiv_zmult_zmult1_aux1: "[| (0::int) < b; c ~= 0 |] ==> (c*a) div (c*b) = a div b" |
755 by (subst zdiv_zmult2_eq, auto) |
755 by (subst zdiv_zmult2_eq, auto) |
756 |
756 |
757 lemma lemma2: "[| b < (0::int); c ~= 0 |] ==> (c*a) div (c*b) = a div b" |
757 lemma zdiv_zmult_zmult1_aux2: "[| b < (0::int); c ~= 0 |] ==> (c*a) div (c*b) = a div b" |
758 apply (subgoal_tac " (c * (-a)) div (c * (-b)) = (-a) div (-b) ") |
758 apply (subgoal_tac " (c * (-a)) div (c * (-b)) = (-a) div (-b) ") |
759 apply (rule_tac [2] lemma1, auto) |
759 apply (rule_tac [2] zdiv_zmult_zmult1_aux1, auto) |
760 done |
760 done |
761 |
761 |
762 lemma zdiv_zmult_zmult1: "c ~= (0::int) ==> (c*a) div (c*b) = a div b" |
762 lemma zdiv_zmult_zmult1: "c ~= (0::int) ==> (c*a) div (c*b) = a div b" |
763 apply (case_tac "b = 0", simp add: DIVISION_BY_ZERO) |
763 apply (case_tac "b = 0", simp add: DIVISION_BY_ZERO) |
764 apply (auto simp add: linorder_neq_iff lemma1 lemma2) |
764 apply (auto simp add: linorder_neq_iff zdiv_zmult_zmult1_aux1 zdiv_zmult_zmult1_aux2) |
765 done |
765 done |
766 |
766 |
767 lemma zdiv_zmult_zmult2: "c ~= (0::int) ==> (a*c) div (b*c) = a div b" |
767 lemma zdiv_zmult_zmult2: "c ~= (0::int) ==> (a*c) div (b*c) = a div b" |
768 apply (drule zdiv_zmult_zmult1) |
768 apply (drule zdiv_zmult_zmult1) |
769 apply (auto simp add: zmult_commute) |
769 apply (auto simp add: zmult_commute) |
771 |
771 |
772 |
772 |
773 |
773 |
774 (*** Distribution of factors over mod ***) |
774 (*** Distribution of factors over mod ***) |
775 |
775 |
776 lemma lemma1: "[| (0::int) < b; c ~= 0 |] ==> (c*a) mod (c*b) = c * (a mod b)" |
776 lemma zmod_zmult_zmult1_aux1: "[| (0::int) < b; c ~= 0 |] ==> (c*a) mod (c*b) = c * (a mod b)" |
777 by (subst zmod_zmult2_eq, auto) |
777 by (subst zmod_zmult2_eq, auto) |
778 |
778 |
779 lemma lemma2: "[| b < (0::int); c ~= 0 |] ==> (c*a) mod (c*b) = c * (a mod b)" |
779 lemma zmod_zmult_zmult1_aux2: "[| b < (0::int); c ~= 0 |] ==> (c*a) mod (c*b) = c * (a mod b)" |
780 apply (subgoal_tac " (c * (-a)) mod (c * (-b)) = c * ((-a) mod (-b))") |
780 apply (subgoal_tac " (c * (-a)) mod (c * (-b)) = c * ((-a) mod (-b))") |
781 apply (rule_tac [2] lemma1, auto) |
781 apply (rule_tac [2] zmod_zmult_zmult1_aux1, auto) |
782 done |
782 done |
783 |
783 |
784 lemma zmod_zmult_zmult1: "(c*a) mod (c*b) = (c::int) * (a mod b)" |
784 lemma zmod_zmult_zmult1: "(c*a) mod (c*b) = (c::int) * (a mod b)" |
785 apply (case_tac "b = 0", simp add: DIVISION_BY_ZERO) |
785 apply (case_tac "b = 0", simp add: DIVISION_BY_ZERO) |
786 apply (case_tac "c = 0", simp add: DIVISION_BY_ZERO) |
786 apply (case_tac "c = 0", simp add: DIVISION_BY_ZERO) |
787 apply (auto simp add: linorder_neq_iff lemma1 lemma2) |
787 apply (auto simp add: linorder_neq_iff zmod_zmult_zmult1_aux1 zmod_zmult_zmult1_aux2) |
788 done |
788 done |
789 |
789 |
790 lemma zmod_zmult_zmult2: "(a*c) mod (b*c) = (a mod b) * (c::int)" |
790 lemma zmod_zmult_zmult2: "(a*c) mod (b*c) = (a mod b) * (c::int)" |
791 apply (cut_tac c = c in zmod_zmult_zmult1) |
791 apply (cut_tac c = c in zmod_zmult_zmult1) |
792 apply (auto simp add: zmult_commute) |
792 apply (auto simp add: zmult_commute) |