| author | wenzelm | 
| Thu, 15 Oct 2015 22:25:57 +0200 | |
| changeset 61456 | b521b8b400f7 | 
| parent 61235 | 37862ccec075 | 
| child 61518 | ff12606337e9 | 
| permissions | -rw-r--r-- | 
| 56215 | 1 | (* Author: John Harrison, Marco Maggesi, Graziano Gentili, Gianni Ciolli, Valentina Bruno | 
| 2 | Ported from "hol_light/Multivariate/canal.ml" by L C Paulson (2014) | |
| 3 | *) | |
| 4 | ||
| 60420 | 5 | section \<open>Complex Analysis Basics\<close> | 
| 56215 | 6 | |
| 7 | theory Complex_Analysis_Basics | |
| 8 | imports "~~/src/HOL/Multivariate_Analysis/Cartesian_Euclidean_Space" | |
| 9 | begin | |
| 10 | ||
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 11 | |
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 12 | lemma cmod_fact [simp]: "cmod (fact n) = fact n" | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 13 | by (metis norm_of_nat of_nat_fact) | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 14 | |
| 60420 | 15 | subsection\<open>General lemmas\<close> | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 16 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 17 | lemma has_derivative_mult_right: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 18 | fixes c:: "'a :: real_normed_algebra" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 19 | shows "((op * c) has_derivative (op * c)) F" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 20 | by (rule has_derivative_mult_right [OF has_derivative_id]) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 21 | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 22 | lemma has_derivative_of_real[derivative_intros, simp]: | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 23 | "(f has_derivative f') F \<Longrightarrow> ((\<lambda>x. of_real (f x)) has_derivative (\<lambda>x. of_real (f' x))) F" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 24 | using bounded_linear.has_derivative[OF bounded_linear_of_real] . | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 25 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 26 | lemma has_vector_derivative_real_complex: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 27 | "DERIV f (of_real a) :> f' \<Longrightarrow> ((\<lambda>x. f (of_real x)) has_vector_derivative f') (at a)" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 28 | using has_derivative_compose[of of_real of_real a UNIV f "op * f'"] | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 29 | by (simp add: scaleR_conv_of_real ac_simps has_vector_derivative_def has_field_derivative_def) | 
| 56215 | 30 | |
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 31 | lemma fact_cancel: | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 32 | fixes c :: "'a::real_field" | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 33 | shows "of_nat (Suc n) * c / (fact (Suc n)) = c / (fact n)" | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 34 | by (simp add: of_nat_mult del: of_nat_Suc times_nat.simps) | 
| 56889 
48a745e1bde7
avoid the Complex constructor, use the more natural Re/Im view; moved csqrt to Complex.
 hoelzl parents: 
56479diff
changeset | 35 | |
| 56215 | 36 | lemma linear_times: | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 37 | fixes c::"'a::real_algebra" shows "linear (\<lambda>x. c * x)" | 
| 56215 | 38 | by (auto simp: linearI distrib_left) | 
| 39 | ||
| 40 | lemma bilinear_times: | |
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 41 | fixes c::"'a::real_algebra" shows "bilinear (\<lambda>x y::'a. x*y)" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 42 | by (auto simp: bilinear_def distrib_left distrib_right intro!: linearI) | 
| 56215 | 43 | |
| 44 | lemma linear_cnj: "linear cnj" | |
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 45 | using bounded_linear.linear[OF bounded_linear_cnj] . | 
| 56215 | 46 | |
| 47 | lemma tendsto_mult_left: | |
| 48 | fixes c::"'a::real_normed_algebra" | |
| 49 | shows "(f ---> l) F \<Longrightarrow> ((\<lambda>x. c * (f x)) ---> c * l) F" | |
| 50 | by (rule tendsto_mult [OF tendsto_const]) | |
| 51 | ||
| 52 | lemma tendsto_mult_right: | |
| 53 | fixes c::"'a::real_normed_algebra" | |
| 54 | shows "(f ---> l) F \<Longrightarrow> ((\<lambda>x. (f x) * c) ---> l * c) F" | |
| 55 | by (rule tendsto_mult [OF _ tendsto_const]) | |
| 56 | ||
| 57 | lemma tendsto_Re_upper: | |
| 58 | assumes "~ (trivial_limit F)" | |
| 59 | "(f ---> l) F" | |
| 60 | "eventually (\<lambda>x. Re(f x) \<le> b) F" | |
| 61 | shows "Re(l) \<le> b" | |
| 62 | by (metis assms tendsto_le [OF _ tendsto_const] tendsto_Re) | |
| 63 | ||
| 64 | lemma tendsto_Re_lower: | |
| 65 | assumes "~ (trivial_limit F)" | |
| 66 | "(f ---> l) F" | |
| 67 | "eventually (\<lambda>x. b \<le> Re(f x)) F" | |
| 68 | shows "b \<le> Re(l)" | |
| 69 | by (metis assms tendsto_le [OF _ _ tendsto_const] tendsto_Re) | |
| 70 | ||
| 71 | lemma tendsto_Im_upper: | |
| 72 | assumes "~ (trivial_limit F)" | |
| 73 | "(f ---> l) F" | |
| 74 | "eventually (\<lambda>x. Im(f x) \<le> b) F" | |
| 75 | shows "Im(l) \<le> b" | |
| 76 | by (metis assms tendsto_le [OF _ tendsto_const] tendsto_Im) | |
| 77 | ||
| 78 | lemma tendsto_Im_lower: | |
| 79 | assumes "~ (trivial_limit F)" | |
| 80 | "(f ---> l) F" | |
| 81 | "eventually (\<lambda>x. b \<le> Im(f x)) F" | |
| 82 | shows "b \<le> Im(l)" | |
| 83 | by (metis assms tendsto_le [OF _ _ tendsto_const] tendsto_Im) | |
| 84 | ||
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 85 | lemma lambda_zero: "(\<lambda>h::'a::mult_zero. 0) = op * 0" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 86 | by auto | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 87 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 88 | lemma lambda_one: "(\<lambda>x::'a::monoid_mult. x) = op * 1" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 89 | by auto | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 90 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 91 | lemma has_real_derivative: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 92 | fixes f :: "real \<Rightarrow> real" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 93 | assumes "(f has_derivative f') F" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 94 | obtains c where "(f has_real_derivative c) F" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 95 | proof - | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 96 | obtain c where "f' = (\<lambda>x. x * c)" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 97 | by (metis assms has_derivative_bounded_linear real_bounded_linear) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 98 | then show ?thesis | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 99 | by (metis assms that has_field_derivative_def mult_commute_abs) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 100 | qed | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 101 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 102 | lemma has_real_derivative_iff: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 103 | fixes f :: "real \<Rightarrow> real" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 104 | shows "(\<exists>c. (f has_real_derivative c) F) = (\<exists>D. (f has_derivative D) F)" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 105 | by (metis has_field_derivative_def has_real_derivative) | 
| 56215 | 106 | |
| 107 | lemma continuous_mult_left: | |
| 108 | fixes c::"'a::real_normed_algebra" | |
| 109 | shows "continuous F f \<Longrightarrow> continuous F (\<lambda>x. c * f x)" | |
| 110 | by (rule continuous_mult [OF continuous_const]) | |
| 111 | ||
| 112 | lemma continuous_mult_right: | |
| 113 | fixes c::"'a::real_normed_algebra" | |
| 114 | shows "continuous F f \<Longrightarrow> continuous F (\<lambda>x. f x * c)" | |
| 115 | by (rule continuous_mult [OF _ continuous_const]) | |
| 116 | ||
| 117 | lemma continuous_on_mult_left: | |
| 118 | fixes c::"'a::real_normed_algebra" | |
| 119 | shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. c * f x)" | |
| 120 | by (rule continuous_on_mult [OF continuous_on_const]) | |
| 121 | ||
| 122 | lemma continuous_on_mult_right: | |
| 123 | fixes c::"'a::real_normed_algebra" | |
| 124 | shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. f x * c)" | |
| 125 | by (rule continuous_on_mult [OF _ continuous_on_const]) | |
| 126 | ||
| 56371 
fb9ae0727548
extend continuous_intros; remove continuous_on_intros and isCont_intros
 hoelzl parents: 
56370diff
changeset | 127 | lemma uniformly_continuous_on_cmul_right [continuous_intros]: | 
| 56215 | 128 | fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_algebra" | 
| 56332 | 129 | shows "uniformly_continuous_on s f \<Longrightarrow> uniformly_continuous_on s (\<lambda>x. f x * c)" | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 130 | using bounded_linear.uniformly_continuous_on[OF bounded_linear_mult_left] . | 
| 56215 | 131 | |
| 56371 
fb9ae0727548
extend continuous_intros; remove continuous_on_intros and isCont_intros
 hoelzl parents: 
56370diff
changeset | 132 | lemma uniformly_continuous_on_cmul_left[continuous_intros]: | 
| 56215 | 133 | fixes f :: "'a::real_normed_vector \<Rightarrow> 'b::real_normed_algebra" | 
| 134 | assumes "uniformly_continuous_on s f" | |
| 135 | shows "uniformly_continuous_on s (\<lambda>x. c * f x)" | |
| 136 | by (metis assms bounded_linear.uniformly_continuous_on bounded_linear_mult_right) | |
| 137 | ||
| 138 | lemma continuous_within_norm_id [continuous_intros]: "continuous (at x within S) norm" | |
| 139 | by (rule continuous_norm [OF continuous_ident]) | |
| 140 | ||
| 141 | lemma continuous_on_norm_id [continuous_intros]: "continuous_on S norm" | |
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 142 | by (intro continuous_on_id continuous_on_norm) | 
| 56215 | 143 | |
| 60420 | 144 | subsection\<open>DERIV stuff\<close> | 
| 56215 | 145 | |
| 146 | lemma DERIV_zero_connected_constant: | |
| 147 |   fixes f :: "'a::{real_normed_field,euclidean_space} \<Rightarrow> 'a"
 | |
| 148 | assumes "connected s" | |
| 149 | and "open s" | |
| 150 | and "finite k" | |
| 151 | and "continuous_on s f" | |
| 152 | and "\<forall>x\<in>(s - k). DERIV f x :> 0" | |
| 153 | obtains c where "\<And>x. x \<in> s \<Longrightarrow> f(x) = c" | |
| 154 | using has_derivative_zero_connected_constant [OF assms(1-4)] assms | |
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 155 | by (metis DERIV_const has_derivative_const Diff_iff at_within_open frechet_derivative_at has_field_derivative_def) | 
| 56215 | 156 | |
| 157 | lemma DERIV_zero_constant: | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 158 |   fixes f :: "'a::{real_normed_field, real_inner} \<Rightarrow> 'a"
 | 
| 56215 | 159 | shows "\<lbrakk>convex s; | 
| 160 | \<And>x. x\<in>s \<Longrightarrow> (f has_field_derivative 0) (at x within s)\<rbrakk> | |
| 161 | \<Longrightarrow> \<exists>c. \<forall>x \<in> s. f(x) = c" | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 162 | by (auto simp: has_field_derivative_def lambda_zero intro: has_derivative_zero_constant) | 
| 56215 | 163 | |
| 164 | lemma DERIV_zero_unique: | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 165 |   fixes f :: "'a::{real_normed_field, real_inner} \<Rightarrow> 'a"
 | 
| 56215 | 166 | assumes "convex s" | 
| 167 | and d0: "\<And>x. x\<in>s \<Longrightarrow> (f has_field_derivative 0) (at x within s)" | |
| 168 | and "a \<in> s" | |
| 169 | and "x \<in> s" | |
| 170 | shows "f x = f a" | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 171 | by (rule has_derivative_zero_unique [OF assms(1) _ assms(4,3)]) | 
| 56332 | 172 | (metis d0 has_field_derivative_imp_has_derivative lambda_zero) | 
| 56215 | 173 | |
| 174 | lemma DERIV_zero_connected_unique: | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 175 |   fixes f :: "'a::{real_normed_field, real_inner} \<Rightarrow> 'a"
 | 
| 56215 | 176 | assumes "connected s" | 
| 177 | and "open s" | |
| 178 | and d0: "\<And>x. x\<in>s \<Longrightarrow> DERIV f x :> 0" | |
| 179 | and "a \<in> s" | |
| 180 | and "x \<in> s" | |
| 181 | shows "f x = f a" | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 182 | by (rule has_derivative_zero_unique_connected [OF assms(2,1) _ assms(5,4)]) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 183 | (metis has_field_derivative_def lambda_zero d0) | 
| 56215 | 184 | |
| 185 | lemma DERIV_transform_within: | |
| 186 | assumes "(f has_field_derivative f') (at a within s)" | |
| 187 | and "0 < d" "a \<in> s" | |
| 188 | and "\<And>x. x\<in>s \<Longrightarrow> dist x a < d \<Longrightarrow> f x = g x" | |
| 189 | shows "(g has_field_derivative f') (at a within s)" | |
| 190 | using assms unfolding has_field_derivative_def | |
| 56332 | 191 | by (blast intro: has_derivative_transform_within) | 
| 56215 | 192 | |
| 193 | lemma DERIV_transform_within_open: | |
| 194 | assumes "DERIV f a :> f'" | |
| 195 | and "open s" "a \<in> s" | |
| 196 | and "\<And>x. x\<in>s \<Longrightarrow> f x = g x" | |
| 197 | shows "DERIV g a :> f'" | |
| 198 | using assms unfolding has_field_derivative_def | |
| 199 | by (metis has_derivative_transform_within_open) | |
| 200 | ||
| 201 | lemma DERIV_transform_at: | |
| 202 | assumes "DERIV f a :> f'" | |
| 203 | and "0 < d" | |
| 204 | and "\<And>x. dist x a < d \<Longrightarrow> f x = g x" | |
| 205 | shows "DERIV g a :> f'" | |
| 206 | by (blast intro: assms DERIV_transform_within) | |
| 207 | ||
| 59615 
fdfdf89a83a6
A few new lemmas and a bit of tidying up
 paulson <lp15@cam.ac.uk> parents: 
59554diff
changeset | 208 | (*generalising DERIV_isconst_all, which requires type real (using the ordering)*) | 
| 
fdfdf89a83a6
A few new lemmas and a bit of tidying up
 paulson <lp15@cam.ac.uk> parents: 
59554diff
changeset | 209 | lemma DERIV_zero_UNIV_unique: | 
| 
fdfdf89a83a6
A few new lemmas and a bit of tidying up
 paulson <lp15@cam.ac.uk> parents: 
59554diff
changeset | 210 |   fixes f :: "'a::{real_normed_field, real_inner} \<Rightarrow> 'a"
 | 
| 
fdfdf89a83a6
A few new lemmas and a bit of tidying up
 paulson <lp15@cam.ac.uk> parents: 
59554diff
changeset | 211 | shows "(\<And>x. DERIV f x :> 0) \<Longrightarrow> f x = f a" | 
| 
fdfdf89a83a6
A few new lemmas and a bit of tidying up
 paulson <lp15@cam.ac.uk> parents: 
59554diff
changeset | 212 | by (metis DERIV_zero_unique UNIV_I assms convex_UNIV) | 
| 
fdfdf89a83a6
A few new lemmas and a bit of tidying up
 paulson <lp15@cam.ac.uk> parents: 
59554diff
changeset | 213 | |
| 60420 | 214 | subsection \<open>Some limit theorems about real part of real series etc.\<close> | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 215 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 216 | (*MOVE? But not to Finite_Cartesian_Product*) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 217 | lemma sums_vec_nth : | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 218 | assumes "f sums a" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 219 | shows "(\<lambda>x. f x $ i) sums a $ i" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 220 | using assms unfolding sums_def | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 221 | by (auto dest: tendsto_vec_nth [where i=i]) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 222 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 223 | lemma summable_vec_nth : | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 224 | assumes "summable f" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 225 | shows "summable (\<lambda>x. f x $ i)" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 226 | using assms unfolding summable_def | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 227 | by (blast intro: sums_vec_nth) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 228 | |
| 60420 | 229 | subsection \<open>Complex number lemmas\<close> | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 230 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 231 | lemma | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 232 |   shows open_halfspace_Re_lt: "open {z. Re(z) < b}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 233 |     and open_halfspace_Re_gt: "open {z. Re(z) > b}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 234 |     and closed_halfspace_Re_ge: "closed {z. Re(z) \<ge> b}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 235 |     and closed_halfspace_Re_le: "closed {z. Re(z) \<le> b}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 236 |     and closed_halfspace_Re_eq: "closed {z. Re(z) = b}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 237 |     and open_halfspace_Im_lt: "open {z. Im(z) < b}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 238 |     and open_halfspace_Im_gt: "open {z. Im(z) > b}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 239 |     and closed_halfspace_Im_ge: "closed {z. Im(z) \<ge> b}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 240 |     and closed_halfspace_Im_le: "closed {z. Im(z) \<le> b}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 241 |     and closed_halfspace_Im_eq: "closed {z. Im(z) = b}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 242 | by (intro open_Collect_less closed_Collect_le closed_Collect_eq isCont_Re | 
| 60150 
bd773c47ad0b
New material about complex transcendental functions (especially Ln, Arg) and polynomials
 paulson <lp15@cam.ac.uk> parents: 
60017diff
changeset | 243 | isCont_Im continuous_ident continuous_const)+ | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 244 | |
| 61070 | 245 | lemma closed_complex_Reals: "closed (\<real> :: complex set)" | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 246 | proof - | 
| 61070 | 247 |   have "(\<real> :: complex set) = {z. Im z = 0}"
 | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 248 | by (auto simp: complex_is_Real_iff) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 249 | then show ?thesis | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 250 | by (metis closed_halfspace_Im_eq) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 251 | qed | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 252 | |
| 60017 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 253 | lemma closed_Real_halfspace_Re_le: "closed (\<real> \<inter> {w. Re w \<le> x})"
 | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 254 | by (simp add: closed_Int closed_complex_Reals closed_halfspace_Re_le) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 255 | |
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 256 | lemma closed_Real_halfspace_Re_ge: "closed (\<real> \<inter> {w. x \<le> Re(w)})"
 | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 257 | using closed_halfspace_Re_ge | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 258 | by (simp add: closed_Int closed_complex_Reals) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 259 | |
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 260 | lemma closed_real_abs_le: "closed {w \<in> \<real>. \<bar>Re w\<bar> \<le> r}"
 | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 261 | proof - | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 262 |   have "{w \<in> \<real>. \<bar>Re w\<bar> \<le> r} = (\<real> \<inter> {w. Re w \<le> r}) \<inter> (\<real> \<inter> {w. Re w \<ge> -r})"
 | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 263 | by auto | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 264 |   then show "closed {w \<in> \<real>. \<bar>Re w\<bar> \<le> r}"
 | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 265 | by (simp add: closed_Int closed_Real_halfspace_Re_ge closed_Real_halfspace_Re_le) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 266 | qed | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 267 | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 268 | lemma real_lim: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 269 | fixes l::complex | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 270 | assumes "(f ---> l) F" and "~(trivial_limit F)" and "eventually P F" and "\<And>a. P a \<Longrightarrow> f a \<in> \<real>" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 271 | shows "l \<in> \<real>" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 272 | proof (rule Lim_in_closed_set[OF closed_complex_Reals _ assms(2,1)]) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 273 | show "eventually (\<lambda>x. f x \<in> \<real>) F" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 274 | using assms(3, 4) by (auto intro: eventually_mono) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 275 | qed | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 276 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 277 | lemma real_lim_sequentially: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 278 | fixes l::complex | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 279 | shows "(f ---> l) sequentially \<Longrightarrow> (\<exists>N. \<forall>n\<ge>N. f n \<in> \<real>) \<Longrightarrow> l \<in> \<real>" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 280 | by (rule real_lim [where F=sequentially]) (auto simp: eventually_sequentially) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 281 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 282 | lemma real_series: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 283 | fixes l::complex | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 284 | shows "f sums l \<Longrightarrow> (\<And>n. f n \<in> \<real>) \<Longrightarrow> l \<in> \<real>" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 285 | unfolding sums_def | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 286 | by (metis real_lim_sequentially setsum_in_Reals) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 287 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 288 | lemma Lim_null_comparison_Re: | 
| 56889 
48a745e1bde7
avoid the Complex constructor, use the more natural Re/Im view; moved csqrt to Complex.
 hoelzl parents: 
56479diff
changeset | 289 | assumes "eventually (\<lambda>x. norm(f x) \<le> Re(g x)) F" "(g ---> 0) F" shows "(f ---> 0) F" | 
| 
48a745e1bde7
avoid the Complex constructor, use the more natural Re/Im view; moved csqrt to Complex.
 hoelzl parents: 
56479diff
changeset | 290 | by (rule Lim_null_comparison[OF assms(1)] tendsto_eq_intros assms(2))+ simp | 
| 56215 | 291 | |
| 60420 | 292 | subsection\<open>Holomorphic functions\<close> | 
| 56215 | 293 | |
| 294 | definition complex_differentiable :: "[complex \<Rightarrow> complex, complex filter] \<Rightarrow> bool" | |
| 295 | (infixr "(complex'_differentiable)" 50) | |
| 296 | where "f complex_differentiable F \<equiv> \<exists>f'. (f has_field_derivative f') F" | |
| 297 | ||
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 298 | lemma complex_differentiable_imp_continuous_at: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 299 | "f complex_differentiable (at x within s) \<Longrightarrow> continuous (at x within s) f" | 
| 56215 | 300 | by (metis DERIV_continuous complex_differentiable_def) | 
| 301 | ||
| 302 | lemma complex_differentiable_within_subset: | |
| 303 | "\<lbrakk>f complex_differentiable (at x within s); t \<subseteq> s\<rbrakk> | |
| 304 | \<Longrightarrow> f complex_differentiable (at x within t)" | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 305 | by (metis DERIV_subset complex_differentiable_def) | 
| 56215 | 306 | |
| 307 | lemma complex_differentiable_at_within: | |
| 308 | "\<lbrakk>f complex_differentiable (at x)\<rbrakk> | |
| 309 | \<Longrightarrow> f complex_differentiable (at x within s)" | |
| 310 | unfolding complex_differentiable_def | |
| 311 | by (metis DERIV_subset top_greatest) | |
| 312 | ||
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 313 | lemma complex_differentiable_linear: "(op * c) complex_differentiable F" | 
| 56215 | 314 | proof - | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 315 | show ?thesis | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 316 | unfolding complex_differentiable_def has_field_derivative_def mult_commute_abs | 
| 56215 | 317 | by (force intro: has_derivative_mult_right) | 
| 318 | qed | |
| 319 | ||
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 320 | lemma complex_differentiable_const: "(\<lambda>z. c) complex_differentiable F" | 
| 56215 | 321 | unfolding complex_differentiable_def has_field_derivative_def | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 322 | by (rule exI [where x=0]) | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 323 | (metis has_derivative_const lambda_zero) | 
| 56215 | 324 | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 325 | lemma complex_differentiable_ident: "(\<lambda>z. z) complex_differentiable F" | 
| 56215 | 326 | unfolding complex_differentiable_def has_field_derivative_def | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 327 | by (rule exI [where x=1]) | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 328 | (simp add: lambda_one [symmetric]) | 
| 56215 | 329 | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 330 | lemma complex_differentiable_id: "id complex_differentiable F" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 331 | unfolding id_def by (rule complex_differentiable_ident) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 332 | |
| 56215 | 333 | lemma complex_differentiable_minus: | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 334 | "f complex_differentiable F \<Longrightarrow> (\<lambda>z. - (f z)) complex_differentiable F" | 
| 56215 | 335 | using assms unfolding complex_differentiable_def | 
| 336 | by (metis field_differentiable_minus) | |
| 337 | ||
| 338 | lemma complex_differentiable_add: | |
| 339 | assumes "f complex_differentiable F" "g complex_differentiable F" | |
| 340 | shows "(\<lambda>z. f z + g z) complex_differentiable F" | |
| 341 | using assms unfolding complex_differentiable_def | |
| 342 | by (metis field_differentiable_add) | |
| 343 | ||
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 344 | lemma complex_differentiable_setsum: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 345 | "(\<And>i. i \<in> I \<Longrightarrow> (f i) complex_differentiable F) \<Longrightarrow> (\<lambda>z. \<Sum>i\<in>I. f i z) complex_differentiable F" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 346 | by (induct I rule: infinite_finite_induct) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 347 | (auto intro: complex_differentiable_add complex_differentiable_const) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 348 | |
| 56215 | 349 | lemma complex_differentiable_diff: | 
| 350 | assumes "f complex_differentiable F" "g complex_differentiable F" | |
| 351 | shows "(\<lambda>z. f z - g z) complex_differentiable F" | |
| 352 | using assms unfolding complex_differentiable_def | |
| 353 | by (metis field_differentiable_diff) | |
| 354 | ||
| 355 | lemma complex_differentiable_inverse: | |
| 356 | assumes "f complex_differentiable (at a within s)" "f a \<noteq> 0" | |
| 357 | shows "(\<lambda>z. inverse (f z)) complex_differentiable (at a within s)" | |
| 358 | using assms unfolding complex_differentiable_def | |
| 359 | by (metis DERIV_inverse_fun) | |
| 360 | ||
| 361 | lemma complex_differentiable_mult: | |
| 362 | assumes "f complex_differentiable (at a within s)" | |
| 363 | "g complex_differentiable (at a within s)" | |
| 364 | shows "(\<lambda>z. f z * g z) complex_differentiable (at a within s)" | |
| 365 | using assms unfolding complex_differentiable_def | |
| 366 | by (metis DERIV_mult [of f _ a s g]) | |
| 367 | ||
| 368 | lemma complex_differentiable_divide: | |
| 369 | assumes "f complex_differentiable (at a within s)" | |
| 370 | "g complex_differentiable (at a within s)" | |
| 371 | "g a \<noteq> 0" | |
| 372 | shows "(\<lambda>z. f z / g z) complex_differentiable (at a within s)" | |
| 373 | using assms unfolding complex_differentiable_def | |
| 374 | by (metis DERIV_divide [of f _ a s g]) | |
| 375 | ||
| 376 | lemma complex_differentiable_power: | |
| 377 | assumes "f complex_differentiable (at a within s)" | |
| 378 | shows "(\<lambda>z. f z ^ n) complex_differentiable (at a within s)" | |
| 379 | using assms unfolding complex_differentiable_def | |
| 380 | by (metis DERIV_power) | |
| 381 | ||
| 382 | lemma complex_differentiable_transform_within: | |
| 383 | "0 < d \<Longrightarrow> | |
| 384 | x \<in> s \<Longrightarrow> | |
| 385 | (\<And>x'. x' \<in> s \<Longrightarrow> dist x' x < d \<Longrightarrow> f x' = g x') \<Longrightarrow> | |
| 386 | f complex_differentiable (at x within s) | |
| 387 | \<Longrightarrow> g complex_differentiable (at x within s)" | |
| 388 | unfolding complex_differentiable_def has_field_derivative_def | |
| 389 | by (blast intro: has_derivative_transform_within) | |
| 390 | ||
| 391 | lemma complex_differentiable_compose_within: | |
| 392 | assumes "f complex_differentiable (at a within s)" | |
| 393 | "g complex_differentiable (at (f a) within f`s)" | |
| 394 | shows "(g o f) complex_differentiable (at a within s)" | |
| 395 | using assms unfolding complex_differentiable_def | |
| 396 | by (metis DERIV_image_chain) | |
| 397 | ||
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 398 | lemma complex_differentiable_compose: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 399 | "f complex_differentiable at z \<Longrightarrow> g complex_differentiable at (f z) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 400 | \<Longrightarrow> (g o f) complex_differentiable at z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 401 | by (metis complex_differentiable_at_within complex_differentiable_compose_within) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 402 | |
| 56215 | 403 | lemma complex_differentiable_within_open: | 
| 404 | "\<lbrakk>a \<in> s; open s\<rbrakk> \<Longrightarrow> f complex_differentiable at a within s \<longleftrightarrow> | |
| 405 | f complex_differentiable at a" | |
| 406 | unfolding complex_differentiable_def | |
| 407 | by (metis at_within_open) | |
| 408 | ||
| 60420 | 409 | subsection\<open>Caratheodory characterization.\<close> | 
| 56215 | 410 | |
| 411 | lemma complex_differentiable_caratheodory_at: | |
| 412 | "f complex_differentiable (at z) \<longleftrightarrow> | |
| 413 | (\<exists>g. (\<forall>w. f(w) - f(z) = g(w) * (w - z)) \<and> continuous (at z) g)" | |
| 414 | using CARAT_DERIV [of f] | |
| 415 | by (simp add: complex_differentiable_def has_field_derivative_def) | |
| 416 | ||
| 417 | lemma complex_differentiable_caratheodory_within: | |
| 418 | "f complex_differentiable (at z within s) \<longleftrightarrow> | |
| 419 | (\<exists>g. (\<forall>w. f(w) - f(z) = g(w) * (w - z)) \<and> continuous (at z within s) g)" | |
| 420 | using DERIV_caratheodory_within [of f] | |
| 421 | by (simp add: complex_differentiable_def has_field_derivative_def) | |
| 422 | ||
| 60420 | 423 | subsection\<open>Holomorphic\<close> | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 424 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 425 | definition holomorphic_on :: "[complex \<Rightarrow> complex, complex set] \<Rightarrow> bool" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 426 | (infixl "(holomorphic'_on)" 50) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 427 | where "f holomorphic_on s \<equiv> \<forall>x\<in>s. f complex_differentiable (at x within s)" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 428 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 429 | lemma holomorphic_on_empty: "f holomorphic_on {}"
 | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 430 | by (simp add: holomorphic_on_def) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 431 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 432 | lemma holomorphic_on_open: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 433 | "open s \<Longrightarrow> f holomorphic_on s \<longleftrightarrow> (\<forall>x \<in> s. \<exists>f'. DERIV f x :> f')" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 434 | by (auto simp: holomorphic_on_def complex_differentiable_def has_field_derivative_def at_within_open [of _ s]) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 435 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 436 | lemma holomorphic_on_imp_continuous_on: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 437 | "f holomorphic_on s \<Longrightarrow> continuous_on s f" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 438 | by (metis complex_differentiable_imp_continuous_at continuous_on_eq_continuous_within holomorphic_on_def) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 439 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 440 | lemma holomorphic_on_subset: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 441 | "f holomorphic_on s \<Longrightarrow> t \<subseteq> s \<Longrightarrow> f holomorphic_on t" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 442 | unfolding holomorphic_on_def | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 443 | by (metis complex_differentiable_within_subset subsetD) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 444 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 445 | lemma holomorphic_transform: "\<lbrakk>f holomorphic_on s; \<And>x. x \<in> s \<Longrightarrow> f x = g x\<rbrakk> \<Longrightarrow> g holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 446 | by (metis complex_differentiable_transform_within linordered_field_no_ub holomorphic_on_def) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 447 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 448 | lemma holomorphic_cong: "s = t ==> (\<And>x. x \<in> s \<Longrightarrow> f x = g x) \<Longrightarrow> f holomorphic_on s \<longleftrightarrow> g holomorphic_on t" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 449 | by (metis holomorphic_transform) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 450 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 451 | lemma holomorphic_on_linear: "(op * c) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 452 | unfolding holomorphic_on_def by (metis complex_differentiable_linear) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 453 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 454 | lemma holomorphic_on_const: "(\<lambda>z. c) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 455 | unfolding holomorphic_on_def by (metis complex_differentiable_const) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 456 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 457 | lemma holomorphic_on_ident: "(\<lambda>x. x) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 458 | unfolding holomorphic_on_def by (metis complex_differentiable_ident) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 459 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 460 | lemma holomorphic_on_id: "id holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 461 | unfolding id_def by (rule holomorphic_on_ident) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 462 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 463 | lemma holomorphic_on_compose: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 464 | "f holomorphic_on s \<Longrightarrow> g holomorphic_on (f ` s) \<Longrightarrow> (g o f) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 465 | using complex_differentiable_compose_within[of f _ s g] | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 466 | by (auto simp: holomorphic_on_def) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 467 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 468 | lemma holomorphic_on_compose_gen: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 469 | "f holomorphic_on s \<Longrightarrow> g holomorphic_on t \<Longrightarrow> f ` s \<subseteq> t \<Longrightarrow> (g o f) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 470 | by (metis holomorphic_on_compose holomorphic_on_subset) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 471 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 472 | lemma holomorphic_on_minus: "f holomorphic_on s \<Longrightarrow> (\<lambda>z. -(f z)) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 473 | by (metis complex_differentiable_minus holomorphic_on_def) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 474 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 475 | lemma holomorphic_on_add: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 476 | "\<lbrakk>f holomorphic_on s; g holomorphic_on s\<rbrakk> \<Longrightarrow> (\<lambda>z. f z + g z) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 477 | unfolding holomorphic_on_def by (metis complex_differentiable_add) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 478 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 479 | lemma holomorphic_on_diff: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 480 | "\<lbrakk>f holomorphic_on s; g holomorphic_on s\<rbrakk> \<Longrightarrow> (\<lambda>z. f z - g z) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 481 | unfolding holomorphic_on_def by (metis complex_differentiable_diff) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 482 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 483 | lemma holomorphic_on_mult: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 484 | "\<lbrakk>f holomorphic_on s; g holomorphic_on s\<rbrakk> \<Longrightarrow> (\<lambda>z. f z * g z) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 485 | unfolding holomorphic_on_def by (metis complex_differentiable_mult) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 486 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 487 | lemma holomorphic_on_inverse: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 488 | "\<lbrakk>f holomorphic_on s; \<And>z. z \<in> s \<Longrightarrow> f z \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>z. inverse (f z)) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 489 | unfolding holomorphic_on_def by (metis complex_differentiable_inverse) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 490 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 491 | lemma holomorphic_on_divide: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 492 | "\<lbrakk>f holomorphic_on s; g holomorphic_on s; \<And>z. z \<in> s \<Longrightarrow> g z \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>z. f z / g z) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 493 | unfolding holomorphic_on_def by (metis complex_differentiable_divide) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 494 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 495 | lemma holomorphic_on_power: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 496 | "f holomorphic_on s \<Longrightarrow> (\<lambda>z. (f z)^n) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 497 | unfolding holomorphic_on_def by (metis complex_differentiable_power) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 498 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 499 | lemma holomorphic_on_setsum: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 500 | "(\<And>i. i \<in> I \<Longrightarrow> (f i) holomorphic_on s) \<Longrightarrow> (\<lambda>x. setsum (\<lambda>i. f i x) I) holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 501 | unfolding holomorphic_on_def by (metis complex_differentiable_setsum) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 502 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 503 | definition deriv :: "('a \<Rightarrow> 'a::real_normed_field) \<Rightarrow> 'a \<Rightarrow> 'a" where
 | 
| 61235 
37862ccec075
SOME rather than THE makes it easy to prove equivalence with other forms of derivatives
 paulson <lp15@cam.ac.uk> parents: 
61070diff
changeset | 504 | "deriv f x \<equiv> SOME D. DERIV f x :> D" | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 505 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 506 | lemma DERIV_imp_deriv: "DERIV f x :> f' \<Longrightarrow> deriv f x = f'" | 
| 61235 
37862ccec075
SOME rather than THE makes it easy to prove equivalence with other forms of derivatives
 paulson <lp15@cam.ac.uk> parents: 
61070diff
changeset | 507 | unfolding deriv_def by (metis some_equality DERIV_unique) | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 508 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 509 | lemma DERIV_deriv_iff_real_differentiable: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 510 | fixes x :: real | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 511 | shows "DERIV f x :> deriv f x \<longleftrightarrow> f differentiable at x" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 512 | unfolding differentiable_def by (metis DERIV_imp_deriv has_real_derivative_iff) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 513 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 514 | lemma real_derivative_chain: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 515 | fixes x :: real | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 516 | shows "f differentiable at x \<Longrightarrow> g differentiable at (f x) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 517 | \<Longrightarrow> deriv (g o f) x = deriv g (f x) * deriv f x" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 518 | by (metis DERIV_deriv_iff_real_differentiable DERIV_chain DERIV_imp_deriv) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 519 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 520 | lemma DERIV_deriv_iff_complex_differentiable: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 521 | "DERIV f x :> deriv f x \<longleftrightarrow> f complex_differentiable at x" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 522 | unfolding complex_differentiable_def by (metis DERIV_imp_deriv) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 523 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 524 | lemma complex_derivative_chain: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 525 | "f complex_differentiable at x \<Longrightarrow> g complex_differentiable at (f x) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 526 | \<Longrightarrow> deriv (g o f) x = deriv g (f x) * deriv f x" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 527 | by (metis DERIV_deriv_iff_complex_differentiable DERIV_chain DERIV_imp_deriv) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 528 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 529 | lemma complex_derivative_linear: "deriv (\<lambda>w. c * w) = (\<lambda>z. c)" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 530 | by (metis DERIV_imp_deriv DERIV_cmult_Id) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 531 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 532 | lemma complex_derivative_ident: "deriv (\<lambda>w. w) = (\<lambda>z. 1)" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 533 | by (metis DERIV_imp_deriv DERIV_ident) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 534 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 535 | lemma complex_derivative_const: "deriv (\<lambda>w. c) = (\<lambda>z. 0)" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 536 | by (metis DERIV_imp_deriv DERIV_const) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 537 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 538 | lemma complex_derivative_add: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 539 | "\<lbrakk>f complex_differentiable at z; g complex_differentiable at z\<rbrakk> | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 540 | \<Longrightarrow> deriv (\<lambda>w. f w + g w) z = deriv f z + deriv g z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 541 | unfolding DERIV_deriv_iff_complex_differentiable[symmetric] | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 542 | by (auto intro!: DERIV_imp_deriv derivative_intros) | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 543 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 544 | lemma complex_derivative_diff: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 545 | "\<lbrakk>f complex_differentiable at z; g complex_differentiable at z\<rbrakk> | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 546 | \<Longrightarrow> deriv (\<lambda>w. f w - g w) z = deriv f z - deriv g z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 547 | unfolding DERIV_deriv_iff_complex_differentiable[symmetric] | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 548 | by (auto intro!: DERIV_imp_deriv derivative_intros) | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 549 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 550 | lemma complex_derivative_mult: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 551 | "\<lbrakk>f complex_differentiable at z; g complex_differentiable at z\<rbrakk> | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 552 | \<Longrightarrow> deriv (\<lambda>w. f w * g w) z = f z * deriv g z + deriv f z * g z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 553 | unfolding DERIV_deriv_iff_complex_differentiable[symmetric] | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 554 | by (auto intro!: DERIV_imp_deriv derivative_eq_intros) | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 555 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 556 | lemma complex_derivative_cmult: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 557 | "f complex_differentiable at z \<Longrightarrow> deriv (\<lambda>w. c * f w) z = c * deriv f z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 558 | unfolding DERIV_deriv_iff_complex_differentiable[symmetric] | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 559 | by (auto intro!: DERIV_imp_deriv derivative_eq_intros) | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 560 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 561 | lemma complex_derivative_cmult_right: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 562 | "f complex_differentiable at z \<Longrightarrow> deriv (\<lambda>w. f w * c) z = deriv f z * c" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 563 | unfolding DERIV_deriv_iff_complex_differentiable[symmetric] | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 564 | by (auto intro!: DERIV_imp_deriv derivative_eq_intros) | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 565 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 566 | lemma complex_derivative_transform_within_open: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 567 | "\<lbrakk>f holomorphic_on s; g holomorphic_on s; open s; z \<in> s; \<And>w. w \<in> s \<Longrightarrow> f w = g w\<rbrakk> | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 568 | \<Longrightarrow> deriv f z = deriv g z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 569 | unfolding holomorphic_on_def | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 570 | by (rule DERIV_imp_deriv) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 571 | (metis DERIV_deriv_iff_complex_differentiable DERIV_transform_within_open at_within_open) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 572 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 573 | lemma complex_derivative_compose_linear: | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 574 | "f complex_differentiable at (c * z) \<Longrightarrow> deriv (\<lambda>w. f (c * w)) z = c * deriv f (c * z)" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 575 | apply (rule DERIV_imp_deriv) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 576 | apply (simp add: DERIV_deriv_iff_complex_differentiable [symmetric]) | 
| 59554 
4044f53326c9
inlined rules to free user-space from technical names
 haftmann parents: 
58877diff
changeset | 577 | apply (drule DERIV_chain' [of "times c" c z UNIV f "deriv f (c * z)", OF DERIV_cmult_Id]) | 
| 
4044f53326c9
inlined rules to free user-space from technical names
 haftmann parents: 
58877diff
changeset | 578 | apply (simp add: algebra_simps) | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 579 | done | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 580 | |
| 60420 | 581 | subsection\<open>Analyticity on a set\<close> | 
| 56215 | 582 | |
| 583 | definition analytic_on (infixl "(analytic'_on)" 50) | |
| 584 | where | |
| 585 | "f analytic_on s \<equiv> \<forall>x \<in> s. \<exists>e. 0 < e \<and> f holomorphic_on (ball x e)" | |
| 586 | ||
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 587 | lemma analytic_imp_holomorphic: "f analytic_on s \<Longrightarrow> f holomorphic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 588 | by (simp add: at_within_open [OF _ open_ball] analytic_on_def holomorphic_on_def) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 589 | (metis centre_in_ball complex_differentiable_at_within) | 
| 56215 | 590 | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 591 | lemma analytic_on_open: "open s \<Longrightarrow> f analytic_on s \<longleftrightarrow> f holomorphic_on s" | 
| 56215 | 592 | apply (auto simp: analytic_imp_holomorphic) | 
| 593 | apply (auto simp: analytic_on_def holomorphic_on_def) | |
| 594 | by (metis holomorphic_on_def holomorphic_on_subset open_contains_ball) | |
| 595 | ||
| 596 | lemma analytic_on_imp_differentiable_at: | |
| 597 | "f analytic_on s \<Longrightarrow> x \<in> s \<Longrightarrow> f complex_differentiable (at x)" | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 598 | apply (auto simp: analytic_on_def holomorphic_on_def) | 
| 56215 | 599 | by (metis Topology_Euclidean_Space.open_ball centre_in_ball complex_differentiable_within_open) | 
| 600 | ||
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 601 | lemma analytic_on_subset: "f analytic_on s \<Longrightarrow> t \<subseteq> s \<Longrightarrow> f analytic_on t" | 
| 56215 | 602 | by (auto simp: analytic_on_def) | 
| 603 | ||
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 604 | lemma analytic_on_Un: "f analytic_on (s \<union> t) \<longleftrightarrow> f analytic_on s \<and> f analytic_on t" | 
| 56215 | 605 | by (auto simp: analytic_on_def) | 
| 606 | ||
| 60585 | 607 | lemma analytic_on_Union: "f analytic_on (\<Union>s) \<longleftrightarrow> (\<forall>t \<in> s. f analytic_on t)" | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 608 | by (auto simp: analytic_on_def) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 609 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 610 | lemma analytic_on_UN: "f analytic_on (\<Union>i\<in>I. s i) \<longleftrightarrow> (\<forall>i\<in>I. f analytic_on (s i))" | 
| 56215 | 611 | by (auto simp: analytic_on_def) | 
| 612 | ||
| 613 | lemma analytic_on_holomorphic: | |
| 614 | "f analytic_on s \<longleftrightarrow> (\<exists>t. open t \<and> s \<subseteq> t \<and> f holomorphic_on t)" | |
| 615 | (is "?lhs = ?rhs") | |
| 616 | proof - | |
| 617 | have "?lhs \<longleftrightarrow> (\<exists>t. open t \<and> s \<subseteq> t \<and> f analytic_on t)" | |
| 618 | proof safe | |
| 619 | assume "f analytic_on s" | |
| 620 | then show "\<exists>t. open t \<and> s \<subseteq> t \<and> f analytic_on t" | |
| 621 | apply (simp add: analytic_on_def) | |
| 622 |       apply (rule exI [where x="\<Union>{u. open u \<and> f analytic_on u}"], auto)
 | |
| 623 | apply (metis Topology_Euclidean_Space.open_ball analytic_on_open centre_in_ball) | |
| 624 | by (metis analytic_on_def) | |
| 625 | next | |
| 626 | fix t | |
| 627 | assume "open t" "s \<subseteq> t" "f analytic_on t" | |
| 628 | then show "f analytic_on s" | |
| 629 | by (metis analytic_on_subset) | |
| 630 | qed | |
| 631 | also have "... \<longleftrightarrow> ?rhs" | |
| 632 | by (auto simp: analytic_on_open) | |
| 633 | finally show ?thesis . | |
| 634 | qed | |
| 635 | ||
| 636 | lemma analytic_on_linear: "(op * c) analytic_on s" | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 637 | by (auto simp add: analytic_on_holomorphic holomorphic_on_linear) | 
| 56215 | 638 | |
| 639 | lemma analytic_on_const: "(\<lambda>z. c) analytic_on s" | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 640 | by (metis analytic_on_def holomorphic_on_const zero_less_one) | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 641 | |
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 642 | lemma analytic_on_ident: "(\<lambda>x. x) analytic_on s" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 643 | by (simp add: analytic_on_def holomorphic_on_ident gt_ex) | 
| 56215 | 644 | |
| 645 | lemma analytic_on_id: "id analytic_on s" | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 646 | unfolding id_def by (rule analytic_on_ident) | 
| 56215 | 647 | |
| 648 | lemma analytic_on_compose: | |
| 649 | assumes f: "f analytic_on s" | |
| 650 | and g: "g analytic_on (f ` s)" | |
| 651 | shows "(g o f) analytic_on s" | |
| 652 | unfolding analytic_on_def | |
| 653 | proof (intro ballI) | |
| 654 | fix x | |
| 655 | assume x: "x \<in> s" | |
| 656 | then obtain e where e: "0 < e" and fh: "f holomorphic_on ball x e" using f | |
| 657 | by (metis analytic_on_def) | |
| 658 | obtain e' where e': "0 < e'" and gh: "g holomorphic_on ball (f x) e'" using g | |
| 659 | by (metis analytic_on_def g image_eqI x) | |
| 660 | have "isCont f x" | |
| 661 | by (metis analytic_on_imp_differentiable_at complex_differentiable_imp_continuous_at f x) | |
| 662 | with e' obtain d where d: "0 < d" and fd: "f ` ball x d \<subseteq> ball (f x) e'" | |
| 663 | by (auto simp: continuous_at_ball) | |
| 664 | have "g \<circ> f holomorphic_on ball x (min d e)" | |
| 665 | apply (rule holomorphic_on_compose) | |
| 666 | apply (metis fh holomorphic_on_subset min.bounded_iff order_refl subset_ball) | |
| 667 | by (metis fd gh holomorphic_on_subset image_mono min.cobounded1 subset_ball) | |
| 668 | then show "\<exists>e>0. g \<circ> f holomorphic_on ball x e" | |
| 669 | by (metis d e min_less_iff_conj) | |
| 670 | qed | |
| 671 | ||
| 672 | lemma analytic_on_compose_gen: | |
| 673 | "f analytic_on s \<Longrightarrow> g analytic_on t \<Longrightarrow> (\<And>z. z \<in> s \<Longrightarrow> f z \<in> t) | |
| 674 | \<Longrightarrow> g o f analytic_on s" | |
| 675 | by (metis analytic_on_compose analytic_on_subset image_subset_iff) | |
| 676 | ||
| 677 | lemma analytic_on_neg: | |
| 678 | "f analytic_on s \<Longrightarrow> (\<lambda>z. -(f z)) analytic_on s" | |
| 679 | by (metis analytic_on_holomorphic holomorphic_on_minus) | |
| 680 | ||
| 681 | lemma analytic_on_add: | |
| 682 | assumes f: "f analytic_on s" | |
| 683 | and g: "g analytic_on s" | |
| 684 | shows "(\<lambda>z. f z + g z) analytic_on s" | |
| 685 | unfolding analytic_on_def | |
| 686 | proof (intro ballI) | |
| 687 | fix z | |
| 688 | assume z: "z \<in> s" | |
| 689 | then obtain e where e: "0 < e" and fh: "f holomorphic_on ball z e" using f | |
| 690 | by (metis analytic_on_def) | |
| 691 | obtain e' where e': "0 < e'" and gh: "g holomorphic_on ball z e'" using g | |
| 692 | by (metis analytic_on_def g z) | |
| 693 | have "(\<lambda>z. f z + g z) holomorphic_on ball z (min e e')" | |
| 694 | apply (rule holomorphic_on_add) | |
| 695 | apply (metis fh holomorphic_on_subset min.bounded_iff order_refl subset_ball) | |
| 696 | by (metis gh holomorphic_on_subset min.bounded_iff order_refl subset_ball) | |
| 697 | then show "\<exists>e>0. (\<lambda>z. f z + g z) holomorphic_on ball z e" | |
| 698 | by (metis e e' min_less_iff_conj) | |
| 699 | qed | |
| 700 | ||
| 701 | lemma analytic_on_diff: | |
| 702 | assumes f: "f analytic_on s" | |
| 703 | and g: "g analytic_on s" | |
| 704 | shows "(\<lambda>z. f z - g z) analytic_on s" | |
| 705 | unfolding analytic_on_def | |
| 706 | proof (intro ballI) | |
| 707 | fix z | |
| 708 | assume z: "z \<in> s" | |
| 709 | then obtain e where e: "0 < e" and fh: "f holomorphic_on ball z e" using f | |
| 710 | by (metis analytic_on_def) | |
| 711 | obtain e' where e': "0 < e'" and gh: "g holomorphic_on ball z e'" using g | |
| 712 | by (metis analytic_on_def g z) | |
| 713 | have "(\<lambda>z. f z - g z) holomorphic_on ball z (min e e')" | |
| 714 | apply (rule holomorphic_on_diff) | |
| 715 | apply (metis fh holomorphic_on_subset min.bounded_iff order_refl subset_ball) | |
| 716 | by (metis gh holomorphic_on_subset min.bounded_iff order_refl subset_ball) | |
| 717 | then show "\<exists>e>0. (\<lambda>z. f z - g z) holomorphic_on ball z e" | |
| 718 | by (metis e e' min_less_iff_conj) | |
| 719 | qed | |
| 720 | ||
| 721 | lemma analytic_on_mult: | |
| 722 | assumes f: "f analytic_on s" | |
| 723 | and g: "g analytic_on s" | |
| 724 | shows "(\<lambda>z. f z * g z) analytic_on s" | |
| 725 | unfolding analytic_on_def | |
| 726 | proof (intro ballI) | |
| 727 | fix z | |
| 728 | assume z: "z \<in> s" | |
| 729 | then obtain e where e: "0 < e" and fh: "f holomorphic_on ball z e" using f | |
| 730 | by (metis analytic_on_def) | |
| 731 | obtain e' where e': "0 < e'" and gh: "g holomorphic_on ball z e'" using g | |
| 732 | by (metis analytic_on_def g z) | |
| 733 | have "(\<lambda>z. f z * g z) holomorphic_on ball z (min e e')" | |
| 734 | apply (rule holomorphic_on_mult) | |
| 735 | apply (metis fh holomorphic_on_subset min.bounded_iff order_refl subset_ball) | |
| 736 | by (metis gh holomorphic_on_subset min.bounded_iff order_refl subset_ball) | |
| 737 | then show "\<exists>e>0. (\<lambda>z. f z * g z) holomorphic_on ball z e" | |
| 738 | by (metis e e' min_less_iff_conj) | |
| 739 | qed | |
| 740 | ||
| 741 | lemma analytic_on_inverse: | |
| 742 | assumes f: "f analytic_on s" | |
| 743 | and nz: "(\<And>z. z \<in> s \<Longrightarrow> f z \<noteq> 0)" | |
| 744 | shows "(\<lambda>z. inverse (f z)) analytic_on s" | |
| 745 | unfolding analytic_on_def | |
| 746 | proof (intro ballI) | |
| 747 | fix z | |
| 748 | assume z: "z \<in> s" | |
| 749 | then obtain e where e: "0 < e" and fh: "f holomorphic_on ball z e" using f | |
| 750 | by (metis analytic_on_def) | |
| 751 | have "continuous_on (ball z e) f" | |
| 752 | by (metis fh holomorphic_on_imp_continuous_on) | |
| 753 | then obtain e' where e': "0 < e'" and nz': "\<And>y. dist z y < e' \<Longrightarrow> f y \<noteq> 0" | |
| 754 | by (metis Topology_Euclidean_Space.open_ball centre_in_ball continuous_on_open_avoid e z nz) | |
| 755 | have "(\<lambda>z. inverse (f z)) holomorphic_on ball z (min e e')" | |
| 756 | apply (rule holomorphic_on_inverse) | |
| 757 | apply (metis fh holomorphic_on_subset min.cobounded2 min.commute subset_ball) | |
| 758 | by (metis nz' mem_ball min_less_iff_conj) | |
| 759 | then show "\<exists>e>0. (\<lambda>z. inverse (f z)) holomorphic_on ball z e" | |
| 760 | by (metis e e' min_less_iff_conj) | |
| 761 | qed | |
| 762 | ||
| 763 | ||
| 764 | lemma analytic_on_divide: | |
| 765 | assumes f: "f analytic_on s" | |
| 766 | and g: "g analytic_on s" | |
| 767 | and nz: "(\<And>z. z \<in> s \<Longrightarrow> g z \<noteq> 0)" | |
| 768 | shows "(\<lambda>z. f z / g z) analytic_on s" | |
| 769 | unfolding divide_inverse | |
| 770 | by (metis analytic_on_inverse analytic_on_mult f g nz) | |
| 771 | ||
| 772 | lemma analytic_on_power: | |
| 773 | "f analytic_on s \<Longrightarrow> (\<lambda>z. (f z) ^ n) analytic_on s" | |
| 774 | by (induct n) (auto simp: analytic_on_const analytic_on_mult) | |
| 775 | ||
| 776 | lemma analytic_on_setsum: | |
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 777 | "(\<And>i. i \<in> I \<Longrightarrow> (f i) analytic_on s) \<Longrightarrow> (\<lambda>x. setsum (\<lambda>i. f i x) I) analytic_on s" | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 778 | by (induct I rule: infinite_finite_induct) (auto simp: analytic_on_const analytic_on_add) | 
| 56215 | 779 | |
| 60420 | 780 | subsection\<open>analyticity at a point.\<close> | 
| 56215 | 781 | |
| 782 | lemma analytic_at_ball: | |
| 783 |   "f analytic_on {z} \<longleftrightarrow> (\<exists>e. 0<e \<and> f holomorphic_on ball z e)"
 | |
| 784 | by (metis analytic_on_def singleton_iff) | |
| 785 | ||
| 786 | lemma analytic_at: | |
| 787 |     "f analytic_on {z} \<longleftrightarrow> (\<exists>s. open s \<and> z \<in> s \<and> f holomorphic_on s)"
 | |
| 788 | by (metis analytic_on_holomorphic empty_subsetI insert_subset) | |
| 789 | ||
| 790 | lemma analytic_on_analytic_at: | |
| 791 |     "f analytic_on s \<longleftrightarrow> (\<forall>z \<in> s. f analytic_on {z})"
 | |
| 792 | by (metis analytic_at_ball analytic_on_def) | |
| 793 | ||
| 794 | lemma analytic_at_two: | |
| 795 |   "f analytic_on {z} \<and> g analytic_on {z} \<longleftrightarrow>
 | |
| 796 | (\<exists>s. open s \<and> z \<in> s \<and> f holomorphic_on s \<and> g holomorphic_on s)" | |
| 797 | (is "?lhs = ?rhs") | |
| 798 | proof | |
| 799 | assume ?lhs | |
| 800 | then obtain s t | |
| 801 | where st: "open s" "z \<in> s" "f holomorphic_on s" | |
| 802 | "open t" "z \<in> t" "g holomorphic_on t" | |
| 803 | by (auto simp: analytic_at) | |
| 804 | show ?rhs | |
| 805 | apply (rule_tac x="s \<inter> t" in exI) | |
| 806 | using st | |
| 807 | apply (auto simp: Diff_subset holomorphic_on_subset) | |
| 808 | done | |
| 809 | next | |
| 810 | assume ?rhs | |
| 811 | then show ?lhs | |
| 812 | by (force simp add: analytic_at) | |
| 813 | qed | |
| 814 | ||
| 60420 | 815 | subsection\<open>Combining theorems for derivative with ``analytic at'' hypotheses\<close> | 
| 56215 | 816 | |
| 817 | lemma | |
| 818 |   assumes "f analytic_on {z}" "g analytic_on {z}"
 | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 819 | shows complex_derivative_add_at: "deriv (\<lambda>w. f w + g w) z = deriv f z + deriv g z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 820 | and complex_derivative_diff_at: "deriv (\<lambda>w. f w - g w) z = deriv f z - deriv g z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 821 | and complex_derivative_mult_at: "deriv (\<lambda>w. f w * g w) z = | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 822 | f z * deriv g z + deriv f z * g z" | 
| 56215 | 823 | proof - | 
| 824 | obtain s where s: "open s" "z \<in> s" "f holomorphic_on s" "g holomorphic_on s" | |
| 825 | using assms by (metis analytic_at_two) | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 826 | show "deriv (\<lambda>w. f w + g w) z = deriv f z + deriv g z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 827 | apply (rule DERIV_imp_deriv [OF DERIV_add]) | 
| 56215 | 828 | using s | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 829 | apply (auto simp: holomorphic_on_open complex_differentiable_def DERIV_deriv_iff_complex_differentiable) | 
| 56215 | 830 | done | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 831 | show "deriv (\<lambda>w. f w - g w) z = deriv f z - deriv g z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 832 | apply (rule DERIV_imp_deriv [OF DERIV_diff]) | 
| 56215 | 833 | using s | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 834 | apply (auto simp: holomorphic_on_open complex_differentiable_def DERIV_deriv_iff_complex_differentiable) | 
| 56215 | 835 | done | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 836 | show "deriv (\<lambda>w. f w * g w) z = f z * deriv g z + deriv f z * g z" | 
| 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 837 | apply (rule DERIV_imp_deriv [OF DERIV_mult']) | 
| 56215 | 838 | using s | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 839 | apply (auto simp: holomorphic_on_open complex_differentiable_def DERIV_deriv_iff_complex_differentiable) | 
| 56215 | 840 | done | 
| 841 | qed | |
| 842 | ||
| 843 | lemma complex_derivative_cmult_at: | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 844 |   "f analytic_on {z} \<Longrightarrow>  deriv (\<lambda>w. c * f w) z = c * deriv f z"
 | 
| 56215 | 845 | by (auto simp: complex_derivative_mult_at complex_derivative_const analytic_on_const) | 
| 846 | ||
| 847 | lemma complex_derivative_cmult_right_at: | |
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 848 |   "f analytic_on {z} \<Longrightarrow>  deriv (\<lambda>w. f w * c) z = deriv f z * c"
 | 
| 56215 | 849 | by (auto simp: complex_derivative_mult_at complex_derivative_const analytic_on_const) | 
| 850 | ||
| 60420 | 851 | subsection\<open>Complex differentiation of sequences and series\<close> | 
| 56215 | 852 | |
| 853 | lemma has_complex_derivative_sequence: | |
| 854 | fixes s :: "complex set" | |
| 855 | assumes cvs: "convex s" | |
| 856 | and df: "\<And>n x. x \<in> s \<Longrightarrow> (f n has_field_derivative f' n x) (at x within s)" | |
| 857 | and conv: "\<And>e. 0 < e \<Longrightarrow> \<exists>N. \<forall>n x. n \<ge> N \<longrightarrow> x \<in> s \<longrightarrow> norm (f' n x - g' x) \<le> e" | |
| 858 | and "\<exists>x l. x \<in> s \<and> ((\<lambda>n. f n x) ---> l) sequentially" | |
| 859 | shows "\<exists>g. \<forall>x \<in> s. ((\<lambda>n. f n x) ---> g x) sequentially \<and> | |
| 860 | (g has_field_derivative (g' x)) (at x within s)" | |
| 861 | proof - | |
| 862 | from assms obtain x l where x: "x \<in> s" and tf: "((\<lambda>n. f n x) ---> l) sequentially" | |
| 863 | by blast | |
| 864 |   { fix e::real assume e: "e > 0"
 | |
| 865 | then obtain N where N: "\<forall>n\<ge>N. \<forall>x. x \<in> s \<longrightarrow> cmod (f' n x - g' x) \<le> e" | |
| 866 | by (metis conv) | |
| 867 | have "\<exists>N. \<forall>n\<ge>N. \<forall>x\<in>s. \<forall>h. cmod (f' n x * h - g' x * h) \<le> e * cmod h" | |
| 868 | proof (rule exI [of _ N], clarify) | |
| 869 | fix n y h | |
| 870 | assume "N \<le> n" "y \<in> s" | |
| 871 | then have "cmod (f' n y - g' y) \<le> e" | |
| 872 | by (metis N) | |
| 873 | then have "cmod h * cmod (f' n y - g' y) \<le> cmod h * e" | |
| 874 | by (auto simp: antisym_conv2 mult_le_cancel_left norm_triangle_ineq2) | |
| 875 | then show "cmod (f' n y * h - g' y * h) \<le> e * cmod h" | |
| 876 | by (simp add: norm_mult [symmetric] field_simps) | |
| 877 | qed | |
| 878 | } note ** = this | |
| 879 | show ?thesis | |
| 880 | unfolding has_field_derivative_def | |
| 881 | proof (rule has_derivative_sequence [OF cvs _ _ x]) | |
| 882 | show "\<forall>n. \<forall>x\<in>s. (f n has_derivative (op * (f' n x))) (at x within s)" | |
| 883 | by (metis has_field_derivative_def df) | |
| 884 | next show "(\<lambda>n. f n x) ----> l" | |
| 885 | by (rule tf) | |
| 886 | next show "\<forall>e>0. \<exists>N. \<forall>n\<ge>N. \<forall>x\<in>s. \<forall>h. cmod (f' n x * h - g' x * h) \<le> e * cmod h" | |
| 887 | by (blast intro: **) | |
| 888 | qed | |
| 889 | qed | |
| 890 | ||
| 891 | ||
| 892 | lemma has_complex_derivative_series: | |
| 893 | fixes s :: "complex set" | |
| 894 | assumes cvs: "convex s" | |
| 895 | and df: "\<And>n x. x \<in> s \<Longrightarrow> (f n has_field_derivative f' n x) (at x within s)" | |
| 896 | and conv: "\<And>e. 0 < e \<Longrightarrow> \<exists>N. \<forall>n x. n \<ge> N \<longrightarrow> x \<in> s | |
| 897 | \<longrightarrow> cmod ((\<Sum>i<n. f' i x) - g' x) \<le> e" | |
| 898 | and "\<exists>x l. x \<in> s \<and> ((\<lambda>n. f n x) sums l)" | |
| 899 | shows "\<exists>g. \<forall>x \<in> s. ((\<lambda>n. f n x) sums g x) \<and> ((g has_field_derivative g' x) (at x within s))" | |
| 900 | proof - | |
| 901 | from assms obtain x l where x: "x \<in> s" and sf: "((\<lambda>n. f n x) sums l)" | |
| 902 | by blast | |
| 903 |   { fix e::real assume e: "e > 0"
 | |
| 904 | then obtain N where N: "\<forall>n x. n \<ge> N \<longrightarrow> x \<in> s | |
| 905 | \<longrightarrow> cmod ((\<Sum>i<n. f' i x) - g' x) \<le> e" | |
| 906 | by (metis conv) | |
| 907 | have "\<exists>N. \<forall>n\<ge>N. \<forall>x\<in>s. \<forall>h. cmod ((\<Sum>i<n. h * f' i x) - g' x * h) \<le> e * cmod h" | |
| 908 | proof (rule exI [of _ N], clarify) | |
| 909 | fix n y h | |
| 910 | assume "N \<le> n" "y \<in> s" | |
| 911 | then have "cmod ((\<Sum>i<n. f' i y) - g' y) \<le> e" | |
| 912 | by (metis N) | |
| 913 | then have "cmod h * cmod ((\<Sum>i<n. f' i y) - g' y) \<le> cmod h * e" | |
| 914 | by (auto simp: antisym_conv2 mult_le_cancel_left norm_triangle_ineq2) | |
| 915 | then show "cmod ((\<Sum>i<n. h * f' i y) - g' y * h) \<le> e * cmod h" | |
| 916 | by (simp add: norm_mult [symmetric] field_simps setsum_right_distrib) | |
| 917 | qed | |
| 918 | } note ** = this | |
| 919 | show ?thesis | |
| 920 | unfolding has_field_derivative_def | |
| 921 | proof (rule has_derivative_series [OF cvs _ _ x]) | |
| 922 | fix n x | |
| 923 | assume "x \<in> s" | |
| 924 | then show "((f n) has_derivative (\<lambda>z. z * f' n x)) (at x within s)" | |
| 925 | by (metis df has_field_derivative_def mult_commute_abs) | |
| 926 | next show " ((\<lambda>n. f n x) sums l)" | |
| 927 | by (rule sf) | |
| 928 | next show "\<forall>e>0. \<exists>N. \<forall>n\<ge>N. \<forall>x\<in>s. \<forall>h. cmod ((\<Sum>i<n. h * f' i x) - g' x * h) \<le> e * cmod h" | |
| 929 | by (blast intro: **) | |
| 930 | qed | |
| 931 | qed | |
| 932 | ||
| 60420 | 933 | subsection\<open>Bound theorem\<close> | 
| 56215 | 934 | |
| 935 | lemma complex_differentiable_bound: | |
| 936 | fixes s :: "complex set" | |
| 937 | assumes cvs: "convex s" | |
| 938 | and df: "\<And>z. z \<in> s \<Longrightarrow> (f has_field_derivative f' z) (at z within s)" | |
| 939 | and dn: "\<And>z. z \<in> s \<Longrightarrow> norm (f' z) \<le> B" | |
| 940 | and "x \<in> s" "y \<in> s" | |
| 941 | shows "norm(f x - f y) \<le> B * norm(x - y)" | |
| 942 | apply (rule differentiable_bound [OF cvs]) | |
| 56223 
7696903b9e61
generalize theory of operator norms to work with class real_normed_vector
 huffman parents: 
56217diff
changeset | 943 | apply (rule ballI, erule df [unfolded has_field_derivative_def]) | 
| 
7696903b9e61
generalize theory of operator norms to work with class real_normed_vector
 huffman parents: 
56217diff
changeset | 944 | apply (rule ballI, rule onorm_le, simp add: norm_mult mult_right_mono dn) | 
| 
7696903b9e61
generalize theory of operator norms to work with class real_normed_vector
 huffman parents: 
56217diff
changeset | 945 | apply fact | 
| 
7696903b9e61
generalize theory of operator norms to work with class real_normed_vector
 huffman parents: 
56217diff
changeset | 946 | apply fact | 
| 56215 | 947 | done | 
| 948 | ||
| 60420 | 949 | subsection\<open>Inverse function theorem for complex derivatives.\<close> | 
| 56215 | 950 | |
| 951 | lemma has_complex_derivative_inverse_basic: | |
| 952 | fixes f :: "complex \<Rightarrow> complex" | |
| 953 | shows "DERIV f (g y) :> f' \<Longrightarrow> | |
| 954 | f' \<noteq> 0 \<Longrightarrow> | |
| 955 | continuous (at y) g \<Longrightarrow> | |
| 956 | open t \<Longrightarrow> | |
| 957 | y \<in> t \<Longrightarrow> | |
| 958 | (\<And>z. z \<in> t \<Longrightarrow> f (g z) = z) | |
| 959 | \<Longrightarrow> DERIV g y :> inverse (f')" | |
| 960 | unfolding has_field_derivative_def | |
| 961 | apply (rule has_derivative_inverse_basic) | |
| 962 | apply (auto simp: bounded_linear_mult_right) | |
| 963 | done | |
| 964 | ||
| 965 | (*Used only once, in Multivariate/cauchy.ml. *) | |
| 966 | lemma has_complex_derivative_inverse_strong: | |
| 967 | fixes f :: "complex \<Rightarrow> complex" | |
| 968 | shows "DERIV f x :> f' \<Longrightarrow> | |
| 969 | f' \<noteq> 0 \<Longrightarrow> | |
| 970 | open s \<Longrightarrow> | |
| 971 | x \<in> s \<Longrightarrow> | |
| 972 | continuous_on s f \<Longrightarrow> | |
| 973 | (\<And>z. z \<in> s \<Longrightarrow> g (f z) = z) | |
| 974 | \<Longrightarrow> DERIV g (f x) :> inverse (f')" | |
| 975 | unfolding has_field_derivative_def | |
| 976 | apply (rule has_derivative_inverse_strong [of s x f g ]) | |
| 977 | using assms | |
| 978 | by auto | |
| 979 | ||
| 980 | lemma has_complex_derivative_inverse_strong_x: | |
| 981 | fixes f :: "complex \<Rightarrow> complex" | |
| 982 | shows "DERIV f (g y) :> f' \<Longrightarrow> | |
| 983 | f' \<noteq> 0 \<Longrightarrow> | |
| 984 | open s \<Longrightarrow> | |
| 985 | continuous_on s f \<Longrightarrow> | |
| 986 | g y \<in> s \<Longrightarrow> f(g y) = y \<Longrightarrow> | |
| 987 | (\<And>z. z \<in> s \<Longrightarrow> g (f z) = z) | |
| 988 | \<Longrightarrow> DERIV g y :> inverse (f')" | |
| 989 | unfolding has_field_derivative_def | |
| 990 | apply (rule has_derivative_inverse_strong_x [of s g y f]) | |
| 991 | using assms | |
| 992 | by auto | |
| 993 | ||
| 60420 | 994 | subsection \<open>Taylor on Complex Numbers\<close> | 
| 56215 | 995 | |
| 996 | lemma setsum_Suc_reindex: | |
| 997 | fixes f :: "nat \<Rightarrow> 'a::ab_group_add" | |
| 998 |     shows  "setsum f {0..n} = f 0 - f (Suc n) + setsum (\<lambda>i. f (Suc i)) {0..n}"
 | |
| 999 | by (induct n) auto | |
| 1000 | ||
| 1001 | lemma complex_taylor: | |
| 1002 | assumes s: "convex s" | |
| 1003 | and f: "\<And>i x. x \<in> s \<Longrightarrow> i \<le> n \<Longrightarrow> (f i has_field_derivative f (Suc i) x) (at x within s)" | |
| 1004 | and B: "\<And>x. x \<in> s \<Longrightarrow> cmod (f (Suc n) x) \<le> B" | |
| 1005 | and w: "w \<in> s" | |
| 1006 | and z: "z \<in> s" | |
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1007 | shows "cmod(f 0 z - (\<Sum>i\<le>n. f i w * (z-w) ^ i / (fact i))) | 
| 56215 | 1008 | \<le> B * cmod(z - w)^(Suc n) / fact n" | 
| 1009 | proof - | |
| 1010 | have wzs: "closed_segment w z \<subseteq> s" using assms | |
| 1011 | by (metis convex_contains_segment) | |
| 1012 |   { fix u
 | |
| 1013 | assume "u \<in> closed_segment w z" | |
| 1014 | then have "u \<in> s" | |
| 1015 | by (metis wzs subsetD) | |
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1016 | have "(\<Sum>i\<le>n. f i u * (- of_nat i * (z-u)^(i - 1)) / (fact i) + | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1017 | f (Suc i) u * (z-u)^i / (fact i)) = | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1018 | f (Suc n) u * (z-u) ^ n / (fact n)" | 
| 56215 | 1019 | proof (induction n) | 
| 1020 | case 0 show ?case by simp | |
| 1021 | next | |
| 1022 | case (Suc n) | |
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1023 | have "(\<Sum>i\<le>Suc n. f i u * (- of_nat i * (z-u) ^ (i - 1)) / (fact i) + | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1024 | f (Suc i) u * (z-u) ^ i / (fact i)) = | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1025 | f (Suc n) u * (z-u) ^ n / (fact n) + | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1026 | f (Suc (Suc n)) u * ((z-u) * (z-u) ^ n) / (fact (Suc n)) - | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1027 | f (Suc n) u * ((1 + of_nat n) * (z-u) ^ n) / (fact (Suc n))" | 
| 56479 
91958d4b30f7
revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
 hoelzl parents: 
56409diff
changeset | 1028 | using Suc by simp | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1029 | also have "... = f (Suc (Suc n)) u * (z-u) ^ Suc n / (fact (Suc n))" | 
| 56215 | 1030 | proof - | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1031 | have "(fact(Suc n)) * | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1032 | (f(Suc n) u *(z-u) ^ n / (fact n) + | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1033 | f(Suc(Suc n)) u *((z-u) *(z-u) ^ n) / (fact(Suc n)) - | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1034 | f(Suc n) u *((1 + of_nat n) *(z-u) ^ n) / (fact(Suc n))) = | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1035 | ((fact(Suc n)) *(f(Suc n) u *(z-u) ^ n)) / (fact n) + | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1036 | ((fact(Suc n)) *(f(Suc(Suc n)) u *((z-u) *(z-u) ^ n)) / (fact(Suc n))) - | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1037 | ((fact(Suc n)) *(f(Suc n) u *(of_nat(Suc n) *(z-u) ^ n))) / (fact(Suc n))" | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1038 | by (simp add: algebra_simps del: fact.simps) | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1039 | also have "... = ((fact (Suc n)) * (f (Suc n) u * (z-u) ^ n)) / (fact n) + | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1040 | (f (Suc (Suc n)) u * ((z-u) * (z-u) ^ n)) - | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1041 | (f (Suc n) u * ((1 + of_nat n) * (z-u) ^ n))" | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1042 | by (simp del: fact.simps) | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1043 | also have "... = (of_nat (Suc n) * (f (Suc n) u * (z-u) ^ n)) + | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1044 | (f (Suc (Suc n)) u * ((z-u) * (z-u) ^ n)) - | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1045 | (f (Suc n) u * ((1 + of_nat n) * (z-u) ^ n))" | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1046 | by (simp only: fact.simps of_nat_mult ac_simps) simp | 
| 56215 | 1047 | also have "... = f (Suc (Suc n)) u * ((z-u) * (z-u) ^ n)" | 
| 1048 | by (simp add: algebra_simps) | |
| 1049 | finally show ?thesis | |
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1050 | by (simp add: mult_left_cancel [where c = "(fact (Suc n))", THEN iffD1] del: fact.simps) | 
| 56215 | 1051 | qed | 
| 1052 | finally show ?case . | |
| 1053 | qed | |
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1054 | then have "((\<lambda>v. (\<Sum>i\<le>n. f i v * (z - v)^i / (fact i))) | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1055 | has_field_derivative f (Suc n) u * (z-u) ^ n / (fact n)) | 
| 56215 | 1056 | (at u within s)" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1057 | apply (intro derivative_eq_intros) | 
| 60420 | 1058 | apply (blast intro: assms \<open>u \<in> s\<close>) | 
| 56215 | 1059 | apply (rule refl)+ | 
| 1060 | apply (auto simp: field_simps) | |
| 1061 | done | |
| 1062 | } note sum_deriv = this | |
| 1063 |   { fix u
 | |
| 1064 | assume u: "u \<in> closed_segment w z" | |
| 1065 | then have us: "u \<in> s" | |
| 1066 | by (metis wzs subsetD) | |
| 1067 | have "cmod (f (Suc n) u) * cmod (z - u) ^ n \<le> cmod (f (Suc n) u) * cmod (u - z) ^ n" | |
| 1068 | by (metis norm_minus_commute order_refl) | |
| 1069 | also have "... \<le> cmod (f (Suc n) u) * cmod (z - w) ^ n" | |
| 1070 | by (metis mult_left_mono norm_ge_zero power_mono segment_bound [OF u]) | |
| 1071 | also have "... \<le> B * cmod (z - w) ^ n" | |
| 1072 | by (metis norm_ge_zero zero_le_power mult_right_mono B [OF us]) | |
| 1073 | finally have "cmod (f (Suc n) u) * cmod (z - u) ^ n \<le> B * cmod (z - w) ^ n" . | |
| 1074 | } note cmod_bound = this | |
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1075 | have "(\<Sum>i\<le>n. f i z * (z - z) ^ i / (fact i)) = (\<Sum>i\<le>n. (f i z / (fact i)) * 0 ^ i)" | 
| 56215 | 1076 | by simp | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1077 | also have "\<dots> = f 0 z / (fact 0)" | 
| 56215 | 1078 | by (subst setsum_zero_power) simp | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1079 | finally have "cmod (f 0 z - (\<Sum>i\<le>n. f i w * (z - w) ^ i / (fact i))) | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1080 | \<le> cmod ((\<Sum>i\<le>n. f i w * (z - w) ^ i / (fact i)) - | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1081 | (\<Sum>i\<le>n. f i z * (z - z) ^ i / (fact i)))" | 
| 56215 | 1082 | by (simp add: norm_minus_commute) | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1083 | also have "... \<le> B * cmod (z - w) ^ n / (fact n) * cmod (w - z)" | 
| 56215 | 1084 | apply (rule complex_differentiable_bound | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1085 | [where f' = "\<lambda>w. f (Suc n) w * (z - w)^n / (fact n)" | 
| 56215 | 1086 | and s = "closed_segment w z", OF convex_segment]) | 
| 1087 | apply (auto simp: ends_in_segment real_of_nat_def DERIV_subset [OF sum_deriv wzs] | |
| 1088 | norm_divide norm_mult norm_power divide_le_cancel cmod_bound) | |
| 1089 | done | |
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1090 | also have "... \<le> B * cmod (z - w) ^ Suc n / (fact n)" | 
| 56215 | 1091 | by (simp add: algebra_simps norm_minus_commute real_of_nat_def) | 
| 1092 | finally show ?thesis . | |
| 1093 | qed | |
| 1094 | ||
| 60420 | 1095 | text\<open>Something more like the traditional MVT for real components.\<close> | 
| 56370 
7c717ba55a0b
reorder Complex_Analysis_Basics; rename DD to deriv
 hoelzl parents: 
56369diff
changeset | 1096 | |
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1097 | lemma complex_mvt_line: | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1098 | assumes "\<And>u. u \<in> closed_segment w z \<Longrightarrow> (f has_field_derivative f'(u)) (at u)" | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1099 | shows "\<exists>u. u \<in> open_segment w z \<and> Re(f z) - Re(f w) = Re(f'(u) * (z - w))" | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1100 | proof - | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1101 | have twz: "\<And>t. (1 - t) *\<^sub>R w + t *\<^sub>R z = w + t *\<^sub>R (z - w)" | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1102 | by (simp add: real_vector.scale_left_diff_distrib real_vector.scale_right_diff_distrib) | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1103 | note assms[unfolded has_field_derivative_def, derivative_intros] | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1104 | show ?thesis | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1105 | apply (cut_tac mvt_simple | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1106 | [of 0 1 "Re o f o (\<lambda>t. (1 - t) *\<^sub>R w + t *\<^sub>R z)" | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1107 | "\<lambda>u. Re o (\<lambda>h. f'((1 - u) *\<^sub>R w + u *\<^sub>R z) * h) o (\<lambda>t. t *\<^sub>R (z - w))"]) | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1108 | apply auto | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1109 | apply (rule_tac x="(1 - x) *\<^sub>R w + x *\<^sub>R z" in exI) | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1110 | apply (auto simp add: open_segment_def twz) [] | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1111 | apply (intro derivative_eq_intros has_derivative_at_within) | 
| 56369 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1112 | apply simp_all | 
| 
2704ca85be98
moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
 hoelzl parents: 
56332diff
changeset | 1113 | apply (simp add: fun_eq_iff real_vector.scale_right_diff_distrib) | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1114 | apply (force simp add: twz closed_segment_def) | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1115 | done | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1116 | qed | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1117 | |
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1118 | lemma complex_taylor_mvt: | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1119 | assumes "\<And>i x. \<lbrakk>x \<in> closed_segment w z; i \<le> n\<rbrakk> \<Longrightarrow> ((f i) has_field_derivative f (Suc i) x) (at x)" | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1120 | shows "\<exists>u. u \<in> closed_segment w z \<and> | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1121 | Re (f 0 z) = | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1122 | Re ((\<Sum>i = 0..n. f i w * (z - w) ^ i / (fact i)) + | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1123 | (f (Suc n) u * (z-u)^n / (fact n)) * (z - w))" | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1124 | proof - | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1125 |   { fix u
 | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1126 | assume u: "u \<in> closed_segment w z" | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1127 | have "(\<Sum>i = 0..n. | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1128 | (f (Suc i) u * (z-u) ^ i - of_nat i * (f i u * (z-u) ^ (i - Suc 0))) / | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1129 | (fact i)) = | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1130 | f (Suc 0) u - | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1131 | (f (Suc (Suc n)) u * ((z-u) ^ Suc n) - (of_nat (Suc n)) * (z-u) ^ n * f (Suc n) u) / | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1132 | (fact (Suc n)) + | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1133 | (\<Sum>i = 0..n. | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1134 | (f (Suc (Suc i)) u * ((z-u) ^ Suc i) - of_nat (Suc i) * (f (Suc i) u * (z-u) ^ i)) / | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1135 | (fact (Suc i)))" | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1136 | by (subst setsum_Suc_reindex) simp | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1137 | also have "... = f (Suc 0) u - | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1138 | (f (Suc (Suc n)) u * ((z-u) ^ Suc n) - (of_nat (Suc n)) * (z-u) ^ n * f (Suc n) u) / | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1139 | (fact (Suc n)) + | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1140 | (\<Sum>i = 0..n. | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1141 | f (Suc (Suc i)) u * ((z-u) ^ Suc i) / (fact (Suc i)) - | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1142 | f (Suc i) u * (z-u) ^ i / (fact i))" | 
| 57514 
bdc2c6b40bf2
prefer ac_simps collections over separate name bindings for add and mult
 haftmann parents: 
56889diff
changeset | 1143 | by (simp only: diff_divide_distrib fact_cancel ac_simps) | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1144 | also have "... = f (Suc 0) u - | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1145 | (f (Suc (Suc n)) u * (z-u) ^ Suc n - of_nat (Suc n) * (z-u) ^ n * f (Suc n) u) / | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1146 | (fact (Suc n)) + | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1147 | f (Suc (Suc n)) u * (z-u) ^ Suc n / (fact (Suc n)) - f (Suc 0) u" | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1148 | by (subst setsum_Suc_diff) auto | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1149 | also have "... = f (Suc n) u * (z-u) ^ n / (fact n)" | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1150 | by (simp only: algebra_simps diff_divide_distrib fact_cancel) | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1151 | finally have "(\<Sum>i = 0..n. (f (Suc i) u * (z - u) ^ i | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1152 | - of_nat i * (f i u * (z-u) ^ (i - Suc 0))) / (fact i)) = | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1153 | f (Suc n) u * (z - u) ^ n / (fact n)" . | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1154 | then have "((\<lambda>u. \<Sum>i = 0..n. f i u * (z - u) ^ i / (fact i)) has_field_derivative | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1155 | f (Suc n) u * (z - u) ^ n / (fact n)) (at u)" | 
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 1156 | apply (intro derivative_eq_intros)+ | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1157 | apply (force intro: u assms) | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1158 | apply (rule refl)+ | 
| 57514 
bdc2c6b40bf2
prefer ac_simps collections over separate name bindings for add and mult
 haftmann parents: 
56889diff
changeset | 1159 | apply (auto simp: ac_simps) | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1160 | done | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1161 | } | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1162 | then show ?thesis | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1163 | apply (cut_tac complex_mvt_line [of w z "\<lambda>u. \<Sum>i = 0..n. f i u * (z-u) ^ i / (fact i)" | 
| 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59615diff
changeset | 1164 | "\<lambda>u. (f (Suc n) u * (z-u)^n / (fact n))"]) | 
| 56238 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1165 | apply (auto simp add: intro: open_closed_segment) | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1166 | done | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1167 | qed | 
| 
5d147e1e18d1
a few new lemmas and generalisations of old ones
 paulson <lp15@cam.ac.uk> parents: 
56223diff
changeset | 1168 | |
| 60017 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1169 | |
| 60420 | 1170 | subsection \<open>Polynomal function extremal theorem, from HOL Light\<close> | 
| 60017 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1171 | |
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1172 | lemma polyfun_extremal_lemma: (*COMPLEX_POLYFUN_EXTREMAL_LEMMA in HOL Light*) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1173 | fixes c :: "nat \<Rightarrow> 'a::real_normed_div_algebra" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1174 | assumes "0 < e" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1175 | shows "\<exists>M. \<forall>z. M \<le> norm(z) \<longrightarrow> norm (\<Sum>i\<le>n. c(i) * z^i) \<le> e * norm(z) ^ (Suc n)" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1176 | proof (induct n) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1177 | case 0 with assms | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1178 | show ?case | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1179 | apply (rule_tac x="norm (c 0) / e" in exI) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1180 | apply (auto simp: field_simps) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1181 | done | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1182 | next | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1183 | case (Suc n) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1184 | obtain M where M: "\<And>z. M \<le> norm z \<Longrightarrow> norm (\<Sum>i\<le>n. c i * z^i) \<le> e * norm z ^ Suc n" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1185 | using Suc assms by blast | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1186 | show ?case | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1187 | proof (rule exI [where x= "max M (1 + norm(c(Suc n)) / e)"], clarsimp simp del: power_Suc) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1188 | fix z::'a | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1189 | assume z1: "M \<le> norm z" and "1 + norm (c (Suc n)) / e \<le> norm z" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1190 | then have z2: "e + norm (c (Suc n)) \<le> e * norm z" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1191 | using assms by (simp add: field_simps) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1192 | have "norm (\<Sum>i\<le>n. c i * z^i) \<le> e * norm z ^ Suc n" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1193 | using M [OF z1] by simp | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1194 | then have "norm (\<Sum>i\<le>n. c i * z^i) + norm (c (Suc n) * z ^ Suc n) \<le> e * norm z ^ Suc n + norm (c (Suc n) * z ^ Suc n)" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1195 | by simp | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1196 | then have "norm ((\<Sum>i\<le>n. c i * z^i) + c (Suc n) * z ^ Suc n) \<le> e * norm z ^ Suc n + norm (c (Suc n) * z ^ Suc n)" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1197 | by (blast intro: norm_triangle_le elim: ) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1198 | also have "... \<le> (e + norm (c (Suc n))) * norm z ^ Suc n" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1199 | by (simp add: norm_power norm_mult algebra_simps) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1200 | also have "... \<le> (e * norm z) * norm z ^ Suc n" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1201 | by (metis z2 mult.commute mult_left_mono norm_ge_zero norm_power) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1202 | finally show "norm ((\<Sum>i\<le>n. c i * z^i) + c (Suc n) * z ^ Suc n) \<le> e * norm z ^ Suc (Suc n)" | 
| 60162 | 1203 | by simp | 
| 60017 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1204 | qed | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1205 | qed | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1206 | |
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1207 | lemma polyfun_extremal: (*COMPLEX_POLYFUN_EXTREMAL in HOL Light*) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1208 | fixes c :: "nat \<Rightarrow> 'a::real_normed_div_algebra" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1209 | assumes k: "c k \<noteq> 0" "1\<le>k" and kn: "k\<le>n" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1210 | shows "eventually (\<lambda>z. norm (\<Sum>i\<le>n. c(i) * z^i) \<ge> B) at_infinity" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1211 | using kn | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1212 | proof (induction n) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1213 | case 0 | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1214 | then show ?case | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1215 | using k by simp | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1216 | next | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1217 | case (Suc m) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1218 | let ?even = ?case | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1219 | show ?even | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1220 | proof (cases "c (Suc m) = 0") | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1221 | case True | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1222 | then show ?even using Suc k | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1223 | by auto (metis antisym_conv less_eq_Suc_le not_le) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1224 | next | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1225 | case False | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1226 | then obtain M where M: | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1227 | "\<And>z. M \<le> norm z \<Longrightarrow> norm (\<Sum>i\<le>m. c i * z^i) \<le> norm (c (Suc m)) / 2 * norm z ^ Suc m" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1228 | using polyfun_extremal_lemma [of "norm(c (Suc m)) / 2" c m] Suc | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1229 | by auto | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1230 | have "\<exists>b. \<forall>z. b \<le> norm z \<longrightarrow> B \<le> norm (\<Sum>i\<le>Suc m. c i * z^i)" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1231 | proof (rule exI [where x="max M (max 1 (\<bar>B\<bar> / (norm(c (Suc m)) / 2)))"], clarsimp simp del: power_Suc) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1232 | fix z::'a | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1233 | assume z1: "M \<le> norm z" "1 \<le> norm z" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1234 | and "\<bar>B\<bar> * 2 / norm (c (Suc m)) \<le> norm z" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1235 | then have z2: "\<bar>B\<bar> \<le> norm (c (Suc m)) * norm z / 2" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1236 | using False by (simp add: field_simps) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1237 | have nz: "norm z \<le> norm z ^ Suc m" | 
| 60420 | 1238 | by (metis \<open>1 \<le> norm z\<close> One_nat_def less_eq_Suc_le power_increasing power_one_right zero_less_Suc) | 
| 60017 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1239 | have *: "\<And>y x. norm (c (Suc m)) * norm z / 2 \<le> norm y - norm x \<Longrightarrow> B \<le> norm (x + y)" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1240 | by (metis abs_le_iff add.commute norm_diff_ineq order_trans z2) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1241 | have "norm z * norm (c (Suc m)) + 2 * norm (\<Sum>i\<le>m. c i * z^i) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1242 | \<le> norm (c (Suc m)) * norm z + norm (c (Suc m)) * norm z ^ Suc m" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1243 | using M [of z] Suc z1 by auto | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1244 | also have "... \<le> 2 * (norm (c (Suc m)) * norm z ^ Suc m)" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1245 | using nz by (simp add: mult_mono del: power_Suc) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1246 | finally show "B \<le> norm ((\<Sum>i\<le>m. c i * z^i) + c (Suc m) * z ^ Suc m)" | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1247 | using Suc.IH | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1248 | apply (auto simp: eventually_at_infinity) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1249 | apply (rule *) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1250 | apply (simp add: field_simps norm_mult norm_power) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1251 | done | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1252 | qed | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1253 | then show ?even | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1254 | by (simp add: eventually_at_infinity) | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1255 | qed | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1256 | qed | 
| 
b785d6d06430
Overloading of ln and powr, but "approximation" no longer works for powr. Code generation also fails due to type ambiguity in scala.
 paulson <lp15@cam.ac.uk> parents: 
59730diff
changeset | 1257 | |
| 56215 | 1258 | end |