| author | wenzelm | 
| Mon, 04 Dec 2023 12:10:39 +0100 | |
| changeset 79120 | 45b2171e9e03 | 
| parent 78517 | 28c1f4f5335f | 
| child 80090 | 646cd337bb08 | 
| permissions | -rw-r--r-- | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1 | section \<open>Conformal Mappings and Consequences of Cauchy's Integral Theorem\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 3 | text\<open>By John Harrison et al. Ported from HOL Light by L C Paulson (2016)\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 4 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 5 | text\<open>Also Cauchy's residue theorem by Wenda Li (2016)\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 6 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 7 | theory Conformal_Mappings | 
| 71201 
6617fb368a06
Reorganised HOL-Complex_Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: 
71189diff
changeset | 8 | imports Cauchy_Integral_Formula | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 9 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 10 | begin | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 11 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 12 | subsection \<open>Analytic continuation\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 13 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 14 | proposition isolated_zeros: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 15 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 16 | and "open S" "connected S" "\<xi> \<in> S" "f \<xi> = 0" "\<beta> \<in> S" "f \<beta> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 17 | obtains r where "0 < r" and "ball \<xi> r \<subseteq> S" and | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 18 |         "\<And>z. z \<in> ball \<xi> r - {\<xi>} \<Longrightarrow> f z \<noteq> 0"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 19 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 20 | obtain r where "0 < r" and r: "ball \<xi> r \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 21 | using \<open>open S\<close> \<open>\<xi> \<in> S\<close> open_contains_ball_eq by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 22 | have powf: "((\<lambda>n. (deriv ^^ n) f \<xi> / (fact n) * (z - \<xi>)^n) sums f z)" if "z \<in> ball \<xi> r" for z | 
| 72259 | 23 | by (intro holomorphic_power_series [OF _ that] holomorphic_on_subset [OF holf r]) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 24 | obtain m where m: "(deriv ^^ m) f \<xi> / (fact m) \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 25 | using holomorphic_fun_eq_0_on_connected [OF holf \<open>open S\<close> \<open>connected S\<close> _ \<open>\<xi> \<in> S\<close> \<open>\<beta> \<in> S\<close>] \<open>f \<beta> \<noteq> 0\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 26 | by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 27 | then have "m \<noteq> 0" using assms(5) funpow_0 by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 28 |   obtain s where "0 < s" and s: "\<And>z. z \<in> cball \<xi> s - {\<xi>} \<Longrightarrow> f z \<noteq> 0"
 | 
| 72259 | 29 | using powser_0_nonzero [OF \<open>0 < r\<close> powf \<open>f \<xi> = 0\<close> m] | 
| 30 | by (metis \<open>m \<noteq> 0\<close> dist_norm mem_ball norm_minus_commute not_gr_zero) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 31 | have "0 < min r s" by (simp add: \<open>0 < r\<close> \<open>0 < s\<close>) | 
| 72259 | 32 | then show thesis | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 33 | proof qed (use r s in auto) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 34 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 35 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 36 | proposition analytic_continuation: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 37 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 38 | and "open S" and "connected S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 39 | and "U \<subseteq> S" and "\<xi> \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 40 | and "\<xi> islimpt U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 41 | and fU0 [simp]: "\<And>z. z \<in> U \<Longrightarrow> f z = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 42 | and "w \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 43 | shows "f w = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 44 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 45 | obtain e where "0 < e" and e: "cball \<xi> e \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 46 | using \<open>open S\<close> \<open>\<xi> \<in> S\<close> open_contains_cball_eq by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 47 | define T where "T = cball \<xi> e \<inter> U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 48 | have contf: "continuous_on (closure T) f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 49 | by (metis T_def closed_cball closure_minimal e holf holomorphic_on_imp_continuous_on | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 50 | holomorphic_on_subset inf.cobounded1) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 51 | have fT0 [simp]: "\<And>x. x \<in> T \<Longrightarrow> f x = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 52 | by (simp add: T_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 53 | have "\<And>r. \<lbrakk>\<forall>e>0. \<exists>x'\<in>U. x' \<noteq> \<xi> \<and> dist x' \<xi> < e; 0 < r\<rbrakk> \<Longrightarrow> \<exists>x'\<in>cball \<xi> e \<inter> U. x' \<noteq> \<xi> \<and> dist x' \<xi> < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 54 | by (metis \<open>0 < e\<close> IntI dist_commute less_eq_real_def mem_cball min_less_iff_conj) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 55 | then have "\<xi> islimpt T" using \<open>\<xi> islimpt U\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 56 | by (auto simp: T_def islimpt_approachable) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 57 | then have "\<xi> \<in> closure T" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 58 | by (simp add: closure_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 59 | then have "f \<xi> = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 60 | by (auto simp: continuous_constant_on_closure [OF contf]) | 
| 72259 | 61 |   moreover have "\<And>r. \<lbrakk>0 < r; \<And>z. z \<in> ball \<xi> r - {\<xi>} \<Longrightarrow> f z \<noteq> 0\<rbrakk> \<Longrightarrow> False"
 | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 62 | by (metis open_ball \<open>\<xi> islimpt T\<close> centre_in_ball fT0 insertE insert_Diff islimptE) | 
| 72259 | 63 | ultimately show ?thesis | 
| 64 | by (metis \<open>open S\<close> \<open>connected S\<close> \<open>\<xi> \<in> S\<close> \<open>w \<in> S\<close> holf isolated_zeros) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 65 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 66 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 67 | corollary analytic_continuation_open: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 68 |   assumes "open s" and "open s'" and "s \<noteq> {}" and "connected s'"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 69 | and "s \<subseteq> s'" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 70 | assumes "f holomorphic_on s'" and "g holomorphic_on s'" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 71 | and "\<And>z. z \<in> s \<Longrightarrow> f z = g z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 72 | assumes "z \<in> s'" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 73 | shows "f z = g z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 74 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 75 |   from \<open>s \<noteq> {}\<close> obtain \<xi> where "\<xi> \<in> s" by auto
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 76 | with \<open>open s\<close> have \<xi>: "\<xi> islimpt s" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 77 | by (intro interior_limit_point) (auto simp: interior_open) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 78 | have "f z - g z = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 79 | by (rule analytic_continuation[of "\<lambda>z. f z - g z" s' s \<xi>]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 80 | (insert assms \<open>\<xi> \<in> s\<close> \<xi>, auto intro: holomorphic_intros) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 81 | thus ?thesis by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 82 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 83 | |
| 74007 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 84 | corollary analytic_continuation': | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 85 | assumes "f holomorphic_on S" "open S" "connected S" | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 86 | and "U \<subseteq> S" "\<xi> \<in> S" "\<xi> islimpt U" | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 87 | and "f constant_on U" | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 88 | shows "f constant_on S" | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 89 | proof - | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 90 | obtain c where c: "\<And>x. x \<in> U \<Longrightarrow> f x - c = 0" | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 91 | by (metis \<open>f constant_on U\<close> constant_on_def diff_self) | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 92 | have "(\<lambda>z. f z - c) holomorphic_on S" | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 93 | using assms by (intro holomorphic_intros) | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 94 | with c analytic_continuation assms have "\<And>x. x \<in> S \<Longrightarrow> f x - c = 0" | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 95 | by blast | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 96 | then show ?thesis | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 97 | unfolding constant_on_def by force | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 98 | qed | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 99 | |
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 100 | lemma holomorphic_compact_finite_zeros: | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 101 | assumes S: "f holomorphic_on S" "open S" "connected S" | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 102 | and "compact K" "K \<subseteq> S" | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 103 | and "\<not> f constant_on S" | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 104 |     shows "finite {z\<in>K. f z = 0}"
 | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 105 | proof (rule ccontr) | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 106 |   assume "infinite {z\<in>K. f z = 0}"
 | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 107 |   then obtain z where "z \<in> K" and z: "z islimpt {z\<in>K. f z = 0}"
 | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 108 | using \<open>compact K\<close> by (auto simp: compact_eq_Bolzano_Weierstrass) | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 109 |   moreover have "{z\<in>K. f z = 0} \<subseteq> S"
 | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 110 | using \<open>K \<subseteq> S\<close> by blast | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 111 | ultimately show False | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 112 | using assms analytic_continuation [OF S] unfolding constant_on_def | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 113 | by blast | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 114 | qed | 
| 
df976eefcba0
A few new lemmas and simplifications
 paulson <lp15@cam.ac.uk> parents: 
73932diff
changeset | 115 | |
| 75168 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 116 | lemma holomorphic_countable_zeros: | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 117 | assumes S: "f holomorphic_on S" "open S" "connected S" and "fsigma S" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 118 | and "\<not> f constant_on S" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 119 |     shows "countable {z\<in>S. f z = 0}"
 | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 120 | proof - | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 121 | obtain F::"nat \<Rightarrow> complex set" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 122 | where F: "range F \<subseteq> Collect compact" and Seq: "S = (\<Union>i. F i)" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 123 | using \<open>fsigma S\<close> by (meson fsigma_Union_compact) | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 124 |   have fin: "finite {z \<in> F i. f z = 0}" for i
 | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 125 | using holomorphic_compact_finite_zeros assms F Seq Union_iff by blast | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 126 |   have "{z \<in> S. f z = 0} = (\<Union>i. {z \<in> F i. f z = 0})"
 | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 127 | using Seq by auto | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 128 | with fin show ?thesis | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 129 | by (simp add: countable_finite) | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 130 | qed | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 131 | |
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 132 | lemma holomorphic_countable_equal: | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 133 | assumes "f holomorphic_on S" "g holomorphic_on S" "open S" "connected S" and "fsigma S" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 134 |     and eq: "uncountable {z\<in>S. f z = g z}"
 | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 135 |   shows "S \<subseteq> {z\<in>S. f z = g z}"
 | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 136 | proof - | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 137 | obtain z where z: "z\<in>S" "f z = g z" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 138 | using eq not_finite_existsD uncountable_infinite by blast | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 139 | have "(\<lambda>x. f x - g x) holomorphic_on S" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 140 | by (simp add: assms holomorphic_on_diff) | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 141 | then have "(\<lambda>x. f x - g x) constant_on S" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 142 | using holomorphic_countable_zeros assms by force | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 143 | with z have "\<And>x. x\<in>S \<Longrightarrow> f x - g x = 0" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 144 | unfolding constant_on_def by force | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 145 | then show ?thesis | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 146 | by auto | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 147 | qed | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 148 | |
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 149 | lemma holomorphic_countable_equal_UNIV: | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 150 | assumes fg: "f holomorphic_on UNIV" "g holomorphic_on UNIV" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 151 |     and eq: "uncountable {z. f z = g z}"
 | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 152 | shows "f=g" | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 153 | using holomorphic_countable_equal [OF fg] eq by fastforce | 
| 
ff60b4acd6dd
Added some theorems (from Wetzel)
 paulson <lp15@cam.ac.uk> parents: 
74007diff
changeset | 154 | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 155 | subsection\<open>Open mapping theorem\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 156 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 157 | lemma holomorphic_contract_to_zero: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 158 | assumes contf: "continuous_on (cball \<xi> r) f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 159 | and holf: "f holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 160 | and "0 < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 161 | and norm_less: "\<And>z. norm(\<xi> - z) = r \<Longrightarrow> norm(f \<xi>) < norm(f z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 162 | obtains z where "z \<in> ball \<xi> r" "f z = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 163 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 164 |   { assume fnz: "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> f w \<noteq> 0"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 165 | then have "0 < norm (f \<xi>)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 166 | by (simp add: \<open>0 < r\<close>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 167 | have fnz': "\<And>w. w \<in> cball \<xi> r \<Longrightarrow> f w \<noteq> 0" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 168 | using dist_complex_def fnz norm_less order_le_less by fastforce | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 169 |     have "frontier(cball \<xi> r) \<noteq> {}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 170 | using \<open>0 < r\<close> by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 171 | define g where [abs_def]: "g z = inverse (f z)" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 172 | have contg: "continuous_on (cball \<xi> r) g" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 173 | unfolding g_def using contf continuous_on_inverse fnz' by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 174 | have holg: "g holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 175 | unfolding g_def using fnz holf holomorphic_on_inverse by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 176 | have "frontier (cball \<xi> r) \<subseteq> cball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 177 | by (simp add: subset_iff) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 178 | then have contf': "continuous_on (frontier (cball \<xi> r)) f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 179 | and contg': "continuous_on (frontier (cball \<xi> r)) g" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 180 | by (blast intro: contf contg continuous_on_subset)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 181 |     have froc: "frontier(cball \<xi> r) \<noteq> {}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 182 | using \<open>0 < r\<close> by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 183 | moreover have "continuous_on (frontier (cball \<xi> r)) (norm o f)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 184 | using contf' continuous_on_compose continuous_on_norm_id by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 185 | ultimately obtain w where w: "w \<in> frontier(cball \<xi> r)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 186 | and now: "\<And>x. x \<in> frontier(cball \<xi> r) \<Longrightarrow> norm (f w) \<le> norm (f x)" | 
| 72259 | 187 | using continuous_attains_inf [OF compact_frontier [OF compact_cball]] | 
| 188 | by (metis comp_apply) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 189 | then have fw: "0 < norm (f w)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 190 | by (simp add: fnz') | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 191 | have "continuous_on (frontier (cball \<xi> r)) (norm o g)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 192 | using contg' continuous_on_compose continuous_on_norm_id by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 193 | then obtain v where v: "v \<in> frontier(cball \<xi> r)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 194 | and nov: "\<And>x. x \<in> frontier(cball \<xi> r) \<Longrightarrow> norm (g v) \<ge> norm (g x)" | 
| 72259 | 195 | using continuous_attains_sup [OF compact_frontier [OF compact_cball] froc] by force | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 196 | then have fv: "0 < norm (f v)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 197 | by (simp add: fnz') | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 198 | have "norm ((deriv ^^ 0) g \<xi>) \<le> fact 0 * norm (g v) / r ^ 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 199 | by (rule Cauchy_inequality [OF holg contg \<open>0 < r\<close>]) (simp add: dist_norm nov) | 
| 72259 | 200 | then have "cmod (g \<xi>) \<le> cmod (g v)" | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 201 | by simp | 
| 72259 | 202 | moreover have "cmod (\<xi> - w) = r" | 
| 203 | by (metis (no_types) dist_norm frontier_cball mem_sphere w) | |
| 204 | ultimately obtain wr: "norm (\<xi> - w) = r" and nfw: "norm (f w) \<le> norm (f \<xi>)" | |
| 205 | unfolding g_def | |
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 206 | by (smt (verit, del_insts) \<open>0 < cmod (f \<xi>)\<close> inverse_le_imp_le norm_inverse now v) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 207 | with fw have False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 208 | using norm_less by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 209 | } | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 210 | with that show ?thesis by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 211 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 212 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 213 | theorem open_mapping_thm: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 214 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 215 | and S: "open S" and "connected S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 216 | and "open U" and "U \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 217 | and fne: "\<not> f constant_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 218 | shows "open (f ` U)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 219 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 220 | have *: "open (f ` U)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 221 |           if "U \<noteq> {}" and U: "open U" "connected U" and "f holomorphic_on U" and fneU: "\<And>x. \<exists>y \<in> U. f y \<noteq> x"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 222 | for U | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 223 | proof (clarsimp simp: open_contains_ball) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 224 | fix \<xi> assume \<xi>: "\<xi> \<in> U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 225 | show "\<exists>e>0. ball (f \<xi>) e \<subseteq> f ` U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 226 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 227 | have hol: "(\<lambda>z. f z - f \<xi>) holomorphic_on U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 228 | by (rule holomorphic_intros that)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 229 | obtain s where "0 < s" and sbU: "ball \<xi> s \<subseteq> U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 230 |                  and sne: "\<And>z. z \<in> ball \<xi> s - {\<xi>} \<Longrightarrow> (\<lambda>z. f z - f \<xi>) z \<noteq> 0"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 231 | using isolated_zeros [OF hol U \<xi>] by (metis fneU right_minus_eq) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 232 | obtain r where "0 < r" and r: "cball \<xi> r \<subseteq> ball \<xi> s" | 
| 72259 | 233 | using \<open>0 < s\<close> by (rule_tac r="s/2" in that) auto | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 234 | have "cball \<xi> r \<subseteq> U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 235 | using sbU r by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 236 | then have frsbU: "frontier (cball \<xi> r) \<subseteq> U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 237 | using Diff_subset frontier_def order_trans by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 238 | then have cof: "compact (frontier(cball \<xi> r))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 239 | by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 240 |       have frne: "frontier (cball \<xi> r) \<noteq> {}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 241 | using \<open>0 < r\<close> by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 242 | have contfr: "continuous_on (frontier (cball \<xi> r)) (\<lambda>z. norm (f z - f \<xi>))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 243 | by (metis continuous_on_norm continuous_on_subset frsbU hol holomorphic_on_imp_continuous_on) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 244 | obtain w where "norm (\<xi> - w) = r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 245 | and w: "(\<And>z. norm (\<xi> - z) = r \<Longrightarrow> norm (f w - f \<xi>) \<le> norm(f z - f \<xi>))" | 
| 72259 | 246 | using continuous_attains_inf [OF cof frne contfr] by (auto simp: dist_norm) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 247 | moreover define \<epsilon> where "\<epsilon> \<equiv> norm (f w - f \<xi>) / 3" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 248 | ultimately have "0 < \<epsilon>" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 249 | using \<open>0 < r\<close> dist_complex_def r sne by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 250 | have "ball (f \<xi>) \<epsilon> \<subseteq> f ` U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 251 | proof | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 252 | fix \<gamma> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 253 | assume \<gamma>: "\<gamma> \<in> ball (f \<xi>) \<epsilon>" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 254 | have *: "cmod (\<gamma> - f \<xi>) < cmod (\<gamma> - f z)" if "cmod (\<xi> - z) = r" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 255 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 256 | have lt: "cmod (f w - f \<xi>) / 3 < cmod (\<gamma> - f z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 257 | using w [OF that] \<gamma> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 258 | using dist_triangle2 [of "f \<xi>" "\<gamma>" "f z"] dist_triangle2 [of "f \<xi>" "f z" \<gamma>] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 259 | by (simp add: \<epsilon>_def dist_norm norm_minus_commute) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 260 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 261 | by (metis \<epsilon>_def dist_commute dist_norm less_trans lt mem_ball \<gamma>) | 
| 72259 | 262 | qed | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 263 | have "continuous_on (cball \<xi> r) (\<lambda>z. \<gamma> - f z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 264 | using \<open>cball \<xi> r \<subseteq> U\<close> \<open>f holomorphic_on U\<close> | 
| 72259 | 265 | by (force intro: continuous_intros continuous_on_subset holomorphic_on_imp_continuous_on) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 266 | moreover have "(\<lambda>z. \<gamma> - f z) holomorphic_on ball \<xi> r" | 
| 72259 | 267 | using \<open>cball \<xi> r \<subseteq> U\<close> ball_subset_cball holomorphic_on_subset that(4) | 
| 268 | by (intro holomorphic_intros) blast | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 269 | ultimately obtain z where "z \<in> ball \<xi> r" "\<gamma> - f z = 0" | 
| 72259 | 270 | using "*" \<open>0 < r\<close> holomorphic_contract_to_zero by blast | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 271 | then show "\<gamma> \<in> f ` U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 272 | using \<open>cball \<xi> r \<subseteq> U\<close> by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 273 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 274 | then show ?thesis using \<open>0 < \<epsilon>\<close> by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 275 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 276 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 277 | have "open (f ` X)" if "X \<in> components U" for X | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 278 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 279 | have holfU: "f holomorphic_on U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 280 | using \<open>U \<subseteq> S\<close> holf holomorphic_on_subset by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 281 |     have "X \<noteq> {}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 282 | using that by (simp add: in_components_nonempty) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 283 | moreover have "open X" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 284 | using that \<open>open U\<close> open_components by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 285 | moreover have "connected X" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 286 | using that in_components_maximal by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 287 | moreover have "f holomorphic_on X" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 288 | by (meson that holfU holomorphic_on_subset in_components_maximal) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 289 | moreover have "\<exists>y\<in>X. f y \<noteq> x" for x | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 290 | proof (rule ccontr) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 291 | assume not: "\<not> (\<exists>y\<in>X. f y \<noteq> x)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 292 | have "X \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 293 | using \<open>U \<subseteq> S\<close> in_components_subset that by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 294 |       obtain w where w: "w \<in> X" using \<open>X \<noteq> {}\<close> by blast
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 295 | have wis: "w islimpt X" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 296 | using w \<open>open X\<close> interior_eq by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 297 | have hol: "(\<lambda>z. f z - x) holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 298 | by (simp add: holf holomorphic_on_diff) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 299 | with fne [unfolded constant_on_def] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 300 | analytic_continuation[OF hol S \<open>connected S\<close> \<open>X \<subseteq> S\<close> _ wis] not \<open>X \<subseteq> S\<close> w | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 301 | show False by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 302 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 303 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 304 | by (rule *) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 305 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 306 | then have "open (f ` \<Union>(components U))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 307 | by (metis (no_types, lifting) imageE image_Union open_Union) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 308 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 309 | by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 310 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 311 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 312 | text\<open>No need for \<^term>\<open>S\<close> to be connected. But the nonconstant condition is stronger.\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 313 | corollary\<^marker>\<open>tag unimportant\<close> open_mapping_thm2: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 314 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 315 | and S: "open S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 316 | and "open U" "U \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 317 |       and fnc: "\<And>X. \<lbrakk>open X; X \<subseteq> S; X \<noteq> {}\<rbrakk> \<Longrightarrow> \<not> f constant_on X"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 318 | shows "open (f ` U)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 319 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 320 | have "S = \<Union>(components S)" by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 321 | with \<open>U \<subseteq> S\<close> have "U = (\<Union>C \<in> components S. C \<inter> U)" by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 322 | then have "f ` U = (\<Union>C \<in> components S. f ` (C \<inter> U))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 323 | using image_UN by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 324 | moreover | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 325 |   { fix C assume "C \<in> components S"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 326 | with S \<open>C \<in> components S\<close> open_components in_components_connected | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 327 | have C: "open C" "connected C" by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 328 | have "C \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 329 | by (metis \<open>C \<in> components S\<close> in_components_maximal) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 330 | have nf: "\<not> f constant_on C" | 
| 72259 | 331 | using \<open>open C\<close> \<open>C \<in> components S\<close> \<open>C \<subseteq> S\<close> fnc in_components_nonempty by blast | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 332 | have "f holomorphic_on C" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 333 | by (metis holf holomorphic_on_subset \<open>C \<subseteq> S\<close>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 334 | then have "open (f ` (C \<inter> U))" | 
| 72259 | 335 | by (meson C \<open>open U\<close> inf_le1 nf open_Int open_mapping_thm) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 336 | } ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 337 | by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 338 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 339 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 340 | corollary\<^marker>\<open>tag unimportant\<close> open_mapping_thm3: | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 341 | assumes "f holomorphic_on S" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 342 | and "open S" and "inj_on f S" | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 343 | shows "open (f ` S)" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 344 | by (meson assms inj_on_subset injective_not_constant open_mapping_thm2 order.refl) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 345 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 346 | subsection\<open>Maximum modulus principle\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 347 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 348 | text\<open>If \<^term>\<open>f\<close> is holomorphic, then its norm (modulus) cannot exhibit a true local maximum that is | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 349 | properly within the domain of \<^term>\<open>f\<close>.\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 350 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 351 | proposition maximum_modulus_principle: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 352 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 353 | and S: "open S" and "connected S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 354 | and "open U" and "U \<subseteq> S" and "\<xi> \<in> U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 355 | and no: "\<And>z. z \<in> U \<Longrightarrow> norm(f z) \<le> norm(f \<xi>)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 356 | shows "f constant_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 357 | proof (rule ccontr) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 358 | assume "\<not> f constant_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 359 | then have "open (f ` U)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 360 | using open_mapping_thm assms by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 361 | moreover have "\<not> open (f ` U)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 362 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 363 | have "\<exists>t. cmod (f \<xi> - t) < e \<and> t \<notin> f ` U" if "0 < e" for e | 
| 72259 | 364 | using that | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 365 | apply (rule_tac x="if 0 < Re(f \<xi>) then f \<xi> + (e/2) else f \<xi> - (e/2)" in exI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 366 | apply (simp add: dist_norm) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 367 | apply (fastforce simp: cmod_Re_le_iff dest!: no dest: sym) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 368 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 369 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 370 | unfolding open_contains_ball by (metis \<open>\<xi> \<in> U\<close> contra_subsetD dist_norm imageI mem_ball) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 371 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 372 | ultimately show False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 373 | by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 374 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 375 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 376 | proposition maximum_modulus_frontier: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 377 | assumes holf: "f holomorphic_on (interior S)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 378 | and contf: "continuous_on (closure S) f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 379 | and bos: "bounded S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 380 | and leB: "\<And>z. z \<in> frontier S \<Longrightarrow> norm(f z) \<le> B" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 381 | and "\<xi> \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 382 | shows "norm(f \<xi>) \<le> B" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 383 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 384 | have "compact (closure S)" using bos | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 385 | by (simp add: bounded_closure compact_eq_bounded_closed) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 386 | moreover have "continuous_on (closure S) (cmod \<circ> f)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 387 | using contf continuous_on_compose continuous_on_norm_id by blast | 
| 72259 | 388 | ultimately obtain z where "z \<in> closure S" and z: "\<And>y. y \<in> closure S \<Longrightarrow> (cmod \<circ> f) y \<le> (cmod \<circ> f) z" | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 389 | using continuous_attains_sup [of "closure S" "norm o f"] \<open>\<xi> \<in> S\<close> by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 390 | then consider "z \<in> frontier S" | "z \<in> interior S" using frontier_def by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 391 | then have "norm(f z) \<le> B" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 392 | proof cases | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 393 | case 1 then show ?thesis using leB by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 394 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 395 | case 2 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 396 | have "f constant_on (connected_component_set (interior S) z)" | 
| 72259 | 397 | proof (rule maximum_modulus_principle) | 
| 398 | show "f holomorphic_on connected_component_set (interior S) z" | |
| 399 | by (metis connected_component_subset holf holomorphic_on_subset) | |
| 400 | show zin: "z \<in> connected_component_set (interior S) z" | |
| 401 | by (simp add: 2) | |
| 402 | show "\<And>W. W \<in> connected_component_set (interior S) z \<Longrightarrow> cmod (f W) \<le> cmod (f z)" | |
| 403 | using closure_def connected_component_subset z by fastforce | |
| 404 | qed (auto simp: open_connected_component) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 405 | then obtain c where c: "\<And>w. w \<in> connected_component_set (interior S) z \<Longrightarrow> f w = c" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 406 | by (auto simp: constant_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 407 |     have "f ` closure(connected_component_set (interior S) z) \<subseteq> {c}"
 | 
| 72259 | 408 | proof (rule image_closure_subset) | 
| 409 | show "continuous_on (closure (connected_component_set (interior S) z)) f" | |
| 410 | by (meson closure_mono connected_component_subset contf continuous_on_subset interior_subset) | |
| 411 | qed (use c in auto) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 412 | then have cc: "\<And>w. w \<in> closure(connected_component_set (interior S) z) \<Longrightarrow> f w = c" by blast | 
| 72259 | 413 | have "connected_component (interior S) z z" | 
| 414 | by (simp add: "2") | |
| 415 | moreover have "connected_component_set (interior S) z \<noteq> UNIV" | |
| 416 | by (metis bos bounded_interior connected_component_eq_UNIV not_bounded_UNIV) | |
| 417 |     ultimately have "frontier(connected_component_set (interior S) z) \<noteq> {}"
 | |
| 418 | by (meson "2" connected_component_eq_empty frontier_not_empty) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 419 | then obtain w where w: "w \<in> frontier(connected_component_set (interior S) z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 420 | by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 421 | then have "norm (f z) = norm (f w)" by (simp add: "2" c cc frontier_def) | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 422 | also have "\<dots> \<le> B" | 
| 72259 | 423 | using w frontier_interior_subset frontier_of_connected_component_subset | 
| 424 | by (blast intro: leB) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 425 | finally show ?thesis . | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 426 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 427 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 428 | using z \<open>\<xi> \<in> S\<close> closure_subset by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 429 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 430 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 431 | corollary\<^marker>\<open>tag unimportant\<close> maximum_real_frontier: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 432 | assumes holf: "f holomorphic_on (interior S)" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 433 | and contf: "continuous_on (closure S) f" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 434 | and bos: "bounded S" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 435 | and leB: "\<And>z. z \<in> frontier S \<Longrightarrow> Re(f z) \<le> B" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 436 | and "\<xi> \<in> S" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 437 | shows "Re(f \<xi>) \<le> B" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 438 | using maximum_modulus_frontier [of "exp o f" S "exp B"] | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 439 | Transcendental.continuous_on_exp holomorphic_on_compose holomorphic_on_exp assms | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 440 | by auto | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 441 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 442 | subsection\<^marker>\<open>tag unimportant\<close> \<open>Factoring out a zero according to its order\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 443 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 444 | lemma holomorphic_factor_order_of_zero: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 445 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 446 | and os: "open S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 447 | and "\<xi> \<in> S" "0 < n" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 448 | and dnz: "(deriv ^^ n) f \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 449 | and dfz: "\<And>i. \<lbrakk>0 < i; i < n\<rbrakk> \<Longrightarrow> (deriv ^^ i) f \<xi> = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 450 | obtains g r where "0 < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 451 | "g holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 452 | "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> f w - f \<xi> = (w - \<xi>)^n * g w" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 453 | "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> g w \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 454 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 455 | obtain r where "r>0" and r: "ball \<xi> r \<subseteq> S" using assms by (blast elim!: openE) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 456 | then have holfb: "f holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 457 | using holf holomorphic_on_subset by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 458 | define g where "g w = suminf (\<lambda>i. (deriv ^^ (i + n)) f \<xi> / (fact(i + n)) * (w - \<xi>)^i)" for w | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 459 | have sumsg: "(\<lambda>i. (deriv ^^ (i + n)) f \<xi> / (fact(i + n)) * (w - \<xi>)^i) sums g w" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 460 | and feq: "f w - f \<xi> = (w - \<xi>)^n * g w" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 461 | if w: "w \<in> ball \<xi> r" for w | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 462 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 463 | define powf where "powf = (\<lambda>i. (deriv ^^ i) f \<xi>/(fact i) * (w - \<xi>)^i)" | 
| 72259 | 464 | have [simp]: "powf 0 = f \<xi>" | 
| 465 | by (simp add: powf_def) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 466 |     have sing: "{..<n} - {i. powf i = 0} = (if f \<xi> = 0 then {} else {0})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 467 | unfolding powf_def using \<open>0 < n\<close> dfz by (auto simp: dfz; metis funpow_0 not_gr0) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 468 | have "powf sums f w" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 469 | unfolding powf_def by (rule holomorphic_power_series [OF holfb w]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 470 | moreover have "(\<Sum>i<n. powf i) = f \<xi>" | 
| 72259 | 471 | by (subst sum.setdiff_irrelevant [symmetric]; simp add: dfz sing) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 472 | ultimately have fsums: "(\<lambda>i. powf (i+n)) sums (f w - f \<xi>)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 473 | using w sums_iff_shift' by metis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 474 | then have *: "summable (\<lambda>i. (w - \<xi>) ^ n * ((deriv ^^ (i + n)) f \<xi> * (w - \<xi>) ^ i / fact (i + n)))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 475 | unfolding powf_def using sums_summable | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 476 | by (auto simp: power_add mult_ac) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 477 | have "summable (\<lambda>i. (deriv ^^ (i + n)) f \<xi> * (w - \<xi>) ^ i / fact (i + n))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 478 | proof (cases "w=\<xi>") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 479 | case False then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 480 | using summable_mult [OF *, of "1 / (w - \<xi>) ^ n"] by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 481 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 482 | case True then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 483 |         by (auto simp: Power.semiring_1_class.power_0_left intro!: summable_finite [of "{0}"]
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 484 | split: if_split_asm) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 485 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 486 | then show sumsg: "(\<lambda>i. (deriv ^^ (i + n)) f \<xi> / (fact(i + n)) * (w - \<xi>)^i) sums g w" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 487 | by (simp add: summable_sums_iff g_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 488 | show "f w - f \<xi> = (w - \<xi>)^n * g w" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 489 | using sums_mult [OF sumsg, of "(w - \<xi>) ^ n"] | 
| 72259 | 490 | by (intro sums_unique2 [OF fsums]) (auto simp: power_add mult_ac powf_def) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 491 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 492 | then have holg: "g holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 493 | by (meson sumsg power_series_holomorphic) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 494 | then have contg: "continuous_on (ball \<xi> r) g" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 495 | by (blast intro: holomorphic_on_imp_continuous_on) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 496 | have "g \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 497 | using dnz unfolding g_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 498 |     by (subst suminf_finite [of "{0}"]) auto
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 499 | obtain d where "0 < d" and d: "\<And>w. w \<in> ball \<xi> d \<Longrightarrow> g w \<noteq> 0" | 
| 72259 | 500 | using \<open>0 < r\<close> continuous_on_avoid [OF contg _ \<open>g \<xi> \<noteq> 0\<close>] | 
| 501 | by (metis centre_in_ball le_cases mem_ball mem_ball_leI) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 502 | show ?thesis | 
| 72259 | 503 | proof | 
| 504 | show "g holomorphic_on ball \<xi> (min r d)" | |
| 505 | using holg by (auto simp: feq holomorphic_on_subset subset_ball d) | |
| 506 | qed (use \<open>0 < r\<close> \<open>0 < d\<close> in \<open>auto simp: feq d\<close>) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 507 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 508 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 509 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 510 | lemma holomorphic_factor_order_of_zero_strong: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 511 | assumes holf: "f holomorphic_on S" "open S" "\<xi> \<in> S" "0 < n" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 512 | and "(deriv ^^ n) f \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 513 | and "\<And>i. \<lbrakk>0 < i; i < n\<rbrakk> \<Longrightarrow> (deriv ^^ i) f \<xi> = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 514 | obtains g r where "0 < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 515 | "g holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 516 | "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> f w - f \<xi> = ((w - \<xi>) * g w) ^ n" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 517 | "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> g w \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 518 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 519 | obtain g r where "0 < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 520 | and holg: "g holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 521 | and feq: "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> f w - f \<xi> = (w - \<xi>)^n * g w" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 522 | and gne: "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> g w \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 523 | by (auto intro: holomorphic_factor_order_of_zero [OF assms]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 524 | have con: "continuous_on (ball \<xi> r) (\<lambda>z. deriv g z / g z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 525 | by (rule continuous_intros) (auto simp: gne holg holomorphic_deriv holomorphic_on_imp_continuous_on) | 
| 72259 | 526 | have cd: "(\<lambda>z. deriv g z / g z) field_differentiable at x" if "dist \<xi> x < r" for x | 
| 527 | proof (intro derivative_intros) | |
| 528 | show "deriv g field_differentiable at x" | |
| 529 | using that holg mem_ball by (blast intro: holomorphic_deriv holomorphic_on_imp_differentiable_at) | |
| 530 | show "g field_differentiable at x" | |
| 531 | by (metis that open_ball at_within_open holg holomorphic_on_def mem_ball) | |
| 532 | qed (simp add: gne that) | |
| 533 | obtain h where h: "\<And>x. x \<in> ball \<xi> r \<Longrightarrow> (h has_field_derivative deriv g x / g x) (at x)" | |
| 534 |       using holomorphic_convex_primitive [of "ball \<xi> r" "{}" "\<lambda>z. deriv g z / g z"]
 | |
| 535 | by (metis (no_types, lifting) Diff_empty at_within_interior cd con convex_ball infinite_imp_nonempty interior_ball mem_ball) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 536 | then have "continuous_on (ball \<xi> r) h" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 537 | by (metis open_ball holomorphic_on_imp_continuous_on holomorphic_on_open) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 538 | then have con: "continuous_on (ball \<xi> r) (\<lambda>x. exp (h x) / g x)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 539 | by (auto intro!: continuous_intros simp add: holg holomorphic_on_imp_continuous_on gne) | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 540 | have gfd: "dist \<xi> x < r \<Longrightarrow> g field_differentiable at x" if "dist \<xi> x < r" for x | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 541 | using holg holomorphic_on_imp_differentiable_at by auto | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 542 | have 0: "dist \<xi> x < r \<Longrightarrow> ((\<lambda>x. exp (h x) / g x) has_field_derivative 0) (at x)" for x | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 543 | by (rule gfd h derivative_eq_intros DERIV_deriv_iff_field_differentiable [THEN iffD2] | simp add: gne)+ | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 544 | obtain c where c: "\<And>x. x \<in> ball \<xi> r \<Longrightarrow> exp (h x) / g x = c" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 545 |     by (rule DERIV_zero_connected_constant [of "ball \<xi> r" "{}" "\<lambda>x. exp(h x) / g x"]) (auto simp: con 0)
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 546 | have hol: "(\<lambda>z. exp ((Ln (inverse c) + h z) / of_nat n)) holomorphic_on ball \<xi> r" | 
| 72259 | 547 | proof (intro holomorphic_intros holomorphic_on_compose [unfolded o_def, where g = exp]) | 
| 548 | show "h holomorphic_on ball \<xi> r" | |
| 549 | using h holomorphic_on_open by blast | |
| 550 | qed (use \<open>0 < n\<close> in auto) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 551 | show ?thesis | 
| 72259 | 552 | proof | 
| 553 | show "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> f w - f \<xi> = ((w - \<xi>) * exp ((Ln (inverse c) + h w) / of_nat n)) ^ n" | |
| 554 | using \<open>0 < n\<close> | |
| 555 | by (auto simp: feq power_mult_distrib exp_divide_power_eq exp_add gne simp flip: c) | |
| 556 | qed (use hol \<open>0 < r\<close> in auto) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 557 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 558 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 559 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 560 | lemma | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 561 | fixes k :: "'a::wellorder" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 562 | assumes a_def: "a == LEAST x. P x" and P: "P k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 563 | shows def_LeastI: "P a" and def_Least_le: "a \<le> k" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 564 | unfolding a_def | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 565 | by (rule LeastI Least_le; rule P)+ | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 566 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 567 | lemma holomorphic_factor_zero_nonconstant: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 568 | assumes holf: "f holomorphic_on S" and S: "open S" "connected S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 569 | and "\<xi> \<in> S" "f \<xi> = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 570 | and nonconst: "\<not> f constant_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 571 | obtains g r n | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 572 | where "0 < n" "0 < r" "ball \<xi> r \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 573 | "g holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 574 | "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> f w = (w - \<xi>)^n * g w" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 575 | "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> g w \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 576 | proof (cases "\<forall>n>0. (deriv ^^ n) f \<xi> = 0") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 577 | case True then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 578 | using holomorphic_fun_eq_const_on_connected [OF holf S _ \<open>\<xi> \<in> S\<close>] nonconst by (simp add: constant_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 579 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 580 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 581 | then obtain n0 where "n0 > 0" and n0: "(deriv ^^ n0) f \<xi> \<noteq> 0" by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 582 | obtain r0 where "r0 > 0" "ball \<xi> r0 \<subseteq> S" using S openE \<open>\<xi> \<in> S\<close> by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 583 | define n where "n \<equiv> LEAST n. (deriv ^^ n) f \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 584 | have n_ne: "(deriv ^^ n) f \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 585 | by (rule def_LeastI [OF n_def]) (rule n0) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 586 | then have "0 < n" using \<open>f \<xi> = 0\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 587 | using funpow_0 by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 588 | have n_min: "\<And>k. k < n \<Longrightarrow> (deriv ^^ k) f \<xi> = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 589 | using def_Least_le [OF n_def] not_le by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 590 | then obtain g r1 | 
| 72259 | 591 | where g: "0 < r1" "g holomorphic_on ball \<xi> r1" | 
| 592 | and geq: "\<And>w. w \<in> ball \<xi> r1 \<Longrightarrow> f w = (w - \<xi>) ^ n * g w" | |
| 593 | and g0: "\<And>w. w \<in> ball \<xi> r1 \<Longrightarrow> g w \<noteq> 0" | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 594 | by (auto intro: holomorphic_factor_order_of_zero [OF holf \<open>open S\<close> \<open>\<xi> \<in> S\<close> \<open>n > 0\<close> n_ne] simp: \<open>f \<xi> = 0\<close>) | 
| 72259 | 595 | show ?thesis | 
| 596 | proof | |
| 597 | show "g holomorphic_on ball \<xi> (min r0 r1)" | |
| 598 | using g by auto | |
| 599 | show "\<And>w. w \<in> ball \<xi> (min r0 r1) \<Longrightarrow> f w = (w - \<xi>) ^ n * g w" | |
| 600 | by (simp add: geq) | |
| 601 | qed (use \<open>0 < n\<close> \<open>0 < r0\<close> \<open>0 < r1\<close> \<open>ball \<xi> r0 \<subseteq> S\<close> g0 in auto) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 602 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 603 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 604 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 605 | lemma holomorphic_lower_bound_difference: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 606 | assumes holf: "f holomorphic_on S" and S: "open S" "connected S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 607 | and "\<xi> \<in> S" and "\<phi> \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 608 | and fne: "f \<phi> \<noteq> f \<xi>" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 609 | obtains k n r | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 610 | where "0 < k" "0 < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 611 | "ball \<xi> r \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 612 | "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> k * norm(w - \<xi>)^n \<le> norm(f w - f \<xi>)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 613 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 614 | define n where "n = (LEAST n. 0 < n \<and> (deriv ^^ n) f \<xi> \<noteq> 0)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 615 | obtain n0 where "0 < n0" and n0: "(deriv ^^ n0) f \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 616 | using fne holomorphic_fun_eq_const_on_connected [OF holf S] \<open>\<xi> \<in> S\<close> \<open>\<phi> \<in> S\<close> by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 617 | then have "0 < n" and n_ne: "(deriv ^^ n) f \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 618 | unfolding n_def by (metis (mono_tags, lifting) LeastI)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 619 | have n_min: "\<And>k. \<lbrakk>0 < k; k < n\<rbrakk> \<Longrightarrow> (deriv ^^ k) f \<xi> = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 620 | unfolding n_def by (blast dest: not_less_Least) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 621 | then obtain g r | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 622 | where "0 < r" and holg: "g holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 623 | and fne: "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> f w - f \<xi> = (w - \<xi>) ^ n * g w" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 624 | and gnz: "\<And>w. w \<in> ball \<xi> r \<Longrightarrow> g w \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 625 | by (auto intro: holomorphic_factor_order_of_zero [OF holf \<open>open S\<close> \<open>\<xi> \<in> S\<close> \<open>n > 0\<close> n_ne]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 626 | obtain e where "e>0" and e: "ball \<xi> e \<subseteq> S" using assms by (blast elim!: openE) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 627 | then have holfb: "f holomorphic_on ball \<xi> e" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 628 | using holf holomorphic_on_subset by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 629 | define d where "d = (min e r) / 2" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 630 | have "0 < d" using \<open>0 < r\<close> \<open>0 < e\<close> by (simp add: d_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 631 | have "d < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 632 | using \<open>0 < r\<close> by (auto simp: d_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 633 | then have cbb: "cball \<xi> d \<subseteq> ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 634 | by (auto simp: cball_subset_ball_iff) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 635 | then have "g holomorphic_on cball \<xi> d" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 636 | by (rule holomorphic_on_subset [OF holg]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 637 | then have "closed (g ` cball \<xi> d)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 638 | by (simp add: compact_imp_closed compact_continuous_image holomorphic_on_imp_continuous_on) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 639 |   moreover have "g ` cball \<xi> d \<noteq> {}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 640 | using \<open>0 < d\<close> by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 641 | ultimately obtain x where x: "x \<in> g ` cball \<xi> d" and "\<And>y. y \<in> g ` cball \<xi> d \<Longrightarrow> dist 0 x \<le> dist 0 y" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 642 | by (rule distance_attains_inf) blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 643 | then have leg: "\<And>w. w \<in> cball \<xi> d \<Longrightarrow> norm x \<le> norm (g w)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 644 | by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 645 | have "ball \<xi> d \<subseteq> cball \<xi> d" by auto | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 646 | also have "\<dots> \<subseteq> ball \<xi> e" using \<open>0 < d\<close> d_def by auto | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 647 | also have "\<dots> \<subseteq> S" by (rule e) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 648 | finally have dS: "ball \<xi> d \<subseteq> S" . | 
| 72259 | 649 | have "x \<noteq> 0" using gnz x \<open>d < r\<close> by auto | 
| 650 | show thesis | |
| 651 | proof | |
| 652 | show "\<And>w. w \<in> ball \<xi> d \<Longrightarrow> cmod x * cmod (w - \<xi>) ^ n \<le> cmod (f w - f \<xi>)" | |
| 653 | using \<open>d < r\<close> leg by (auto simp: fne norm_mult norm_power algebra_simps mult_right_mono) | |
| 654 | qed (use dS \<open>x \<noteq> 0\<close> \<open>d > 0\<close> in auto) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 655 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 656 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 657 | lemma | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 658 |   assumes holf: "f holomorphic_on (S - {\<xi>})" and \<xi>: "\<xi> \<in> interior S"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 659 | shows holomorphic_on_extend_lim: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 660 |           "(\<exists>g. g holomorphic_on S \<and> (\<forall>z \<in> S - {\<xi>}. g z = f z)) \<longleftrightarrow>
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 661 | ((\<lambda>z. (z - \<xi>) * f z) \<longlongrightarrow> 0) (at \<xi>)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 662 | (is "?P = ?Q") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 663 | and holomorphic_on_extend_bounded: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 664 |           "(\<exists>g. g holomorphic_on S \<and> (\<forall>z \<in> S - {\<xi>}. g z = f z)) \<longleftrightarrow>
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 665 | (\<exists>B. eventually (\<lambda>z. norm(f z) \<le> B) (at \<xi>))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 666 | (is "?P = ?R") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 667 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 668 | obtain \<delta> where "0 < \<delta>" and \<delta>: "ball \<xi> \<delta> \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 669 | using \<xi> mem_interior by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 670 |   have "?R" if holg: "g holomorphic_on S" and gf: "\<And>z. z \<in> S - {\<xi>} \<Longrightarrow> g z = f z" for g
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 671 | proof - | 
| 72259 | 672 | have \<section>: "cmod (f x) \<le> cmod (g \<xi>) + 1" if "x \<noteq> \<xi>" "dist x \<xi> < \<delta>" "dist (g x) (g \<xi>) < 1" for x | 
| 673 | proof - | |
| 674 | have "x \<in> S" | |
| 675 | by (metis \<delta> dist_commute mem_ball subsetD that(2)) | |
| 676 | with that gf [of x] show ?thesis | |
| 677 | using norm_triangle_ineq2 [of "f x" "g \<xi>"] dist_complex_def by auto | |
| 678 | qed | |
| 679 | then have *: "\<forall>\<^sub>F z in at \<xi>. dist (g z) (g \<xi>) < 1 \<longrightarrow> cmod (f z) \<le> cmod (g \<xi>) + 1" | |
| 680 | using \<open>0 < \<delta>\<close> eventually_at by blast | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 681 | have "continuous_on (interior S) g" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 682 | by (meson continuous_on_subset holg holomorphic_on_imp_continuous_on interior_subset) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 683 | then have "\<And>x. x \<in> interior S \<Longrightarrow> (g \<longlongrightarrow> g x) (at x)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 684 | using continuous_on_interior continuous_within holg holomorphic_on_imp_continuous_on by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 685 | then have "(g \<longlongrightarrow> g \<xi>) (at \<xi>)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 686 | by (simp add: \<xi>) | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 687 | then have "\<forall>\<^sub>F z in at \<xi>. cmod (f z) \<le> cmod (g \<xi>) + 1" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 688 | by (rule eventually_mp [OF * tendstoD [where e=1]], auto) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 689 | then show ?thesis | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 690 | by blast | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 691 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 692 | moreover have "?Q" if "\<forall>\<^sub>F z in at \<xi>. cmod (f z) \<le> B" for B | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 693 | by (rule lim_null_mult_right_bounded [OF _ that]) (simp add: LIM_zero) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 694 | moreover have "?P" if "(\<lambda>z. (z - \<xi>) * f z) \<midarrow>\<xi>\<rightarrow> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 695 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 696 | define h where [abs_def]: "h z = (z - \<xi>)^2 * f z" for z | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 697 | have "(\<lambda>y. (y - \<xi>)\<^sup>2 * f y / (y - \<xi>)) \<midarrow>\<xi>\<rightarrow> 0" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 698 | by (simp add: LIM_cong power2_eq_square that) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 699 | then have h0: "(h has_field_derivative 0) (at \<xi>)" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 700 | by (simp add: h_def has_field_derivative_iff) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 701 | have holh: "h holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 702 | proof (simp add: holomorphic_on_def, clarify) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 703 | fix z assume "z \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 704 | show "h field_differentiable at z within S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 705 | proof (cases "z = \<xi>") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 706 | case True then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 707 | using field_differentiable_at_within field_differentiable_def h0 by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 708 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 709 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 710 | then have "f field_differentiable at z within S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 711 | using holomorphic_onD [OF holf, of z] \<open>z \<in> S\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 712 | unfolding field_differentiable_def has_field_derivative_iff | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 713 | by (force intro: exI [where x="dist \<xi> z"] elim: Lim_transform_within_set [unfolded eventually_at]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 714 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 715 | by (simp add: h_def power2_eq_square derivative_intros) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 716 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 717 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 718 | define g where [abs_def]: "g z = (if z = \<xi> then deriv h \<xi> else (h z - h \<xi>) / (z - \<xi>))" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 719 | have holg: "g holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 720 | unfolding g_def by (rule pole_lemma [OF holh \<xi>]) | 
| 72259 | 721 |     have \<section>: "\<forall>z\<in>S - {\<xi>}. (g z - g \<xi>) / (z - \<xi>) = f z"
 | 
| 722 | using h0 by (auto simp: g_def power2_eq_square divide_simps DERIV_imp_deriv h_def) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 723 | show ?thesis | 
| 72259 | 724 | apply (intro exI conjI) | 
| 725 | apply (rule pole_lemma [OF holg \<xi>]) | |
| 726 | apply (simp add: \<section>) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 727 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 728 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 729 | ultimately show "?P = ?Q" and "?P = ?R" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 730 | by meson+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 731 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 732 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 733 | lemma pole_at_infinity: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 734 | assumes holf: "f holomorphic_on UNIV" and lim: "((inverse o f) \<longlongrightarrow> l) at_infinity" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 735 | obtains a n where "\<And>z. f z = (\<Sum>i\<le>n. a i * z^i)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 736 | proof (cases "l = 0") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 737 | case False | 
| 72259 | 738 | show thesis | 
| 739 | proof | |
| 740 | show "f z = (\<Sum>i\<le>0. inverse l * z ^ i)" for z | |
| 741 | using False tendsto_inverse [OF lim] by (simp add: Liouville_weak [OF holf]) | |
| 742 | qed | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 743 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 744 | case True | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 745 | then have [simp]: "l = 0" . | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 746 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 747 |   proof (cases "\<exists>r. 0 < r \<and> (\<forall>z \<in> ball 0 r - {0}. f(inverse z) \<noteq> 0)")
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 748 | case True | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 749 |       then obtain r where "0 < r" and r: "\<And>z. z \<in> ball 0 r - {0} \<Longrightarrow> f(inverse z) \<noteq> 0"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 750 | by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 751 |       have 1: "inverse \<circ> f \<circ> inverse holomorphic_on ball 0 r - {0}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 752 | by (rule holomorphic_on_compose holomorphic_intros holomorphic_on_subset [OF holf] | force simp: r)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 753 | have 2: "0 \<in> interior (ball 0 r)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 754 | using \<open>0 < r\<close> by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 755 | obtain g where holg: "g holomorphic_on ball 0 r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 756 |                  and geq: "\<And>z. z \<in> ball 0 r - {0} \<Longrightarrow> g z = (inverse \<circ> f \<circ> inverse) z"
 | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 757 | using tendstoD [OF lim [unfolded lim_at_infinity_0] zero_less_one] holomorphic_on_extend_bounded [OF 1 2] | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 758 | by (smt (verit, del_insts) \<open>l = 0\<close> eventually_mono norm_conv_dist) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 759 | have ifi0: "(inverse \<circ> f \<circ> inverse) \<midarrow>0\<rightarrow> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 760 | using \<open>l = 0\<close> lim lim_at_infinity_0 by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 761 | have g2g0: "g \<midarrow>0\<rightarrow> g 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 762 | using \<open>0 < r\<close> centre_in_ball continuous_at continuous_on_eq_continuous_at holg | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 763 | by (blast intro: holomorphic_on_imp_continuous_on) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 764 | have g2g1: "g \<midarrow>0\<rightarrow> 0" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 765 | proof (rule Lim_transform_within_open [OF ifi0 open_ball]) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 766 | show "\<And>x. \<lbrakk>x \<in> ball 0 r; x \<noteq> 0\<rbrakk> \<Longrightarrow> (inverse \<circ> f \<circ> inverse) x = g x" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 767 | by (auto simp: geq) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 768 | qed (auto simp: \<open>0 < r\<close>) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 769 | have [simp]: "g 0 = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 770 | by (rule tendsto_unique [OF _ g2g0 g2g1]) simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 771 |       have "ball 0 r - {0::complex} \<noteq> {}"
 | 
| 72259 | 772 | using \<open>0 < r\<close> by (metis "2" Diff_iff insert_Diff interior_ball interior_singleton) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 773 | then obtain w::complex where "w \<noteq> 0" and w: "norm w < r" by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 774 | then have "g w \<noteq> 0" by (simp add: geq r) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 775 | obtain B n e where "0 < B" "0 < e" "e \<le> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 776 | and leg: "\<And>w. norm w < e \<Longrightarrow> B * cmod w ^ n \<le> cmod (g w)" | 
| 72259 | 777 | proof (rule holomorphic_lower_bound_difference [OF holg open_ball connected_ball]) | 
| 778 | show "g w \<noteq> g 0" | |
| 779 | by (simp add: \<open>g w \<noteq> 0\<close>) | |
| 780 | show "w \<in> ball 0 r" | |
| 781 | using mem_ball_0 w by blast | |
| 782 | qed (use \<open>0 < r\<close> in \<open>auto simp: ball_subset_ball_iff\<close>) | |
| 783 | have \<section>: "cmod (f z) \<le> cmod z ^ n / B" if "2/e \<le> cmod z" for z | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 784 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 785 |         have ize: "inverse z \<in> ball 0 e - {0}" using that \<open>0 < e\<close>
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 786 | by (auto simp: norm_divide field_split_simps algebra_simps) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 787 |         then have [simp]: "z \<noteq> 0" and izr: "inverse z \<in> ball 0 r - {0}" using  \<open>e \<le> r\<close>
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 788 | by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 789 | then have [simp]: "f z \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 790 | using r [of "inverse z"] by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 791 | have [simp]: "f z = inverse (g (inverse z))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 792 | using izr geq [of "inverse z"] by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 793 | show ?thesis using ize leg [of "inverse z"] \<open>0 < B\<close> \<open>0 < e\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 794 | by (simp add: field_split_simps norm_divide algebra_simps) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 795 | qed | 
| 72259 | 796 | show thesis | 
| 797 | proof | |
| 798 | show "f z = (\<Sum>i\<le>n. (deriv ^^ i) f 0 / fact i * z ^ i)" for z | |
| 799 | using \<section> by (rule_tac A = "2/e" and B = "1/B" in Liouville_polynomial [OF holf], simp) | |
| 800 | qed | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 801 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 802 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 803 |     then have fi0: "\<And>r. r > 0 \<Longrightarrow> \<exists>z\<in>ball 0 r - {0}. f (inverse z) = 0"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 804 | by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 805 | have fz0: "f z = 0" if "0 < r" and lt1: "\<And>x. x \<noteq> 0 \<Longrightarrow> cmod x < r \<Longrightarrow> inverse (cmod (f (inverse x))) < 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 806 | for z r | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 807 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 808 | have f0: "(f \<longlongrightarrow> 0) at_infinity" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 809 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 810 | have DIM_complex[intro]: "2 \<le> DIM(complex)" \<comment> \<open>should not be necessary!\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 811 | by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 812 | have "f (inverse x) \<noteq> 0 \<Longrightarrow> x \<noteq> 0 \<Longrightarrow> cmod x < r \<Longrightarrow> 1 < cmod (f (inverse x))" for x | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 813 | using lt1[of x] by (auto simp: field_simps) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 814 | then have **: "cmod (f (inverse x)) \<le> 1 \<Longrightarrow> x \<noteq> 0 \<Longrightarrow> cmod x < r \<Longrightarrow> f (inverse x) = 0" for x | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 815 | by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 816 |         then have *: "(f \<circ> inverse) ` (ball 0 r - {0}) \<subseteq> {0} \<union> - ball 0 1"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 817 | by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 818 |         have "continuous_on (inverse ` (ball 0 r - {0})) f"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 819 | using continuous_on_subset holf holomorphic_on_imp_continuous_on by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 820 |         then have "connected ((f \<circ> inverse) ` (ball 0 r - {0}))"
 | 
| 72259 | 821 | using connected_punctured_ball | 
| 822 | by (intro connected_continuous_image continuous_intros; force) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 823 |         then have "{0} \<inter> (f \<circ> inverse) ` (ball 0 r - {0}) = {} \<or> - ball 0 1 \<inter> (f \<circ> inverse) ` (ball 0 r - {0}) = {}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 824 | by (rule connected_closedD) (use * in auto) | 
| 72259 | 825 | then have "f (inverse w) = 0" if "w \<noteq> 0" "cmod w < r" for w | 
| 826 | using **[of w] fi0 \<open>0 < r\<close> that by force | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 827 | then show ?thesis | 
| 72259 | 828 | unfolding lim_at_infinity_0 | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 829 | using eventually_at \<open>r > 0\<close> by (force simp: intro: tendsto_eventually) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 830 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 831 |       obtain w where "w \<in> ball 0 r - {0}" and "f (inverse w) = 0"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 832 | using False \<open>0 < r\<close> by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 833 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 834 | by (auto simp: f0 Liouville_weak [OF holf, of 0]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 835 | qed | 
| 72259 | 836 | show thesis | 
| 837 | proof | |
| 838 | show "\<And>z. f z = (\<Sum>i\<le>0. 0 * z ^ i)" | |
| 839 | using lim | |
| 840 | apply (simp add: lim_at_infinity_0 Lim_at dist_norm norm_inverse) | |
| 841 | using fz0 zero_less_one by blast | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 842 | qed | 
| 72259 | 843 | qed | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 844 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 845 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 846 | subsection\<^marker>\<open>tag unimportant\<close> \<open>Entire proper functions are precisely the non-trivial polynomials\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 847 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 848 | lemma proper_map_polyfun: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 849 |     fixes c :: "nat \<Rightarrow> 'a::{real_normed_div_algebra,heine_borel}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 850 | assumes "closed S" and "compact K" and c: "c i \<noteq> 0" "1 \<le> i" "i \<le> n" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 851 |     shows "compact (S \<inter> {z. (\<Sum>i\<le>n. c i * z^i) \<in> K})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 852 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 853 | obtain B where "B > 0" and B: "\<And>x. x \<in> K \<Longrightarrow> norm x \<le> B" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 854 | by (metis compact_imp_bounded \<open>compact K\<close> bounded_pos) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 855 | have *: "norm x \<le> b" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 856 | if "\<And>x. b \<le> norm x \<Longrightarrow> B + 1 \<le> norm (\<Sum>i\<le>n. c i * x ^ i)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 857 | "(\<Sum>i\<le>n. c i * x ^ i) \<in> K" for b x | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 858 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 859 | have "norm (\<Sum>i\<le>n. c i * x ^ i) \<le> B" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 860 | using B that by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 861 | moreover have "\<not> B + 1 \<le> B" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 862 | by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 863 | ultimately show "norm x \<le> b" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 864 | using that by (metis (no_types) less_eq_real_def not_less order_trans) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 865 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 866 |   have "bounded {z. (\<Sum>i\<le>n. c i * z ^ i) \<in> K}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 867 | using Limits.polyfun_extremal [where c=c and B="B+1", OF c] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 868 | by (auto simp: bounded_pos eventually_at_infinity_pos *) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 869 | moreover have "closed ((\<lambda>z. (\<Sum>i\<le>n. c i * z ^ i)) -` K)" | 
| 72259 | 870 | using \<open>compact K\<close> compact_eq_bounded_closed | 
| 871 | by (intro allI continuous_closed_vimage continuous_intros; force) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 872 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 873 | using closed_Int_compact [OF \<open>closed S\<close>] compact_eq_bounded_closed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 874 | by (auto simp add: vimage_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 875 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 876 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 877 | lemma proper_map_polyfun_univ: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 878 |     fixes c :: "nat \<Rightarrow> 'a::{real_normed_div_algebra,heine_borel}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 879 | assumes "compact K" "c i \<noteq> 0" "1 \<le> i" "i \<le> n" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 880 |     shows "compact ({z. (\<Sum>i\<le>n. c i * z^i) \<in> K})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 881 | using proper_map_polyfun [of UNIV K c i n] assms by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 882 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 883 | lemma proper_map_polyfun_eq: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 884 | assumes "f holomorphic_on UNIV" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 885 |     shows "(\<forall>k. compact k \<longrightarrow> compact {z. f z \<in> k}) \<longleftrightarrow>
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 886 | (\<exists>c n. 0 < n \<and> (c n \<noteq> 0) \<and> f = (\<lambda>z. \<Sum>i\<le>n. c i * z^i))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 887 | (is "?lhs = ?rhs") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 888 | proof | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 889 | assume compf [rule_format]: ?lhs | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 890 | have 2: "\<exists>k. 0 < k \<and> a k \<noteq> 0 \<and> f = (\<lambda>z. \<Sum>i \<le> k. a i * z ^ i)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 891 | if "\<And>z. f z = (\<Sum>i\<le>n. a i * z ^ i)" for a n | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 892 | proof (cases "\<forall>i\<le>n. 0<i \<longrightarrow> a i = 0") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 893 | case True | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 894 | then have [simp]: "\<And>z. f z = a 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 895 | by (simp add: that sum.atMost_shift) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 896 |     have False using compf [of "{a 0}"] by simp
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 897 | then show ?thesis .. | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 898 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 899 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 900 | then obtain k where k: "0 < k" "k\<le>n" "a k \<noteq> 0" by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 901 | define m where "m = (GREATEST k. k\<le>n \<and> a k \<noteq> 0)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 902 | have m: "m\<le>n \<and> a m \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 903 | unfolding m_def | 
| 72259 | 904 | using GreatestI_nat [where b = n] k by (metis (mono_tags, lifting)) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 905 | have [simp]: "a i = 0" if "m < i" "i \<le> n" for i | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 906 | using Greatest_le_nat [where b = "n" and P = "\<lambda>k. k\<le>n \<and> a k \<noteq> 0"] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 907 | using m_def not_le that by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 908 | have "k \<le> m" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 909 | unfolding m_def | 
| 72259 | 910 | using Greatest_le_nat [where b = n] k by (metis (mono_tags, lifting)) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 911 | with k m show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 912 | by (rule_tac x=m in exI) (auto simp: that comm_monoid_add_class.sum.mono_neutral_right) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 913 | qed | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 914 | have *: "((inverse \<circ> f) \<longlongrightarrow> 0) at_infinity" | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 915 | proof (rule Lim_at_infinityI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 916 | fix e::real assume "0 < e" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 917 | with compf [of "cball 0 (inverse e)"] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 918 | show "\<exists>B. \<forall>x. B \<le> cmod x \<longrightarrow> dist ((inverse \<circ> f) x) 0 \<le> e" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 919 | apply simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 920 | apply (clarsimp simp add: compact_eq_bounded_closed bounded_pos norm_inverse) | 
| 73932 
fd21b4a93043
added opaque_combs and renamed hide_lams to opaque_lifting
 desharna parents: 
72259diff
changeset | 921 | by (metis (no_types, opaque_lifting) inverse_inverse_eq le_less_trans less_eq_real_def less_imp_inverse_less linordered_field_no_ub not_less) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 922 | qed | 
| 72259 | 923 | then obtain a n where "\<And>z. f z = (\<Sum>i\<le>n. a i * z^i)" | 
| 924 | using assms pole_at_infinity by blast | |
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 925 | with * 2 show ?rhs by blast | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 926 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 927 | assume ?rhs | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 928 | then obtain c n where "0 < n" "c n \<noteq> 0" "f = (\<lambda>z. \<Sum>i\<le>n. c i * z ^ i)" by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 929 |   then have "compact {z. f z \<in> k}" if "compact k" for k
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 930 | by (auto intro: proper_map_polyfun_univ [OF that]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 931 | then show ?lhs by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 932 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 933 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 934 | subsection \<open>Relating invertibility and nonvanishing of derivative\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 935 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 936 | lemma has_complex_derivative_locally_injective: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 937 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 938 | and S: "\<xi> \<in> S" "open S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 939 | and dnz: "deriv f \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 940 | obtains r where "r > 0" "ball \<xi> r \<subseteq> S" "inj_on f (ball \<xi> r)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 941 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 942 | have *: "\<exists>d>0. \<forall>x. dist \<xi> x < d \<longrightarrow> onorm (\<lambda>v. deriv f x * v - deriv f \<xi> * v) < e" if "e > 0" for e | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 943 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 944 | have contdf: "continuous_on S (deriv f)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 945 | by (simp add: holf holomorphic_deriv holomorphic_on_imp_continuous_on \<open>open S\<close>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 946 | obtain \<delta> where "\<delta>>0" and \<delta>: "\<And>x. \<lbrakk>x \<in> S; dist x \<xi> \<le> \<delta>\<rbrakk> \<Longrightarrow> cmod (deriv f x - deriv f \<xi>) \<le> e/2" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 947 | using continuous_onE [OF contdf \<open>\<xi> \<in> S\<close>, of "e/2"] \<open>0 < e\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 948 | by (metis dist_complex_def half_gt_zero less_imp_le) | 
| 72259 | 949 | have \<section>: "\<And>\<zeta> z. \<lbrakk>\<zeta> \<in> S; dist \<xi> \<zeta> < \<delta>\<rbrakk> \<Longrightarrow> cmod (deriv f \<zeta> - deriv f \<xi>) * cmod z \<le> e/2 * cmod z" | 
| 950 | by (intro mult_right_mono [OF \<delta>]) (auto simp: dist_commute) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 951 | obtain \<epsilon> where "\<epsilon>>0" "ball \<xi> \<epsilon> \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 952 | by (metis openE [OF \<open>open S\<close> \<open>\<xi> \<in> S\<close>]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 953 | with \<open>\<delta>>0\<close> have "\<exists>\<delta>>0. \<forall>x. dist \<xi> x < \<delta> \<longrightarrow> onorm (\<lambda>v. deriv f x * v - deriv f \<xi> * v) \<le> e/2" | 
| 72259 | 954 | using \<section> | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 955 | apply (rule_tac x="min \<delta> \<epsilon>" in exI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 956 | apply (intro conjI allI impI Operator_Norm.onorm_le) | 
| 72259 | 957 | apply (force simp: mult_right_mono norm_mult [symmetric] left_diff_distrib \<delta>)+ | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 958 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 959 | with \<open>e>0\<close> show ?thesis by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 960 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 961 | have "inj ((*) (deriv f \<xi>))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 962 | using dnz by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 963 | then obtain g' where g': "linear g'" "g' \<circ> (*) (deriv f \<xi>) = id" | 
| 72259 | 964 | using linear_injective_left_inverse [of "(*) (deriv f \<xi>)"] by auto | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 965 | |
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 966 | have fder: "\<And>x. x \<in> S \<Longrightarrow> (f has_derivative (*) (deriv f x)) (at x)" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 967 | using \<open>open S\<close> has_field_derivative_imp_has_derivative holf holomorphic_derivI by blast | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 968 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 969 | apply (rule has_derivative_locally_injective [OF S, where f=f and f' = "\<lambda>z h. deriv f z * h" and g' = g']) | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 970 | using g' * by (simp_all add: fder linear_conv_bounded_linear that) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 971 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 972 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 973 | lemma has_complex_derivative_locally_invertible: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 974 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 975 | and S: "\<xi> \<in> S" "open S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 976 | and dnz: "deriv f \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 977 | obtains r where "r > 0" "ball \<xi> r \<subseteq> S" "open (f ` (ball \<xi> r))" "inj_on f (ball \<xi> r)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 978 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 979 | obtain r where "r > 0" "ball \<xi> r \<subseteq> S" "inj_on f (ball \<xi> r)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 980 | by (blast intro: that has_complex_derivative_locally_injective [OF assms]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 981 | then have \<xi>: "\<xi> \<in> ball \<xi> r" by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 982 | then have nc: "\<not> f constant_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 983 | using \<open>inj_on f (ball \<xi> r)\<close> injective_not_constant by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 984 | have holf': "f holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 985 | using \<open>ball \<xi> r \<subseteq> S\<close> holf holomorphic_on_subset by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 986 | have "open (f ` ball \<xi> r)" | 
| 72259 | 987 | by (simp add: \<open>inj_on f (ball \<xi> r)\<close> holf' open_mapping_thm3) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 988 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 989 | using \<open>0 < r\<close> \<open>ball \<xi> r \<subseteq> S\<close> \<open>inj_on f (ball \<xi> r)\<close> that by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 990 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 991 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 992 | lemma holomorphic_injective_imp_regular: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 993 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 994 | and "open S" and injf: "inj_on f S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 995 | and "\<xi> \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 996 | shows "deriv f \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 997 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 998 | obtain r where "r>0" and r: "ball \<xi> r \<subseteq> S" using assms by (blast elim!: openE) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 999 | have holf': "f holomorphic_on ball \<xi> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1000 | using \<open>ball \<xi> r \<subseteq> S\<close> holf holomorphic_on_subset by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1001 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1002 | proof (cases "\<forall>n>0. (deriv ^^ n) f \<xi> = 0") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1003 | case True | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1004 | have fcon: "f w = f \<xi>" if "w \<in> ball \<xi> r" for w | 
| 72259 | 1005 | by (meson open_ball True \<open>0 < r\<close> centre_in_ball connected_ball holf' | 
| 1006 | holomorphic_fun_eq_const_on_connected that) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1007 | have False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1008 | using fcon [of "\<xi> + r/2"] \<open>0 < r\<close> r injf unfolding inj_on_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1009 | by (metis \<open>\<xi> \<in> S\<close> contra_subsetD dist_commute fcon mem_ball perfect_choose_dist) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1010 | then show ?thesis .. | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1011 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1012 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1013 | then obtain n0 where n0: "n0 > 0 \<and> (deriv ^^ n0) f \<xi> \<noteq> 0" by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1014 | define n where [abs_def]: "n = (LEAST n. n > 0 \<and> (deriv ^^ n) f \<xi> \<noteq> 0)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1015 | have n_ne: "n > 0" "(deriv ^^ n) f \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1016 | using def_LeastI [OF n_def n0] by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1017 | have n_min: "\<And>k. 0 < k \<Longrightarrow> k < n \<Longrightarrow> (deriv ^^ k) f \<xi> = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1018 | using def_Least_le [OF n_def] not_le by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1019 | obtain g \<delta> where "0 < \<delta>" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1020 | and holg: "g holomorphic_on ball \<xi> \<delta>" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1021 | and fd: "\<And>w. w \<in> ball \<xi> \<delta> \<Longrightarrow> f w - f \<xi> = ((w - \<xi>) * g w) ^ n" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1022 | and gnz: "\<And>w. w \<in> ball \<xi> \<delta> \<Longrightarrow> g w \<noteq> 0" | 
| 72259 | 1023 | by (blast intro: n_min holomorphic_factor_order_of_zero_strong [OF holf \<open>open S\<close> \<open>\<xi> \<in> S\<close> n_ne]) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1024 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1025 | proof (cases "n=1") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1026 | case True | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1027 | with n_ne show ?thesis by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1028 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1029 | case False | 
| 72259 | 1030 | have "g holomorphic_on ball \<xi> (min r \<delta>)" | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1031 | using holg by (simp add: holomorphic_on_subset subset_ball) | 
| 72259 | 1032 | then have holgw: "(\<lambda>w. (w - \<xi>) * g w) holomorphic_on ball \<xi> (min r \<delta>)" | 
| 1033 | by (intro holomorphic_intros) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1034 | have gd: "\<And>w. dist \<xi> w < \<delta> \<Longrightarrow> (g has_field_derivative deriv g w) (at w)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1035 | using holg | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1036 | by (simp add: DERIV_deriv_iff_field_differentiable holomorphic_on_def at_within_open_NO_MATCH) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1037 | have *: "\<And>w. w \<in> ball \<xi> (min r \<delta>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1038 | \<Longrightarrow> ((\<lambda>w. (w - \<xi>) * g w) has_field_derivative ((w - \<xi>) * deriv g w + g w)) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1039 | (at w)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1040 | by (rule gd derivative_eq_intros | simp)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1041 | have [simp]: "deriv (\<lambda>w. (w - \<xi>) * g w) \<xi> \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1042 | using * [of \<xi>] \<open>0 < \<delta>\<close> \<open>0 < r\<close> by (simp add: DERIV_imp_deriv gnz) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1043 | obtain T where "\<xi> \<in> T" "open T" and Tsb: "T \<subseteq> ball \<xi> (min r \<delta>)" and oimT: "open ((\<lambda>w. (w - \<xi>) * g w) ` T)" | 
| 72259 | 1044 | using \<open>0 < r\<close> \<open>0 < \<delta>\<close> has_complex_derivative_locally_invertible [OF holgw, of \<xi>] | 
| 1045 | by force | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1046 | define U where "U = (\<lambda>w. (w - \<xi>) * g w) ` T" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1047 | have "open U" by (metis oimT U_def) | 
| 72228 
aa7cb84983e9
minor tidying, also s->S and t->T
 paulson <lp15@cam.ac.uk> parents: 
71201diff
changeset | 1048 | moreover have "0 \<in> U" | 
| 
aa7cb84983e9
minor tidying, also s->S and t->T
 paulson <lp15@cam.ac.uk> parents: 
71201diff
changeset | 1049 | using \<open>\<xi> \<in> T\<close> by (auto simp: U_def intro: image_eqI [where x = \<xi>]) | 
| 
aa7cb84983e9
minor tidying, also s->S and t->T
 paulson <lp15@cam.ac.uk> parents: 
71201diff
changeset | 1050 | ultimately obtain \<epsilon> where "\<epsilon>>0" and \<epsilon>: "cball 0 \<epsilon> \<subseteq> U" | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1051 | using \<open>open U\<close> open_contains_cball by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1052 | then have "\<epsilon> * exp(2 * of_real pi * \<i> * (0/n)) \<in> cball 0 \<epsilon>" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1053 | "\<epsilon> * exp(2 * of_real pi * \<i> * (1/n)) \<in> cball 0 \<epsilon>" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1054 | by (auto simp: norm_mult) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1055 | with \<epsilon> have "\<epsilon> * exp(2 * of_real pi * \<i> * (0/n)) \<in> U" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1056 | "\<epsilon> * exp(2 * of_real pi * \<i> * (1/n)) \<in> U" by blast+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1057 | then obtain y0 y1 where "y0 \<in> T" and y0: "(y0 - \<xi>) * g y0 = \<epsilon> * exp(2 * of_real pi * \<i> * (0/n))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1058 | and "y1 \<in> T" and y1: "(y1 - \<xi>) * g y1 = \<epsilon> * exp(2 * of_real pi * \<i> * (1/n))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1059 | by (auto simp: U_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1060 | then have "y0 \<in> ball \<xi> \<delta>" "y1 \<in> ball \<xi> \<delta>" using Tsb by auto | 
| 72259 | 1061 | then have "f y0 - f \<xi> = ((y0 - \<xi>) * g y0) ^ n" "f y1 - f \<xi> = ((y1 - \<xi>) * g y1) ^ n" | 
| 1062 | using fd by blast+ | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1063 | moreover have "y0 \<noteq> y1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1064 | using y0 y1 \<open>\<epsilon> > 0\<close> complex_root_unity_eq_1 [of n 1] \<open>n > 0\<close> False by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1065 | moreover have "T \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1066 | by (meson Tsb min.cobounded1 order_trans r subset_ball) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1067 | ultimately have False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1068 | using inj_onD [OF injf, of y0 y1] \<open>y0 \<in> T\<close> \<open>y1 \<in> T\<close> | 
| 72259 | 1069 | using complex_root_unity [of n 1] | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1070 | apply (simp add: y0 y1 power_mult_distrib) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1071 | apply (force simp: algebra_simps) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1072 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1073 | then show ?thesis .. | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1074 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1075 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1076 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1077 | |
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1078 | subsubsection \<open>Hence a nice clean inverse function theorem\<close> | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1079 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1080 | lemma has_field_derivative_inverse_strong: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1081 |   fixes f :: "'a::{euclidean_space,real_normed_field} \<Rightarrow> 'a"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1082 | shows "\<lbrakk>DERIV f x :> f'; f' \<noteq> 0; open S; x \<in> S; continuous_on S f; | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1083 | \<And>z. z \<in> S \<Longrightarrow> g (f z) = z\<rbrakk> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1084 | \<Longrightarrow> DERIV g (f x) :> inverse (f')" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1085 | unfolding has_field_derivative_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1086 | by (rule has_derivative_inverse_strong [of S x f g]) auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1087 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1088 | lemma has_field_derivative_inverse_strong_x: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1089 |   fixes f :: "'a::{euclidean_space,real_normed_field} \<Rightarrow> 'a"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1090 | shows "\<lbrakk>DERIV f (g y) :> f'; f' \<noteq> 0; open S; continuous_on S f; g y \<in> S; f(g y) = y; | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1091 | \<And>z. z \<in> S \<Longrightarrow> g (f z) = z\<rbrakk> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1092 | \<Longrightarrow> DERIV g y :> inverse (f')" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1093 | unfolding has_field_derivative_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1094 | by (rule has_derivative_inverse_strong_x [of S g y f]) auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1095 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1096 | proposition holomorphic_has_inverse: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1097 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1098 | and "open S" and injf: "inj_on f S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1099 | obtains g where "g holomorphic_on (f ` S)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1100 | "\<And>z. z \<in> S \<Longrightarrow> deriv f z * deriv g (f z) = 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1101 | "\<And>z. z \<in> S \<Longrightarrow> g(f z) = z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1102 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1103 | have ofs: "open (f ` S)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1104 | by (rule open_mapping_thm3 [OF assms]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1105 | have contf: "continuous_on S f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1106 | by (simp add: holf holomorphic_on_imp_continuous_on) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1107 | have *: "(the_inv_into S f has_field_derivative inverse (deriv f z)) (at (f z))" if "z \<in> S" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1108 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1109 | have 1: "(f has_field_derivative deriv f z) (at z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1110 | using DERIV_deriv_iff_field_differentiable \<open>z \<in> S\<close> \<open>open S\<close> holf holomorphic_on_imp_differentiable_at | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1111 | by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1112 | have 2: "deriv f z \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1113 | using \<open>z \<in> S\<close> \<open>open S\<close> holf holomorphic_injective_imp_regular injf by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1114 | show ?thesis | 
| 72259 | 1115 | proof (rule has_field_derivative_inverse_strong [OF 1 2 \<open>open S\<close> \<open>z \<in> S\<close>]) | 
| 1116 | show "continuous_on S f" | |
| 1117 | by (simp add: holf holomorphic_on_imp_continuous_on) | |
| 1118 | show "\<And>z. z \<in> S \<Longrightarrow> the_inv_into S f (f z) = z" | |
| 1119 | by (simp add: injf the_inv_into_f_f) | |
| 1120 | qed | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1121 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1122 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1123 | proof | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1124 | show "the_inv_into S f holomorphic_on f ` S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1125 | by (simp add: holomorphic_on_open ofs) (blast intro: *) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1126 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1127 | fix z assume "z \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1128 | have "deriv f z \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1129 | using \<open>z \<in> S\<close> \<open>open S\<close> holf holomorphic_injective_imp_regular injf by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1130 | then show "deriv f z * deriv (the_inv_into S f) (f z) = 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1131 | using * [OF \<open>z \<in> S\<close>] by (simp add: DERIV_imp_deriv) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1132 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1133 | fix z assume "z \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1134 | show "the_inv_into S f (f z) = z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1135 | by (simp add: \<open>z \<in> S\<close> injf the_inv_into_f_f) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1136 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1137 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1138 | |
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1139 | subsubsection \<open> Holomorphism of covering maps and lifts.\<close> | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1140 | |
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1141 | lemma covering_space_lift_is_holomorphic: | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1142 | assumes cov: "covering_space C p S" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1143 | and C: "open C" "p holomorphic_on C" | 
| 78248 
740b23f1138a
EXPERIMENTAL replacement of f ` A <= B by f : A -> B in Analysis
 paulson <lp15@cam.ac.uk> parents: 
77228diff
changeset | 1144 | and holf: "f holomorphic_on U" and fim: "f \<in> U \<rightarrow> S" and gim: "g \<in> U \<rightarrow> C" | 
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1145 | and contg: "continuous_on U g" and pg_f: "\<And>x. x \<in> U \<Longrightarrow> p(g x) = f x" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1146 | shows "g holomorphic_on U" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1147 | unfolding holomorphic_on_def | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1148 | proof (intro strip) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1149 | fix z | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1150 | assume "z \<in> U" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1151 | with fim have "f z \<in> S" by blast | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1152 | then obtain T \<V> where "f z \<in> T" and opeT: "openin (top_of_set S) T" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1153 | and UV: "\<Union>\<V> = C \<inter> p -` T" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1154 | and "\<And>W. W \<in> \<V> \<Longrightarrow> openin (top_of_set C) W" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1155 | and disV: "pairwise disjnt \<V>" and homeV: "\<And>W. W \<in> \<V> \<Longrightarrow> \<exists>q. homeomorphism W T p q" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1156 | using cov fim unfolding covering_space_def by meson | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1157 | then have "\<And>W. W \<in> \<V> \<Longrightarrow> open W \<and> W \<subseteq> C" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1158 | by (metis \<open>open C\<close> inf_le1 open_Int openin_open) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1159 | then obtain V where "V \<in> \<V>" "g z \<in> V" "open V" "V \<subseteq> C" | 
| 78248 
740b23f1138a
EXPERIMENTAL replacement of f ` A <= B by f : A -> B in Analysis
 paulson <lp15@cam.ac.uk> parents: 
77228diff
changeset | 1160 | by (metis IntI UnionE image_subset_iff vimageI UV \<open>f z \<in> T\<close> \<open>z \<in> U\<close> gim pg_f image_subset_iff_funcset) | 
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1161 | have holp: "p holomorphic_on V" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1162 | using \<open>V \<subseteq> C\<close> \<open>p holomorphic_on C\<close> holomorphic_on_subset by blast | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1163 | moreover have injp: "inj_on p V" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1164 | by (metis \<open>V \<in> \<V>\<close> homeV homeomorphism_def inj_on_inverseI) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1165 | ultimately | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1166 | obtain p' where holp': "p' holomorphic_on (p ` V)" and pp': "\<And>z. z \<in> V \<Longrightarrow> p'(p z) = z" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1167 | using \<open>open V\<close> holomorphic_has_inverse by metis | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1168 | have "z \<in> U \<inter> g -` V" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1169 | using \<open>g z \<in> V\<close> \<open>z \<in> U\<close> by blast | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1170 | moreover have "openin (top_of_set U) (U \<inter> g -` V)" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1171 | using continuous_openin_preimage [OF contg gim] | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1172 | by (meson \<open>open V\<close> contg continuous_openin_preimage_eq) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1173 | ultimately obtain \<epsilon> where "\<epsilon>>0" and e: "ball z \<epsilon> \<inter> U \<subseteq> g -` V" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1174 | by (force simp: openin_contains_ball) | 
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1175 | show "g field_differentiable at z within U" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1176 | proof (rule field_differentiable_transform_within) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1177 | show "(0::real) < \<epsilon>" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1178 | by (simp add: \<open>0 < \<epsilon>\<close>) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1179 | show "z \<in> U" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1180 | by (simp add: \<open>z \<in> U\<close>) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1181 | show "(p' o f) x' = g x'" if "x' \<in> U" "dist x' z < \<epsilon>" for x' | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1182 | using that | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1183 | by (metis Int_iff comp_apply dist_commute e mem_ball pg_f pp' subsetD vimage_eq) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1184 | have "open (p ` V)" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1185 | using \<open>open V\<close> holp injp open_mapping_thm3 by force | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1186 | moreover have "f z \<in> p ` V" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1187 | by (metis \<open>z \<in> U\<close> image_iff pg_f \<open>g z \<in> V\<close>) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1188 | ultimately have "p' field_differentiable at (f z)" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1189 | using holomorphic_on_imp_differentiable_at holp' by blast | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1190 | moreover have "f field_differentiable at z within U" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1191 | by (metis (no_types) \<open>z \<in> U\<close> holf holomorphic_on_def) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1192 | ultimately show "(p' o f) field_differentiable at z within U" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1193 | by (metis (no_types) field_differentiable_at_within field_differentiable_compose_within) | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1194 | qed | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1195 | qed | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1196 | |
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1197 | lemma covering_space_lift_holomorphic: | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1198 | assumes cov: "covering_space C p S" | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1199 | and C: "open C" "p holomorphic_on C" | 
| 78248 
740b23f1138a
EXPERIMENTAL replacement of f ` A <= B by f : A -> B in Analysis
 paulson <lp15@cam.ac.uk> parents: 
77228diff
changeset | 1200 | and f: "f holomorphic_on U" "f \<in> U \<rightarrow> S" | 
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1201 | and U: "simply_connected U" "locally path_connected U" | 
| 78248 
740b23f1138a
EXPERIMENTAL replacement of f ` A <= B by f : A -> B in Analysis
 paulson <lp15@cam.ac.uk> parents: 
77228diff
changeset | 1202 | obtains g where "g holomorphic_on U" "g \<in> U \<rightarrow> C" "\<And>y. y \<in> U \<Longrightarrow> p(g y) = f y" | 
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1203 | proof - | 
| 78248 
740b23f1138a
EXPERIMENTAL replacement of f ` A <= B by f : A -> B in Analysis
 paulson <lp15@cam.ac.uk> parents: 
77228diff
changeset | 1204 | obtain g where "continuous_on U g" "g \<in> U \<rightarrow> C" "\<And>y. y \<in> U \<Longrightarrow> p(g y) = f y" | 
| 
740b23f1138a
EXPERIMENTAL replacement of f ` A <= B by f : A -> B in Analysis
 paulson <lp15@cam.ac.uk> parents: 
77228diff
changeset | 1205 | using covering_space_lift [OF cov U] f holomorphic_on_imp_continuous_on by blast | 
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1206 | then show ?thesis | 
| 78248 
740b23f1138a
EXPERIMENTAL replacement of f ` A <= B by f : A -> B in Analysis
 paulson <lp15@cam.ac.uk> parents: 
77228diff
changeset | 1207 | by (metis C cov covering_space_lift_is_holomorphic f image_subset_iff_funcset that) | 
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1208 | qed | 
| 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1209 | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1210 | subsection\<open>The Schwarz Lemma\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1211 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1212 | lemma Schwarz1: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1213 | assumes holf: "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1214 | and contf: "continuous_on (closure S) f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1215 | and S: "open S" "connected S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1216 | and boS: "bounded S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1217 |       and "S \<noteq> {}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1218 | obtains w where "w \<in> frontier S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1219 | "\<And>z. z \<in> closure S \<Longrightarrow> norm (f z) \<le> norm (f w)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1220 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1221 | have connf: "continuous_on (closure S) (norm o f)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1222 | using contf continuous_on_compose continuous_on_norm_id by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1223 | have coc: "compact (closure S)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1224 | by (simp add: \<open>bounded S\<close> bounded_closure compact_eq_bounded_closed) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1225 | then obtain x where x: "x \<in> closure S" and xmax: "\<And>z. z \<in> closure S \<Longrightarrow> norm(f z) \<le> norm(f x)" | 
| 72259 | 1226 |     using continuous_attains_sup [OF _ _ connf] \<open>S \<noteq> {}\<close> by auto
 | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1227 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1228 | proof (cases "x \<in> frontier S") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1229 | case True | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1230 | then show ?thesis using that xmax by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1231 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1232 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1233 | then have "x \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1234 | using \<open>open S\<close> frontier_def interior_eq x by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1235 | then have "f constant_on S" | 
| 72259 | 1236 | proof (rule maximum_modulus_principle [OF holf S \<open>open S\<close> order_refl]) | 
| 1237 | show "\<And>z. z \<in> S \<Longrightarrow> cmod (f z) \<le> cmod (f x)" | |
| 1238 | using closure_subset by (blast intro: xmax) | |
| 1239 | qed | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1240 | then have "f constant_on (closure S)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1241 | by (rule constant_on_closureI [OF _ contf]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1242 | then obtain c where c: "\<And>x. x \<in> closure S \<Longrightarrow> f x = c" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1243 | by (meson constant_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1244 | obtain w where "w \<in> frontier S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1245 | by (metis coc all_not_in_conv assms(6) closure_UNIV frontier_eq_empty not_compact_UNIV) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1246 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1247 | by (simp add: c frontier_def that) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1248 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1249 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1250 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1251 | lemma Schwarz2: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1252 | "\<lbrakk>f holomorphic_on ball 0 r; | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1253 | 0 < s; ball w s \<subseteq> ball 0 r; | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1254 | \<And>z. norm (w-z) < s \<Longrightarrow> norm(f z) \<le> norm(f w)\<rbrakk> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1255 | \<Longrightarrow> f constant_on ball 0 r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1256 | by (rule maximum_modulus_principle [where U = "ball w s" and \<xi> = w]) (simp_all add: dist_norm) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1257 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1258 | lemma Schwarz3: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1259 | assumes holf: "f holomorphic_on (ball 0 r)" and [simp]: "f 0 = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1260 | obtains h where "h holomorphic_on (ball 0 r)" and "\<And>z. norm z < r \<Longrightarrow> f z = z * (h z)" and "deriv f 0 = h 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1261 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1262 | define h where "h z = (if z = 0 then deriv f 0 else f z / z)" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1263 | have d0: "deriv f 0 = h 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1264 | by (simp add: h_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1265 | moreover have "h holomorphic_on (ball 0 r)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1266 | by (rule pole_theorem_open_0 [OF holf, of 0]) (auto simp: h_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1267 | moreover have "norm z < r \<Longrightarrow> f z = z * h z" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1268 | by (simp add: h_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1269 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1270 | using that by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1271 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1272 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1273 | proposition Schwarz_Lemma: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1274 | assumes holf: "f holomorphic_on (ball 0 1)" and [simp]: "f 0 = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1275 | and no: "\<And>z. norm z < 1 \<Longrightarrow> norm (f z) < 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1276 | and \<xi>: "norm \<xi> < 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1277 | shows "norm (f \<xi>) \<le> norm \<xi>" and "norm(deriv f 0) \<le> 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1278 | and "((\<exists>z. norm z < 1 \<and> z \<noteq> 0 \<and> norm(f z) = norm z) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1279 | \<or> norm(deriv f 0) = 1) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1280 | \<Longrightarrow> \<exists>\<alpha>. (\<forall>z. norm z < 1 \<longrightarrow> f z = \<alpha> * z) \<and> norm \<alpha> = 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1281 | (is "?P \<Longrightarrow> ?Q") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1282 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1283 | obtain h where holh: "h holomorphic_on (ball 0 1)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1284 | and fz_eq: "\<And>z. norm z < 1 \<Longrightarrow> f z = z * (h z)" and df0: "deriv f 0 = h 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1285 | by (rule Schwarz3 [OF holf]) auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1286 | have noh_le: "norm (h z) \<le> 1" if z: "norm z < 1" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1287 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1288 | have "norm (h z) < a" if a: "1 < a" for a | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1289 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1290 | have "max (inverse a) (norm z) < 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1291 | using z a by (simp_all add: inverse_less_1_iff) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1292 | then obtain r where r: "max (inverse a) (norm z) < r" and "r < 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1293 | using Rats_dense_in_real by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1294 | then have nzr: "norm z < r" and ira: "inverse r < a" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1295 | using z a less_imp_inverse_less by force+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1296 | then have "0 < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1297 | by (meson norm_not_less_zero not_le order.strict_trans2) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1298 | have holh': "h holomorphic_on ball 0 r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1299 | by (meson holh \<open>r < 1\<close> holomorphic_on_subset less_eq_real_def subset_ball) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1300 | have conth': "continuous_on (cball 0 r) h" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1301 | by (meson \<open>r < 1\<close> dual_order.trans holh holomorphic_on_imp_continuous_on holomorphic_on_subset mem_ball_0 mem_cball_0 not_less subsetI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1302 | obtain w where w: "norm w = r" and lenw: "\<And>z. norm z < r \<Longrightarrow> norm(h z) \<le> norm(h w)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1303 | apply (rule Schwarz1 [OF holh']) using conth' \<open>0 < r\<close> by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1304 | have "h w = f w / w" using fz_eq \<open>r < 1\<close> nzr w by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1305 | then have "cmod (h z) < inverse r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1306 | by (metis \<open>0 < r\<close> \<open>r < 1\<close> divide_strict_right_mono inverse_eq_divide | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1307 | le_less_trans lenw no norm_divide nzr w) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1308 | then show ?thesis using ira by linarith | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1309 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1310 | then show "norm (h z) \<le> 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1311 | using not_le by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1312 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1313 | show "cmod (f \<xi>) \<le> cmod \<xi>" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1314 | proof (cases "\<xi> = 0") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1315 | case True then show ?thesis by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1316 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1317 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1318 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1319 | by (simp add: noh_le fz_eq \<xi> mult_left_le norm_mult) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1320 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1321 | show no_df0: "norm(deriv f 0) \<le> 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1322 | by (simp add: \<open>\<And>z. cmod z < 1 \<Longrightarrow> cmod (h z) \<le> 1\<close> df0) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1323 | show "?Q" if "?P" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1324 | using that | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1325 | proof | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1326 | assume "\<exists>z. cmod z < 1 \<and> z \<noteq> 0 \<and> cmod (f z) = cmod z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1327 | then obtain \<gamma> where \<gamma>: "cmod \<gamma> < 1" "\<gamma> \<noteq> 0" "cmod (f \<gamma>) = cmod \<gamma>" by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1328 | then have [simp]: "norm (h \<gamma>) = 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1329 | by (simp add: fz_eq norm_mult) | 
| 72259 | 1330 | have \<section>: "ball \<gamma> (1 - cmod \<gamma>) \<subseteq> ball 0 1" | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1331 | by (simp add: ball_subset_ball_iff) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1332 | moreover have "\<And>z. cmod (\<gamma> - z) < 1 - cmod \<gamma> \<Longrightarrow> cmod (h z) \<le> cmod (h \<gamma>)" | 
| 72259 | 1333 | by (metis \<open>cmod (h \<gamma>) = 1\<close> \<section> dist_0_norm dist_complex_def in_mono mem_ball noh_le) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1334 | ultimately obtain c where c: "\<And>z. norm z < 1 \<Longrightarrow> h z = c" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1335 | using Schwarz2 [OF holh, of "1 - norm \<gamma>" \<gamma>, unfolded constant_on_def] \<gamma> by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1336 | then have "norm c = 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1337 | using \<gamma> by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1338 | with c show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1339 | using fz_eq by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1340 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1341 | assume [simp]: "cmod (deriv f 0) = 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1342 | then obtain c where c: "\<And>z. norm z < 1 \<Longrightarrow> h z = c" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1343 | using Schwarz2 [OF holh zero_less_one, of 0, unfolded constant_on_def] df0 noh_le | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1344 | by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1345 | moreover have "norm c = 1" using df0 c by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1346 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1347 | using fz_eq by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1348 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1349 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1350 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1351 | corollary Schwarz_Lemma': | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1352 | assumes holf: "f holomorphic_on (ball 0 1)" and [simp]: "f 0 = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1353 | and no: "\<And>z. norm z < 1 \<Longrightarrow> norm (f z) < 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1354 | shows "((\<forall>\<xi>. norm \<xi> < 1 \<longrightarrow> norm (f \<xi>) \<le> norm \<xi>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1355 | \<and> norm(deriv f 0) \<le> 1) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1356 | \<and> (((\<exists>z. norm z < 1 \<and> z \<noteq> 0 \<and> norm(f z) = norm z) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1357 | \<or> norm(deriv f 0) = 1) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1358 | \<longrightarrow> (\<exists>\<alpha>. (\<forall>z. norm z < 1 \<longrightarrow> f z = \<alpha> * z) \<and> norm \<alpha> = 1))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1359 | using Schwarz_Lemma [OF assms] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1360 | by (metis (no_types) norm_eq_zero zero_less_one) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1361 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1362 | subsection\<open>The Schwarz reflection principle\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1363 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1364 | lemma hol_pal_lem0: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1365 | assumes "d \<bullet> a \<le> k" "k \<le> d \<bullet> b" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1366 | obtains c where | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1367 | "c \<in> closed_segment a b" "d \<bullet> c = k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1368 | "\<And>z. z \<in> closed_segment a c \<Longrightarrow> d \<bullet> z \<le> k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1369 | "\<And>z. z \<in> closed_segment c b \<Longrightarrow> k \<le> d \<bullet> z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1370 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1371 | obtain c where cin: "c \<in> closed_segment a b" and keq: "k = d \<bullet> c" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1372 | using connected_ivt_hyperplane [of "closed_segment a b" a b d k] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1373 | by (auto simp: assms) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1374 |   have "closed_segment a c \<subseteq> {z. d \<bullet> z \<le> k}"  "closed_segment c b \<subseteq> {z. k \<le> d \<bullet> z}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1375 | unfolding segment_convex_hull using assms keq | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1376 | by (auto simp: convex_halfspace_le convex_halfspace_ge hull_minimal) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1377 | then show ?thesis using cin that by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1378 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1379 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1380 | lemma hol_pal_lem1: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1381 | assumes "convex S" "open S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1382 | and abc: "a \<in> S" "b \<in> S" "c \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1383 | "d \<noteq> 0" and lek: "d \<bullet> a \<le> k" "d \<bullet> b \<le> k" "d \<bullet> c \<le> k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1384 |       and holf1: "f holomorphic_on {z. z \<in> S \<and> d \<bullet> z < k}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1385 | and contf: "continuous_on S f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1386 | shows "contour_integral (linepath a b) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1387 | contour_integral (linepath b c) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1388 | contour_integral (linepath c a) f = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1389 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1390 |   have "interior (convex hull {a, b, c}) \<subseteq> interior(S \<inter> {x. d \<bullet> x \<le> k})"
 | 
| 72259 | 1391 | proof (intro interior_mono hull_minimal) | 
| 1392 |     show "{a, b, c} \<subseteq> S \<inter> {x. d \<bullet> x \<le> k}"
 | |
| 1393 | by (simp add: abc lek) | |
| 1394 |     show "convex (S \<inter> {x. d \<bullet> x \<le> k})"
 | |
| 1395 | by (rule convex_Int [OF \<open>convex S\<close> convex_halfspace_le]) | |
| 1396 | qed | |
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1397 |   also have "\<dots> \<subseteq> {z \<in> S. d \<bullet> z < k}"
 | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1398 | by (force simp: interior_open [OF \<open>open S\<close>] \<open>d \<noteq> 0\<close>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1399 |   finally have *: "interior (convex hull {a, b, c}) \<subseteq> {z \<in> S. d \<bullet> z < k}" .
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1400 |   have "continuous_on (convex hull {a,b,c}) f"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1401 | using \<open>convex S\<close> contf abc continuous_on_subset subset_hull | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1402 | by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1403 |   moreover have "f holomorphic_on interior (convex hull {a,b,c})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1404 | by (rule holomorphic_on_subset [OF holf1 *]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1405 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1406 | using Cauchy_theorem_triangle_interior has_chain_integral_chain_integral3 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1407 | by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1408 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1409 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1410 | lemma hol_pal_lem2: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1411 | assumes S: "convex S" "open S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1412 | and abc: "a \<in> S" "b \<in> S" "c \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1413 | and "d \<noteq> 0" and lek: "d \<bullet> a \<le> k" "d \<bullet> b \<le> k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1414 |       and holf1: "f holomorphic_on {z. z \<in> S \<and> d \<bullet> z < k}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1415 |       and holf2: "f holomorphic_on {z. z \<in> S \<and> k < d \<bullet> z}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1416 | and contf: "continuous_on S f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1417 | shows "contour_integral (linepath a b) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1418 | contour_integral (linepath b c) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1419 | contour_integral (linepath c a) f = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1420 | proof (cases "d \<bullet> c \<le> k") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1421 | case True show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1422 | by (rule hol_pal_lem1 [OF S abc \<open>d \<noteq> 0\<close> lek True holf1 contf]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1423 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1424 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1425 | then have "d \<bullet> c > k" by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1426 | obtain a' where a': "a' \<in> closed_segment b c" and "d \<bullet> a' = k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1427 | and ba': "\<And>z. z \<in> closed_segment b a' \<Longrightarrow> d \<bullet> z \<le> k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1428 | and a'c: "\<And>z. z \<in> closed_segment a' c \<Longrightarrow> k \<le> d \<bullet> z" | 
| 72259 | 1429 | using False hol_pal_lem0 [of d b k c, OF \<open>d \<bullet> b \<le> k\<close>] by auto | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1430 | obtain b' where b': "b' \<in> closed_segment a c" and "d \<bullet> b' = k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1431 | and ab': "\<And>z. z \<in> closed_segment a b' \<Longrightarrow> d \<bullet> z \<le> k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1432 | and b'c: "\<And>z. z \<in> closed_segment b' c \<Longrightarrow> k \<le> d \<bullet> z" | 
| 72259 | 1433 | using False hol_pal_lem0 [of d a k c, OF \<open>d \<bullet> a \<le> k\<close>] by auto | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1434 | have a'b': "a' \<in> S \<and> b' \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1435 | using a' abc b' convex_contains_segment \<open>convex S\<close> by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1436 | have "continuous_on (closed_segment c a) f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1437 | by (meson abc contf continuous_on_subset convex_contains_segment \<open>convex S\<close>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1438 | then have 1: "contour_integral (linepath c a) f = | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1439 | contour_integral (linepath c b') f + contour_integral (linepath b' a) f" | 
| 72259 | 1440 | using b' closed_segment_commute contour_integral_split_linepath by blast | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1441 | have "continuous_on (closed_segment b c) f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1442 | by (meson abc contf continuous_on_subset convex_contains_segment \<open>convex S\<close>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1443 | then have 2: "contour_integral (linepath b c) f = | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1444 | contour_integral (linepath b a') f + contour_integral (linepath a' c) f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1445 | by (rule contour_integral_split_linepath [OF _ a']) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1446 | have 3: "contour_integral (reversepath (linepath b' a')) f = | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1447 | - contour_integral (linepath b' a') f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1448 | by (rule contour_integral_reversepath [OF valid_path_linepath]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1449 | have fcd_le: "f field_differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1450 |                if "x \<in> interior S \<and> x \<in> interior {x. d \<bullet> x \<le> k}" for x
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1451 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1452 |     have "f holomorphic_on S \<inter> {c. d \<bullet> c < k}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1453 | by (metis (no_types) Collect_conj_eq Collect_mem_eq holf1) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1454 | then have "\<exists>C D. x \<in> interior C \<inter> interior D \<and> f holomorphic_on interior C \<inter> interior D" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1455 | using that | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1456 | by (metis Collect_mem_eq Int_Collect \<open>d \<noteq> 0\<close> interior_halfspace_le interior_open \<open>open S\<close>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1457 | then show "f field_differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1458 | by (metis at_within_interior holomorphic_on_def interior_Int interior_interior) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1459 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1460 | have ab_le: "\<And>x. x \<in> closed_segment a b \<Longrightarrow> d \<bullet> x \<le> k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1461 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1462 | fix x :: complex | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1463 | assume "x \<in> closed_segment a b" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1464 | then have "\<And>C. x \<in> C \<or> b \<notin> C \<or> a \<notin> C \<or> \<not> convex C" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1465 | by (meson contra_subsetD convex_contains_segment) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1466 | then show "d \<bullet> x \<le> k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1467 | by (metis lek convex_halfspace_le mem_Collect_eq) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1468 | qed | 
| 72259 | 1469 |   have cs: "closed_segment a' b' \<subseteq> {x. d \<bullet> x \<le> k} \<and> closed_segment b' a \<subseteq> {x. d \<bullet> x \<le> k}"
 | 
| 1470 | by (simp add: \<open>d \<bullet> a' = k\<close> \<open>d \<bullet> b' = k\<close> closed_segment_subset convex_halfspace_le lek(1)) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1471 |   have "continuous_on (S \<inter> {x. d \<bullet> x \<le> k}) f" using contf
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1472 | by (simp add: continuous_on_subset) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1473 | then have "(f has_contour_integral 0) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1474 | (linepath a b +++ linepath b a' +++ linepath a' b' +++ linepath b' a)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1475 |     apply (rule Cauchy_theorem_convex [where K = "{}"])
 | 
| 72259 | 1476 | by (simp_all add: path_image_join convex_Int convex_halfspace_le \<open>convex S\<close> fcd_le ab_le | 
| 1477 | closed_segment_subset abc a'b' ba' cs) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1478 | then have 4: "contour_integral (linepath a b) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1479 | contour_integral (linepath b a') f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1480 | contour_integral (linepath a' b') f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1481 | contour_integral (linepath b' a) f = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1482 | by (rule has_chain_integral_chain_integral4) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1483 | have fcd_ge: "f field_differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1484 |                if "x \<in> interior S \<and> x \<in> interior {x. k \<le> d \<bullet> x}" for x
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1485 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1486 |     have f2: "f holomorphic_on S \<inter> {c. k < d \<bullet> c}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1487 | by (metis (full_types) Collect_conj_eq Collect_mem_eq holf2) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1488 | have f3: "interior S = S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1489 | by (simp add: interior_open \<open>open S\<close>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1490 |     then have "x \<in> S \<inter> interior {c. k \<le> d \<bullet> c}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1491 | using that by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1492 | then show "f field_differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1493 | using f3 f2 unfolding holomorphic_on_def | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1494 | by (metis (no_types) \<open>d \<noteq> 0\<close> at_within_interior interior_Int interior_halfspace_ge interior_interior) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1495 | qed | 
| 72259 | 1496 |   have cs: "closed_segment c b' \<subseteq> {x. k \<le> d \<bullet> x} \<and> closed_segment b' a' \<subseteq> {x. k \<le> d \<bullet> x}"
 | 
| 1497 | by (simp add: \<open>d \<bullet> a' = k\<close> b'c closed_segment_subset convex_halfspace_ge) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1498 |   have "continuous_on (S \<inter> {x. k \<le> d \<bullet> x}) f" using contf
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1499 | by (simp add: continuous_on_subset) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1500 | then have "(f has_contour_integral 0) (linepath a' c +++ linepath c b' +++ linepath b' a')" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1501 |     apply (rule Cauchy_theorem_convex [where K = "{}"])
 | 
| 72259 | 1502 | by (simp_all add: path_image_join convex_Int convex_halfspace_ge \<open>convex S\<close> | 
| 1503 | fcd_ge closed_segment_subset abc a'b' a'c cs) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1504 | then have 5: "contour_integral (linepath a' c) f + contour_integral (linepath c b') f + contour_integral (linepath b' a') f = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1505 | by (rule has_chain_integral_chain_integral3) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1506 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1507 | using 1 2 3 4 5 by (metis add.assoc eq_neg_iff_add_eq_0 reversepath_linepath) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1508 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1509 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1510 | lemma hol_pal_lem3: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1511 | assumes S: "convex S" "open S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1512 | and abc: "a \<in> S" "b \<in> S" "c \<in> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1513 | and "d \<noteq> 0" and lek: "d \<bullet> a \<le> k" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1514 |       and holf1: "f holomorphic_on {z. z \<in> S \<and> d \<bullet> z < k}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1515 |       and holf2: "f holomorphic_on {z. z \<in> S \<and> k < d \<bullet> z}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1516 | and contf: "continuous_on S f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1517 | shows "contour_integral (linepath a b) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1518 | contour_integral (linepath b c) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1519 | contour_integral (linepath c a) f = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1520 | proof (cases "d \<bullet> b \<le> k") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1521 | case True show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1522 | by (rule hol_pal_lem2 [OF S abc \<open>d \<noteq> 0\<close> lek True holf1 holf2 contf]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1523 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1524 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1525 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1526 | proof (cases "d \<bullet> c \<le> k") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1527 | case True | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1528 | have "contour_integral (linepath c a) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1529 | contour_integral (linepath a b) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1530 | contour_integral (linepath b c) f = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1531 | by (rule hol_pal_lem2 [OF S \<open>c \<in> S\<close> \<open>a \<in> S\<close> \<open>b \<in> S\<close> \<open>d \<noteq> 0\<close> \<open>d \<bullet> c \<le> k\<close> lek holf1 holf2 contf]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1532 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1533 | by (simp add: algebra_simps) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1534 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1535 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1536 | have "contour_integral (linepath b c) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1537 | contour_integral (linepath c a) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1538 | contour_integral (linepath a b) f = 0" | 
| 72259 | 1539 | using hol_pal_lem2 [OF S \<open>b \<in> S\<close> \<open>c \<in> S\<close> \<open>a \<in> S\<close>, of "-d" "-k"] | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1540 | using \<open>d \<noteq> 0\<close> \<open>\<not> d \<bullet> b \<le> k\<close> False by (simp_all add: holf1 holf2 contf) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1541 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1542 | by (simp add: algebra_simps) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1543 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1544 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1545 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1546 | lemma hol_pal_lem4: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1547 | assumes S: "convex S" "open S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1548 | and abc: "a \<in> S" "b \<in> S" "c \<in> S" and "d \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1549 |       and holf1: "f holomorphic_on {z. z \<in> S \<and> d \<bullet> z < k}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1550 |       and holf2: "f holomorphic_on {z. z \<in> S \<and> k < d \<bullet> z}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1551 | and contf: "continuous_on S f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1552 | shows "contour_integral (linepath a b) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1553 | contour_integral (linepath b c) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1554 | contour_integral (linepath c a) f = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1555 | proof (cases "d \<bullet> a \<le> k") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1556 | case True show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1557 | by (rule hol_pal_lem3 [OF S abc \<open>d \<noteq> 0\<close> True holf1 holf2 contf]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1558 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1559 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1560 | show ?thesis | 
| 72259 | 1561 | using \<open>d \<noteq> 0\<close> hol_pal_lem3 [OF S abc, of "-d" "-k"] False | 
| 1562 | by (simp_all add: holf1 holf2 contf) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1563 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1564 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1565 | lemma holomorphic_on_paste_across_line: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1566 | assumes S: "open S" and "d \<noteq> 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1567 |       and holf1: "f holomorphic_on (S \<inter> {z. d \<bullet> z < k})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1568 |       and holf2: "f holomorphic_on (S \<inter> {z. k < d \<bullet> z})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1569 | and contf: "continuous_on S f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1570 | shows "f holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1571 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1572 | have *: "\<exists>t. open t \<and> p \<in> t \<and> continuous_on t f \<and> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1573 |                (\<forall>a b c. convex hull {a, b, c} \<subseteq> t \<longrightarrow>
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1574 | contour_integral (linepath a b) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1575 | contour_integral (linepath b c) f + | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1576 | contour_integral (linepath c a) f = 0)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1577 | if "p \<in> S" for p | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1578 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1579 | obtain e where "e>0" and e: "ball p e \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1580 | using \<open>p \<in> S\<close> openE S by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1581 | then have "continuous_on (ball p e) f" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1582 | using contf continuous_on_subset by blast | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1583 | moreover | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1584 |     have "{z. dist p z < e \<and> d \<bullet> z < k} \<subseteq> S \<inter> {z. d \<bullet> z < k}" 
 | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1585 |          "{z. dist p z < e \<and> k < d \<bullet> z} \<subseteq> S \<inter> {z. k < d \<bullet> z}"
 | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1586 | using e by auto | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1587 |     then have "f holomorphic_on {z. dist p z < e \<and> d \<bullet> z < k}" 
 | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1588 |               "f holomorphic_on {z. dist p z < e \<and> k < d \<bullet> z}"
 | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1589 | using holomorphic_on_subset holf1 holf2 by presburger+ | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1590 | ultimately show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1591 | apply (rule_tac x="ball p e" in exI) | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1592 | using \<open>e > 0\<close> e \<open>d \<noteq> 0\<close> hol_pal_lem4 [of "ball p e" _ _ _ d _ k] | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1593 | by (force simp: subset_hull) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1594 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1595 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1596 | by (blast intro: * Morera_local_triangle analytic_imp_holomorphic) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1597 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1598 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1599 | proposition Schwarz_reflection: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1600 | assumes "open S" and cnjs: "cnj ` S \<subseteq> S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1601 |       and  holf: "f holomorphic_on (S \<inter> {z. 0 < Im z})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1602 |       and contf: "continuous_on (S \<inter> {z. 0 \<le> Im z}) f"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1603 | and f: "\<And>z. \<lbrakk>z \<in> S; z \<in> \<real>\<rbrakk> \<Longrightarrow> (f z) \<in> \<real>" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1604 | shows "(\<lambda>z. if 0 \<le> Im z then f z else cnj(f(cnj z))) holomorphic_on S" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1605 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1606 |   have 1: "(\<lambda>z. if 0 \<le> Im z then f z else cnj (f (cnj z))) holomorphic_on (S \<inter> {z. 0 < Im z})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1607 | by (force intro: iffD1 [OF holomorphic_cong [OF refl] holf]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1608 |   have cont_cfc: "continuous_on (S \<inter> {z. Im z \<le> 0}) (cnj o f o cnj)"
 | 
| 72259 | 1609 | using cnjs | 
| 1610 | by (intro continuous_intros continuous_on_compose continuous_on_subset [OF contf]) auto | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1611 |   have "cnj \<circ> f \<circ> cnj field_differentiable at x within S \<inter> {z. Im z < 0}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1612 |         if "x \<in> S" "Im x < 0" "f field_differentiable at (cnj x) within S \<inter> {z. 0 < Im z}" for x
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1613 | using that | 
| 72259 | 1614 | apply (clarsimp simp add: field_differentiable_def has_field_derivative_iff Lim_within dist_norm) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1615 | apply (rule_tac x="cnj f'" in exI) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1616 | apply (elim all_forward ex_forward conj_forward imp_forward asm_rl, clarify) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1617 | apply (drule_tac x="cnj xa" in bspec) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1618 | using cnjs apply force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1619 | apply (metis complex_cnj_cnj complex_cnj_diff complex_cnj_divide complex_mod_cnj) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1620 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1621 |   then have hol_cfc: "(cnj o f o cnj) holomorphic_on (S \<inter> {z. Im z < 0})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1622 | using holf cnjs | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1623 | by (force simp: holomorphic_on_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1624 |   have 2: "(\<lambda>z. if 0 \<le> Im z then f z else cnj (f (cnj z))) holomorphic_on (S \<inter> {z. Im z < 0})"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1625 | apply (rule iffD1 [OF holomorphic_cong [OF refl]]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1626 | using hol_cfc by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1627 |   have [simp]: "(S \<inter> {z. 0 \<le> Im z}) \<union> (S \<inter> {z. Im z \<le> 0}) = S"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1628 | by force | 
| 72259 | 1629 | have eq: "\<And>z. \<lbrakk>z \<in> S; Im z \<le> 0; 0 \<le> Im z\<rbrakk> \<Longrightarrow> f z = cnj (f (cnj z))" | 
| 1630 | using f Reals_cnj_iff complex_is_Real_iff by auto | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1631 |   have "continuous_on ((S \<inter> {z. 0 \<le> Im z}) \<union> (S \<inter> {z. Im z \<le> 0}))
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1632 | (\<lambda>z. if 0 \<le> Im z then f z else cnj (f (cnj z)))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1633 | apply (rule continuous_on_cases_local) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1634 | using cont_cfc contf | 
| 72259 | 1635 | by (simp_all add: closedin_closed_Int closed_halfspace_Im_le closed_halfspace_Im_ge eq) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1636 | then have 3: "continuous_on S (\<lambda>z. if 0 \<le> Im z then f z else cnj (f (cnj z)))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1637 | by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1638 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1639 | apply (rule holomorphic_on_paste_across_line [OF \<open>open S\<close>, of "- \<i>" _ 0]) | 
| 72259 | 1640 | using 1 2 3 by auto | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1641 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1642 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1643 | subsection\<open>Bloch's theorem\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1644 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1645 | lemma Bloch_lemma_0: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1646 | assumes holf: "f holomorphic_on cball 0 r" and "0 < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1647 | and [simp]: "f 0 = 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1648 | and le: "\<And>z. norm z < r \<Longrightarrow> norm(deriv f z) \<le> 2 * norm(deriv f 0)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1649 | shows "ball 0 ((3 - 2 * sqrt 2) * r * norm(deriv f 0)) \<subseteq> f ` ball 0 r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1650 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1651 | have "sqrt 2 < 3/2" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1652 | by (rule real_less_lsqrt) (auto simp: power2_eq_square) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1653 | then have sq3: "0 < 3 - 2 * sqrt 2" by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1654 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1655 | proof (cases "deriv f 0 = 0") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1656 | case True then show ?thesis by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1657 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1658 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1659 | define C where "C = 2 * norm(deriv f 0)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1660 | have "0 < C" using False by (simp add: C_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1661 | have holf': "f holomorphic_on ball 0 r" using holf | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1662 | using ball_subset_cball holomorphic_on_subset by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1663 | then have holdf': "deriv f holomorphic_on ball 0 r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1664 | by (rule holomorphic_deriv [OF _ open_ball]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1665 | have "Le1": "norm(deriv f z - deriv f 0) \<le> norm z / (r - norm z) * C" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1666 | if "norm z < r" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1667 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1668 | have T1: "norm(deriv f z - deriv f 0) \<le> norm z / (R - norm z) * C" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1669 | if R: "norm z < R" "R < r" for R | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1670 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1671 | have "0 < R" using R | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1672 | by (metis less_trans norm_zero zero_less_norm_iff) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1673 | have df_le: "\<And>x. norm x < r \<Longrightarrow> norm (deriv f x) \<le> C" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1674 | using le by (simp add: C_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1675 | have hol_df: "deriv f holomorphic_on cball 0 R" | 
| 72259 | 1676 | using R holdf' holomorphic_on_subset by auto | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1677 | have *: "((\<lambda>w. deriv f w / (w - z)) has_contour_integral 2 * pi * \<i> * deriv f z) (circlepath 0 R)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1678 | if "norm z < R" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1679 | using \<open>0 < R\<close> that Cauchy_integral_formula_convex_simple [OF convex_cball hol_df, of _ "circlepath 0 R"] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1680 | by (force simp: winding_number_circlepath) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1681 | have **: "((\<lambda>x. deriv f x / (x - z) - deriv f x / x) has_contour_integral | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1682 | of_real (2 * pi) * \<i> * (deriv f z - deriv f 0)) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1683 | (circlepath 0 R)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1684 | using has_contour_integral_diff [OF * [of z] * [of 0]] \<open>0 < R\<close> that | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1685 | by (simp add: algebra_simps) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1686 | have [simp]: "\<And>x. norm x = R \<Longrightarrow> x \<noteq> z" using that(1) by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1687 | have "norm (deriv f x / (x - z) - deriv f x / x) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1688 | \<le> C * norm z / (R * (R - norm z))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1689 | if "norm x = R" for x | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1690 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1691 | have [simp]: "norm (deriv f x * x - deriv f x * (x - z)) = | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1692 | norm (deriv f x) * norm z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1693 | by (simp add: norm_mult right_diff_distrib') | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1694 | show ?thesis | 
| 72259 | 1695 | using \<open>0 < R\<close> \<open>0 < C\<close> R that | 
| 1696 | by (auto simp add: norm_mult norm_divide divide_simps df_le mult_mono norm_triangle_ineq2) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1697 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1698 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1699 | using has_contour_integral_bound_circlepath | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1700 | [OF **, of "C * norm z/(R*(R - norm z))"] | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1701 | \<open>0 < R\<close> \<open>0 < C\<close> R | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1702 | apply (simp add: norm_mult norm_divide) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1703 | apply (simp add: divide_simps mult.commute) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1704 | done | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1705 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1706 | obtain r' where r': "norm z < r'" "r' < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1707 | using Rats_dense_in_real [of "norm z" r] \<open>norm z < r\<close> by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1708 |       then have [simp]: "closure {r'<..<r} = {r'..r}" by simp
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1709 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1710 | apply (rule continuous_ge_on_closure | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1711 |                  [where f = "\<lambda>r. norm z / (r - norm z) * C" and s = "{r'<..<r}",
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1712 | OF _ _ T1]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1713 | using that r' | 
| 72259 | 1714 | by (auto simp: not_le intro!: continuous_intros) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1715 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1716 | have "*": "(norm z - norm z^2/(r - norm z)) * norm(deriv f 0) \<le> norm(f z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1717 | if r: "norm z < r" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1718 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1719 | have 1: "\<And>x. x \<in> ball 0 r \<Longrightarrow> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1720 | ((\<lambda>z. f z - deriv f 0 * z) has_field_derivative deriv f x - deriv f 0) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1721 | (at x within ball 0 r)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1722 | by (rule derivative_eq_intros holomorphic_derivI holf' | simp)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1723 | have 2: "closed_segment 0 z \<subseteq> ball 0 r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1724 | by (metis \<open>0 < r\<close> convex_ball convex_contains_segment dist_self mem_ball mem_ball_0 that) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1725 | have 4: "norm (deriv f (x *\<^sub>R z) - deriv f 0) * norm z \<le> norm z * norm z * x * C / (r - norm z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1726 | if x: "0 \<le> x" "x \<le> 1" for x | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1727 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1728 | have [simp]: "x * norm z < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1729 | using r x by (meson le_less_trans mult_le_cancel_right2 norm_not_less_zero) | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1730 | then have "cmod (x *\<^sub>R z) < r" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1731 | by (simp add: x) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1732 | then have "norm (deriv f (x *\<^sub>R z) - deriv f 0) \<le> norm (x *\<^sub>R z) / (r - norm (x *\<^sub>R z)) * C" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1733 | by (metis Le1) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1734 | also have "\<dots> \<le> norm (x *\<^sub>R z) / (r - norm z) * C" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1735 | using r x \<open>0 < r\<close> \<open>0 < C\<close> by (simp add: frac_le mult_left_le_one_le) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1736 | finally have "norm (deriv f (x *\<^sub>R z) - deriv f 0) * norm z \<le> norm (x *\<^sub>R z) / (r - norm z) * C * norm z" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1737 | by (rule mult_right_mono) simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1738 | with x show ?thesis by (simp add: algebra_simps) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1739 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1740 | have le_norm: "abc \<le> norm d - e \<Longrightarrow> norm(f - d) \<le> e \<Longrightarrow> abc \<le> norm f" for abc d e and f::complex | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1741 | by (metis add_diff_cancel_left' add_diff_eq diff_left_mono norm_diff_ineq order_trans) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1742 |       have "norm (integral {0..1} (\<lambda>x. (deriv f (x *\<^sub>R z) - deriv f 0) * z))
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1743 |             \<le> integral {0..1} (\<lambda>t. (norm z)\<^sup>2 * t / (r - norm z) * C)"
 | 
| 72259 | 1744 | proof (rule integral_norm_bound_integral) | 
| 1745 |         show "(\<lambda>x. (deriv f (x *\<^sub>R z) - deriv f 0) * z) integrable_on {0..1}"
 | |
| 1746 | using contour_integral_primitive [OF 1, of "linepath 0 z"] 2 | |
| 1747 | by (simp add: has_contour_integral_linepath has_integral_integrable_integral) | |
| 1748 |         have "(*) ((cmod z)\<^sup>2) integrable_on {0..1}"
 | |
| 1749 | by (metis ident_integrable_on integrable_0 integrable_eq integrable_on_cmult_iff lambda_zero) | |
| 1750 |         then show "(\<lambda>t. (norm z)\<^sup>2 * t / (r - norm z) * C) integrable_on {0..1}"
 | |
| 78475 | 1751 | using integrable_on_cmult_right[where 'b=real, simplified] integrable_on_divide [where 'b=real, simplified] | 
| 72259 | 1752 | by blast | 
| 1753 | qed (simp add: norm_mult power2_eq_square 4) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1754 | then have int_le: "norm (f z - deriv f 0 * z) \<le> (norm z)\<^sup>2 * norm(deriv f 0) / ((r - norm z))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1755 | using contour_integral_primitive [OF 1, of "linepath 0 z"] 2 | 
| 72259 | 1756 | by (simp add: has_contour_integral_linepath has_integral_integrable_integral C_def) | 
| 1757 | have "norm z * (norm (deriv f 0) * (r - norm z - norm z)) \<le> norm z * (norm (deriv f 0) * (r - norm z) - norm (deriv f 0) * norm z)" | |
| 1758 | by (simp add: algebra_simps) | |
| 1759 | then have \<section>: "(norm z * (r - norm z) - norm z * norm z) * norm (deriv f 0) \<le> norm (deriv f 0) * norm z * (r - norm z) - norm z * norm z * norm (deriv f 0)" | |
| 1760 | by (simp add: algebra_simps) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1761 | show ?thesis | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1762 | using \<open>norm z < r\<close> | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1763 | by (force simp add: power2_eq_square divide_simps C_def norm_mult \<section> intro!: le_norm [OF _ int_le]) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1764 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1765 | have sq201 [simp]: "0 < (1 - sqrt 2 / 2)" "(1 - sqrt 2 / 2) < 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1766 | by (auto simp: sqrt2_less_2) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1767 | have 1: "continuous_on (closure (ball 0 ((1 - sqrt 2 / 2) * r))) f" | 
| 72259 | 1768 | proof (rule continuous_on_subset [OF holomorphic_on_imp_continuous_on [OF holf]]) | 
| 1769 | show "closure (ball 0 ((1 - sqrt 2 / 2) * r)) \<subseteq> cball 0 r" | |
| 1770 | proof - | |
| 1771 | have "(1 - sqrt 2 / 2) * r \<le> r" | |
| 1772 | by (simp add: \<open>0 < r\<close>) | |
| 1773 | then show ?thesis | |
| 1774 | by (meson ball_subset_cball closed_cball closure_minimal dual_order.trans subset_ball) | |
| 1775 | qed | |
| 1776 | qed | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1777 | have 2: "open (f ` interior (ball 0 ((1 - sqrt 2 / 2) * r)))" | 
| 72259 | 1778 | proof (rule open_mapping_thm [OF holf' open_ball connected_ball]) | 
| 1779 | show "interior (ball 0 ((1 - sqrt 2 / 2) * r)) \<subseteq> ball (0::complex) r" | |
| 1780 | using \<open>0 < r\<close> mult_pos_pos sq201 by (simp add: ball_subset_ball_iff) | |
| 1781 | show "\<not> f constant_on ball 0 r" | |
| 1782 | using False \<open>0 < r\<close> centre_in_ball holf' holomorphic_nonconstant by blast | |
| 1783 | qed auto | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1784 | have "ball 0 ((3 - 2 * sqrt 2) * r * norm (deriv f 0)) = | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1785 | ball (f 0) ((3 - 2 * sqrt 2) * r * norm (deriv f 0))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1786 | by simp | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1787 | also have "\<dots> \<subseteq> f ` ball 0 ((1 - sqrt 2 / 2) * r)" | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1788 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1789 | have 3: "(3 - 2 * sqrt 2) * r * norm (deriv f 0) \<le> norm (f z)" | 
| 72259 | 1790 | if "norm z = (1 - sqrt 2 / 2) * r" for z | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1791 | proof (rule order_trans [OF _ *]) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1792 | show "(3 - 2 * sqrt 2) * r * cmod (deriv f 0) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1793 | \<le> (cmod z - (cmod z)\<^sup>2 / (r - cmod z)) * cmod (deriv f 0)" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1794 | by (simp add: le_less algebra_simps divide_simps power2_eq_square that) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1795 | qed (use \<open>0 < r\<close> that in auto) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1796 | show ?thesis | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1797 | using \<open>0 < r\<close> sq201 3 C_def \<open>0 < C\<close> sq3 | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1798 | by (intro ball_subset_open_map_image [OF 1 2 _ bounded_ball]) auto | 
| 72259 | 1799 | qed | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1800 | also have "\<dots> \<subseteq> f ` ball 0 r" | 
| 72259 | 1801 | proof - | 
| 1802 | have "\<And>x. (1 - sqrt 2 / 2) * r \<le> r" | |
| 1803 | using \<open>0 < r\<close> by (auto simp: field_simps) | |
| 1804 | then show ?thesis | |
| 1805 | by auto | |
| 1806 | qed | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1807 | finally show ?thesis . | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1808 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1809 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1810 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1811 | lemma Bloch_lemma: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1812 | assumes holf: "f holomorphic_on cball a r" and "0 < r" | 
| 72259 | 1813 | and le: "\<And>z. z \<in> ball a r \<Longrightarrow> norm(deriv f z) \<le> 2 * norm(deriv f a)" | 
| 1814 | shows "ball (f a) ((3 - 2 * sqrt 2) * r * norm(deriv f a)) \<subseteq> f ` ball a r" (is "?lhs \<subseteq> ?rhs") | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1815 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1816 | have fz: "(\<lambda>z. f (a + z)) = f o (\<lambda>z. (a + z))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1817 | by (simp add: o_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1818 | have hol0: "(\<lambda>z. f (a + z)) holomorphic_on cball 0 r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1819 | unfolding fz by (intro holomorphic_intros holf holomorphic_on_compose | simp)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1820 | then have [simp]: "\<And>x. norm x < r \<Longrightarrow> (\<lambda>z. f (a + z)) field_differentiable at x" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1821 | by (metis open_ball at_within_open ball_subset_cball diff_0 dist_norm holomorphic_on_def holomorphic_on_subset mem_ball norm_minus_cancel) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1822 | have [simp]: "\<And>z. norm z < r \<Longrightarrow> f field_differentiable at (a + z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1823 | by (metis holf open_ball add_diff_cancel_left' dist_complex_def holomorphic_on_imp_differentiable_at holomorphic_on_subset interior_cball interior_subset mem_ball norm_minus_commute) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1824 | then have [simp]: "f field_differentiable at a" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1825 | by (metis add.comm_neutral \<open>0 < r\<close> norm_eq_zero) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1826 | have hol1: "(\<lambda>z. f (a + z) - f a) holomorphic_on cball 0 r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1827 | by (intro holomorphic_intros hol0) | 
| 72259 | 1828 | then have \<section>: "ball 0 ((3 - 2 * sqrt 2) * r * norm (deriv (\<lambda>z. f (a + z) - f a) 0)) | 
| 1829 | \<subseteq> (\<lambda>z. f (a + z) - f a) ` ball 0 r" | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1830 | apply (rule Bloch_lemma_0) | 
| 72259 | 1831 | using \<open>0 < r\<close> | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1832 | apply (simp_all add: \<open>0 < r\<close> ) | 
| 72259 | 1833 | apply (simp add: fz deriv_chain dist_norm le) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1834 | done | 
| 72259 | 1835 | show ?thesis | 
| 1836 | proof clarify | |
| 1837 | fix x | |
| 1838 | assume "x \<in> ?lhs" | |
| 1839 | with subsetD [OF \<section>, of "x - f a"] show "x \<in> ?rhs" | |
| 1840 | by (force simp: fz \<open>0 < r\<close> dist_norm deriv_chain field_differentiable_compose) | |
| 1841 | qed | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1842 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1843 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1844 | proposition Bloch_unit: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1845 | assumes holf: "f holomorphic_on ball a 1" and [simp]: "deriv f a = 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1846 | obtains b r where "1/12 < r" and "ball b r \<subseteq> f ` (ball a 1)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1847 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1848 | define r :: real where "r = 249/256" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1849 | have "0 < r" "r < 1" by (auto simp: r_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1850 | define g where "g z = deriv f z * of_real(r - norm(z - a))" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1851 | have "deriv f holomorphic_on ball a 1" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1852 | by (rule holomorphic_deriv [OF holf open_ball]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1853 | then have "continuous_on (ball a 1) (deriv f)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1854 | using holomorphic_on_imp_continuous_on by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1855 | then have "continuous_on (cball a r) (deriv f)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1856 | by (rule continuous_on_subset) (simp add: cball_subset_ball_iff \<open>r < 1\<close>) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1857 | then have "continuous_on (cball a r) g" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1858 | by (simp add: g_def continuous_intros) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1859 | then have 1: "compact (g ` cball a r)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1860 | by (rule compact_continuous_image [OF _ compact_cball]) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1861 |   have 2: "g ` cball a r \<noteq> {}"
 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1862 | using \<open>r > 0\<close> by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1863 | obtain p where pr: "p \<in> cball a r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1864 | and pge: "\<And>y. y \<in> cball a r \<Longrightarrow> norm (g y) \<le> norm (g p)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1865 | using distance_attains_sup [OF 1 2, of 0] by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1866 | define t where "t = (r - norm(p - a)) / 2" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1867 | have "norm (p - a) \<noteq> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1868 | using pge [of a] \<open>r > 0\<close> by (auto simp: g_def norm_mult) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1869 | then have "norm (p - a) < r" using pr | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1870 | by (simp add: norm_minus_commute dist_norm) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1871 | then have "0 < t" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1872 | by (simp add: t_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1873 | have cpt: "cball p t \<subseteq> ball a r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1874 | using \<open>0 < t\<close> by (simp add: cball_subset_ball_iff dist_norm t_def field_simps) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1875 | have gen_le_dfp: "norm (deriv f y) * (r - norm (y - a)) / (r - norm (p - a)) \<le> norm (deriv f p)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1876 | if "y \<in> cball a r" for y | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1877 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1878 | have [simp]: "norm (y - a) \<le> r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1879 | using that by (simp add: dist_norm norm_minus_commute) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1880 | have "norm (g y) \<le> norm (g p)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1881 | using pge [OF that] by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1882 | then have "norm (deriv f y) * abs (r - norm (y - a)) \<le> norm (deriv f p) * abs (r - norm (p - a))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1883 | by (simp only: dist_norm g_def norm_mult norm_of_real) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1884 | with that \<open>norm (p - a) < r\<close> show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1885 | by (simp add: dist_norm field_split_simps) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1886 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1887 | have le_norm_dfp: "r / (r - norm (p - a)) \<le> norm (deriv f p)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1888 | using gen_le_dfp [of a] \<open>r > 0\<close> by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1889 | have 1: "f holomorphic_on cball p t" | 
| 72259 | 1890 | using cpt \<open>r < 1\<close> order_subst1 subset_ball | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1891 | by (force simp: intro!: holomorphic_on_subset [OF holf]) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1892 | have 2: "norm (deriv f z) \<le> 2 * norm (deriv f p)" if "z \<in> ball p t" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1893 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1894 | have z: "z \<in> cball a r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1895 | by (meson ball_subset_cball subsetD cpt that) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1896 | then have "norm(z - a) < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1897 | by (metis ball_subset_cball contra_subsetD cpt dist_norm mem_ball norm_minus_commute that) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1898 | have "norm (deriv f z) * (r - norm (z - a)) / (r - norm (p - a)) \<le> norm (deriv f p)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1899 | using gen_le_dfp [OF z] by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1900 | with \<open>norm (z - a) < r\<close> \<open>norm (p - a) < r\<close> | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1901 | have "norm (deriv f z) \<le> (r - norm (p - a)) / (r - norm (z - a)) * norm (deriv f p)" | 
| 72259 | 1902 | by (simp add: field_simps) | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1903 | also have "\<dots> \<le> 2 * norm (deriv f p)" | 
| 72259 | 1904 | proof (rule mult_right_mono) | 
| 1905 | show "(r - cmod (p - a)) / (r - cmod (z - a)) \<le> 2" | |
| 1906 | using that \<open>norm (p - a) < r\<close> \<open>norm(z - a) < r\<close> dist_triangle3 [of z a p] | |
| 1907 | by (simp add: field_simps t_def dist_norm [symmetric]) | |
| 1908 | qed auto | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1909 | finally show ?thesis . | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1910 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1911 | have sqrt2: "sqrt 2 < 2113/1494" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1912 | by (rule real_less_lsqrt) (auto simp: power2_eq_square) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1913 | then have sq3: "0 < 3 - 2 * sqrt 2" by simp | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1914 | have "1 / 12 / ((3 - 2 * sqrt 2) / 2) < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1915 | using sq3 sqrt2 by (auto simp: field_simps r_def) | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1916 | also have "\<dots> \<le> cmod (deriv f p) * (r - cmod (p - a))" | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1917 | using \<open>norm (p - a) < r\<close> le_norm_dfp by (simp add: pos_divide_le_eq) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1918 | finally have "1 / 12 < cmod (deriv f p) * (r - cmod (p - a)) * ((3 - 2 * sqrt 2) / 2)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1919 | using pos_divide_less_eq half_gt_zero_iff sq3 by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1920 | then have **: "1 / 12 < (3 - 2 * sqrt 2) * t * norm (deriv f p)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1921 | using sq3 by (simp add: mult.commute t_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1922 | have "ball (f p) ((3 - 2 * sqrt 2) * t * norm (deriv f p)) \<subseteq> f ` ball p t" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1923 | by (rule Bloch_lemma [OF 1 \<open>0 < t\<close> 2]) | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1924 | also have "\<dots> \<subseteq> f ` ball a 1" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1925 | by (meson \<open>r < 1\<close> ball_subset_cball cpt dual_order.trans image_mono less_le_not_le subset_ball) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1926 | finally have "ball (f p) ((3 - 2 * sqrt 2) * t * norm (deriv f p)) \<subseteq> f ` ball a 1" . | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1927 | with ** show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1928 | by (rule that) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1929 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1930 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1931 | theorem Bloch: | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1932 | assumes holf: "f holomorphic_on ball a r" and "0 < r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1933 | and r': "r' \<le> r * norm (deriv f a) / 12" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1934 | obtains b where "ball b r' \<subseteq> f ` (ball a r)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1935 | proof (cases "deriv f a = 0") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1936 | case True with r' show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1937 | using ball_eq_empty that by fastforce | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1938 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1939 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1940 | define C where "C = deriv f a" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1941 | have "0 < norm C" using False by (simp add: C_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1942 | have dfa: "f field_differentiable at a" | 
| 72259 | 1943 | using \<open>0 < r\<close> holomorphic_on_imp_differentiable_at [OF holf] by auto | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1944 | have fo: "(\<lambda>z. f (a + of_real r * z)) = f o (\<lambda>z. (a + of_real r * z))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1945 | by (simp add: o_def) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1946 | have holf': "f holomorphic_on (\<lambda>z. a + complex_of_real r * z) ` ball 0 1" | 
| 72259 | 1947 | using \<open>0 < r\<close> holomorphic_on_subset [OF holf] by (force simp: dist_norm norm_mult) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1948 | have 1: "(\<lambda>z. f (a + r * z) / (C * r)) holomorphic_on ball 0 1" | 
| 72259 | 1949 | using \<open>0 < r\<close> \<open>0 < norm C\<close> | 
| 1950 | by (intro holomorphic_intros holomorphic_on_compose holf'; simp add: fo)+ | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1951 | have "((\<lambda>z. f (a + of_real r * z) / (C * of_real r)) has_field_derivative | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1952 | (deriv f (a + of_real r * z) / C)) (at z)" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1953 | if "norm z < 1" for z | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1954 | proof - | 
| 72259 | 1955 | have fd: "f field_differentiable at (a + complex_of_real r * z)" | 
| 1956 | using \<open>0 < r\<close> by (simp_all add: dist_norm norm_mult holomorphic_on_imp_differentiable_at [OF holf] that) | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1957 | have *: "((\<lambda>x. f (a + of_real r * x)) has_field_derivative | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1958 | (deriv f (a + of_real r * z) * of_real r)) (at z)" | 
| 72259 | 1959 | by (rule fd DERIV_chain [OF field_differentiable_derivI]derivative_eq_intros | simp add: fo)+ | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1960 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1961 | apply (rule derivative_eq_intros * | simp)+ | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1962 | using \<open>0 < r\<close> by (auto simp: C_def False) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1963 | qed | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1964 | obtain f' where "(f has_field_derivative f') (at a)" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1965 | using dfa field_differentiable_def by blast | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1966 | then have "\<exists>c. ((\<lambda>c. f (a + complex_of_real r * c)) has_field_derivative c) (at 0)" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1967 | by (metis (no_types) DERIV_chain2 add_cancel_left_right field_differentiable_add_const | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1968 | field_differentiable_def field_differentiable_linear mult_eq_0_iff) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1969 | then have "(\<lambda>w. f (a + complex_of_real r * w)) field_differentiable at 0" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1970 | by (simp add: field_differentiable_def) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1971 | then have "deriv (\<lambda>z. f (a + of_real r * z) / (C * of_real r)) 0 | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1972 | = deriv (\<lambda>z. f (a + of_real r * z)) 0 / (C * of_real r)" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1973 | by (rule deriv_cdivide_right) | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
78475diff
changeset | 1974 | also have "\<dots> = 1" | 
| 72259 | 1975 | using \<open>0 < r\<close> by (simp add: C_def False fo derivative_intros dfa deriv_chain) | 
| 1976 | finally have 2: "deriv (\<lambda>z. f (a + of_real r * z) / (C * of_real r)) 0 = 1" . | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1977 | have sb1: "(*) (C * r) ` (\<lambda>z. f (a + of_real r * z) / (C * r)) ` ball 0 1 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1978 | \<subseteq> f ` ball a r" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1979 | using \<open>0 < r\<close> by (auto simp: dist_norm norm_mult C_def False) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1980 | have sb2: "ball (C * r * b) r' \<subseteq> (*) (C * r) ` ball b t" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1981 | if "1 / 12 < t" for b t | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1982 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1983 | have *: "r * cmod (deriv f a) / 12 \<le> r * (t * cmod (deriv f a))" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1984 | using that \<open>0 < r\<close> less_eq_real_def mult.commute mult.right_neutral mult_left_mono norm_ge_zero times_divide_eq_right | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1985 | by auto | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1986 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1987 | apply clarify | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1988 | apply (rule_tac x="x / (C * r)" in image_eqI) | 
| 72259 | 1989 | using \<open>0 < r\<close> apply (simp_all add: dist_norm norm_mult norm_divide C_def False field_simps) | 
| 1990 | using "*" r' by linarith | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1991 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1992 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1993 | apply (rule Bloch_unit [OF 1 2]) | 
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 1994 | using image_mono sb1 sb2 that by fastforce | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1995 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1996 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1997 | corollary Bloch_general: | 
| 72259 | 1998 | assumes holf: "f holomorphic_on S" and "a \<in> S" | 
| 1999 | and tle: "\<And>z. z \<in> frontier S \<Longrightarrow> t \<le> dist a z" | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2000 | and rle: "r \<le> t * norm(deriv f a) / 12" | 
| 72259 | 2001 | obtains b where "ball b r \<subseteq> f ` S" | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2002 | proof - | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2003 | consider "r \<le> 0" | "0 < t * norm(deriv f a) / 12" using rle by force | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2004 | then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2005 | proof cases | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2006 | case 1 then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2007 | by (simp add: ball_empty that) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2008 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2009 | case 2 | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2010 | show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2011 | proof (cases "deriv f a = 0") | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2012 | case True then show ?thesis | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2013 | using rle by (simp add: ball_empty that) | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2014 | next | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2015 | case False | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2016 | then have "t > 0" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2017 | using 2 by (force simp: zero_less_mult_iff) | 
| 72259 | 2018 |       have "\<not> ball a t \<subseteq> S \<Longrightarrow> ball a t \<inter> frontier S \<noteq> {}"
 | 
| 2019 | by (metis Diff_eq_empty_iff \<open>0 < t\<close> \<open>a \<in> S\<close> closure_Int_ball_not_empty closure_subset connected_Int_frontier connected_ball inf.commute) | |
| 2020 | with tle have *: "ball a t \<subseteq> S" by fastforce | |
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2021 | then have 1: "f holomorphic_on ball a t" | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2022 | using holf using holomorphic_on_subset by blast | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2023 | show ?thesis | 
| 77228 
8c093a4b8ccf
Even more new material from Eberl and Li
 paulson <lp15@cam.ac.uk> parents: 
75168diff
changeset | 2024 | using Bloch [OF 1 \<open>t > 0\<close> rle] * by (metis image_mono order_trans that) | 
| 71189 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2025 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2026 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2027 | qed | 
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2028 | |
| 
954ee5acaae0
Split off new HOL-Complex_Analysis session from HOL-Analysis
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2029 | end |