src/HOL/Integ/IntDiv.thy
changeset 14353 79f9fbef9106
parent 14288 d149e3cbdb39
child 14378 69c4d5997669
equal deleted inserted replaced
14352:a8b1a44d8264 14353:79f9fbef9106
   355 
   355 
   356 subsection{*Division of a Number by Itself*}
   356 subsection{*Division of a Number by Itself*}
   357 
   357 
   358 lemma self_quotient_aux1: "[| (0::int) < a; a = r + a*q; r < a |] ==> 1 \<le> q"
   358 lemma self_quotient_aux1: "[| (0::int) < a; a = r + a*q; r < a |] ==> 1 \<le> q"
   359 apply (subgoal_tac "0 < a*q")
   359 apply (subgoal_tac "0 < a*q")
   360  apply (simp add: int_0_less_mult_iff, arith)
   360  apply (simp add: zero_less_mult_iff, arith)
   361 done
   361 done
   362 
   362 
   363 lemma self_quotient_aux2: "[| (0::int) < a; a = r + a*q; 0 \<le> r |] ==> q \<le> 1"
   363 lemma self_quotient_aux2: "[| (0::int) < a; a = r + a*q; 0 \<le> r |] ==> q \<le> 1"
   364 apply (subgoal_tac "0 \<le> a* (1-q) ")
   364 apply (subgoal_tac "0 \<le> a* (1-q) ")
   365  apply (simp add: int_0_le_mult_iff)
   365  apply (simp add: zero_le_mult_iff)
   366 apply (simp add: zdiff_zmult_distrib2)
   366 apply (simp add: zdiff_zmult_distrib2)
   367 done
   367 done
   368 
   368 
   369 lemma self_quotient: "[| quorem((a,a),(q,r));  a ~= (0::int) |] ==> q = 1"
   369 lemma self_quotient: "[| quorem((a,a),(q,r));  a ~= (0::int) |] ==> q = 1"
   370 apply (simp add: split_ifs quorem_def linorder_neq_iff)
   370 apply (simp add: split_ifs quorem_def linorder_neq_iff)
   514 subsection{*Monotonicity in the Second Argument (Divisor)*}
   514 subsection{*Monotonicity in the Second Argument (Divisor)*}
   515 
   515 
   516 lemma q_pos_lemma:
   516 lemma q_pos_lemma:
   517      "[| 0 \<le> b'*q' + r'; r' < b';  0 < b' |] ==> 0 \<le> (q'::int)"
   517      "[| 0 \<le> b'*q' + r'; r' < b';  0 < b' |] ==> 0 \<le> (q'::int)"
   518 apply (subgoal_tac "0 < b'* (q' + 1) ")
   518 apply (subgoal_tac "0 < b'* (q' + 1) ")
   519  apply (simp add: int_0_less_mult_iff)
   519  apply (simp add: zero_less_mult_iff)
   520 apply (simp add: zadd_zmult_distrib2)
   520 apply (simp add: zadd_zmult_distrib2)
   521 done
   521 done
   522 
   522 
   523 lemma zdiv_mono2_lemma:
   523 lemma zdiv_mono2_lemma:
   524      "[| b*q + r = b'*q' + r';  0 \<le> b'*q' + r';   
   524      "[| b*q + r = b'*q' + r';  0 \<le> b'*q' + r';   
   547 done
   547 done
   548 
   548 
   549 lemma q_neg_lemma:
   549 lemma q_neg_lemma:
   550      "[| b'*q' + r' < 0;  0 \<le> r';  0 < b' |] ==> q' \<le> (0::int)"
   550      "[| b'*q' + r' < 0;  0 \<le> r';  0 < b' |] ==> q' \<le> (0::int)"
   551 apply (subgoal_tac "b'*q' < 0")
   551 apply (subgoal_tac "b'*q' < 0")
   552  apply (simp add: zmult_less_0_iff, arith)
   552  apply (simp add: mult_less_0_iff, arith)
   553 done
   553 done
   554 
   554 
   555 lemma zdiv_mono2_neg_lemma:
   555 lemma zdiv_mono2_neg_lemma:
   556      "[| b*q + r = b'*q' + r';  b'*q' + r' < 0;   
   556      "[| b*q + r = b'*q' + r';  b'*q' + r' < 0;   
   557          r < b;  0 \<le> r';  0 < b';  b' \<le> b |]   
   557          r < b;  0 \<le> r';  0 < b';  b' \<le> b |]   
   709 done
   709 done
   710 
   710 
   711 lemma zmult2_lemma_aux2: "[| (0::int) < c;   b < r;  r \<le> 0 |] ==> b * (q mod c) + r \<le> 0"
   711 lemma zmult2_lemma_aux2: "[| (0::int) < c;   b < r;  r \<le> 0 |] ==> b * (q mod c) + r \<le> 0"
   712 apply (subgoal_tac "b * (q mod c) \<le> 0")
   712 apply (subgoal_tac "b * (q mod c) \<le> 0")
   713  apply arith
   713  apply arith
   714 apply (simp add: zmult_le_0_iff)
   714 apply (simp add: mult_le_0_iff)
   715 done
   715 done
   716 
   716 
   717 lemma zmult2_lemma_aux3: "[| (0::int) < c;  0 \<le> r;  r < b |] ==> 0 \<le> b * (q mod c) + r"
   717 lemma zmult2_lemma_aux3: "[| (0::int) < c;  0 \<le> r;  r < b |] ==> 0 \<le> b * (q mod c) + r"
   718 apply (subgoal_tac "0 \<le> b * (q mod c) ")
   718 apply (subgoal_tac "0 \<le> b * (q mod c) ")
   719 apply arith
   719 apply arith
   720 apply (simp add: int_0_le_mult_iff)
   720 apply (simp add: zero_le_mult_iff)
   721 done
   721 done
   722 
   722 
   723 lemma zmult2_lemma_aux4: "[| (0::int) < c; 0 \<le> r; r < b |] ==> b * (q mod c) + r < b * c"
   723 lemma zmult2_lemma_aux4: "[| (0::int) < c; 0 \<le> r; r < b |] ==> b * (q mod c) + r < b * c"
   724 apply (subgoal_tac "r * 1 < b * (c - q mod c) ")
   724 apply (subgoal_tac "r * 1 < b * (c - q mod c) ")
   725 apply (simp add: zdiff_zmult_distrib2)
   725 apply (simp add: zdiff_zmult_distrib2)
   731 done
   731 done
   732 
   732 
   733 lemma zmult2_lemma: "[| quorem ((a,b), (q,r));  b ~= 0;  0 < c |]  
   733 lemma zmult2_lemma: "[| quorem ((a,b), (q,r));  b ~= 0;  0 < c |]  
   734       ==> quorem ((a, b*c), (q div c, b*(q mod c) + r))"
   734       ==> quorem ((a, b*c), (q div c, b*(q mod c) + r))"
   735 by (auto simp add: mult_ac quorem_def linorder_neq_iff
   735 by (auto simp add: mult_ac quorem_def linorder_neq_iff
   736                    int_0_less_mult_iff zadd_zmult_distrib2 [symmetric] 
   736                    zero_less_mult_iff zadd_zmult_distrib2 [symmetric] 
   737                    zmult2_lemma_aux1 zmult2_lemma_aux2 zmult2_lemma_aux3 zmult2_lemma_aux4)
   737                    zmult2_lemma_aux1 zmult2_lemma_aux2 zmult2_lemma_aux3 zmult2_lemma_aux4)
   738 
   738 
   739 lemma zdiv_zmult2_eq: "(0::int) < c ==> a div (b*c) = (a div b) div c"
   739 lemma zdiv_zmult2_eq: "(0::int) < c ==> a div (b*c) = (a div b) div c"
   740 apply (case_tac "b = 0", simp add: DIVISION_BY_ZERO)
   740 apply (case_tac "b = 0", simp add: DIVISION_BY_ZERO)
   741 apply (force simp add: quorem_div_mod [THEN zmult2_lemma, THEN quorem_div])
   741 apply (force simp add: quorem_div_mod [THEN zmult2_lemma, THEN quorem_div])
  1031   done
  1031   done
  1032 
  1032 
  1033 lemma zdvd_anti_sym:
  1033 lemma zdvd_anti_sym:
  1034     "0 < m ==> 0 < n ==> m dvd n ==> n dvd m ==> m = (n::int)"
  1034     "0 < m ==> 0 < n ==> m dvd n ==> n dvd m ==> m = (n::int)"
  1035   apply (unfold dvd_def, auto)
  1035   apply (unfold dvd_def, auto)
  1036   apply (simp add: zmult_assoc zmult_eq_self_iff int_0_less_mult_iff zmult_eq_1_iff)
  1036   apply (simp add: zmult_assoc zmult_eq_self_iff zero_less_mult_iff zmult_eq_1_iff)
  1037   done
  1037   done
  1038 
  1038 
  1039 lemma zdvd_zadd: "k dvd m ==> k dvd n ==> k dvd (m + n :: int)"
  1039 lemma zdvd_zadd: "k dvd m ==> k dvd n ==> k dvd (m + n :: int)"
  1040   apply (unfold dvd_def)
  1040   apply (unfold dvd_def)
  1041   apply (blast intro: zadd_zmult_distrib2 [symmetric])
  1041   apply (blast intro: zadd_zmult_distrib2 [symmetric])
  1110 lemma zdvd_not_zless: "0 < m ==> m < n ==> \<not> n dvd (m::int)"
  1110 lemma zdvd_not_zless: "0 < m ==> m < n ==> \<not> n dvd (m::int)"
  1111   apply (unfold dvd_def, auto)
  1111   apply (unfold dvd_def, auto)
  1112   apply (subgoal_tac "0 < n")
  1112   apply (subgoal_tac "0 < n")
  1113    prefer 2
  1113    prefer 2
  1114    apply (blast intro: zless_trans)
  1114    apply (blast intro: zless_trans)
  1115   apply (simp add: int_0_less_mult_iff)
  1115   apply (simp add: zero_less_mult_iff)
  1116   apply (subgoal_tac "n * k < n * 1")
  1116   apply (subgoal_tac "n * k < n * 1")
  1117    apply (drule zmult_zless_cancel1 [THEN iffD1], auto)
  1117    apply (drule zmult_zless_cancel1 [THEN iffD1], auto)
  1118   done
  1118   done
  1119 
  1119 
  1120 lemma int_dvd_iff: "(int m dvd z) = (m dvd nat (abs z))"
  1120 lemma int_dvd_iff: "(int m dvd z) = (m dvd nat (abs z))"
  1121   apply (auto simp add: dvd_def nat_abs_mult_distrib)
  1121   apply (auto simp add: dvd_def nat_abs_mult_distrib)
  1122   apply (auto simp add: nat_eq_iff zabs_eq_iff)
  1122   apply (auto simp add: nat_eq_iff abs_if split add: split_if_asm)
  1123    apply (rule_tac [2] x = "-(int k)" in exI)
  1123    apply (rule_tac x = "-(int k)" in exI)
  1124   apply (auto simp add: zmult_int [symmetric])
  1124   apply (auto simp add: zmult_int [symmetric])
  1125   done
  1125   done
  1126 
  1126 
  1127 lemma dvd_int_iff: "(z dvd int m) = (nat (abs z) dvd m)"
  1127 lemma dvd_int_iff: "(z dvd int m) = (nat (abs z) dvd m)"
  1128   apply (auto simp add: dvd_def zabs_def zmult_int [symmetric])
  1128   apply (auto simp add: dvd_def zabs_def zmult_int [symmetric])
  1129     apply (rule_tac [3] x = "nat k" in exI)
  1129     apply (rule_tac [3] x = "nat k" in exI)
  1130     apply (rule_tac [2] x = "-(int k)" in exI)
  1130     apply (rule_tac [2] x = "-(int k)" in exI)
  1131     apply (rule_tac x = "nat (-k)" in exI)
  1131     apply (rule_tac x = "nat (-k)" in exI)
  1132     apply (cut_tac [3] k = m in int_less_0_conv)
  1132     apply (cut_tac [3] k = m in int_less_0_conv)
  1133     apply (cut_tac k = m in int_less_0_conv)
  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
  1134     apply (auto simp add: zero_le_mult_iff mult_less_0_iff
  1135       nat_mult_distrib [symmetric] nat_eq_iff2)
  1135       nat_mult_distrib [symmetric] nat_eq_iff2)
  1136   done
  1136   done
  1137 
  1137 
  1138 lemma nat_dvd_iff: "(nat z dvd m) = (if 0 \<le> z then (z dvd int m) else m = 0)"
  1138 lemma nat_dvd_iff: "(nat z dvd m) = (if 0 \<le> z then (z dvd int m) else m = 0)"
  1139   apply (auto simp add: dvd_def zmult_int [symmetric])
  1139   apply (auto simp add: dvd_def zmult_int [symmetric])
  1140   apply (rule_tac x = "nat k" in exI)
  1140   apply (rule_tac x = "nat k" in exI)
  1141   apply (cut_tac k = m in int_less_0_conv)
  1141   apply (cut_tac k = m in int_less_0_conv)
  1142   apply (auto simp add: int_0_le_mult_iff zmult_less_0_iff
  1142   apply (auto simp add: zero_le_mult_iff mult_less_0_iff
  1143     nat_mult_distrib [symmetric] nat_eq_iff2)
  1143     nat_mult_distrib [symmetric] nat_eq_iff2)
  1144   done
  1144   done
  1145 
  1145 
  1146 lemma zminus_dvd_iff [iff]: "(-z dvd w) = (z dvd (w::int))"
  1146 lemma zminus_dvd_iff [iff]: "(-z dvd w) = (z dvd (w::int))"
  1147   apply (auto simp add: dvd_def)
  1147   apply (auto simp add: dvd_def)
  1158   apply (rule_tac z=n in int_cases)
  1158   apply (rule_tac z=n in int_cases)
  1159   apply (auto simp add: dvd_int_iff) 
  1159   apply (auto simp add: dvd_int_iff) 
  1160   apply (rule_tac z=z in int_cases) 
  1160   apply (rule_tac z=z in int_cases) 
  1161   apply (auto simp add: dvd_imp_le) 
  1161   apply (auto simp add: dvd_imp_le) 
  1162   done
  1162   done
       
  1163 
       
  1164 
       
  1165 subsection{*Integer Powers*} 
       
  1166 
       
  1167 instance int :: power ..
       
  1168 
       
  1169 primrec
       
  1170   "p ^ 0 = 1"
       
  1171   "p ^ (Suc n) = (p::int) * (p ^ n)"
       
  1172 
       
  1173 
       
  1174 instance int :: ringpower
       
  1175 proof
       
  1176   fix z :: int
       
  1177   fix n :: nat
       
  1178   show "z^0 = 1" by simp
       
  1179   show "z^(Suc n) = z * (z^n)" by simp
       
  1180 qed
       
  1181 
       
  1182 
       
  1183 lemma zpower_zmod: "((x::int) mod m)^y mod m = x^y mod m"
       
  1184 apply (induct_tac "y", auto)
       
  1185 apply (rule zmod_zmult1_eq [THEN trans])
       
  1186 apply (simp (no_asm_simp))
       
  1187 apply (rule zmod_zmult_distrib [symmetric])
       
  1188 done
       
  1189 
       
  1190 lemma zpower_zadd_distrib: "x^(y+z) = ((x^y)*(x^z)::int)"
       
  1191   by (rule Power.power_add)
       
  1192 
       
  1193 lemma zpower_zpower: "(x^y)^z = (x^(y*z)::int)"
       
  1194   by (rule Power.power_mult [symmetric])
       
  1195 
       
  1196 lemma zero_less_zpower_abs_iff [simp]:
       
  1197      "(0 < (abs x)^n) = (x \<noteq> (0::int) | n=0)"
       
  1198 apply (induct_tac "n")
       
  1199 apply (auto simp add: zero_less_mult_iff)
       
  1200 done
       
  1201 
       
  1202 lemma zero_le_zpower_abs [simp]: "(0::int) <= (abs x)^n"
       
  1203 apply (induct_tac "n")
       
  1204 apply (auto simp add: zero_le_mult_iff)
       
  1205 done
  1163 
  1206 
  1164 
  1207 
  1165 ML
  1208 ML
  1166 {*
  1209 {*
  1167 val quorem_def = thm "quorem_def";
  1210 val quorem_def = thm "quorem_def";
  1262 val div_nonneg_neg_le0 = thm "div_nonneg_neg_le0";
  1305 val div_nonneg_neg_le0 = thm "div_nonneg_neg_le0";
  1263 val pos_imp_zdiv_nonneg_iff = thm "pos_imp_zdiv_nonneg_iff";
  1306 val pos_imp_zdiv_nonneg_iff = thm "pos_imp_zdiv_nonneg_iff";
  1264 val neg_imp_zdiv_nonneg_iff = thm "neg_imp_zdiv_nonneg_iff";
  1307 val neg_imp_zdiv_nonneg_iff = thm "neg_imp_zdiv_nonneg_iff";
  1265 val pos_imp_zdiv_neg_iff = thm "pos_imp_zdiv_neg_iff";
  1308 val pos_imp_zdiv_neg_iff = thm "pos_imp_zdiv_neg_iff";
  1266 val neg_imp_zdiv_neg_iff = thm "neg_imp_zdiv_neg_iff";
  1309 val neg_imp_zdiv_neg_iff = thm "neg_imp_zdiv_neg_iff";
       
  1310 
       
  1311 val zpower_zmod = thm "zpower_zmod";
       
  1312 val zpower_zadd_distrib = thm "zpower_zadd_distrib";
       
  1313 val zpower_zpower = thm "zpower_zpower";
       
  1314 val zero_less_zpower_abs_iff = thm "zero_less_zpower_abs_iff";
       
  1315 val zero_le_zpower_abs = thm "zero_le_zpower_abs";
  1267 *}
  1316 *}
  1268 
  1317 
  1269 end
  1318 end