diff -r a8b1a44d8264 -r 79f9fbef9106 src/HOL/Integ/IntDiv.thy --- a/src/HOL/Integ/IntDiv.thy Mon Jan 12 16:45:35 2004 +0100 +++ b/src/HOL/Integ/IntDiv.thy Mon Jan 12 16:51:45 2004 +0100 @@ -357,12 +357,12 @@ lemma self_quotient_aux1: "[| (0::int) < a; a = r + a*q; r < a |] ==> 1 \ q" apply (subgoal_tac "0 < a*q") - apply (simp add: int_0_less_mult_iff, arith) + apply (simp add: zero_less_mult_iff, arith) done lemma self_quotient_aux2: "[| (0::int) < a; a = r + a*q; 0 \ r |] ==> q \ 1" apply (subgoal_tac "0 \ a* (1-q) ") - apply (simp add: int_0_le_mult_iff) + apply (simp add: zero_le_mult_iff) apply (simp add: zdiff_zmult_distrib2) done @@ -516,7 +516,7 @@ lemma q_pos_lemma: "[| 0 \ b'*q' + r'; r' < b'; 0 < b' |] ==> 0 \ (q'::int)" apply (subgoal_tac "0 < b'* (q' + 1) ") - apply (simp add: int_0_less_mult_iff) + apply (simp add: zero_less_mult_iff) apply (simp add: zadd_zmult_distrib2) done @@ -549,7 +549,7 @@ lemma q_neg_lemma: "[| b'*q' + r' < 0; 0 \ r'; 0 < b' |] ==> q' \ (0::int)" apply (subgoal_tac "b'*q' < 0") - apply (simp add: zmult_less_0_iff, arith) + apply (simp add: mult_less_0_iff, arith) done lemma zdiv_mono2_neg_lemma: @@ -711,13 +711,13 @@ lemma zmult2_lemma_aux2: "[| (0::int) < c; b < r; r \ 0 |] ==> b * (q mod c) + r \ 0" apply (subgoal_tac "b * (q mod c) \ 0") apply arith -apply (simp add: zmult_le_0_iff) +apply (simp add: mult_le_0_iff) done lemma zmult2_lemma_aux3: "[| (0::int) < c; 0 \ r; r < b |] ==> 0 \ b * (q mod c) + r" apply (subgoal_tac "0 \ b * (q mod c) ") apply arith -apply (simp add: int_0_le_mult_iff) +apply (simp add: zero_le_mult_iff) done lemma zmult2_lemma_aux4: "[| (0::int) < c; 0 \ r; r < b |] ==> b * (q mod c) + r < b * c" @@ -733,7 +733,7 @@ lemma zmult2_lemma: "[| quorem ((a,b), (q,r)); b ~= 0; 0 < c |] ==> quorem ((a, b*c), (q div c, b*(q mod c) + r))" by (auto simp add: mult_ac quorem_def linorder_neq_iff - int_0_less_mult_iff zadd_zmult_distrib2 [symmetric] + zero_less_mult_iff zadd_zmult_distrib2 [symmetric] zmult2_lemma_aux1 zmult2_lemma_aux2 zmult2_lemma_aux3 zmult2_lemma_aux4) lemma zdiv_zmult2_eq: "(0::int) < c ==> a div (b*c) = (a div b) div c" @@ -1033,7 +1033,7 @@ lemma zdvd_anti_sym: "0 < m ==> 0 < n ==> m dvd n ==> n dvd m ==> m = (n::int)" apply (unfold dvd_def, auto) - apply (simp add: zmult_assoc zmult_eq_self_iff int_0_less_mult_iff zmult_eq_1_iff) + apply (simp add: zmult_assoc zmult_eq_self_iff zero_less_mult_iff zmult_eq_1_iff) done lemma zdvd_zadd: "k dvd m ==> k dvd n ==> k dvd (m + n :: int)" @@ -1112,15 +1112,15 @@ apply (subgoal_tac "0 < n") prefer 2 apply (blast intro: zless_trans) - apply (simp add: int_0_less_mult_iff) + apply (simp add: zero_less_mult_iff) apply (subgoal_tac "n * k < n * 1") apply (drule zmult_zless_cancel1 [THEN iffD1], auto) done lemma int_dvd_iff: "(int m dvd z) = (m dvd nat (abs z))" apply (auto simp add: dvd_def nat_abs_mult_distrib) - apply (auto simp add: nat_eq_iff zabs_eq_iff) - apply (rule_tac [2] x = "-(int k)" in exI) + apply (auto simp add: nat_eq_iff abs_if split add: split_if_asm) + apply (rule_tac x = "-(int k)" in exI) apply (auto simp add: zmult_int [symmetric]) done @@ -1131,7 +1131,7 @@ apply (rule_tac x = "nat (-k)" in exI) apply (cut_tac [3] k = m in int_less_0_conv) apply (cut_tac k = m in int_less_0_conv) - apply (auto simp add: int_0_le_mult_iff zmult_less_0_iff + apply (auto simp add: zero_le_mult_iff mult_less_0_iff nat_mult_distrib [symmetric] nat_eq_iff2) done @@ -1139,7 +1139,7 @@ apply (auto simp add: dvd_def zmult_int [symmetric]) apply (rule_tac x = "nat k" in exI) apply (cut_tac k = m in int_less_0_conv) - apply (auto simp add: int_0_le_mult_iff zmult_less_0_iff + apply (auto simp add: zero_le_mult_iff mult_less_0_iff nat_mult_distrib [symmetric] nat_eq_iff2) done @@ -1162,6 +1162,49 @@ done +subsection{*Integer Powers*} + +instance int :: power .. + +primrec + "p ^ 0 = 1" + "p ^ (Suc n) = (p::int) * (p ^ n)" + + +instance int :: ringpower +proof + fix z :: int + fix n :: nat + show "z^0 = 1" by simp + show "z^(Suc n) = z * (z^n)" by simp +qed + + +lemma zpower_zmod: "((x::int) mod m)^y mod m = x^y mod m" +apply (induct_tac "y", auto) +apply (rule zmod_zmult1_eq [THEN trans]) +apply (simp (no_asm_simp)) +apply (rule zmod_zmult_distrib [symmetric]) +done + +lemma zpower_zadd_distrib: "x^(y+z) = ((x^y)*(x^z)::int)" + by (rule Power.power_add) + +lemma zpower_zpower: "(x^y)^z = (x^(y*z)::int)" + by (rule Power.power_mult [symmetric]) + +lemma zero_less_zpower_abs_iff [simp]: + "(0 < (abs x)^n) = (x \ (0::int) | n=0)" +apply (induct_tac "n") +apply (auto simp add: zero_less_mult_iff) +done + +lemma zero_le_zpower_abs [simp]: "(0::int) <= (abs x)^n" +apply (induct_tac "n") +apply (auto simp add: zero_le_mult_iff) +done + + ML {* val quorem_def = thm "quorem_def"; @@ -1264,6 +1307,12 @@ val neg_imp_zdiv_nonneg_iff = thm "neg_imp_zdiv_nonneg_iff"; val pos_imp_zdiv_neg_iff = thm "pos_imp_zdiv_neg_iff"; val neg_imp_zdiv_neg_iff = thm "neg_imp_zdiv_neg_iff"; + +val zpower_zmod = thm "zpower_zmod"; +val zpower_zadd_distrib = thm "zpower_zadd_distrib"; +val zpower_zpower = thm "zpower_zpower"; +val zero_less_zpower_abs_iff = thm "zero_less_zpower_abs_iff"; +val zero_le_zpower_abs = thm "zero_le_zpower_abs"; *} end