138 apply (auto simp add: mult_strict_mono zero_le_power power_Suc |
138 apply (auto simp add: mult_strict_mono zero_le_power power_Suc |
139 order_le_less_trans [of 0 a b]) |
139 order_le_less_trans [of 0 a b]) |
140 done |
140 done |
141 |
141 |
142 lemma power_eq_0_iff [simp]: |
142 lemma power_eq_0_iff [simp]: |
143 "(a^n = 0) = (a = (0::'a::{ring_1_no_zero_divisors,recpower}) & 0<n)" |
143 "(a^n = 0) = (a = (0::'a::{ring_1_no_zero_divisors,recpower}) & n\<noteq>0)" |
144 apply (induct "n") |
144 apply (induct "n") |
145 apply (auto simp add: power_Suc zero_neq_one [THEN not_sym]) |
145 apply (auto simp add: power_Suc zero_neq_one [THEN not_sym]) |
146 done |
146 done |
147 |
147 |
148 lemma field_power_eq_0_iff: |
148 lemma field_power_not_zero: |
149 "(a^n = 0) = (a = (0::'a::{division_ring,recpower}) & 0<n)" |
149 "a \<noteq> (0::'a::{ring_1_no_zero_divisors,recpower}) ==> a^n \<noteq> 0" |
150 by simp (* TODO: delete *) |
|
151 |
|
152 lemma field_power_not_zero: "a \<noteq> (0::'a::{ring_1_no_zero_divisors,recpower}) ==> a^n \<noteq> 0" |
|
153 by force |
150 by force |
154 |
151 |
155 lemma nonzero_power_inverse: |
152 lemma nonzero_power_inverse: |
156 fixes a :: "'a::{division_ring,recpower}" |
153 fixes a :: "'a::{division_ring,recpower}" |
157 shows "a \<noteq> 0 ==> inverse (a ^ n) = (inverse a) ^ n" |
154 shows "a \<noteq> 0 ==> inverse (a ^ n) = (inverse a) ^ n" |
277 apply (rule mult_strict_mono) |
274 apply (rule mult_strict_mono) |
278 apply (auto simp add: order_less_trans [OF zero_less_one] zero_le_power |
275 apply (auto simp add: order_less_trans [OF zero_less_one] zero_le_power |
279 order_less_imp_le) |
276 order_less_imp_le) |
280 done |
277 done |
281 |
278 |
282 lemma power_increasing_iff [simp]: |
279 lemma power_increasing_iff [simp]: |
283 "1 < (b::'a::{ordered_semidom,recpower}) ==> (b ^ x \<le> b ^ y) = (x \<le> y)" |
280 "1 < (b::'a::{ordered_semidom,recpower}) ==> (b ^ x \<le> b ^ y) = (x \<le> y)" |
284 by (blast intro: power_le_imp_le_exp power_increasing order_less_imp_le) |
281 by (blast intro: power_le_imp_le_exp power_increasing order_less_imp_le) |
285 |
282 |
286 lemma power_strict_increasing_iff [simp]: |
283 lemma power_strict_increasing_iff [simp]: |
287 "1 < (b::'a::{ordered_semidom,recpower}) ==> (b ^ x < b ^ y) = (x < y)" |
284 "1 < (b::'a::{ordered_semidom,recpower}) ==> (b ^ x < b ^ y) = (x < y)" |
288 by (blast intro: power_less_imp_less_exp power_strict_increasing) |
285 by (blast intro: power_less_imp_less_exp power_strict_increasing) |
289 |
286 |
290 lemma power_le_imp_le_base: |
287 lemma power_le_imp_le_base: |
291 assumes le: "a ^ Suc n \<le> b ^ Suc n" |
288 assumes le: "a ^ Suc n \<le> b ^ Suc n" |
292 and ynonneg: "(0::'a::{ordered_semidom,recpower}) \<le> b" |
289 and ynonneg: "(0::'a::{ordered_semidom,recpower}) \<le> b" |
293 shows "a \<le> b" |
290 shows "a \<le> b" |
294 proof (rule ccontr) |
291 proof (rule ccontr) |
295 assume "~ a \<le> b" |
292 assume "~ a \<le> b" |
296 then have "b < a" by (simp only: linorder_not_le) |
293 then have "b < a" by (simp only: linorder_not_le) |
297 then have "b ^ Suc n < a ^ Suc n" |
294 then have "b ^ Suc n < a ^ Suc n" |
298 by (simp only: prems power_strict_mono) |
295 by (simp only: prems power_strict_mono) |
299 from le and this show "False" |
296 from le and this show "False" |
300 by (simp add: linorder_not_less [symmetric]) |
297 by (simp add: linorder_not_less [symmetric]) |
301 qed |
298 qed |
302 |
299 |
303 lemma power_less_imp_less_base: |
300 lemma power_less_imp_less_base: |
304 fixes a b :: "'a::{ordered_semidom,recpower}" |
301 fixes a b :: "'a::{ordered_semidom,recpower}" |
305 assumes less: "a ^ n < b ^ n" |
302 assumes less: "a ^ n < b ^ n" |
306 assumes nonneg: "0 \<le> b" |
303 assumes nonneg: "0 \<le> b" |
343 by (induct n, simp_all add: power_Suc of_nat_mult) |
340 by (induct n, simp_all add: power_Suc of_nat_mult) |
344 |
341 |
345 lemma nat_one_le_power [simp]: "1 \<le> i ==> Suc 0 \<le> i^n" |
342 lemma nat_one_le_power [simp]: "1 \<le> i ==> Suc 0 \<le> i^n" |
346 by (insert one_le_power [of i n], simp) |
343 by (insert one_le_power [of i n], simp) |
347 |
344 |
348 lemma nat_zero_less_power_iff [simp]: "(0 < x^n) = (x \<noteq> (0::nat) | n=0)" |
345 lemma nat_zero_less_power_iff [simp]: "(x^n = 0) = (x = (0::nat) & n\<noteq>0)" |
349 by (induct "n", auto) |
346 by (induct "n", auto) |
350 |
347 |
351 text{*Valid for the naturals, but what if @{text"0<i<1"}? |
348 text{*Valid for the naturals, but what if @{text"0<i<1"}? |
352 Premises cannot be weakened: consider the case where @{term "i=0"}, |
349 Premises cannot be weakened: consider the case where @{term "i=0"}, |
353 @{term "m=1"} and @{term "n=0"}.*} |
350 @{term "m=1"} and @{term "n=0"}.*} |
391 val power_inject_exp = thm"power_inject_exp"; |
388 val power_inject_exp = thm"power_inject_exp"; |
392 val power_less_imp_less_exp = thm"power_less_imp_less_exp"; |
389 val power_less_imp_less_exp = thm"power_less_imp_less_exp"; |
393 val power_mono = thm"power_mono"; |
390 val power_mono = thm"power_mono"; |
394 val power_strict_mono = thm"power_strict_mono"; |
391 val power_strict_mono = thm"power_strict_mono"; |
395 val power_eq_0_iff = thm"power_eq_0_iff"; |
392 val power_eq_0_iff = thm"power_eq_0_iff"; |
396 val field_power_eq_0_iff = thm"field_power_eq_0_iff"; |
393 val field_power_eq_0_iff = thm"power_eq_0_iff"; |
397 val field_power_not_zero = thm"field_power_not_zero"; |
394 val field_power_not_zero = thm"field_power_not_zero"; |
398 val power_inverse = thm"power_inverse"; |
395 val power_inverse = thm"power_inverse"; |
399 val nonzero_power_divide = thm"nonzero_power_divide"; |
396 val nonzero_power_divide = thm"nonzero_power_divide"; |
400 val power_divide = thm"power_divide"; |
397 val power_divide = thm"power_divide"; |
401 val power_abs = thm"power_abs"; |
398 val power_abs = thm"power_abs"; |