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)" |