3797 by (simp add: openin_open_Int oo) |
3797 by (simp add: openin_open_Int oo) |
3798 then have "openin (subtopology euclidean S) (\<Inter>a \<in> C. {x \<in> S. f x \<inter> T \<inter> ball a (e/2) \<noteq> {}})" |
3798 then have "openin (subtopology euclidean S) (\<Inter>a \<in> C. {x \<in> S. f x \<inter> T \<inter> ball a (e/2) \<noteq> {}})" |
3799 by (simp add: Int_assoc openin_INT2 [OF \<open>finite C\<close> \<open>C \<noteq> {}\<close>]) |
3799 by (simp add: Int_assoc openin_INT2 [OF \<open>finite C\<close> \<open>C \<noteq> {}\<close>]) |
3800 with xin obtain d2 where "d2>0" |
3800 with xin obtain d2 where "d2>0" |
3801 and d2: "\<And>u v. \<lbrakk>u \<in> S; dist u x < d2; v \<in> C\<rbrakk> \<Longrightarrow> f u \<inter> T \<inter> ball v (e/2) \<noteq> {}" |
3801 and d2: "\<And>u v. \<lbrakk>u \<in> S; dist u x < d2; v \<in> C\<rbrakk> \<Longrightarrow> f u \<inter> T \<inter> ball v (e/2) \<noteq> {}" |
3802 by (force simp: openin_euclidean_subtopology_iff) |
3802 unfolding openin_euclidean_subtopology_iff using xin by fastforce |
3803 show ?thesis |
3803 show ?thesis |
3804 proof (intro that conjI ballI) |
3804 proof (intro that conjI ballI) |
3805 show "0 < min d1 d2" |
3805 show "0 < min d1 d2" |
3806 using \<open>0 < d1\<close> \<open>0 < d2\<close> by linarith |
3806 using \<open>0 < d1\<close> \<open>0 < d2\<close> by linarith |
3807 next |
3807 next |
3825 by (metis add_diff_cancel_left' dist_norm) |
3825 by (metis add_diff_cancel_left' dist_norm) |
3826 qed |
3826 qed |
3827 qed |
3827 qed |
3828 |
3828 |
3829 |
3829 |
3830 subsection\<open>complex logs exist on various "well-behaved" sets\<close> |
3830 subsection\<open>Complex logs exist on various "well-behaved" sets\<close> |
3831 |
3831 |
3832 lemma continuous_logarithm_on_contractible: |
3832 lemma continuous_logarithm_on_contractible: |
3833 fixes f :: "'a::real_normed_vector \<Rightarrow> complex" |
3833 fixes f :: "'a::real_normed_vector \<Rightarrow> complex" |
3834 assumes "continuous_on S f" "contractible S" "\<And>z. z \<in> S \<Longrightarrow> f z \<noteq> 0" |
3834 assumes "continuous_on S f" "contractible S" "\<And>z. z \<in> S \<Longrightarrow> f z \<noteq> 0" |
3835 obtains g where "continuous_on S g" "\<And>x. x \<in> S \<Longrightarrow> f x = exp(g x)" |
3835 obtains g where "continuous_on S g" "\<And>x. x \<in> S \<Longrightarrow> f x = exp(g x)" |
3836 proof - |
3836 proof - |
3837 obtain c where hom: "homotopic_with (\<lambda>h. True) S (-{0}) f (\<lambda>x. c)" |
3837 obtain c where hom: "homotopic_with (\<lambda>h. True) S (-{0}) f (\<lambda>x. c)" |
3838 using nullhomotopic_from_contractible assms |
3838 using nullhomotopic_from_contractible assms |
3839 by (metis imageE subset_Compl_singleton) |
3839 by (metis imageE subset_Compl_singleton) |
3840 then show ?thesis |
3840 then show ?thesis |
3841 by (metis inessential_eq_continuous_logarithm of_real_0 that) |
3841 by (metis inessential_eq_continuous_logarithm that) |
3842 qed |
3842 qed |
3843 |
3843 |
3844 lemma continuous_logarithm_on_simply_connected: |
3844 lemma continuous_logarithm_on_simply_connected: |
3845 fixes f :: "'a::real_normed_vector \<Rightarrow> complex" |
3845 fixes f :: "'a::real_normed_vector \<Rightarrow> complex" |
3846 assumes contf: "continuous_on S f" and S: "simply_connected S" "locally path_connected S" |
3846 assumes contf: "continuous_on S f" and S: "simply_connected S" "locally path_connected S" |
3891 show "continuous_on S (\<lambda>z. exp (g z / 2))" |
3891 show "continuous_on S (\<lambda>z. exp (g z / 2))" |
3892 by (rule continuous_on_compose2 [of UNIV exp]; intro continuous_intros contg subset_UNIV) auto |
3892 by (rule continuous_on_compose2 [of UNIV exp]; intro continuous_intros contg subset_UNIV) auto |
3893 show "\<And>x. x \<in> S \<Longrightarrow> f x = (exp (g x / 2))\<^sup>2" |
3893 show "\<And>x. x \<in> S \<Longrightarrow> f x = (exp (g x / 2))\<^sup>2" |
3894 by (metis exp_double feq nonzero_mult_div_cancel_left times_divide_eq_right zero_neq_numeral) |
3894 by (metis exp_double feq nonzero_mult_div_cancel_left times_divide_eq_right zero_neq_numeral) |
3895 qed |
3895 qed |
|
3896 qed |
|
3897 |
|
3898 |
|
3899 subsection\<open>Another simple case where sphere maps are nullhomotopic.\<close> |
|
3900 |
|
3901 lemma inessential_spheremap_2_aux: |
|
3902 fixes f :: "'a::euclidean_space \<Rightarrow> complex" |
|
3903 assumes 2: "2 < DIM('a)" and contf: "continuous_on (sphere a r) f" |
|
3904 and fim: "f `(sphere a r) \<subseteq> (sphere 0 1)" |
|
3905 obtains c where "homotopic_with (\<lambda>z. True) (sphere a r) (sphere 0 1) f (\<lambda>x. c)" |
|
3906 proof - |
|
3907 obtain g where contg: "continuous_on (sphere a r) g" |
|
3908 and feq: "\<And>x. x \<in> sphere a r \<Longrightarrow> f x = exp(g x)" |
|
3909 proof (rule continuous_logarithm_on_simply_connected [OF contf]) |
|
3910 show "simply_connected (sphere a r)" |
|
3911 using 2 by (simp add: simply_connected_sphere_eq) |
|
3912 show "locally path_connected (sphere a r)" |
|
3913 by (simp add: locally_path_connected_sphere) |
|
3914 show "\<And>z. z \<in> sphere a r \<Longrightarrow> f z \<noteq> 0" |
|
3915 using fim by force |
|
3916 qed auto |
|
3917 have "\<exists>g. continuous_on (sphere a r) g \<and> (\<forall>x\<in>sphere a r. f x = exp (\<i> * complex_of_real (g x)))" |
|
3918 proof (intro exI conjI) |
|
3919 show "continuous_on (sphere a r) (Im \<circ> g)" |
|
3920 by (intro contg continuous_intros continuous_on_compose) |
|
3921 show "\<forall>x\<in>sphere a r. f x = exp (\<i> * complex_of_real ((Im \<circ> g) x))" |
|
3922 using exp_eq_polar feq fim norm_exp_eq_Re by auto |
|
3923 qed |
|
3924 with inessential_eq_continuous_logarithm_circle that show ?thesis |
|
3925 by metis |
|
3926 qed |
|
3927 |
|
3928 lemma inessential_spheremap_2: |
|
3929 fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space" |
|
3930 assumes a2: "2 < DIM('a)" and b2: "DIM('b) = 2" |
|
3931 and contf: "continuous_on (sphere a r) f" and fim: "f `(sphere a r) \<subseteq> (sphere b s)" |
|
3932 obtains c where "homotopic_with (\<lambda>z. True) (sphere a r) (sphere b s) f (\<lambda>x. c)" |
|
3933 proof (cases "s \<le> 0") |
|
3934 case True |
|
3935 then show ?thesis |
|
3936 using contf contractible_sphere fim nullhomotopic_into_contractible that by blast |
|
3937 next |
|
3938 case False |
|
3939 then have "sphere b s homeomorphic sphere (0::complex) 1" |
|
3940 using assms by (simp add: homeomorphic_spheres_gen) |
|
3941 then obtain h k where hk: "homeomorphism (sphere b s) (sphere (0::complex) 1) h k" |
|
3942 by (auto simp: homeomorphic_def) |
|
3943 then have conth: "continuous_on (sphere b s) h" |
|
3944 and contk: "continuous_on (sphere 0 1) k" |
|
3945 and him: "h ` sphere b s \<subseteq> sphere 0 1" |
|
3946 and kim: "k ` sphere 0 1 \<subseteq> sphere b s" |
|
3947 by (simp_all add: homeomorphism_def) |
|
3948 obtain c where "homotopic_with (\<lambda>z. True) (sphere a r) (sphere 0 1) (h \<circ> f) (\<lambda>x. c)" |
|
3949 proof (rule inessential_spheremap_2_aux [OF a2]) |
|
3950 show "continuous_on (sphere a r) (h \<circ> f)" |
|
3951 by (meson continuous_on_compose [OF contf] conth continuous_on_subset fim) |
|
3952 show "(h \<circ> f) ` sphere a r \<subseteq> sphere 0 1" |
|
3953 using fim him by force |
|
3954 qed auto |
|
3955 then have "homotopic_with (\<lambda>f. True) (sphere a r) (sphere b s) (k \<circ> (h \<circ> f)) (k \<circ> (\<lambda>x. c))" |
|
3956 by (rule homotopic_compose_continuous_left [OF _ contk kim]) |
|
3957 then have "homotopic_with (\<lambda>z. True) (sphere a r) (sphere b s) f (\<lambda>x. k c)" |
|
3958 apply (rule homotopic_with_eq, auto) |
|
3959 by (metis fim hk homeomorphism_def image_subset_iff mem_sphere) |
|
3960 then show ?thesis |
|
3961 by (metis that) |
3896 qed |
3962 qed |
3897 |
3963 |
3898 |
3964 |
3899 subsection\<open>Holomorphic logarithms and square roots.\<close> |
3965 subsection\<open>Holomorphic logarithms and square roots.\<close> |
3900 |
3966 |