src/HOL/Integ/IntDiv.thy
changeset 13837 8dd150d36c65
parent 13788 fd03c4ab89d4
child 14271 8ed6989228bb
equal deleted inserted replaced
13836:6d0392fc6dc5 13837:8dd150d36c65
   625   assume "EX q::int. m = d*q"
   625   assume "EX q::int. m = d*q"
   626   thus "m mod d = 0" by auto
   626   thus "m mod d = 0" by auto
   627 qed
   627 qed
   628 
   628 
   629 declare zmod_eq_0_iff [THEN iffD1, dest!]
   629 declare zmod_eq_0_iff [THEN iffD1, dest!]
   630 
       
   631 lemma zdvd_iff_zmod_eq_0: "(m dvd n) = (n mod m = (0::int))"
       
   632 by(simp add:dvd_def zmod_eq_0_iff)
       
   633 
   630 
   634 (** proving (a+b) div c = a div c + b div c + ((a mod c + b mod c) div c) **)
   631 (** proving (a+b) div c = a div c + b div c + ((a mod c + b mod c) div c) **)
   635 
   632 
   636 lemma zadd1_lemma:
   633 lemma zadd1_lemma:
   637      "[| quorem((a,c),(aq,ar));  quorem((b,c),(bq,br));  c ~= 0 |]  
   634      "[| quorem((a,c),(aq,ar));  quorem((b,c),(bq,br));  c ~= 0 |]  
   985 by (simp add: linorder_not_le [symmetric] pos_imp_zdiv_nonneg_iff)
   982 by (simp add: linorder_not_le [symmetric] pos_imp_zdiv_nonneg_iff)
   986 
   983 
   987 (*Again the law fails for <=: consider a = -1, b = -2 when a div b = 0*)
   984 (*Again the law fails for <=: consider a = -1, b = -2 when a div b = 0*)
   988 lemma neg_imp_zdiv_neg_iff: "b < (0::int) ==> (a div b < 0) = (0 < a)"
   985 lemma neg_imp_zdiv_neg_iff: "b < (0::int) ==> (a div b < 0) = (0 < a)"
   989 by (simp add: linorder_not_le [symmetric] neg_imp_zdiv_nonneg_iff)
   986 by (simp add: linorder_not_le [symmetric] neg_imp_zdiv_nonneg_iff)
       
   987 
       
   988 
       
   989 subsection {* Divides relation *}
       
   990 
       
   991 lemma zdvd_iff_zmod_eq_0: "(m dvd n) = (n mod m = (0::int))"
       
   992 by(simp add:dvd_def zmod_eq_0_iff)
       
   993 
       
   994 lemma zdvd_0_right [iff]: "(m::int) dvd 0"
       
   995   apply (unfold dvd_def)
       
   996   apply (blast intro: zmult_0_right [symmetric])
       
   997   done
       
   998 
       
   999 lemma zdvd_0_left [iff]: "(0 dvd (m::int)) = (m = 0)"
       
  1000   by (unfold dvd_def, auto)
       
  1001 
       
  1002 lemma zdvd_1_left [iff]: "1 dvd (m::int)"
       
  1003   by (unfold dvd_def, simp)
       
  1004 
       
  1005 lemma zdvd_refl [simp]: "m dvd (m::int)"
       
  1006   apply (unfold dvd_def)
       
  1007   apply (blast intro: zmult_1_right [symmetric])
       
  1008   done
       
  1009 
       
  1010 lemma zdvd_trans: "m dvd n ==> n dvd k ==> m dvd (k::int)"
       
  1011   apply (unfold dvd_def)
       
  1012   apply (blast intro: zmult_assoc)
       
  1013   done
       
  1014 
       
  1015 lemma zdvd_zminus_iff: "(m dvd -n) = (m dvd (n::int))"
       
  1016   apply (unfold dvd_def, auto)
       
  1017    apply (rule_tac [!] x = "-k" in exI, auto)
       
  1018   done
       
  1019 
       
  1020 lemma zdvd_zminus2_iff: "(-m dvd n) = (m dvd (n::int))"
       
  1021   apply (unfold dvd_def, auto)
       
  1022    apply (rule_tac [!] x = "-k" in exI, auto)
       
  1023   done
       
  1024 
       
  1025 lemma zdvd_anti_sym:
       
  1026     "0 < m ==> 0 < n ==> m dvd n ==> n dvd m ==> m = (n::int)"
       
  1027   apply (unfold dvd_def, auto)
       
  1028   apply (simp add: zmult_assoc zmult_eq_self_iff int_0_less_mult_iff zmult_eq_1_iff)
       
  1029   done
       
  1030 
       
  1031 lemma zdvd_zadd: "k dvd m ==> k dvd n ==> k dvd (m + n :: int)"
       
  1032   apply (unfold dvd_def)
       
  1033   apply (blast intro: zadd_zmult_distrib2 [symmetric])
       
  1034   done
       
  1035 
       
  1036 lemma zdvd_zdiff: "k dvd m ==> k dvd n ==> k dvd (m - n :: int)"
       
  1037   apply (unfold dvd_def)
       
  1038   apply (blast intro: zdiff_zmult_distrib2 [symmetric])
       
  1039   done
       
  1040 
       
  1041 lemma zdvd_zdiffD: "k dvd m - n ==> k dvd n ==> k dvd (m::int)"
       
  1042   apply (subgoal_tac "m = n + (m - n)")
       
  1043    apply (erule ssubst)
       
  1044    apply (blast intro: zdvd_zadd, simp)
       
  1045   done
       
  1046 
       
  1047 lemma zdvd_zmult: "k dvd (n::int) ==> k dvd m * n"
       
  1048   apply (unfold dvd_def)
       
  1049   apply (blast intro: zmult_left_commute)
       
  1050   done
       
  1051 
       
  1052 lemma zdvd_zmult2: "k dvd (m::int) ==> k dvd m * n"
       
  1053   apply (subst zmult_commute)
       
  1054   apply (erule zdvd_zmult)
       
  1055   done
       
  1056 
       
  1057 lemma [iff]: "(k::int) dvd m * k"
       
  1058   apply (rule zdvd_zmult)
       
  1059   apply (rule zdvd_refl)
       
  1060   done
       
  1061 
       
  1062 lemma [iff]: "(k::int) dvd k * m"
       
  1063   apply (rule zdvd_zmult2)
       
  1064   apply (rule zdvd_refl)
       
  1065   done
       
  1066 
       
  1067 lemma zdvd_zmultD2: "j * k dvd n ==> j dvd (n::int)"
       
  1068   apply (unfold dvd_def)
       
  1069   apply (simp add: zmult_assoc, blast)
       
  1070   done
       
  1071 
       
  1072 lemma zdvd_zmultD: "j * k dvd n ==> k dvd (n::int)"
       
  1073   apply (rule zdvd_zmultD2)
       
  1074   apply (subst zmult_commute, assumption)
       
  1075   done
       
  1076 
       
  1077 lemma zdvd_zmult_mono: "i dvd m ==> j dvd (n::int) ==> i * j dvd m * n"
       
  1078   apply (unfold dvd_def, clarify)
       
  1079   apply (rule_tac x = "k * ka" in exI)
       
  1080   apply (simp add: zmult_ac)
       
  1081   done
       
  1082 
       
  1083 lemma zdvd_reduce: "(k dvd n + k * m) = (k dvd (n::int))"
       
  1084   apply (rule iffI)
       
  1085    apply (erule_tac [2] zdvd_zadd)
       
  1086    apply (subgoal_tac "n = (n + k * m) - k * m")
       
  1087     apply (erule ssubst)
       
  1088     apply (erule zdvd_zdiff, simp_all)
       
  1089   done
       
  1090 
       
  1091 lemma zdvd_zmod: "f dvd m ==> f dvd (n::int) ==> f dvd m mod n"
       
  1092   apply (unfold dvd_def)
       
  1093   apply (auto simp add: zmod_zmult_zmult1)
       
  1094   done
       
  1095 
       
  1096 lemma zdvd_zmod_imp_zdvd: "k dvd m mod n ==> k dvd n ==> k dvd (m::int)"
       
  1097   apply (subgoal_tac "k dvd n * (m div n) + m mod n")
       
  1098    apply (simp add: zmod_zdiv_equality [symmetric])
       
  1099   apply (simp only: zdvd_zadd zdvd_zmult2)
       
  1100   done
       
  1101 
       
  1102 lemma zdvd_not_zless: "0 < m ==> m < n ==> \<not> n dvd (m::int)"
       
  1103   apply (unfold dvd_def, auto)
       
  1104   apply (subgoal_tac "0 < n")
       
  1105    prefer 2
       
  1106    apply (blast intro: zless_trans)
       
  1107   apply (simp add: int_0_less_mult_iff)
       
  1108   apply (subgoal_tac "n * k < n * 1")
       
  1109    apply (drule zmult_zless_cancel1 [THEN iffD1], auto)
       
  1110   done
       
  1111 
       
  1112 lemma int_dvd_iff: "(int m dvd z) = (m dvd nat (abs z))"
       
  1113   apply (auto simp add: dvd_def nat_abs_mult_distrib)
       
  1114   apply (auto simp add: nat_eq_iff zabs_eq_iff)
       
  1115    apply (rule_tac [2] x = "-(int k)" in exI)
       
  1116   apply (auto simp add: zmult_int [symmetric])
       
  1117   done
       
  1118 
       
  1119 lemma dvd_int_iff: "(z dvd int m) = (nat (abs z) dvd m)"
       
  1120   apply (auto simp add: dvd_def zabs_def zmult_int [symmetric])
       
  1121     apply (rule_tac [3] x = "nat k" in exI)
       
  1122     apply (rule_tac [2] x = "-(int k)" in exI)
       
  1123     apply (rule_tac x = "nat (-k)" in exI)
       
  1124     apply (cut_tac [3] k = m in int_less_0_conv)
       
  1125     apply (cut_tac k = m in int_less_0_conv)
       
  1126     apply (auto simp add: int_0_le_mult_iff zmult_less_0_iff
       
  1127       nat_mult_distrib [symmetric] nat_eq_iff2)
       
  1128   done
       
  1129 
       
  1130 lemma nat_dvd_iff: "(nat z dvd m) = (if 0 \<le> z then (z dvd int m) else m = 0)"
       
  1131   apply (auto simp add: dvd_def zmult_int [symmetric])
       
  1132   apply (rule_tac x = "nat k" in exI)
       
  1133   apply (cut_tac k = m in int_less_0_conv)
       
  1134   apply (auto simp add: int_0_le_mult_iff zmult_less_0_iff
       
  1135     nat_mult_distrib [symmetric] nat_eq_iff2)
       
  1136   done
       
  1137 
       
  1138 lemma zminus_dvd_iff [iff]: "(-z dvd w) = (z dvd (w::int))"
       
  1139   apply (auto simp add: dvd_def)
       
  1140    apply (rule_tac [!] x = "-k" in exI, auto)
       
  1141   done
       
  1142 
       
  1143 lemma dvd_zminus_iff [iff]: "(z dvd -w) = (z dvd (w::int))"
       
  1144   apply (auto simp add: dvd_def)
       
  1145    apply (drule zminus_equation [THEN iffD1])
       
  1146    apply (rule_tac [!] x = "-k" in exI, auto)
       
  1147   done
       
  1148 
       
  1149 lemma zdvd_imp_le: "[| z dvd n; 0 < n |] ==> z <= (n::int)"
       
  1150   apply (rule_tac z=n in int_cases)
       
  1151   apply (auto simp add: dvd_int_iff) 
       
  1152   apply (rule_tac z=z in int_cases) 
       
  1153   apply (auto simp add: dvd_imp_le) 
       
  1154   done
       
  1155 
   990 
  1156 
   991 ML
  1157 ML
   992 {*
  1158 {*
   993 val quorem_def = thm "quorem_def";
  1159 val quorem_def = thm "quorem_def";
   994 
  1160