26 apply (auto dest: realpow_not_zero) |
26 apply (auto dest: realpow_not_zero) |
27 done |
27 done |
28 |
28 |
29 lemma realpow_inverse: "inverse ((r::real) ^ n) = (inverse r) ^ n" |
29 lemma realpow_inverse: "inverse ((r::real) ^ n) = (inverse r) ^ n" |
30 apply (induct_tac "n") |
30 apply (induct_tac "n") |
31 apply (auto simp add: real_inverse_distrib) |
31 apply (auto simp add: inverse_mult_distrib) |
32 done |
32 done |
33 |
33 |
34 lemma realpow_abs: "abs(r ^ n) = abs(r::real) ^ n" |
34 lemma realpow_abs: "abs(r ^ n) = abs(r::real) ^ n" |
35 apply (induct_tac "n") |
35 apply (induct_tac "n") |
36 apply (auto simp add: abs_mult) |
36 apply (auto simp add: abs_mult) |
37 done |
37 done |
38 |
38 |
39 lemma realpow_add: "(r::real) ^ (n + m) = (r ^ n) * (r ^ m)" |
39 lemma realpow_add: "(r::real) ^ (n + m) = (r ^ n) * (r ^ m)" |
40 apply (induct_tac "n") |
40 apply (induct_tac "n") |
41 apply (auto simp add: real_mult_ac) |
41 apply (auto simp add: mult_ac) |
42 done |
42 done |
43 |
43 |
44 lemma realpow_one [simp]: "(r::real) ^ 1 = r" |
44 lemma realpow_one [simp]: "(r::real) ^ 1 = r" |
45 by simp |
45 by simp |
46 |
46 |
47 lemma realpow_two: "(r::real)^ (Suc (Suc 0)) = r * r" |
47 lemma realpow_two: "(r::real)^ (Suc (Suc 0)) = r * r" |
48 by simp |
48 by simp |
49 |
49 |
50 lemma realpow_gt_zero [rule_format]: "(0::real) < r --> 0 < r ^ n" |
50 lemma realpow_gt_zero [rule_format]: "(0::real) < r --> 0 < r ^ n" |
51 apply (induct_tac "n") |
51 apply (induct_tac "n") |
52 apply (auto intro: real_mult_order simp add: real_zero_less_one) |
52 apply (auto intro: real_mult_order simp add: zero_less_one) |
53 done |
53 done |
54 |
54 |
55 lemma realpow_ge_zero [rule_format]: "(0::real) \<le> r --> 0 \<le> r ^ n" |
55 lemma realpow_ge_zero [rule_format]: "(0::real) \<le> r --> 0 \<le> r ^ n" |
56 apply (induct_tac "n") |
56 apply (induct_tac "n") |
57 apply (auto simp add: real_0_le_mult_iff) |
57 apply (auto simp add: zero_le_mult_iff) |
58 done |
58 done |
59 |
59 |
60 lemma realpow_le [rule_format]: "(0::real) \<le> x & x \<le> y --> x ^ n \<le> y ^ n" |
60 lemma realpow_le [rule_format]: "(0::real) \<le> x & x \<le> y --> x ^ n \<le> y ^ n" |
61 apply (induct_tac "n") |
61 apply (induct_tac "n") |
62 apply (auto intro!: real_mult_le_mono) |
62 apply (auto intro!: mult_mono) |
63 apply (simp (no_asm_simp) add: realpow_ge_zero) |
63 apply (simp (no_asm_simp) add: realpow_ge_zero) |
64 done |
64 done |
65 |
65 |
66 lemma realpow_0_left [rule_format, simp]: |
66 lemma realpow_0_left [rule_format, simp]: |
67 "0 < n --> 0 ^ n = (0::real)" |
67 "0 < n --> 0 ^ n = (0::real)" |
88 apply (auto simp add: abs_mult) |
88 apply (auto simp add: abs_mult) |
89 done |
89 done |
90 |
90 |
91 lemma realpow_mult: "((r::real) * s) ^ n = (r ^ n) * (s ^ n)" |
91 lemma realpow_mult: "((r::real) * s) ^ n = (r ^ n) * (s ^ n)" |
92 apply (induct_tac "n") |
92 apply (induct_tac "n") |
93 apply (auto simp add: real_mult_ac) |
93 apply (auto simp add: mult_ac) |
94 done |
94 done |
95 |
95 |
96 lemma realpow_two_le [simp]: "(0::real) \<le> r^ Suc (Suc 0)" |
96 lemma realpow_two_le [simp]: "(0::real) \<le> r^ Suc (Suc 0)" |
97 by (simp add: real_le_square) |
97 by (simp add: real_le_square) |
98 |
98 |
104 |
104 |
105 lemma realpow_two_gt_one: "(1::real) < r ==> 1 < r^ (Suc (Suc 0))" |
105 lemma realpow_two_gt_one: "(1::real) < r ==> 1 < r^ (Suc (Suc 0))" |
106 apply auto |
106 apply auto |
107 apply (cut_tac real_zero_less_one) |
107 apply (cut_tac real_zero_less_one) |
108 apply (frule_tac x = 0 in order_less_trans, assumption) |
108 apply (frule_tac x = 0 in order_less_trans, assumption) |
109 apply (drule_tac z = r and x = 1 in real_mult_less_mono1) |
109 apply (frule_tac c = r and a = 1 in mult_strict_right_mono) |
110 apply (auto intro: order_less_trans) |
110 apply assumption; |
|
111 apply (simp add: ); |
111 done |
112 done |
112 |
113 |
113 lemma realpow_ge_one [rule_format]: "(1::real) < r --> 1 \<le> r ^ n" |
114 lemma realpow_ge_one [rule_format]: "(1::real) < r --> 1 \<le> r ^ n" |
114 apply (induct_tac "n", auto) |
115 apply (induct_tac "n", auto) |
115 apply (subgoal_tac "1*1 \<le> r * r^n") |
116 apply (subgoal_tac "1*1 \<le> r * r^n") |
116 apply (rule_tac [2] real_mult_le_mono, auto) |
117 apply (rule_tac [2] mult_mono, auto) |
117 done |
118 done |
118 |
119 |
119 lemma realpow_ge_one2: "(1::real) \<le> r ==> 1 \<le> r ^ n" |
120 lemma realpow_ge_one2: "(1::real) \<le> r ==> 1 \<le> r ^ n" |
120 apply (drule order_le_imp_less_or_eq) |
121 apply (drule order_le_imp_less_or_eq) |
121 apply (auto dest: realpow_ge_one) |
122 apply (auto dest: realpow_ge_one) |
168 lemma realpow_less_le [rule_format]: "0 \<le> r & r < (1::real) & n < N --> r ^ N \<le> r ^ n" |
169 lemma realpow_less_le [rule_format]: "0 \<le> r & r < (1::real) & n < N --> r ^ N \<le> r ^ n" |
169 apply (induct_tac "N") |
170 apply (induct_tac "N") |
170 apply (simp_all (no_asm_simp)) |
171 apply (simp_all (no_asm_simp)) |
171 apply clarify |
172 apply clarify |
172 apply (subgoal_tac "r * r ^ na \<le> 1 * r ^ n", simp) |
173 apply (subgoal_tac "r * r ^ na \<le> 1 * r ^ n", simp) |
173 apply (rule real_mult_le_mono) |
174 apply (rule mult_mono) |
174 apply (auto simp add: realpow_ge_zero less_Suc_eq) |
175 apply (auto simp add: realpow_ge_zero less_Suc_eq) |
175 done |
176 done |
176 |
177 |
177 lemma realpow_le_le: "[| 0 \<le> r; r < (1::real); n \<le> N |] ==> r ^ N \<le> r ^ n" |
178 lemma realpow_le_le: "[| 0 \<le> r; r < (1::real); n \<le> N |] ==> r ^ N \<le> r ^ n" |
178 apply (drule_tac n = N in le_imp_less_or_eq) |
179 apply (drule_tac n = N in le_imp_less_or_eq) |
235 lemma realpow_two_minus [simp]: "(-x)^Suc (Suc 0) = (x::real)^Suc (Suc 0)" |
236 lemma realpow_two_minus [simp]: "(-x)^Suc (Suc 0) = (x::real)^Suc (Suc 0)" |
236 by simp |
237 by simp |
237 |
238 |
238 lemma realpow_two_diff: "(x::real)^Suc (Suc 0) - y^Suc (Suc 0) = (x - y) * (x + y)" |
239 lemma realpow_two_diff: "(x::real)^Suc (Suc 0) - y^Suc (Suc 0) = (x - y) * (x + y)" |
239 apply (unfold real_diff_def) |
240 apply (unfold real_diff_def) |
240 apply (simp add: real_add_mult_distrib2 real_add_mult_distrib real_mult_ac) |
241 apply (simp add: right_distrib left_distrib mult_ac) |
241 done |
242 done |
242 |
243 |
243 lemma realpow_two_disj: "((x::real)^Suc (Suc 0) = y^Suc (Suc 0)) = (x = y | x = -y)" |
244 lemma realpow_two_disj: "((x::real)^Suc (Suc 0) = y^Suc (Suc 0)) = (x = y | x = -y)" |
244 apply (cut_tac x = x and y = y in realpow_two_diff) |
245 apply (cut_tac x = x and y = y in realpow_two_diff) |
245 apply (auto simp del: realpow_Suc) |
246 apply (auto simp del: realpow_Suc) |
246 done |
247 done |
247 |
248 |
248 (* used in Transc *) |
249 (* used in Transc *) |
249 lemma realpow_diff: "[|(x::real) \<noteq> 0; m \<le> n |] ==> x ^ (n - m) = x ^ n * inverse (x ^ m)" |
250 lemma realpow_diff: "[|(x::real) \<noteq> 0; m \<le> n |] ==> x ^ (n - m) = x ^ n * inverse (x ^ m)" |
250 by (auto simp add: le_eq_less_or_eq less_iff_Suc_add realpow_add realpow_not_zero real_mult_ac) |
251 by (auto simp add: le_eq_less_or_eq less_iff_Suc_add realpow_add realpow_not_zero mult_ac) |
251 |
252 |
252 lemma realpow_real_of_nat: "real (m::nat) ^ n = real (m ^ n)" |
253 lemma realpow_real_of_nat: "real (m::nat) ^ n = real (m ^ n)" |
253 apply (induct_tac "n") |
254 apply (induct_tac "n") |
254 apply (auto simp add: real_of_nat_one real_of_nat_mult) |
255 apply (auto simp add: real_of_nat_one real_of_nat_mult) |
255 done |
256 done |
256 |
257 |
257 lemma realpow_real_of_nat_two_pos [simp] : "0 < real (Suc (Suc 0) ^ n)" |
258 lemma realpow_real_of_nat_two_pos [simp] : "0 < real (Suc (Suc 0) ^ n)" |
258 apply (induct_tac "n") |
259 apply (induct_tac "n") |
259 apply (auto simp add: real_of_nat_mult real_0_less_mult_iff) |
260 apply (auto simp add: real_of_nat_mult zero_less_mult_iff) |
260 done |
261 done |
261 |
262 |
262 lemma realpow_increasing: |
263 lemma realpow_increasing: |
263 assumes xnonneg: "(0::real) \<le> x" |
264 assumes xnonneg: "(0::real) \<le> x" |
264 and ynonneg: "0 \<le> y" |
265 and ynonneg: "0 \<le> y" |
282 lemma realpow_eq_0_iff [simp]: "(x^n = 0) = (x = (0::real) & 0<n)" |
283 lemma realpow_eq_0_iff [simp]: "(x^n = 0) = (x = (0::real) & 0<n)" |
283 by (induct_tac "n", auto) |
284 by (induct_tac "n", auto) |
284 |
285 |
285 lemma zero_less_realpow_abs_iff [simp]: "(0 < (abs x)^n) = (x \<noteq> (0::real) | n=0)" |
286 lemma zero_less_realpow_abs_iff [simp]: "(0 < (abs x)^n) = (x \<noteq> (0::real) | n=0)" |
286 apply (induct_tac "n") |
287 apply (induct_tac "n") |
287 apply (auto simp add: real_0_less_mult_iff) |
288 apply (auto simp add: zero_less_mult_iff) |
288 done |
289 done |
289 |
290 |
290 lemma zero_le_realpow_abs [simp]: "(0::real) \<le> (abs x)^n" |
291 lemma zero_le_realpow_abs [simp]: "(0::real) \<le> (abs x)^n" |
291 apply (induct_tac "n") |
292 apply (induct_tac "n") |
292 apply (auto simp add: real_0_le_mult_iff) |
293 apply (auto simp add: zero_le_mult_iff) |
293 done |
294 done |
294 |
295 |
295 |
296 |
296 (*** Literal arithmetic involving powers, type real ***) |
297 (*** Literal arithmetic involving powers, type real ***) |
297 |
298 |
330 text{*Used several times in Hyperreal/Transcendental.ML*} |
331 text{*Used several times in Hyperreal/Transcendental.ML*} |
331 lemma real_sum_squares_cancel_a: "x * x = -(y * y) ==> x = (0::real) & y=0" |
332 lemma real_sum_squares_cancel_a: "x * x = -(y * y) ==> x = (0::real) & y=0" |
332 by (auto intro: real_sum_squares_cancel) |
333 by (auto intro: real_sum_squares_cancel) |
333 |
334 |
334 lemma real_squared_diff_one_factored: "x*x - (1::real) = (x + 1)*(x - 1)" |
335 lemma real_squared_diff_one_factored: "x*x - (1::real) = (x + 1)*(x - 1)" |
335 apply (auto simp add: real_add_mult_distrib real_add_mult_distrib2 real_diff_def) |
336 apply (auto simp add: left_distrib right_distrib real_diff_def) |
336 done |
337 done |
337 |
338 |
338 lemma real_mult_is_one: "(x*x = (1::real)) = (x = 1 | x = - 1)" |
339 lemma real_mult_is_one: "(x*x = (1::real)) = (x = 1 | x = - 1)" |
339 apply auto |
340 apply auto |
340 apply (drule right_minus_eq [THEN iffD2]) |
341 apply (drule right_minus_eq [THEN iffD2]) |
355 lemma real_mult_inverse_cancel: |
356 lemma real_mult_inverse_cancel: |
356 "[|(0::real) < x; 0 < x1; x1 * y < x * u |] |
357 "[|(0::real) < x; 0 < x1; x1 * y < x * u |] |
357 ==> inverse x * y < inverse x1 * u" |
358 ==> inverse x * y < inverse x1 * u" |
358 apply (rule_tac c=x in mult_less_imp_less_left) |
359 apply (rule_tac c=x in mult_less_imp_less_left) |
359 apply (auto simp add: real_mult_assoc [symmetric]) |
360 apply (auto simp add: real_mult_assoc [symmetric]) |
360 apply (simp (no_asm) add: real_mult_ac) |
361 apply (simp (no_asm) add: mult_ac) |
361 apply (rule_tac c=x1 in mult_less_imp_less_right) |
362 apply (rule_tac c=x1 in mult_less_imp_less_right) |
362 apply (auto simp add: real_mult_ac) |
363 apply (auto simp add: mult_ac) |
363 done |
364 done |
364 |
365 |
365 text{*Used once: in Hyperreal/Transcendental.ML*} |
366 text{*Used once: in Hyperreal/Transcendental.ML*} |
366 lemma real_mult_inverse_cancel2: "[|(0::real) < x;0 < x1; x1 * y < x * u |] ==> y * inverse x < u * inverse x1" |
367 lemma real_mult_inverse_cancel2: "[|(0::real) < x;0 < x1; x1 * y < x * u |] ==> y * inverse x < u * inverse x1" |
367 apply (auto dest: real_mult_inverse_cancel simp add: real_mult_ac) |
368 apply (auto dest: real_mult_inverse_cancel simp add: mult_ac) |
368 done |
369 done |
369 |
370 |
370 lemma inverse_real_of_nat_gt_zero: "0 < inverse (real (Suc n))" |
371 lemma inverse_real_of_nat_gt_zero: "0 < inverse (real (Suc n))" |
371 apply auto |
372 apply auto |
372 done |
373 done |
401 apply (auto simp add: realpow_mult realpow_inverse) |
402 apply (auto simp add: realpow_mult realpow_inverse) |
402 done |
403 done |
403 |
404 |
404 lemma realpow_ge_zero2 [rule_format (no_asm)]: "(0::real) \<le> r --> 0 \<le> r ^ n" |
405 lemma realpow_ge_zero2 [rule_format (no_asm)]: "(0::real) \<le> r --> 0 \<le> r ^ n" |
405 apply (induct_tac "n") |
406 apply (induct_tac "n") |
406 apply (auto simp add: real_0_le_mult_iff) |
407 apply (auto simp add: zero_le_mult_iff) |
407 done |
408 done |
408 |
409 |
409 lemma realpow_le2 [rule_format (no_asm)]: "(0::real) \<le> x & x \<le> y --> x ^ n \<le> y ^ n" |
410 lemma realpow_le2 [rule_format (no_asm)]: "(0::real) \<le> x & x \<le> y --> x ^ n \<le> y ^ n" |
410 apply (induct_tac "n") |
411 apply (induct_tac "n") |
411 apply (auto intro!: real_mult_le_mono simp add: realpow_ge_zero2) |
412 apply (auto intro!: mult_mono simp add: realpow_ge_zero2) |
412 done |
413 done |
413 |
414 |
414 lemma realpow_Suc_gt_one: "(1::real) < r ==> 1 < r ^ (Suc n)" |
415 lemma realpow_Suc_gt_one: "(1::real) < r ==> 1 < r ^ (Suc n)" |
415 apply (frule_tac n = "n" in realpow_ge_one) |
416 apply (frule_tac n = "n" in realpow_ge_one) |
416 apply (drule real_le_imp_less_or_eq, safe) |
417 apply (drule real_le_imp_less_or_eq, safe) |
417 apply (frule real_zero_less_one [THEN real_less_trans]) |
418 apply (frule zero_less_one [THEN real_less_trans]) |
418 apply (drule_tac y = "r ^ n" in real_mult_less_mono2) |
419 apply (drule_tac y = "r ^ n" in real_mult_less_mono2) |
419 apply assumption |
420 apply assumption |
420 apply (auto dest: real_less_trans) |
421 apply (auto dest: real_less_trans) |
421 done |
422 done |
422 |
423 |