(* Authors: Manuel Eberl, University of Innsbruck Wenda Li, University of Edinburgh
*) theory Meromorphic imports
Laurent_Convergence
Cauchy_Integral_Formula "HOL-Analysis.Sparse_In" begin
subsection \<open>Remove singular points\<close>
text\<open>
This function takes a complex functionand returns a version of it where all removable
singularities have been removed and all other singularities (to be more precise,
unremovable discontinuities) are set to 0.
This is very useful since it is sometimes difficult to avoid introducing removable singularities. For example, consider the meromorphic functions $f(z) = z$ and $g(z) = 1/z$. Then a mathematician would write $f(z)g(z) = 1$, but in Isabelle of course this is not so.
Using the \<open>remove_sings\<close> function, we indeed have \<open>remove_sings (\<lambda>z. f z * g z) = (\<lambda>_. 1)\<close>. \<close> definition%important remove_sings :: "(complex \ complex) \ complex \ complex" where "remove_sings f z = (if \c. f \z\ c then Lim (at z) f else 0)"
lemma remove_sings_eqI [intro]: assumes"f \z\ c" shows"remove_sings f z = c" using assms unfolding remove_sings_def by (auto simp: tendsto_Lim)
lemma remove_sings_at_analytic [simp]: assumes"f analytic_on {z}" shows"remove_sings f z = f z" using assms by (intro remove_sings_eqI) (simp add: analytic_at_imp_isCont isContD)
lemma remove_sings_at_pole [simp]: assumes"is_pole f z" shows"remove_sings f z = 0" using assms unfolding remove_sings_def is_pole_def by (meson at_neq_bot not_tendsto_and_filterlim_at_infinity)
lemma eventually_remove_sings_eq_at: assumes"isolated_singularity_at f z" shows"eventually (\w. remove_sings f w = f w) (at z)" proof - from assms obtain r where r: "r > 0""f analytic_on ball z r - {z}" by (auto simp: isolated_singularity_at_def) hence *: "f analytic_on {w}"if"w \ ball z r - {z}" for w using r that by (auto intro: analytic_on_subset) have"eventually (\w. w \ ball z r - {z}) (at z)" using r by (intro eventually_at_in_open) auto thus ?thesis by eventually_elim (auto simp: remove_sings_at_analytic * ) qed
lemma eventually_remove_sings_eq_nhds: assumes"f analytic_on {z}" shows"eventually (\w. remove_sings f w = f w) (nhds z)" proof - from assms obtain A where A: "open A""z \ A" "f holomorphic_on A" by (auto simp: analytic_at) have"eventually (\z. z \ A) (nhds z)" by (intro eventually_nhds_in_open A) thus ?thesis proof eventually_elim case (elim w) from elim have"f analytic_on {w}" using A analytic_at by blast thus ?caseby auto qed qed
lemma remove_sings_compose: assumes"filtermap g (at z) = at z'" shows"remove_sings (f \ g) z = remove_sings f z'" proof (cases "\c. f \z'\ c") case True thenobtain c where c: "f \z'\ c" by auto from c have"remove_sings f z' = c" by blast moreoverfrom c have"remove_sings (f \ g) z = c" using c by (intro remove_sings_eqI) (auto simp: filterlim_def filtermap_compose assms) ultimatelyshow ?thesis by simp next case False hence"\(\c. (f \ g) \z\ c)" by (auto simp: filterlim_def filtermap_compose assms) with False show ?thesis by (auto simp: remove_sings_def) qed
lemma remove_sings_cong: assumes"eventually (\x. f x = g x) (at z)" "z = z'" shows"remove_sings f z = remove_sings g z'" proof (cases "\c. f \z\ c") case True thenobtain c where c: "f \z\ c" by blast hence"remove_sings f z = c" by blast moreoverhave"f \z\ c \ g \z'\ c" using assms by (intro filterlim_cong refl) auto with c have"remove_sings g z' = c" by (intro remove_sings_eqI) auto ultimatelyshow ?thesis by simp next case False have"f \z\ c \ g \z'\ c" for c using assms by (intro filterlim_cong) auto with False show ?thesis by (auto simp: remove_sings_def) qed
lemma deriv_remove_sings_at_analytic [simp]: assumes"f analytic_on {z}" shows"deriv (remove_sings f) z = deriv f z" apply (rule deriv_cong_ev) apply (rule eventually_remove_sings_eq_nhds) using assms by auto
lemma isolated_singularity_at_remove_sings [simp, intro]: assumes"isolated_singularity_at f z" shows"isolated_singularity_at (remove_sings f) z" using isolated_singularity_at_cong[OF eventually_remove_sings_eq_at[OF assms] refl] assms by simp
lemma not_essential_remove_sings_iff [simp]: assumes"isolated_singularity_at f z" shows"not_essential (remove_sings f) z \ not_essential f z" using not_essential_cong[OF eventually_remove_sings_eq_at[OF assms(1)] refl] by simp
lemma not_essential_remove_sings [intro]: assumes"isolated_singularity_at f z""not_essential f z" shows"not_essential (remove_sings f) z" by (subst not_essential_remove_sings_iff) (use assms in auto)
lemma assumes"isolated_singularity_at f z" shows is_pole_remove_sings_iff [simp]: "is_pole (remove_sings f) z \ is_pole f z" and zorder_remove_sings [simp]: "zorder (remove_sings f) z = zorder f z" and zor_poly_remove_sings [simp]: "zor_poly (remove_sings f) z = zor_poly f z" and has_laurent_expansion_remove_sings_iff [simp]: "(\w. remove_sings f (z + w)) has_laurent_expansion F \
(\<lambda>w. f (z + w)) has_laurent_expansion F" and tendsto_remove_sings_iff [simp]: "remove_sings f \z\ c \ f \z\ c" by (intro is_pole_cong eventually_remove_sings_eq_at refl zorder_cong
zor_poly_cong has_laurent_expansion_cong' tendsto_cong assms)+
lemma remove_sings_has_laurent_expansion [laurent_expansion_intros]: assumes"f has_laurent_expansion F" shows"remove_sings f has_laurent_expansion F" proof - have"remove_sings f has_laurent_expansion F \ f has_laurent_expansion F" proof (rule has_laurent_expansion_cong) have"isolated_singularity_at f 0" using assms by (metis has_laurent_expansion_isolated_0) thus"eventually (\x. remove_sings f x = f x) (at 0)" by (rule eventually_remove_sings_eq_at) qed auto with assms show ?thesis by simp qed
lemma get_all_poles_from_remove_sings: fixes f:: "complex \ complex" defines"ff\remove_sings f" assumes f_holo:"f holomorphic_on s - pts"and"finite pts" "pts\s" "open s" and not_ess:"\x\pts. not_essential f x" obtains pts' where "pts' \ pts" "finite pts'" "ff holomorphic_on s - pts'" "\x\pts'. is_pole ff x" proof -
define pts' where "pts' = {x\<in>pts. is_pole f x}"
have"pts' \ pts" unfolding pts'_def by auto thenhave"finite pts'"using\<open>finite pts\<close> using rev_finite_subset by blast thenhave"open (s - pts')"using\<open>open s\<close> by (simp add: finite_imp_closed open_Diff)
have isolated:"isolated_singularity_at f z"if"z\pts" for z proof (rule isolated_singularity_at_holomorphic) show"f holomorphic_on (s-(pts-{z})) - {z}" by (metis Diff_insert f_holo insert_Diff that) show" open (s - (pts - {z}))" by (meson assms(3) assms(5) finite_Diff finite_imp_closed open_Diff) show"z \ s - (pts - {z})" using assms(4) that by auto qed
have"ff holomorphic_on s - pts'" proof (rule no_isolated_singularity') show"(ff \ ff z) (at z within s - pts')" if "z \ pts-pts'" for z proof - have"at z within s - pts' = at z" apply (rule at_within_open) using\<open>open (s - pts')\<close> that \<open>pts\<subseteq>s\<close> by auto moreoverhave"ff \z\ ff z" unfolding ff_def proof (subst tendsto_remove_sings_iff) show"isolated_singularity_at f z" apply (rule isolated) using that by auto have"not_essential f z" using not_ess that by auto moreoverhave"\is_pole f z" using that unfolding pts'_def by auto ultimatelyhave"\c. f \z\ c" unfolding not_essential_def by auto thenshow"f \z\ remove_sings f z" using remove_sings_eqI by blast qed ultimatelyshow ?thesis by auto qed have"ff holomorphic_on s - pts" using f_holo proof (elim holomorphic_transform) fix x assume"x \ s - pts" thenhave"f analytic_on {x}" using assms(3) assms(5) f_holo by (meson finite_imp_closed
holomorphic_on_imp_analytic_at open_Diff) from remove_sings_at_analytic[OF this] show"f x = ff x"unfolding ff_def by auto qed thenshow"ff holomorphic_on s - pts' - (pts - pts')" apply (elim holomorphic_on_subset) by blast show"open (s - pts')" by (simp add: \<open>open (s - pts')\<close>) show"finite (pts - pts')" by (simp add: assms(3)) qed moreoverhave"\x\pts'. is_pole ff x" unfolding pts'_def using ff_def is_pole_remove_sings_iff isolated by blast moreovernote\<open>pts' \<subseteq> pts\<close> \<open>finite pts'\<close> ultimatelyshow ?thesis using that by auto qed
lemma remove_sings_eq_0_iff: assumes"not_essential f w" shows"remove_sings f w = 0 \ is_pole f w \ f \w\ 0" proof (cases "is_pole f w") case False thenobtain c where c:"f \w\ c" using\<open>not_essential f w\<close> unfolding not_essential_def by auto thenshow ?thesis using False remove_sings_eqI by auto qed simp
lemma remove_sings_analytic_at: assumes"isolated_singularity_at f z""f \z\ c" shows"remove_sings f analytic_on {z}" proof - from assms(1) obtain A where A: "open A""z \ A" "f holomorphic_on (A - {z})" using analytic_imp_holomorphic isolated_singularity_at_iff_analytic_nhd by auto have ana: "f analytic_on (A - {z})" by (subst analytic_on_open) (use A in auto)
have"remove_sings f holomorphic_on A" proof (rule no_isolated_singularity) have"f holomorphic_on (A - {z})" by fact moreoverhave"remove_sings f holomorphic_on (A - {z}) \ f holomorphic_on (A - {z})" by (intro holomorphic_cong remove_sings_at_analytic) (auto intro!: analytic_on_subset[OF ana]) ultimatelyshow"remove_sings f holomorphic_on (A - {z})" by blast hence"continuous_on (A-{z}) (remove_sings f)" by (intro holomorphic_on_imp_continuous_on) moreoverhave"isCont (remove_sings f) z" using assms isCont_def remove_sings_eqI tendsto_remove_sings_iff by blast ultimatelyshow"continuous_on A (remove_sings f)" by (metis A(1) DiffI closed_singleton continuous_on_eq_continuous_at open_Diff singletonD) qed (use A(1) in auto) thus ?thesis using A(1,2) analytic_at by blast qed
lemma remove_sings_analytic_on: assumes"f analytic_on A" shows"remove_sings f analytic_on A" proof - from assms obtain B where B: "open B""A \ B" "f holomorphic_on B" by (metis analytic_on_holomorphic) have"remove_sings f holomorphic_on B \ f holomorphic_on B" proof (rule holomorphic_cong) fix z assume"z \ B" have"f analytic_on {z}" using\<open>z \<in> B\<close> B holomorphic_on_imp_analytic_at by blast thus"remove_sings f z = f z" by (rule remove_sings_at_analytic) qed auto thus ?thesis using B analytic_on_holomorphic by blast qed
lemma residue_remove_sings [simp]: assumes"isolated_singularity_at f z" shows"residue (remove_sings f) z = residue f z" proof - from assms have"eventually (\w. remove_sings f w = f w) (at z)" using eventually_remove_sings_eq_at by blast thenobtain A where A: "open A""z \ A" "\w. w \ A - {z} \ remove_sings f w = f w" by (subst (asm) eventually_at_topological) blast from A(1,2) obtain\<epsilon> where \<epsilon>: "\<epsilon> > 0" "cball z \<epsilon> \<subseteq> A" using open_contains_cball_eq by blast hence eq: "remove_sings f w = f w"if"w \ cball z \ - {z}" for w using that A \<epsilon> by blast
define P where"P = (\f c \. (f has_contour_integral of_real (2 * pi) * \ * c) (circlepath z \))" have"P (remove_sings f) c \ \ P f c \" if "0 < \" "\ < \" for c \ unfolding P_def using\<open>\<epsilon> > 0\<close> that by (intro has_contour_integral_cong) (auto simp: eq) hence *: "(\\>0. \ < e \ P (remove_sings f) c \) \ (\\>0. \ < e \ P f c \)" if "e \ \" for c e using that by force have **: "(\e>0. \\>0. \ < e \ P (remove_sings f) c \) \ (\e>0. \\>0. \ < e \ P f c \)" for c proof assume"(\e>0. \\>0. \ < e \ P (remove_sings f) c \)" thenobtain e where"e > 0""\\>0. \ < e \ P (remove_sings f) c \" by blast thus"(\e>0. \\>0. \ < e \ P f c \)" by (intro exI[of _ "min e \"]) (use *[of "min e \" c] \(1) in auto) next assume"(\e>0. \\>0. \ < e \ P f c \)" thenobtain e where"e > 0""\\>0. \ < e \ P f c \" by blast thus"(\e>0. \\>0. \ < e \ P (remove_sings f) c \)" by (intro exI[of _ "min e \"]) (use *[of "min e \" c] \(1) in auto) qed show ?thesis unfolding residue_def by (intro arg_cong[of _ _ Eps] ext **[unfolded P_def]) qed
lemma remove_sings_shift_0: "remove_sings f z = remove_sings (\w. f (z + w)) 0" proof (cases "\c. f \z\ c") case True thenobtain c where c: "f \z\ c" by blast from c have"remove_sings f z = c" by (rule remove_sings_eqI) moreoverhave"remove_sings (\w. f (z + w)) 0 = c" by (rule remove_sings_eqI) (use c in\<open>simp_all add: at_to_0' filterlim_filtermap add_ac\<close>) ultimatelyshow ?thesis by simp next case False hence"\(\c. (\w. f (z + w)) \0\ c)" by (simp add: at_to_0' filterlim_filtermap add_ac) with False show ?thesis by (simp add: remove_sings_def) qed
lemma remove_sings_shift_0': "NO_MATCH 0 z \ remove_sings f z = remove_sings (\w. f (z + w)) 0" by (rule remove_sings_shift_0)
subsection \<open>Meromorphicity\<close>
text\<open>
We define meromorphicity in terms of Laurent series expansions. This has the advantage of
giving us a particularly simple definition that makes many of the lemmas below trivial because
they reduce to similar statements about Laurent series that are already in the library.
On open domains, this definition coincides with the usual one from the literature, namely that
the function be holomorphic on its domain except for a set of non-essential singularities that is\<^emph>\<open>sparse\<close>, i.e.\ that has no limit point inside the domain.
However, unlike the definitions found in the literature, our definitionalso makes sense for
non-open domains: similarly to\<^const>\<open>analytic_on\<close>, we consider a function meromorphic on a
non-open domainif it is meromorphic on some open superset of that domain.
We will prove all of this below. \<close> definition%important meromorphic_on :: "(complex \ complex) \ complex set \ bool"
(infixl\<open>(meromorphic'_on)\<close> 50) where "f meromorphic_on A \ (\z\A. \F. (\w. f (z + w)) has_laurent_expansion F)"
lemma meromorphic_at_iff: "f meromorphic_on {z} \ isolated_singularity_at f z \ not_essential f z" unfolding meromorphic_on_def by (metis has_laurent_expansion_isolated has_laurent_expansion_not_essential
insertI1 singletonD not_essential_has_laurent_expansion)
lemma meromorphic_on_def': "f meromorphic_on A \ (\z\A. (\w. f (z + w)) has_laurent_expansion laurent_expansion f z)" unfolding meromorphic_on_def using laurent_expansion_eqI by blast
lemma meromorphic_on_meromorphic_at: "f meromorphic_on A \ (\x\A. f meromorphic_on {x})" by (auto simp: meromorphic_on_def)
lemma meromorphic_on_altdef: "f meromorphic_on A \ (\z\A. isolated_singularity_at f z \ not_essential f z)" by (subst meromorphic_on_meromorphic_at) (auto simp: meromorphic_at_iff)
lemma meromorphic_on_cong: assumes"\z. z \ A \ eventually (\w. f w = g w) (at z)" "A = B" shows"f meromorphic_on A \ g meromorphic_on B" unfolding meromorphic_on_def using assms by (intro ball_cong refl arg_cong[of _ _ Ex] has_laurent_expansion_cong ext)
(simp_all add: at_to_0' eventually_filtermap add_ac)
lemma meromorphic_on_subset: "f meromorphic_on A \ B \ A \ f meromorphic_on B" by (auto simp: meromorphic_on_def)
lemma meromorphic_on_Un: assumes"f meromorphic_on A""f meromorphic_on B" shows"f meromorphic_on (A \ B)" using assms unfolding meromorphic_on_def by blast
lemma meromorphic_on_Union: assumes"\A. A \ B \ f meromorphic_on A" shows"f meromorphic_on (\B)" using assms unfolding meromorphic_on_def by blast
lemma meromorphic_on_UN: assumes"\x. x \ X \ f meromorphic_on (A x)" shows"f meromorphic_on (\x\X. A x)" using assms unfolding meromorphic_on_def by blast
lemma meromorphic_on_imp_has_laurent_expansion: assumes"f meromorphic_on A""z \ A" shows"(\w. f (z + w)) has_laurent_expansion laurent_expansion f z" using assms laurent_expansion_eqI unfolding meromorphic_on_def by blast
lemma meromorphic_on_open_nhd: assumes"f meromorphic_on A" obtains B where"open B""A \ B" "f meromorphic_on B" proof - obtain F where F: "\z. z \ A \ (\w. f (z + w)) has_laurent_expansion F z" using assms unfolding meromorphic_on_def by metis have"\Z. open Z \ z \ Z \ (\w\Z-{z}. eval_fls (F z) (w - z) = f w)" if z: "z \ A" for z proof - obtain Z where Z: "open Z""0 \ Z" "\w. w \ Z - {0} \ eval_fls (F z) w = f (z + w)" using F[OF z] unfolding has_laurent_expansion_def eventually_at_topological by blast hence"open ((+) z ` Z)"and"z \ (+) z ` Z" using open_translation by auto moreoverhave"eval_fls (F z) (w - z) = f w"if"w \ (+) z ` Z - {z}" for w using Z(3)[of "w - z"] that by auto ultimatelyshow ?thesis by blast qed thenobtain Z where Z: "\z. z \ A \ open (Z z) \ z \ Z z \ (\w\Z z-{z}. eval_fls (F z) (w - z) = f w)" by metis
define B where"B = (\z\A. Z z \ eball z (fls_conv_radius (F z)))" show ?thesis proof (rule that[of B]) show"open B" using Z unfolding B_def by auto show"A \ B" unfolding B_def using F Z by (auto simp: has_laurent_expansion_def zero_ereal_def) show"f meromorphic_on B" unfolding meromorphic_on_def proof fix z assume z: "z \ B" show"\F. (\w. f (z + w)) has_laurent_expansion F" proof (cases "z \ A") case True thus ?thesis using F by blast next case False thenobtain z0 where z0: "z0 \ A" "z \ Z z0 - {z0}" "dist z0 z < fls_conv_radius (F z0)" using z False Z unfolding B_def by auto hence"(\w. eval_fls (F z0) (w - z0)) analytic_on {z}" by (intro analytic_on_eval_fls' analytic_intros) (auto simp: dist_norm) alsohave"?this \ f analytic_on {z}" proof (intro analytic_at_cong refl) have"eventually (\w. w \ Z z0 - {z0}) (nhds z)" using Z[of z0] z0 by (intro eventually_nhds_in_open) auto thus"\\<^sub>F x in nhds z. eval_fls (F z0) (x - z0) = f x" by eventually_elim (use Z[of z0] z0 in auto) qed finallyshow ?thesis using analytic_at_imp_has_fps_expansion has_fps_expansion_to_laurent by blast qed qed qed qed
lemma meromorphic_on_not_essential: assumes"f meromorphic_on {z}" shows"not_essential f z" using assms has_laurent_expansion_not_essential unfolding meromorphic_on_def by blast
lemma meromorphic_on_isolated_singularity: assumes"f meromorphic_on {z}" shows"isolated_singularity_at f z" using assms has_laurent_expansion_isolated unfolding meromorphic_on_def by blast
lemma meromorphic_on_imp_not_islimpt_singularities: assumes"f meromorphic_on A""z \ A" shows"\z islimpt {w. \f analytic_on {w}}" proof - obtain B where B: "open B""A \ B" "f meromorphic_on B" using assms meromorphic_on_open_nhd by blast obtain F where F: "(\w. f (z + w)) has_laurent_expansion F" using B assms(2) unfolding meromorphic_on_def by blast from F have"isolated_singularity_at f z" using has_laurent_expansion_isolated assms(2) by blast thenobtain r where r: "r > 0""f analytic_on ball z r - {z}" unfolding isolated_singularity_at_def by blast have"f analytic_on {w}"if"w \ ball z r - {z}" for w by (rule analytic_on_subset[OF r(2)]) (use that in auto) hence"eventually (\w. f analytic_on {w}) (at z)" using eventually_at_in_open[of "ball z r" z] \<open>r > 0\<close> by (auto elim!: eventually_mono) thus"\z islimpt {w. \f analytic_on {w}}" by (auto simp: islimpt_conv_frequently_at frequently_def) qed
lemma meromorphic_on_imp_sparse_singularities': assumes"f meromorphic_on A" shows"{w\A. \f analytic_on {w}} sparse_in A" using meromorphic_on_imp_sparse_singularities[OF assms] by (rule sparse_in_subset2) auto
lemma meromorphic_onE: assumes"f meromorphic_on A" obtains pts where"pts \ A" "pts sparse_in A" "f analytic_on A - pts" "\z. z \ A \ not_essential f z" "\z. z \ A \ isolated_singularity_at f z" proof (rule that) show"{z \ A. \ f analytic_on {z}} sparse_in A" using assms by (rule meromorphic_on_imp_sparse_singularities') show"f analytic_on A - {z \ A. \ f analytic_on {z}}" by (subst analytic_on_analytic_at) auto qed (use assms in\<open>auto intro: meromorphic_on_isolated_singularity meromorphic_on_not_essential meromorphic_on_subset\<close>)
lemma meromorphic_onI_weak: assumes"f analytic_on A - pts""\z. z \ pts \ not_essential f z" "pts sparse_in A" "pts \ frontier A = {}" shows"f meromorphic_on A" unfolding meromorphic_on_def proof fix z assume z: "z \ A" show"(\F. (\w. f (z + w)) has_laurent_expansion F)" proof (cases "z \ pts") case False have"f analytic_on {z}" using assms(1) by (rule analytic_on_subset) (use False z in auto) thus ?thesis using isolated_singularity_at_analytic not_essential_analytic
not_essential_has_laurent_expansion by blast next case True show ?thesis proof (rule exI, rule not_essential_has_laurent_expansion) show"not_essential f z" using assms(2) True by blast next show"isolated_singularity_at f z" proof (rule isolated_singularity_at_holomorphic) show"open (interior A - (pts - {z}))" proof (rule open_diff_sparse_pts) show"pts - {z} sparse_in interior A" using sparse_in_subset sparse_in_subset2 assms interior_subset Diff_subset by metis qed auto next have"f analytic_on interior A - (pts - {z}) - {z}" using assms(1) by (rule analytic_on_subset) (use interior_subset in blast) thus"f holomorphic_on interior A - (pts - {z}) - {z}" by (rule analytic_imp_holomorphic) next from assms(4) and True have"z \ interior A" unfolding frontier_def using closure_subset z by blast thus"z \ interior A - (pts - {z})" by blast qed qed qed qed
lemma meromorphic_onI_open: assumes"open A""f analytic_on A - pts""\z. z \ pts \ not_essential f z" assumes"\z. z \ A \ \z islimpt pts \ A" shows"f meromorphic_on A" proof (rule meromorphic_onI_weak) have *: "A - pts \ A = A - pts" by blast show"f analytic_on A - pts \ A" unfolding * by fact show"pts \ A sparse_in A" using assms(1,4) by (subst sparse_in_open) auto show"not_essential f z"if"z \ pts \ A" for z using assms(3) that by blast show"pts \ A \ frontier A = {}" using\<open>open A\<close> frontier_disjoint_eq by blast qed
lemma meromorphic_at_isCont_imp_analytic: assumes"f meromorphic_on {z}""isCont f z" shows"f analytic_on {z}" proof - have *: "(\w. f (z + w)) has_laurent_expansion laurent_expansion f z" using assms by (auto intro: meromorphic_on_imp_has_laurent_expansion) from assms have"\is_pole f z" using is_pole_def not_tendsto_and_filterlim_at_infinity trivial_limit_at by (metis isContD) with * have"fls_subdegree (laurent_expansion f z) \ 0" using has_laurent_expansion_imp_is_pole linorder_not_le by blast hence **: "(\w. eval_fls (laurent_expansion f z) (w - z)) analytic_on {z}" by (intro analytic_intros)+ (use * in\<open>auto simp: has_laurent_expansion_def zero_ereal_def\<close>) have"(\w. eval_fls (laurent_expansion f z) (w - z)) \z\ eval_fls (laurent_expansion f z) (z - z)" by (intro isContD analytic_at_imp_isCont **) alsohave"?this \ f \z\ eval_fls (laurent_expansion f z) (z - z)" by (intro filterlim_cong refl)
(use * in\<open>auto simp: has_laurent_expansion_def at_to_0' eventually_filtermap add_ac\<close>) finallyhave"f \z\ eval_fls (laurent_expansion f z) 0" by simp moreoverfrom assms have"f \z\ f z" by (auto intro: isContD) ultimatelyhave ***: "eval_fls (laurent_expansion f z) 0 = f z" by (rule LIM_unique)
have"eventually (\w. f w = eval_fls (laurent_expansion f z) (w - z)) (at z)" using * by (simp add: has_laurent_expansion_def at_to_0' eventually_filtermap add_ac eq_commute) hence"eventually (\w. f w = eval_fls (laurent_expansion f z) (w - z)) (nhds z)" unfolding eventually_at_filter by eventually_elim (use *** in auto) hence"f analytic_on {z} \ (\w. eval_fls (laurent_expansion f z) (w - z)) analytic_on {z}" by (intro analytic_at_cong refl) with ** show ?thesis by simp qed
lemma analytic_on_imp_meromorphic_on: assumes"f analytic_on A" shows"f meromorphic_on A" by (rule meromorphic_onI_weak[of _ _ "{}"]) (use assms in auto)
lemma meromorphic_on_compose: assumes"g meromorphic_on A""f analytic_on B""f ` B \ A" shows"(\w. g (f w)) meromorphic_on B" unfolding meromorphic_on_def proof safe fix z assume z: "z \ B" have"f analytic_on {z}" using assms(2) by (rule analytic_on_subset) (use assms(3) z in auto) hence"(\w. f w - f z) analytic_on {z}" by (intro analytic_intros) thenobtain F where F: "(\w. f (z + w) - f z) has_fps_expansion F" using analytic_at_imp_has_fps_expansion by blast
from assms(3) and z have"f z \ A" by auto with assms(1) obtain G where G: "(\w. g (f z + w)) has_laurent_expansion G" using z by (auto simp: meromorphic_on_def)
have"\H. ((\w. g (f z + w)) \ (\w. f (z + w) - f z)) has_laurent_expansion H" proof (cases "F = 0") case False show ?thesis proof (rule exI, rule has_laurent_expansion_compose) show"(\w. f (z + w) - f z) has_laurent_expansion fps_to_fls F" using F by (rule has_laurent_expansion_fps) show"fps_nth F 0 = 0" using has_fps_expansion_imp_0_eq_fps_nth_0[OF F] by simp qed fact+ next case True have"(\w. g (f z)) has_laurent_expansion fls_const (g (f z))" by auto alsohave"?this \ (\w. ((\w. g (f z + w)) \ (\w. f (z + w) - f z)) w)
has_laurent_expansion fls_const (g (f z))" proof (rule has_laurent_expansion_cong, goal_cases) case 1 from F and True have"eventually (\w. f (z + w) - f z = 0) (nhds 0)" by (simp add: has_fps_expansion_0_iff) hence"eventually (\w. f (z + w) - f z = 0) (at 0)" by (simp add: eventually_nhds_conv_at) thus ?case by eventually_elim auto qed auto finallyshow ?thesis by blast qed thus"\H. (\w. g (f (z + w))) has_laurent_expansion H" by (simp add: o_def) qed
lemma constant_on_imp_meromorphic_on: assumes"f constant_on A""open A" shows"f meromorphic_on A" using assms analytic_on_imp_meromorphic_on
constant_on_imp_analytic_on by blast
subsection \<open>Nice meromorphicity\<close>
text\<open>
This is probably very non-standard, but we call a function ``nicely meromorphic''if it is
meromorphic and has no removable singularities. That means that the only singularities are
poles. We furthermore require that the function return 0 at any pole, for convenience. \<close> definition nicely_meromorphic_on :: "(complex \ complex) \ complex set \ bool"
(infixl\<open>(nicely'_meromorphic'_on)\<close> 50) where"f nicely_meromorphic_on A \ f meromorphic_on A \<and> (\<forall>z\<in>A. (is_pole f z \<and> f z=0) \<or> f \<midarrow>z\<rightarrow> f z)"
lemma nicely_meromorphic_on_subset: "f nicely_meromorphic_on A \ B \ A \ f nicely_meromorphic_on B" using meromorphic_on_subset unfolding nicely_meromorphic_on_def by blast
lemma nicely_meromorphic_on_imp_analytic_at: assumes"f nicely_meromorphic_on A""z \ A" "\is_pole f z" shows"f analytic_on {z}" proof (rule meromorphic_at_isCont_imp_analytic) show"f meromorphic_on {z}" by (rule meromorphic_on_subset[of _ A]) (use assms in\<open>auto simp: nicely_meromorphic_on_def\<close>) next from assms have"f \z\ f z" by (auto simp: nicely_meromorphic_on_def) thus"isCont f z" by (auto simp: isCont_def) qed
lemma analytic_on_imp_nicely_meromorphic_on: "f analytic_on A \ f nicely_meromorphic_on A" by (meson analytic_at_imp_isCont analytic_on_analytic_at
analytic_on_imp_meromorphic_on isContD nicely_meromorphic_on_def)
lemma remove_sings_meromorphic [meromorphic_intros]: assumes"f meromorphic_on A" shows"remove_sings f meromorphic_on A" unfolding meromorphic_on_def proof safe fix z assume z: "z \ A" show"\F. (\w. remove_sings f (z + w)) has_laurent_expansion F" using assms meromorphic_on_isolated_singularity meromorphic_on_not_essential
not_essential_has_laurent_expansion z meromorphic_on_subset by blast qed
lemma remove_sings_nicely_meromorphic: assumes"f meromorphic_on A" shows"remove_sings f nicely_meromorphic_on A" proof - have"remove_sings f meromorphic_on A" by (simp add: assms remove_sings_meromorphic) moreoverhave"is_pole (remove_sings f) z \<and> remove_sings f z = 0 \<or>
remove_sings f \<midarrow>z\<rightarrow> remove_sings f z" if"z\A" for z proof (cases "\c. f \z\ c") case True thenhave"remove_sings f \z\ remove_sings f z" by (metis remove_sings_eqI tendsto_remove_sings_iff
assms meromorphic_onE that) thenshow ?thesis by simp next case False thenhave"is_pole (remove_sings f) z \<and> remove_sings f z = 0" by (meson is_pole_remove_sings_iff remove_sings_def
remove_sings_eq_0_iff assms meromorphic_onE that) thenshow ?thesis by simp qed ultimatelyshow ?thesis unfolding nicely_meromorphic_on_def by simp qed
text\<open>
A nicely meromorphic function that frequently takes the same valuein the neighbourhood of some
point is constant. \<close> lemma frequently_eq_meromorphic_imp_constant: assumes"frequently (\z. f z = c) (at z)" assumes"f nicely_meromorphic_on A""open A""connected A""z \ A" shows"\w. w \ A \ f w = c" proof - from assms(2) have mero: "f meromorphic_on A" by (auto simp: nicely_meromorphic_on_def) have sparse: "{z. is_pole f z} sparse_in A" using assms(2) mero by (meson assms(3) meromorphic_on_isolated_singularity meromorphic_on_meromorphic_at not_islimpt_poles sparse_in_open)
have eq: "f w = c"if w: "w \ A" "\is_pole f w" for w proof - have"f w - c = 0" proof (rule analytic_continuation[of "\w. f w - c"]) show"(\w. f w - c) holomorphic_on {z\A. \is_pole f z}" using assms(2) by (intro holomorphic_intros)
(metis (mono_tags, lifting) analytic_imp_holomorphic analytic_on_analytic_at
mem_Collect_eq nicely_meromorphic_on_imp_analytic_at) next from sparse and assms(3) have"open (A - {z. is_pole f z})" by (simp add: open_diff_sparse_pts) alsohave"A - {z. is_pole f z} = {z\A. \is_pole f z}" by blast finallyshow"open \" . next from sparse have"connected (A - {z. is_pole f z})" using assms(3,4) by (intro sparse_imp_connected) auto alsohave"A - {z. is_pole f z} = {z\A. \is_pole f z}" by blast finallyshow"connected \" . next have"eventually (\w. w \ A) (at z)" using assms by (intro eventually_at_in_open') auto moreoverhave"eventually (\w. \is_pole f w) (at z)" using mero by (metis assms(5) eventually_not_pole meromorphic_onE) ultimatelyhave ev: "eventually (\w. w \ A \ \is_pole f w) (at z)" by eventually_elim auto show"z islimpt {z\A. \is_pole f z \ f z = c}" using frequently_eventually_frequently[OF assms(1) ev] unfolding islimpt_conv_frequently_at by (rule frequently_elim1) auto next from assms(1) have"\is_pole f z" by (simp add: frequently_const_imp_not_is_pole) with\<open>z \<in> A\<close> show "z \<in> {z \<in> A. \<not> is_pole f z}" by auto qed (use w in auto) thus"f w = c" by simp qed
have not_pole: "\is_pole f w" if w: "w \ A" for w proof - have"eventually (\w. \is_pole f w) (at w)" using mero by (metis eventually_not_pole meromorphic_onE that) moreoverhave"eventually (\w. w \ A) (at w)" using w \<open>open A\<close> by (intro eventually_at_in_open') ultimatelyhave"eventually (\w. f w = c) (at w)" by eventually_elim (auto simp: eq) hence"is_pole f w \ is_pole (\_. c) w" by (intro is_pole_cong refl) thus ?thesis by simp qed
show"f w = c"if w: "w \ A" for w using eq[OF w not_pole[OF w]] . qed
lemma nicely_meromorphic_on_unop: assumes"f nicely_meromorphic_on A" assumes"f meromorphic_on A \ (\z. h (f z)) meromorphic_on A" assumes"\z. z \ A \ is_pole f z \ is_pole (\z. h (f z)) z" assumes"\z. z \ f ` A \ isCont h z" assumes"h 0 = 0" shows"(\z. h (f z)) nicely_meromorphic_on A" unfolding nicely_meromorphic_on_def proof (intro conjI ballI) show"(\z. h (f z)) meromorphic_on A" using assms(1,2) by (auto simp: nicely_meromorphic_on_def) next fix z assume z: "z \ A" hence"is_pole f z \ f z = 0 \ f \z\ f z" using assms by (auto simp: nicely_meromorphic_on_def) thus"is_pole (\z. h (f z)) z \ h (f z) = 0 \ (\z. h (f z)) \z\ h (f z)" proof (rule disj_forward) assume"is_pole f z \ f z = 0" thus"is_pole (\z. h (f z)) z \ h (f z) = 0" using assms z by auto next assume *: "f \z\ f z" from z assms have"isCont h (f z)" by auto with * show"(\z. h (f z)) \z\ h (f z)" using continuous_within continuous_within_compose3 by blast qed qed
subsection \<open>Closure properties and proofs for individual functions\<close>
lemma meromorphic_on_const [intro, meromorphic_intros]: "(\_. c) meromorphic_on A" by (rule analytic_on_imp_meromorphic_on) auto
lemma meromorphic_on_diff [meromorphic_intros]: assumes"f meromorphic_on A""g meromorphic_on A" shows"(\w. f w - g w) meromorphic_on A" using meromorphic_on_add[OF assms(1) meromorphic_on_uminus[OF assms(2)]] by simp
lemma meromorphic_on_mult [meromorphic_intros]: assumes"f meromorphic_on A""g meromorphic_on A" shows"(\w. f w * g w) meromorphic_on A" unfolding meromorphic_on_def by (rule laurent_expansion_intros exI ballI
assms[THEN meromorphic_on_imp_has_laurent_expansion] | assumption)+
lemma meromorphic_on_power [meromorphic_intros]: assumes"f meromorphic_on A" shows"(\w. f w ^ n) meromorphic_on A" unfolding meromorphic_on_def by (rule laurent_expansion_intros exI ballI
assms[THEN meromorphic_on_imp_has_laurent_expansion] | assumption)+
lemma meromorphic_on_powi [meromorphic_intros]: assumes"f meromorphic_on A" shows"(\w. f w powi n) meromorphic_on A" unfolding meromorphic_on_def by (rule laurent_expansion_intros exI ballI
assms[THEN meromorphic_on_imp_has_laurent_expansion] | assumption)+
lemma meromorphic_on_divide [meromorphic_intros]: assumes"f meromorphic_on A""g meromorphic_on A" shows"(\w. f w / g w) meromorphic_on A" using meromorphic_on_mult[OF assms(1) meromorphic_on_inverse[OF assms(2)]] by (simp add: field_simps)
lemma meromorphic_on_sum [meromorphic_intros]: assumes"\i. i \ I \ f i meromorphic_on A" shows"(\w. \i\I. f i w) meromorphic_on A" unfolding meromorphic_on_def by (rule laurent_expansion_intros exI ballI
assms[THEN meromorphic_on_imp_has_laurent_expansion] | assumption)+
lemma meromorphic_on_sum_list [meromorphic_intros]: assumes"\i. i \ set fs \ f i meromorphic_on A" shows"(\w. \i\fs. f i w) meromorphic_on A" unfolding meromorphic_on_def by (rule laurent_expansion_intros exI ballI
assms[THEN meromorphic_on_imp_has_laurent_expansion] | assumption)+
lemma meromorphic_on_sum_mset [meromorphic_intros]: assumes"\i. i \# I \ f i meromorphic_on A" shows"(\w. \i\#I. f i w) meromorphic_on A" unfolding meromorphic_on_def by (rule laurent_expansion_intros exI ballI
assms[THEN meromorphic_on_imp_has_laurent_expansion] | assumption)+
lemma meromorphic_on_prod [meromorphic_intros]: assumes"\i. i \ I \ f i meromorphic_on A" shows"(\w. \i\I. f i w) meromorphic_on A" unfolding meromorphic_on_def by (rule laurent_expansion_intros exI ballI
assms[THEN meromorphic_on_imp_has_laurent_expansion] | assumption)+
lemma meromorphic_on_prod_list [meromorphic_intros]: assumes"\i. i \ set fs \ f i meromorphic_on A" shows"(\w. \i\fs. f i w) meromorphic_on A" unfolding meromorphic_on_def by (rule laurent_expansion_intros exI ballI
assms[THEN meromorphic_on_imp_has_laurent_expansion] | assumption)+
lemma meromorphic_on_prod_mset [meromorphic_intros]: assumes"\i. i \# I \ f i meromorphic_on A" shows"(\w. \i\#I. f i w) meromorphic_on A" unfolding meromorphic_on_def by (rule laurent_expansion_intros exI ballI
assms[THEN meromorphic_on_imp_has_laurent_expansion] | assumption)+
lemma nicely_meromorphic_on_const [intro]: "(\_. c) nicely_meromorphic_on A" unfolding nicely_meromorphic_on_def by auto
lemma nicely_meromorphic_on_cmult_left [intro]: assumes"f nicely_meromorphic_on A" shows"(\z. c * f z) nicely_meromorphic_on A" proof (cases "c = 0") case [simp]: False show ?thesis using assms by (rule nicely_meromorphic_on_unop) (auto intro!: meromorphic_intros) qed (auto intro!: nicely_meromorphic_on_const)
lemma nicely_meromorphic_on_cmult_right [intro]: assumes"f nicely_meromorphic_on A" shows"(\z. f z * c) nicely_meromorphic_on A" using nicely_meromorphic_on_cmult_left[OF assms, of c] by (simp add: mult.commute)
lemma nicely_meromorphic_on_scaleR [intro]: assumes"f nicely_meromorphic_on A" shows"(\z. c *\<^sub>R f z) nicely_meromorphic_on A" using assms by (auto simp: scaleR_conv_of_real)
lemma nicely_meromorphic_on_uminus [intro]: assumes"f nicely_meromorphic_on A" shows"(\z. -f z) nicely_meromorphic_on A" using nicely_meromorphic_on_cmult_left[OF assms, of "-1"] by simp
lemma meromorphic_on_If [meromorphic_intros]: assumes"f meromorphic_on A""g meromorphic_on B" assumes"\z. z \ A \ z \ B \ f z = g z" "open A" "open B" "C \ A \ B" shows"(\z. if z \ A then f z else g z) meromorphic_on C" proof (rule meromorphic_on_subset) show"(\z. if z \ A then f z else g z) meromorphic_on (A \ B)" proof (rule meromorphic_on_Un) have"(\z. if z \ A then f z else g z) meromorphic_on A \ f meromorphic_on A" proof (rule meromorphic_on_cong) fix z assume"z \ A" hence"eventually (\z. z \ A) (at z)" using\<open>open A\<close> by (intro eventually_at_in_open') auto thus"\\<^sub>F w in at z. (if w \ A then f w else g w) = f w" by eventually_elim auto qed auto with assms(1) show"(\z. if z \ A then f z else g z) meromorphic_on A" by blast next have"(\z. if z \ A then f z else g z) meromorphic_on B \ g meromorphic_on B" proof (rule meromorphic_on_cong) fix z assume"z \ B" hence"eventually (\z. z \ B) (at z)" using\<open>open B\<close> by (intro eventually_at_in_open') auto thus"\\<^sub>F w in at z. (if w \ A then f w else g w) = g w" by eventually_elim (use assms(3) in auto) qed auto with assms(2) show"(\z. if z \ A then f z else g z) meromorphic_on B" by blast qed qed fact
lemma meromorphic_on_deriv [meromorphic_intros]: "f meromorphic_on A \ deriv f meromorphic_on A" by (metis meromorphic_on_def isolated_singularity_at_deriv meromorphic_on_isolated_singularity
meromorphic_on_meromorphic_at meromorphic_on_not_essential not_essential_deriv
not_essential_has_laurent_expansion)
lemma meromorphic_on_higher_deriv [meromorphic_intros]: "f meromorphic_on A \ (deriv ^^ n) f meromorphic_on A" by (induction n) (auto intro!: meromorphic_intros)
lemma analytic_on_eval_fps [analytic_intros]: assumes"f analytic_on A" assumes"\z. z \ A \ norm (f z) < fps_conv_radius F" shows"(\w. eval_fps F (f w)) analytic_on A" by (rule analytic_on_compose[OF assms(1) analytic_on_eval_fps, unfolded o_def])
(use assms(2) in auto)
lemma meromorphic_on_eval_fps [meromorphic_intros]: assumes"f analytic_on A" assumes"\z. z \ A \ norm (f z) < fps_conv_radius F" shows"(\w. eval_fps F (f w)) meromorphic_on A" by (rule analytic_on_imp_meromorphic_on analytic_intros analytic_on_eval_fps assms)+
lemma meromorphic_on_eval_fls [meromorphic_intros]: assumes"f analytic_on A" assumes"\z. z \ A \ norm (f z) < fls_conv_radius F" shows"(\w. eval_fls F (f w)) meromorphic_on A" proof (cases "fls_conv_radius F > 0") case False with assms(2) have"A = {}" by (metis all_not_in_conv ereal_less(2) norm_eq_zero order.strict_trans
zero_ereal_def zero_less_norm_iff) thus ?thesis by auto next case True have F: "eval_fls F has_laurent_expansion F" using True by (rule eval_fls_has_laurent_expansion) show ?thesis proof (rule meromorphic_on_compose[OF _ assms(1)]) show"eval_fls F meromorphic_on eball 0 (fls_conv_radius F)" proof (rule meromorphic_onI_open) show"eval_fls F analytic_on eball 0 (fls_conv_radius F) - {0}" by (rule analytic_on_eval_fls) auto show"not_essential (eval_fls F) z"if"z \ {0}" for z using that F has_laurent_expansion_not_essential_0 by blast qed (auto simp: islimpt_finite) qed (use assms(2) in auto) qed
lemma meromorphic_on_imp_analytic_cosparse: assumes"f meromorphic_on A" shows"eventually (\z. f analytic_on {z}) (cosparse A)" unfolding eventually_cosparse using assms meromorphic_on_imp_sparse_singularities by auto
lemma meromorphic_on_imp_not_pole_cosparse: assumes"f meromorphic_on A" shows"eventually (\z. \is_pole f z) (cosparse A)" proof - have"eventually (\z. f analytic_on {z}) (cosparse A)" by (rule meromorphic_on_imp_analytic_cosparse) fact thus ?thesis by eventually_elim (blast dest: analytic_at_imp_no_pole) qed
lemma eventually_remove_sings_eq: assumes"f meromorphic_on A" shows"eventually (\z. remove_sings f z = f z) (cosparse A)" proof - have"eventually (\z. f analytic_on {z}) (cosparse A)" using assms by (rule meromorphic_on_imp_analytic_cosparse) thus ?thesis by eventually_elim auto qed
lemma remove_sings_constant_on_open_iff: assumes"f meromorphic_on A""open A" shows"remove_sings f constant_on A \ (\c. \\<^sub>\x\A. f x = c)" proof assume"remove_sings f constant_on A" thenobtain c where c: "remove_sings f z = c"if"z \ A" for z using that by (auto simp: constant_on_def) have"\\<^sub>\x\A. x \ A" using\<open>open A\<close> by (simp add: eventually_in_cosparse) hence"\\<^sub>\x\A. f x = c" using eventually_remove_sings_eq[OF assms(1)] by eventually_elim (use c in auto) thus"\c. \\<^sub>\x\A. f x = c" by blast next assume"\c. \\<^sub>\x\A. f x = c" thenobtain c where c: "\\<^sub>\x\A. f x = c" by blast have"\\<^sub>\x\A. remove_sings f x = c" using eventually_remove_sings_eq[OF assms(1)] c by eventually_elim auto hence"remove_sings f z = c"if"z \ A" for z using that by (meson assms(2) c eventually_cosparse_open_eq remove_sings_eqI tendsto_eventually) thus"remove_sings f constant_on A" unfolding constant_on_def by blast qed
text\<open>
A meromorphic function on a connected domain takes any given value either almost everywhere
or almost nowhere. \<close> lemma meromorphic_imp_constant_or_avoid: assumes mero: "f meromorphic_on A"and A: "open A""connected A" shows"eventually (\z. f z = c) (cosparse A) \ eventually (\z. f z \ c) (cosparse A)" proof - have"eventually (\z. f z = c) (cosparse A)" if freq: "frequently (\z. f z = c) (cosparse A)" proof - let ?f = "remove_sings f" have ev: "eventually (\z. ?f z = f z) (cosparse A)" by (rule eventually_remove_sings_eq) fact have"frequently (\z. ?f z = c) (cosparse A)" using frequently_eventually_frequently[OF freq ev] by (rule frequently_elim1) auto thenobtain z0 where z0: "z0 \ A" "frequently (\z. ?f z = c) (at z0)" using A by (auto simp: eventually_cosparse_open_eq frequently_def) have mero': "?f nicely_meromorphic_on A" using mero remove_sings_nicely_meromorphic by blast have eq: "?f w = c"if w: "w \ A" for w using frequently_eq_meromorphic_imp_constant[OF z0(2) mero'] A z0(1) w by blast have"eventually (\z. z \ A) (cosparse A)" by (rule eventually_in_cosparse) (use A in auto) thus"eventually (\z. f z = c) (cosparse A)" using ev by eventually_elim (use eq in auto) qed thus ?thesis by (auto simp: frequently_def) qed
lemma nicely_meromorphic_imp_constant_or_avoid: assumes"f nicely_meromorphic_on A""open A""connected A" shows"(\x\A. f x = c) \ (\\<^sub>\x\A. f x \ c)" proof - have"(\\<^sub>\x\A. f x = c) \ (\\<^sub>\x\A. f x \ c)" by (intro meromorphic_imp_constant_or_avoid)
(use assms in\<open>auto simp: nicely_meromorphic_on_def\<close>) thus ?thesis proof assume ev: "\\<^sub>\x\A. f x = c" have"\x\A. f x = c " proof fix x assume x: "x \ A" have"not_essential f x" using assms x unfolding nicely_meromorphic_on_def by blast moreoverhave"is_pole f x \ is_pole (\_. c) x" by (intro is_pole_cong) (use ev x in\<open>auto simp: eventually_cosparse_open_eq assms\<close>) hence"\is_pole f x" by auto ultimatelyhave"f analytic_on {x}" using assms(1) nicely_meromorphic_on_imp_analytic_at x by blast hence"f \x\ f x" by (intro isContD analytic_at_imp_isCont) alsohave"?this \ (\_. c) \x\ f x" by (intro tendsto_cong) (use ev x in\<open>auto simp: eventually_cosparse_open_eq assms\<close>) finallyhave"(\_. c) \x\ f x" . moreoverhave"(\_. c) \x\ c" by simp ultimatelyshow"f x = c" using LIM_unique by blast qed thus ?thesis by blast qed blast qed
lemma nicely_meromorphic_onE: assumes"f nicely_meromorphic_on A" obtains pts where"pts \ A" "pts sparse_in A" "f analytic_on A - pts" "\z. z \ pts \ is_pole f z \ f z=0" proof -
define pts where"pts = {z \ A. \ f analytic_on {z}}" have"pts \ A" "pts sparse_in A" using assms unfolding pts_def nicely_meromorphic_on_def by (auto intro:meromorphic_on_imp_sparse_singularities') moreoverhave"f analytic_on A - pts"unfolding pts_def by (subst analytic_on_analytic_at) auto moreoverhave"\z. z \ pts \ is_pole f z \ f z=0" by (metis (no_types, lifting) remove_sings_eqI
remove_sings_eq_0_iff assms is_pole_imp_not_essential
mem_Collect_eq nicely_meromorphic_on_def
nicely_meromorphic_on_imp_analytic_at pts_def) ultimatelyshow ?thesis using that by auto qed
lemma nicely_meromorphic_onI_open: assumes"open A"and
analytic:"f analytic_on A - pts"and
pole:"\x. x\pts \ is_pole f x \ f x = 0" and
isolated:"\x. x\A \ isolated_singularity_at f x" shows"f nicely_meromorphic_on A" proof - have"f meromorphic_on A" proof (rule meromorphic_onI_open) show"\z. z \ pts \ not_essential f z" using pole unfolding not_essential_def by auto show"\z. z \ A \ \ z islimpt pts \ A" by (metis assms(3) assms(4) inf_commute inf_le2
islimpt_subset mem_Collect_eq not_islimpt_poles subsetI) qed fact+ moreoverhave"(\z\A. (is_pole f z \ f z=0) \ f \z\ f z)" by (meson DiffI analytic analytic_at_imp_isCont
analytic_on_analytic_at assms(3) isContD) ultimatelyshow ?thesis unfolding nicely_meromorphic_on_def by auto qed
lemma nicely_meromorphic_without_singularities: assumes"f nicely_meromorphic_on A""\z\A. \ is_pole f z" shows"f analytic_on A" by (meson analytic_on_analytic_at assms
nicely_meromorphic_on_imp_analytic_at)
lemma meromorphic_on_cong': assumes"eventually (\z. f z = g z) (cosparse A)" "A = B" shows"f meromorphic_on A \ g meromorphic_on B" unfolding assms(2)[symmetric] by (rule meromorphic_on_cong eventually_cosparse_imp_eventually_at assms)+ auto
subsection \<open>Meromorphic functions and zorder\<close>
lemma zorder_power_int: assumes"f meromorphic_on {z}""frequently (\z. f z \ 0) (at z)" shows"zorder (\z. f z powi n) z = n * zorder f z" proof - from assms(1) obtain L where L: "(\w. f (z + w)) has_laurent_expansion L" by (auto simp: meromorphic_on_def) from assms(2) and L have [simp]: "L \ 0" by (metis assms(1) has_laurent_expansion_eventually_nonzero_iff meromorphic_at_iff
not_essential_frequently_0_imp_eventually_0 not_eventually not_frequently) from L have L': "(\w. f (z + w) powi n) has_laurent_expansion L powi n" by (intro laurent_expansion_intros) have"zorder f z = fls_subdegree L" using L assms(2) \<open>L \<noteq> 0\<close> by (simp add: has_laurent_expansion_zorder) moreoverhave"zorder (\z. f z powi n) z = fls_subdegree (L powi n)" using L' assms(2) \L \ 0\ by (simp add: has_laurent_expansion_zorder) moreoverhave"fls_subdegree (L powi n) = n * fls_subdegree L" by simp ultimatelyshow ?thesis by simp qed
lemma zorder_power: assumes"f meromorphic_on {z}""frequently (\z. f z \ 0) (at z)" shows"zorder (\z. f z ^ n) z = n * zorder f z" using zorder_power_int[OF assms, of "int n"] by simp
lemma zorder_add1: assumes"f meromorphic_on {z}""frequently (\z. f z \ 0) (at z)" assumes"g meromorphic_on {z}""frequently (\z. g z \ 0) (at z)" assumes"zorder f z < zorder g z" shows"zorder (\z. f z + g z) z = zorder f z" proof - from assms(1) obtain F where F: "(\w. f (z + w)) has_laurent_expansion F" by (auto simp: meromorphic_on_def) from assms(3) obtain G where G: "(\w. g (z + w)) has_laurent_expansion G" by (auto simp: meromorphic_on_def) have [simp]: "F \ 0" "G \ 0" by (metis assms has_laurent_expansion_eventually_nonzero_iff meromorphic_at_iff
not_essential_frequently_0_imp_eventually_0 not_eventually not_frequently F G)+ have *: "zorder f z = fls_subdegree F""zorder g z = fls_subdegree G" using F G assms by (simp_all add: has_laurent_expansion_zorder) from assms * have"F \ -G" by auto hence [simp]: "F + G \ 0" by (simp add: add_eq_0_iff2) moreoverhave"zorder (\z. f z + g z) z = fls_subdegree (F + G)" using has_laurent_expansion_zorder[OF has_laurent_expansion_add[OF F G]] \<open>F \<noteq> -G\<close> by simp moreoverhave"fls_subdegree (F + G) = fls_subdegree F" using assms by (simp add: * fls_subdegree_add_eq1) ultimatelyshow ?thesis by (simp add: *) qed
lemma zorder_add2: assumes"f meromorphic_on {z}""frequently (\z. f z \ 0) (at z)" assumes"g meromorphic_on {z}""frequently (\z. g z \ 0) (at z)" assumes"zorder f z > zorder g z" shows"zorder (\z. f z + g z) z = zorder g z" using zorder_add1[OF assms(3,4) assms(1,2)] assms(5-) by (simp add: add.commute)
lemma zorder_add_ge: fixes f g :: "complex \ complex" assumes"f meromorphic_on {z}""frequently (\z. f z \ 0) (at z)" assumes"g meromorphic_on {z}""frequently (\z. g z \ 0) (at z)" assumes"frequently (\z. f z + g z \ 0) (at z)" "zorder f z \ c" "zorder g z \ c" shows"zorder (\z. f z + g z) z \ c" proof - from assms(1) obtain F where F: "(\w. f (z + w)) has_laurent_expansion F" by (auto simp: meromorphic_on_def) from assms(3) obtain G where G: "(\w. g (z + w)) has_laurent_expansion G" by (auto simp: meromorphic_on_def) have [simp]: "F \ 0" "G \ 0" using assms F G has_laurent_expansion_frequently_nonzero_iff by blast+ have FG: "(\w. f (z + w) + g (z + w)) has_laurent_expansion F + G" by (intro laurent_expansion_intros F G) have [simp]: "F + G \ 0" using assms(5) has_laurent_expansion_frequently_nonzero_iff[OF FG] by blast
have *: "zorder f z = fls_subdegree F""zorder g z = fls_subdegree G" "zorder (\z. f z + g z) z = fls_subdegree (F + G)" using F G FG has_laurent_expansion_zorder by simp_all moreoverhave"zorder (\z. f z + g z) z = fls_subdegree (F + G)" using has_laurent_expansion_zorder[OF has_laurent_expansion_add[OF F G]] by simp moreoverhave"fls_subdegree (F + G) \ min (fls_subdegree F) (fls_subdegree G)" by (intro fls_plus_subdegree) simp ultimatelyshow ?thesis using assms(6,7) unfolding * by linarith qed
lemma zorder_diff_ge: fixes f g :: "complex \ complex" assumes"f meromorphic_on {z}""frequently (\z. f z \ 0) (at z)" assumes"g meromorphic_on {z}""frequently (\z. g z \ 0) (at z)" assumes"frequently (\z. f z \ g z) (at z)" "zorder f z \ c" "zorder g z \ c" shows"zorder (\z. f z - g z) z \ c" proof - have"(\z. - g z) meromorphic_on {z}" by (auto intro: meromorphic_intros assms) thus ?thesis using zorder_add_ge[of f z "\z. -g z" c] assms by simp qed
lemma zorder_diff1: assumes"f meromorphic_on {z}""frequently (\z. f z \ 0) (at z)" assumes"g meromorphic_on {z}""frequently (\z. g z \ 0) (at z)" assumes"zorder f z < zorder g z" shows"zorder (\z. f z - g z) z = zorder f z" proof - have"zorder (\z. f z + (-g z)) z = zorder f z" by (intro zorder_add1 meromorphic_intros assms) (use assms in auto) thus ?thesis by simp qed
lemma zorder_diff2: assumes"f meromorphic_on {z}""frequently (\z. f z \ 0) (at z)" assumes"g meromorphic_on {z}""frequently (\z. g z \ 0) (at z)" assumes"zorder f z > zorder g z" shows"zorder (\z. f z - g z) z = zorder g z" proof - have"zorder (\z. f z + (-g z)) z = zorder (\z. -g z) z" by (intro zorder_add2 meromorphic_intros assms) (use assms in auto) thus ?thesis by simp qed
lemma zorder_mult: assumes"f meromorphic_on {z}""frequently (\z. f z \ 0) (at z)" assumes"g meromorphic_on {z}""frequently (\z. g z \ 0) (at z)" shows"zorder (\z. f z * g z) z = zorder f z + zorder g z" proof - from assms(1) obtain F where F: "(\w. f (z + w)) has_laurent_expansion F" by (auto simp: meromorphic_on_def) from assms(3) obtain G where G: "(\w. g (z + w)) has_laurent_expansion G" by (auto simp: meromorphic_on_def) have [simp]: "F \ 0" "G \ 0" by (metis assms has_laurent_expansion_eventually_nonzero_iff meromorphic_at_iff
not_essential_frequently_0_imp_eventually_0 not_eventually not_frequently F G)+ have *: "zorder f z = fls_subdegree F""zorder g z = fls_subdegree G" using F G assms by (simp_all add: has_laurent_expansion_zorder) moreoverhave"zorder (\z. f z * g z) z = fls_subdegree (F * G)" using has_laurent_expansion_zorder[OF has_laurent_expansion_mult[OF F G]] by simp moreoverhave"fls_subdegree (F * G) = fls_subdegree F + fls_subdegree G" using assms by simp ultimatelyshow ?thesis by (simp add: *) qed
lemma zorder_divide: assumes"f meromorphic_on {z}""frequently (\z. f z \ 0) (at z)" assumes"g meromorphic_on {z}""frequently (\z. g z \ 0) (at z)" shows"zorder (\z. f z / g z) z = zorder f z - zorder g z" proof - from assms(1) obtain F where F: "(\w. f (z + w)) has_laurent_expansion F" by (auto simp: meromorphic_on_def) from assms(3) obtain G where G: "(\w. g (z + w)) has_laurent_expansion G" by (auto simp: meromorphic_on_def) have [simp]: "F \ 0" "G \ 0" by (metis assms has_laurent_expansion_eventually_nonzero_iff meromorphic_at_iff
not_essential_frequently_0_imp_eventually_0 not_eventually not_frequently F G)+ have *: "zorder f z = fls_subdegree F""zorder g z = fls_subdegree G" using F G assms by (simp_all add: has_laurent_expansion_zorder) moreoverhave"zorder (\z. f z / g z) z = fls_subdegree (F / G)" using has_laurent_expansion_zorder[OF has_laurent_expansion_divide[OF F G]] by simp moreoverhave"fls_subdegree (F / G) = fls_subdegree F - fls_subdegree G" using assms by (simp add: fls_divide_subdegree) ultimatelyshow ?thesis by (simp add: *) qed
lemma constant_on_extend_nicely_meromorphic_on: assumes"f nicely_meromorphic_on B""f constant_on A" assumes"open A""open B""connected B""A \ {}" "A \ B" shows"f constant_on B" proof - from assms obtain c where c: "\z. z \ A \ f z = c"
--> --------------------
--> maximum size reached
--> --------------------
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.