src/HOL/Integ/IntDiv.thy
changeset 15234 ec91a90c604e
parent 15221 8412cfdf3287
child 15251 bb6f072c8d10
equal deleted inserted replaced
15233:c55a12162944 15234:ec91a90c604e
   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)