src/HOL/Real/RealPow.thy
changeset 14334 6137d24eef79
parent 14304 cc0b4bbfbc43
child 14348 744c868ee0b7
equal deleted inserted replaced
14333:14f29eb097a3 14334:6137d24eef79
    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