src/HOL/Analysis/Conformal_Mappings.thy
changeset 66486 ffaaa83543b2
parent 66456 621897f47fab
child 66660 bc3584f7ac0c
equal deleted inserted replaced
66485:ddb31006e315 66486:ffaaa83543b2
  3926 qed
  3926 qed
  3927 
  3927 
  3928 
  3928 
  3929 subsection \<open>More facts about poles and residues\<close>
  3929 subsection \<open>More facts about poles and residues\<close>
  3930 
  3930 
       
  3931 lemma zorder_cong:
       
  3932   assumes "eventually (\<lambda>z. f z = g z) (nhds z)" "z = z'"
       
  3933   shows   "zorder f z = zorder g z'"
       
  3934 proof -
       
  3935   let ?P = "(\<lambda>f n h r. 0 < r \<and> h holomorphic_on cball z r \<and>
       
  3936               (\<forall>w\<in>cball z r. f w = h w * (w - z) ^ n \<and> h w \<noteq> 0))"
       
  3937   have "(\<lambda>n. n > 0 \<and> (\<exists>h r. ?P f n h r)) = (\<lambda>n. n > 0 \<and> (\<exists>h r. ?P g n h r))"
       
  3938   proof (intro ext conj_cong refl iff_exI[where ?'a = "complex \<Rightarrow> complex"], goal_cases)
       
  3939     case (1 n h)
       
  3940     have *: "\<exists>r. ?P g n h r" if "\<exists>r. ?P f n h r" and "eventually (\<lambda>x. f x = g x) (nhds z)" for f g
       
  3941     proof -
       
  3942       from that(1) obtain r where "?P f n h r" by blast
       
  3943       moreover from that(2) obtain r' where "r' > 0" "\<And>w. dist w z < r' \<Longrightarrow> f w = g w"
       
  3944         by (auto simp: eventually_nhds_metric)
       
  3945       hence "\<forall>w\<in>cball z (r'/2). f w = g w" by (auto simp: dist_commute)
       
  3946       ultimately show ?thesis using \<open>r' > 0\<close>
       
  3947         by (intro exI[of _ "min r (r'/2)"]) (auto simp: cball_def)
       
  3948     qed
       
  3949     from assms have eq': "eventually (\<lambda>z. g z = f z) (nhds z)"
       
  3950       by (simp add: eq_commute)
       
  3951     show ?case
       
  3952       by (rule iffI[OF *[OF _ assms(1)] *[OF _ eq']])
       
  3953   qed
       
  3954   with assms(2) show ?thesis unfolding zorder_def by simp
       
  3955 qed
       
  3956 
       
  3957 lemma porder_cong:
       
  3958   assumes "eventually (\<lambda>z. f z = g z) (at z)" "z = z'"
       
  3959   shows   "porder f z = porder g z'"
       
  3960 proof -
       
  3961   from assms(1) have *: "eventually (\<lambda>w. w \<noteq> z \<longrightarrow> f w = g w) (nhds z)"
       
  3962     by (auto simp: eventually_at_filter)
       
  3963   from assms(2) show ?thesis
       
  3964     unfolding porder_def Let_def
       
  3965     by (intro zorder_cong eventually_mono [OF *]) auto
       
  3966 qed
       
  3967 
       
  3968 lemma zer_poly_cong:
       
  3969   assumes "eventually (\<lambda>z. f z = g z) (nhds z)" "z = z'"
       
  3970   shows   "zer_poly f z = zer_poly g z'"
       
  3971   unfolding zer_poly_def
       
  3972 proof (rule Eps_cong, goal_cases)
       
  3973   case (1 h)
       
  3974   let ?P = "\<lambda>w f. f w = h w * (w - z) ^ zorder f z \<and> h w \<noteq> 0"
       
  3975   from assms have eq': "eventually (\<lambda>z. g z = f z) (nhds z)"
       
  3976     by (simp add: eq_commute)
       
  3977   have "\<exists>r>0. h holomorphic_on cball z r \<and> (\<forall>w\<in>cball z r. ?P w g)"
       
  3978     if "r > 0" "h holomorphic_on cball z r" "\<And>w. w \<in> cball z r \<Longrightarrow> ?P w f"
       
  3979        "eventually (\<lambda>z. f z = g z) (nhds z)" for f g r
       
  3980   proof -
       
  3981     from that have [simp]: "zorder f z = zorder g z"
       
  3982       by (intro zorder_cong) auto
       
  3983     from that(4) obtain r' where r': "r' > 0" "\<And>w. w \<in> ball z r' \<Longrightarrow> g w = f w"
       
  3984       by (auto simp: eventually_nhds_metric ball_def dist_commute)
       
  3985     define R where "R = min r (r' / 2)"
       
  3986     have "R > 0" "cball z R \<subseteq> cball z r" "cball z R \<subseteq> ball z r'"
       
  3987       using that(1) r' by (auto simp: R_def)
       
  3988     with that(1,2,3) r'
       
  3989     have "R > 0" "h holomorphic_on cball z R" "\<forall>w\<in>cball z R. ?P w g" 
       
  3990       by force+
       
  3991     thus ?thesis by blast
       
  3992   qed
       
  3993   from this[of _ f g] and this[of _ g f] and assms and eq'
       
  3994     show ?case by blast
       
  3995 qed
       
  3996       
       
  3997 lemma pol_poly_cong:
       
  3998   assumes "eventually (\<lambda>z. f z = g z) (at z)" "z = z'"
       
  3999   shows   "pol_poly f z = pol_poly g z'"
       
  4000 proof -
       
  4001   from assms have *: "eventually (\<lambda>w. w \<noteq> z \<longrightarrow> f w = g w) (nhds z)"
       
  4002     by (auto simp: eventually_at_filter)
       
  4003   have "zer_poly (\<lambda>x. if x = z then 0 else inverse (f x)) z =
       
  4004           zer_poly (\<lambda>x. if x = z' then 0 else inverse (g x)) z"
       
  4005     by (intro zer_poly_cong eventually_mono[OF *] refl) (auto simp: assms(2))
       
  4006   thus "pol_poly f z = pol_poly g z'"
       
  4007     by (simp add: pol_poly_def Let_def o_def fun_eq_iff assms(2))
       
  4008 qed
       
  4009 
       
  4010 lemma porder_nonzero_div_power:
       
  4011   assumes "open s" "z \<in> s" "f holomorphic_on s" "f z \<noteq> 0" "n > 0"
       
  4012   shows   "porder (\<lambda>w. f w / (w - z) ^ n) z = n"
       
  4013 proof -
       
  4014   let ?s' = "(f -` (-{0}) \<inter> s)"
       
  4015   have "continuous_on s f"
       
  4016     by (rule holomorphic_on_imp_continuous_on) fact
       
  4017   moreover have "open (-{0::complex})" by auto
       
  4018   ultimately have s': "open ?s'"
       
  4019     unfolding continuous_on_open_vimage[OF \<open>open s\<close>] by blast
       
  4020   show ?thesis unfolding Let_def porder_def
       
  4021   proof (rule zorder_eqI)
       
  4022     show "(\<lambda>x. inverse (f x)) holomorphic_on ?s'"
       
  4023       using assms by (auto intro!: holomorphic_intros)
       
  4024   qed (insert assms s', auto simp: field_simps)
       
  4025 qed
       
  4026 
       
  4027 lemma is_pole_inverse_power: "n > 0 \<Longrightarrow> is_pole (\<lambda>z::complex. 1 / (z - a) ^ n) a"
       
  4028   unfolding is_pole_def inverse_eq_divide [symmetric]
       
  4029   by (intro filterlim_compose[OF filterlim_inverse_at_infinity] tendsto_intros)
       
  4030      (auto simp: filterlim_at eventually_at intro!: exI[of _ 1] tendsto_eq_intros)
       
  4031 
       
  4032 lemma is_pole_inverse: "is_pole (\<lambda>z::complex. 1 / (z - a)) a"
       
  4033   using is_pole_inverse_power[of 1 a] by simp
       
  4034 
       
  4035 lemma is_pole_divide:
       
  4036   fixes f :: "'a :: t2_space \<Rightarrow> 'b :: real_normed_field"
       
  4037   assumes "isCont f z" "filterlim g (at 0) (at z)" "f z \<noteq> 0"
       
  4038   shows   "is_pole (\<lambda>z. f z / g z) z"
       
  4039 proof -
       
  4040   have "filterlim (\<lambda>z. f z * inverse (g z)) at_infinity (at z)"
       
  4041     by (intro tendsto_mult_filterlim_at_infinity[of _ "f z"]
       
  4042                  filterlim_compose[OF filterlim_inverse_at_infinity])+
       
  4043        (insert assms, auto simp: isCont_def)
       
  4044   thus ?thesis by (simp add: divide_simps is_pole_def)
       
  4045 qed
       
  4046 
       
  4047 lemma is_pole_basic:
       
  4048   assumes "f holomorphic_on A" "open A" "z \<in> A" "f z \<noteq> 0" "n > 0"
       
  4049   shows   "is_pole (\<lambda>w. f w / (w - z) ^ n) z"
       
  4050 proof (rule is_pole_divide)
       
  4051   have "continuous_on A f" by (rule holomorphic_on_imp_continuous_on) fact
       
  4052   with assms show "isCont f z" by (auto simp: continuous_on_eq_continuous_at)
       
  4053   have "filterlim (\<lambda>w. (w - z) ^ n) (nhds 0) (at z)"
       
  4054     using assms by (auto intro!: tendsto_eq_intros)
       
  4055   thus "filterlim (\<lambda>w. (w - z) ^ n) (at 0) (at z)"
       
  4056     by (intro filterlim_atI tendsto_eq_intros)
       
  4057        (insert assms, auto simp: eventually_at_filter)
       
  4058 qed fact+
       
  4059 
       
  4060 lemma is_pole_basic':
       
  4061   assumes "f holomorphic_on A" "open A" "0 \<in> A" "f 0 \<noteq> 0" "n > 0"
       
  4062   shows   "is_pole (\<lambda>w. f w / w ^ n) 0"
       
  4063   using is_pole_basic[of f A 0] assms by simp
       
  4064 
       
  4065 lemma zer_poly_eq:
       
  4066   assumes "open s" "connected s" "z \<in> s" "f holomorphic_on s" "f z = 0" "\<exists>w\<in>s. f w \<noteq> 0"
       
  4067   shows "eventually (\<lambda>w. zer_poly f z w = f w / (w - z) ^ zorder f z) (at z)"
       
  4068 proof -
       
  4069   from zorder_exist [OF assms] obtain r where r: "r > 0" 
       
  4070     and "\<forall>w\<in>cball z r. f w = zer_poly f z w * (w - z) ^ zorder f z" by blast
       
  4071   hence *: "\<forall>w\<in>ball z r - {z}. zer_poly f z w = f w / (w - z) ^ zorder f z" 
       
  4072     by (auto simp: field_simps)
       
  4073   have "eventually (\<lambda>w. w \<in> ball z r - {z}) (at z)"
       
  4074     using r eventually_at_ball'[of r z UNIV] by auto
       
  4075   thus ?thesis by eventually_elim (insert *, auto)
       
  4076 qed
       
  4077 
       
  4078 lemma pol_poly_eq:
       
  4079   assumes "open s" "z \<in> s" "f holomorphic_on s - {z}" "is_pole f z" "\<exists>w\<in>s. f w \<noteq> 0"
       
  4080   shows "eventually (\<lambda>w. pol_poly f z w = f w * (w - z) ^ porder f z) (at z)"
       
  4081 proof -
       
  4082   from porder_exist[OF assms(1-4)] obtain r where r: "r > 0" 
       
  4083     and "\<forall>w\<in>cball z r. w \<noteq> z \<longrightarrow> f w = pol_poly f z w / (w - z) ^ porder f z" by blast
       
  4084   hence *: "\<forall>w\<in>ball z r - {z}. pol_poly f z w = f w * (w - z) ^ porder f z" 
       
  4085     by (auto simp: field_simps)
       
  4086   have "eventually (\<lambda>w. w \<in> ball z r - {z}) (at z)"
       
  4087     using r eventually_at_ball'[of r z UNIV] by auto
       
  4088   thus ?thesis by eventually_elim (insert *, auto)
       
  4089 qed
       
  4090 
  3931 lemma lhopital_complex_simple:
  4091 lemma lhopital_complex_simple:
  3932   assumes "(f has_field_derivative f') (at z)" 
  4092   assumes "(f has_field_derivative f') (at z)" 
  3933   assumes "(g has_field_derivative g') (at z)"
  4093   assumes "(g has_field_derivative g') (at z)"
  3934   assumes "f z = 0" "g z = 0" "g' \<noteq> 0" "f' / g' = c"
  4094   assumes "f z = 0" "g z = 0" "g' \<noteq> 0" "f' / g' = c"
  3935   shows   "((\<lambda>w. f w / g w) \<longlongrightarrow> c) (at z)"
  4095   shows   "((\<lambda>w. f w / g w) \<longlongrightarrow> c) (at z)"