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 |