src/HOL/Integ/IntDiv.thy
changeset 13524 604d0f3622d6
parent 13517 42efec18f5b2
child 13601 fd3e3d6b37b2
equal deleted inserted replaced
13523:079af5c90d1c 13524:604d0f3622d6
   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)