src/HOL/Complex_Analysis/Winding_Numbers.thy
changeset 73932 fd21b4a93043
parent 72506 44468f28b2c3
child 74475 409ca22dee4c
equal deleted inserted replaced
73866:66bff50bc5f1 73932:fd21b4a93043
   835     using w by blast
   835     using w by blast
   836   moreover have "winding_number \<gamma> constant_on outside (path_image \<gamma>)"
   836   moreover have "winding_number \<gamma> constant_on outside (path_image \<gamma>)"
   837     using winding_number_constant [OF \<gamma> loop, of "outside(path_image \<gamma>)"] connected_outside
   837     using winding_number_constant [OF \<gamma> loop, of "outside(path_image \<gamma>)"] connected_outside
   838     by (metis DIM_complex bounded_path_image dual_order.refl \<gamma> outside_no_overlap)
   838     by (metis DIM_complex bounded_path_image dual_order.refl \<gamma> outside_no_overlap)
   839   ultimately have "winding_number \<gamma> z = winding_number \<gamma> w"
   839   ultimately have "winding_number \<gamma> z = winding_number \<gamma> w"
   840     by (metis (no_types, hide_lams) constant_on_def z)
   840     by (metis (no_types, opaque_lifting) constant_on_def z)
   841   also have "\<dots> = 0"
   841   also have "\<dots> = 0"
   842   proof -
   842   proof -
   843     have wnot: "w \<notin> path_image \<gamma>"  using wout by (simp add: outside_def)
   843     have wnot: "w \<notin> path_image \<gamma>"  using wout by (simp add: outside_def)
   844     { fix e::real assume "0<e"
   844     { fix e::real assume "0<e"
   845       obtain p where p: "polynomial_function p" "pathstart p = pathstart \<gamma>" "pathfinish p = pathfinish \<gamma>"
   845       obtain p where p: "polynomial_function p" "pathstart p = pathstart \<gamma>" "pathfinish p = pathfinish \<gamma>"
  1575       then show 3: "path_image p \<inter> path_image (linepath (a + e) c +++ linepath c (a - e)) = {a + e, a - e}"
  1575       then show 3: "path_image p \<inter> path_image (linepath (a + e) c +++ linepath c (a - e)) = {a + e, a - e}"
  1576         using "1" "2" by blast
  1576         using "1" "2" by blast
  1577       show 4: "path_image (linepath (a + e) c +++ linepath c (a - e)) \<inter>
  1577       show 4: "path_image (linepath (a + e) c +++ linepath c (a - e)) \<inter>
  1578                inside (path_image (linepath (a + e) (a - e)) \<union> path_image p) \<noteq> {}"
  1578                inside (path_image (linepath (a + e) (a - e)) \<union> path_image p) \<noteq> {}"
  1579         apply (clarsimp simp: path_image_join segment_convex_hull disjoint_iff_not_equal)
  1579         apply (clarsimp simp: path_image_join segment_convex_hull disjoint_iff_not_equal)
  1580         by (metis (no_types, hide_lams) UnI1 Un_commute c closed_segment_commute ends_in_segment(1) path_image_join
  1580         by (metis (no_types, opaque_lifting) UnI1 Un_commute c closed_segment_commute ends_in_segment(1) path_image_join
  1581                   path_image_linepath pathstart_linepath pfp segment_convex_hull)
  1581                   path_image_linepath pathstart_linepath pfp segment_convex_hull)
  1582       show zin_inside: "z \<in> inside (path_image (linepath (a + e) (a - e)) \<union>
  1582       show zin_inside: "z \<in> inside (path_image (linepath (a + e) (a - e)) \<union>
  1583                                     path_image (linepath (a + e) c +++ linepath c (a - e)))"
  1583                                     path_image (linepath (a + e) c +++ linepath c (a - e)))"
  1584       proof (simp add: path_image_join)
  1584       proof (simp add: path_image_join)
  1585         show "z \<in> inside (closed_segment (a + e) (a - e) \<union> (closed_segment (a + e) c \<union> closed_segment c (a - e)))"
  1585         show "z \<in> inside (closed_segment (a + e) (a - e) \<union> (closed_segment (a + e) c \<union> closed_segment c (a - e)))"
  1623 obtains z where "z \<in> inside (path_image (p +++ linepath (a - d) (a + e)))"
  1623 obtains z where "z \<in> inside (path_image (p +++ linepath (a - d) (a + e)))"
  1624                 "cmod (winding_number (p +++ linepath (a - d) (a + e)) z) = 1"
  1624                 "cmod (winding_number (p +++ linepath (a - d) (a + e)) z) = 1"
  1625 proof -
  1625 proof -
  1626   have [simp]: "a + of_real x \<in> closed_segment (a - \<alpha>) (a - \<beta>) \<longleftrightarrow> x \<in> closed_segment (-\<alpha>) (-\<beta>)" for x \<alpha> \<beta>::real
  1626   have [simp]: "a + of_real x \<in> closed_segment (a - \<alpha>) (a - \<beta>) \<longleftrightarrow> x \<in> closed_segment (-\<alpha>) (-\<beta>)" for x \<alpha> \<beta>::real
  1627     using closed_segment_translation_eq [of a]
  1627     using closed_segment_translation_eq [of a]
  1628     by (metis (no_types, hide_lams) add_uminus_conv_diff of_real_minus of_real_closed_segment)
  1628     by (metis (no_types, opaque_lifting) add_uminus_conv_diff of_real_minus of_real_closed_segment)
  1629   have [simp]: "a - of_real x \<in> closed_segment (a + \<alpha>) (a + \<beta>) \<longleftrightarrow> -x \<in> closed_segment \<alpha> \<beta>" for x \<alpha> \<beta>::real
  1629   have [simp]: "a - of_real x \<in> closed_segment (a + \<alpha>) (a + \<beta>) \<longleftrightarrow> -x \<in> closed_segment \<alpha> \<beta>" for x \<alpha> \<beta>::real
  1630     by (metis closed_segment_translation_eq diff_conv_add_uminus of_real_closed_segment of_real_minus)
  1630     by (metis closed_segment_translation_eq diff_conv_add_uminus of_real_closed_segment of_real_minus)
  1631   have "arc p" and arc_lp: "arc (linepath (a - d) (a + e))" and "path p"
  1631   have "arc p" and arc_lp: "arc (linepath (a - d) (a + e))" and "path p"
  1632     and pap: "path_image p \<inter> closed_segment (a - d) (a + e) \<subseteq> {a+e, a-d}"
  1632     and pap: "path_image p \<inter> closed_segment (a - d) (a + e) \<subseteq> {a+e, a-d}"
  1633     using simple_path_join_loop_eq [of "linepath (a - d) (a + e)" p] assms arc_imp_path  by auto
  1633     using simple_path_join_loop_eq [of "linepath (a - d) (a + e)" p] assms arc_imp_path  by auto
  1801       by (metis ComplD Un_iff Un_closed_segment a_diff_kde inside_Un_outside path_image_join path_image_linepath pathstart_linepath pfp zzin)
  1801       by (metis ComplD Un_iff Un_closed_segment a_diff_kde inside_Un_outside path_image_join path_image_linepath pathstart_linepath pfp zzin)
  1802     have znotin_d_e: "z \<notin> closed_segment (a - d) (a + e)"
  1802     have znotin_d_e: "z \<notin> closed_segment (a - d) (a + e)"
  1803       by (metis IntI UnCI emptyE inside_no_overlap path_image_join path_image_linepath pathstart_linepath pfp zzin)
  1803       by (metis IntI UnCI emptyE inside_no_overlap path_image_join path_image_linepath pathstart_linepath pfp zzin)
  1804     have znotin_kde_e: "z \<notin> closed_segment (a + kde) (a + e)" and znotin_d_kde': "z \<notin> closed_segment (a - d) (a - kde)"
  1804     have znotin_kde_e: "z \<notin> closed_segment (a + kde) (a + e)" and znotin_d_kde': "z \<notin> closed_segment (a - d) (a - kde)"
  1805       using clsub1 clsub2 zzin 
  1805       using clsub1 clsub2 zzin 
  1806       by (metis (no_types, hide_lams) IntI Un_iff emptyE inside_no_overlap path_image_join path_image_linepath pathstart_linepath pfp subsetD)+
  1806       by (metis (no_types, opaque_lifting) IntI Un_iff emptyE inside_no_overlap path_image_join path_image_linepath pathstart_linepath pfp subsetD)+
  1807     have "winding_number (linepath (a - d) (a + e)) z =
  1807     have "winding_number (linepath (a - d) (a + e)) z =
  1808           winding_number (linepath (a - d) (a + kde)) z + winding_number (linepath (a + kde) (a + e)) z"
  1808           winding_number (linepath (a - d) (a + kde)) z + winding_number (linepath (a + kde) (a + e)) z"
  1809     proof (rule winding_number_split_linepath)
  1809     proof (rule winding_number_split_linepath)
  1810       show "a + complex_of_real kde \<in> closed_segment (a - d) (a + e)"
  1810       show "a + complex_of_real kde \<in> closed_segment (a - d) (a + e)"
  1811         by (simp add: a_diff_kde)
  1811         by (simp add: a_diff_kde)
  1950         "(path_image (subpath 0 t q) \<union> path_image (subpath 1 t q)) \<inter> closed_segment (a - d) (a + e) = {a - d, a + e}"
  1950         "(path_image (subpath 0 t q) \<union> path_image (subpath 1 t q)) \<inter> closed_segment (a - d) (a + e) = {a - d, a + e}"
  1951     by metis
  1951     by metis
  1952   have z_notin_ed: "z \<notin> closed_segment (a + e) (a - d)"
  1952   have z_notin_ed: "z \<notin> closed_segment (a + e) (a - d)"
  1953     using zin q01 by (simp add: path_image_join closed_segment_commute inside_def)
  1953     using zin q01 by (simp add: path_image_join closed_segment_commute inside_def)
  1954   have z_notin_0t: "z \<notin> path_image (subpath 0 t q)"
  1954   have z_notin_0t: "z \<notin> path_image (subpath 0 t q)"
  1955     by (metis (no_types, hide_lams) IntI Un_upper1 subsetD empty_iff inside_no_overlap path_image_join
  1955     by (metis (no_types, opaque_lifting) IntI Un_upper1 subsetD empty_iff inside_no_overlap path_image_join
  1956         path_image_subpath_commute pathfinish_subpath pathstart_def pathstart_linepath q_ends(1) qt subpath_trivial zin)
  1956         path_image_subpath_commute pathfinish_subpath pathstart_def pathstart_linepath q_ends(1) qt subpath_trivial zin)
  1957   have [simp]: "- winding_number (subpath t 0 q) z = winding_number (subpath 0 t q) z"
  1957   have [simp]: "- winding_number (subpath t 0 q) z = winding_number (subpath 0 t q) z"
  1958     by (metis \<open>0 \<le> t\<close> \<open>simple_path q\<close> \<open>t \<le> 1\<close> atLeastAtMost_iff zero_le_one
  1958     by (metis \<open>0 \<le> t\<close> \<open>simple_path q\<close> \<open>t \<le> 1\<close> atLeastAtMost_iff zero_le_one
  1959               path_image_subpath_commute path_subpath real_eq_0_iff_le_ge_0
  1959               path_image_subpath_commute path_subpath real_eq_0_iff_le_ge_0
  1960               reversepath_subpath simple_path_imp_path winding_number_reversepath z_notin_0t)
  1960               reversepath_subpath simple_path_imp_path winding_number_reversepath z_notin_0t)