section‹Complex Path Integrals and Cauchy's Integral Theorem›
text‹By John Harrison et al. Ported from HOL Light by L C Paulson (2015)›
theory Cauchy_Integral_Theorem imports "HOL-Analysis.Analysis"
Contour_Integration begin
lemma leibniz_rule_holomorphic: fixes f::"complex ==> 'b::euclidean_space ==> complex" assumes"∧x t. x ∈ U ==> t ∈ cbox a b ==> ((λx. f x t) has_field_derivative fx x t) (at x within U)" assumes"∧x. x ∈ U ==> (f x) integrable_on cbox a b" assumes"continuous_on (U × (cbox a b)) (λ(x, t). fx x t)" assumes"convex U" shows"(λx. integral (cbox a b) (f x)) holomorphic_on U" using leibniz_rule_field_differentiable[OF assms(1-3) _ assms(4)] by (auto simp: holomorphic_on_def)
lemma Ln_measurable [measurable]: "Ln ∈ measurable borel borel" proof - have *: "Ln (-of_real x) = of_real (ln x) + i * pi"if"x > 0"for x using that by (subst Ln_minus) (auto simp: Ln_of_real) have **: "Ln (of_real x) = of_real (ln (-x)) + i * pi"if"x < 0"for x using *[of "-x"] that by simp have cont: "(λx. indicat_real (- ℝ🪙≤🪙0) x *🪙R Ln x) ∈ borel_measurable borel" by (intro borel_measurable_continuous_on_indicator continuous_intros) auto have"(λx. if x ∈ℝ🪙≤🪙0 then ln (-Re x) + i * pi else indicator (-ℝ🪙≤🪙0) x *🪙R Ln x) ∈ borel →🪙M borel"
(is"?f ∈ _") by (rule measurable_If_set[OF _ cont]) auto hence"(λx. if x = 0 then Ln 0 else ?f x) ∈ borel →🪙M borel"by measurable alsohave"(λx. if x = 0 then Ln 0 else ?f x) = Ln" by (auto simp: fun_eq_iff ** nonpos_Reals_def) finallyshow ?thesis . qed
lemma powr_complex_measurable [measurable]: assumes [measurable]: "f ∈ measurable M borel""g ∈ measurable M borel" shows"(λx. f x powr g x :: complex) ∈ measurable M borel" using assms by (simp add: powr_def)
text‹The special case of midpoints used in the main quadrisection›
lemma has_contour_integral_midpoint: assumes"(f has_contour_integral i) (linepath a (midpoint a b))" "(f has_contour_integral j) (linepath (midpoint a b) b)" shows"(f has_contour_integral (i + j)) (linepath a b)" proof (rule has_contour_integral_split) show"midpoint a b - a = (1/2) *🪙R (b - a)" using assms by (auto simp: midpoint_def scaleR_conv_of_real) qed (use assms in auto)
lemma contour_integral_midpoint: assumes"continuous_on (closed_segment a b) f" shows"contour_integral (linepath a b) f = contour_integral (linepath a (midpoint a b)) f + contour_integral (linepath (midpoint a b) b) f" proof (rule contour_integral_split) show"midpoint a b - a = (1/2) *🪙R (b - a)" using assms by (auto simp: midpoint_def scaleR_conv_of_real) qed (use assms in auto)
text‹A couple of special case lemmas that are useful below›
lemma triangle_linear_has_chain_integral: "((λx. m*x + d) has_contour_integral 0) (linepath a b +++ linepath b c +++ linepath c a)" proof (rule Cauchy_theorem_primitive) show"∧x. x ∈ UNIV ==> ((λx. m / 2 * x🪙2 + d * x) has_field_derivative m * x + d) (at x)" by (auto intro!: derivative_eq_intros) qed auto
lemma has_chain_integral_chain_integral3: assumes"(f has_contour_integral i) (linepath a b +++ linepath b c +++ linepath c d)"
(is"(f has_contour_integral i) ?g") shows"contour_integral (linepath a b) f + contour_integral (linepath b c) f + contour_integral (linepath c d) f = i"
(is"?lhs = _") proof - have"f contour_integrable_on ?g" using assms contour_integrable_on_def by blast thenhave"?lhs = contour_integral ?g f" by (simp add: valid_path_join has_contour_integral_integrable) thenshow ?thesis using assms contour_integral_unique by blast qed
lemma has_chain_integral_chain_integral4: assumes"(f has_contour_integral i) (linepath a b +++ linepath b c +++ linepath c d +++ linepath d e)"
(is"(f has_contour_integral i) ?g") shows"contour_integral (linepath a b) f + contour_integral (linepath b c) f + contour_integral (linepath c d) f + contour_integral (linepath d e) f = i"
(is"?lhs = _") proof - have"f contour_integrable_on ?g" using assms contour_integrable_on_def by blast thenhave"?lhs = contour_integral ?g f" by (simp add: valid_path_join has_contour_integral_integrable) thenshow ?thesis using assms contour_integral_unique by blast qed
lemma norm_sum_half: assumes"norm(a + b) ≥ e" shows"norm a ≥ e/2 ∨ norm b ≥ e/2" proof - have"e ≤ norm (- a - b)" by (simp add: add.commute assms norm_minus_commute) thus ?thesis using norm_triangle_ineq4 order_trans by fastforce qed
lemma norm_sum_lemma: assumes"e ≤ norm (a + b + c + d)" shows"e / 4 ≤ norm a ∨ e / 4 ≤ norm b ∨ e / 4 ≤ norm c ∨ e / 4 ≤ norm d" proof - have"e ≤ norm ((a + b) + (c + d))"using assms by (simp add: algebra_simps) thenshow ?thesis by (auto dest!: norm_sum_half) qed
lemma Cauchy_theorem_quadrisection: assumes f: "continuous_on (convex hull {a,b,c}) f" and dist: "dist a b ≤ K""dist b c ≤ K""dist c a ≤ K" and e: "e * K^2 ≤ norm (contour_integral(linepath a b) f + contour_integral(linepath b c) f + contour_integral(linepath c a) f)" shows"∃a' b' c'. a' ∈ convex hull {a,b,c} ∧ b' ∈ convex hull {a,b,c} ∧ c' ∈ convex hull {a,b,c} ∧ dist a' b' ≤ K/2 ∧ dist b' c' ≤ K/2 ∧ dist c' a' ≤ K/2 ∧ e * (K/2)^2 ≤ norm(contour_integral(linepath a' b') f + contour_integral(linepath b' c') f + contour_integral(linepath c' a') f)"
(is"∃x y z. ?Φ x y z") proof - note divide_le_eq_numeral1 [simp del]
define a' where"a' = midpoint b c"
define b' where"b' = midpoint c a"
define c' where"c' = midpoint a b" have fabc: "continuous_on (closed_segment a b) f""continuous_on (closed_segment b c) f""continuous_on (closed_segment c a) f" using f continuous_on_subset segments_subset_convex_hull by metis+ have fcont': "continuous_on (closed_segment c' b') f" "continuous_on (closed_segment a' c') f" "continuous_on (closed_segment b' a') f" unfolding a'_def b'_def c'_def by (rule continuous_on_subset [OF f],
metis midpoints_in_convex_hull convex_hull_subset hull_subset insert_subset segment_convex_hull)+
define pathint where"pathint x y ≡ contour_integral(linepath x y) f"for x y have *: "pathint a b + pathint b c + pathint c a = (pathint a c' + pathint c' b' + pathint b' a) + (pathint a' c' + pathint c' b + pathint b a') + (pathint a' c + pathint c b' + pathint b' a') + (pathint a' b' + pathint b' c' + pathint c' a')" unfolding pathint_def by (simp add: fcont' contour_integral_reverse_linepath) (simp add: a'_def b'_def c'_def contour_integral_midpoint fabc) have [simp]: "∧x y. cmod (x * 2 - y * 2) = cmod (x - y) * 2" by (metis left_diff_distrib mult.commute norm_mult_numeral1) have [simp]: "∧x y. cmod (x - y) = cmod (y - x)" by (simp add: norm_minus_commute)
consider "e * K🪙2 / 4 ≤ cmod (pathint a c' + pathint c' b' + pathint b' a)" | "e * K🪙2 / 4 ≤ cmod (pathint a' c' + pathint c' b + pathint b a')" | "e * K🪙2 / 4 ≤ cmod (pathint a' c + pathint c b' + pathint b' a')" | "e * K🪙2 / 4 ≤ cmod (pathint a' b' + pathint b' c' + pathint c' a')" using assms by (metis "*" norm_sum_lemma pathint_def) thenshow ?thesis proof cases case 1 thenhave"?Φ a c' b'" using assms unfolding pathint_def [symmetric] apply (clarsimp simp: c'_def b'_def midpoints_in_convex_hull hull_subset [THEN subsetD]) apply (auto simp: midpoint_def dist_norm scaleR_conv_of_real field_split_simps) done thenshow ?thesis by blast next case 2 thenhave"?Φ a' c' b" using assms unfolding pathint_def [symmetric] apply (clarsimp simp: a'_def c'_def midpoints_in_convex_hull hull_subset [THEN subsetD]) apply (auto simp: midpoint_def dist_norm scaleR_conv_of_real field_split_simps) done thenshow ?thesis by blast next case 3 thenhave"?Φ a' c b'" using assms unfolding pathint_def [symmetric] apply (clarsimp simp: a'_def b'_def midpoints_in_convex_hull hull_subset [THEN subsetD]) apply (auto simp: midpoint_def dist_norm scaleR_conv_of_real field_split_simps) done thenshow ?thesis by blast next case 4 thenhave"?Φ a' b' c'" using assms unfolding pathint_def [symmetric] apply (clarsimp simp: a'_def c'_def b'_def midpoints_in_convex_hull hull_subset [THEN subsetD]) apply (auto simp: midpoint_def dist_norm scaleR_conv_of_real field_split_simps) done thenshow ?thesis by blast qed qed
subsection🍋‹tag unimportant›‹Cauchy's theorem for triangles›
lemma triangle_points_closer: fixes a::complex shows"[x ∈ convex hull {a,b,c}; y ∈ convex hull {a,b,c}] ==> norm(x - y) ≤ norm(a - b) ∨ norm(x - y) ≤ norm(b - c) ∨ norm(x - y) ≤ norm(c - a)" using simplex_extremal_le [of "{a,b,c}"] by (auto simp: norm_minus_commute)
lemma holomorphic_point_small_triangle: assumes x: "x ∈ S" and f: "continuous_on S f" andcd: "f field_differentiable (at x within S)" and e: "0 < e" shows"∃k>0. ∀a b c. dist a b ≤ k ∧ dist b c ≤ k ∧ dist c a ≤ k ∧ x ∈ convex hull {a,b,c} ∧ convex hull {a,b,c} ⊆ S ⟶ norm(contour_integral(linepath a b) f + contour_integral(linepath b c) f + contour_integral(linepath c a) f) ≤ e*(dist a b + dist b c + dist c a)^2"
(is"∃k>0. ∀a b c. _ ⟶ ?normle a b c") proof - have le_of_3: "∧a x y z. [0 ≤ x*y; 0 ≤ x*z; 0 ≤ y*z; a ≤ (e*(x + y + z))*x + (e*(x + y + z))*y + (e*(x + y + z))*z] ==> a ≤ e*(x + y + z)^2" by (simp add: algebra_simps power2_eq_square) have disj_le: "[x ≤ a ∨ x ≤ b ∨ x ≤ c; 0 ≤ a; 0 ≤ b; 0 ≤ c]==> x ≤ a + b + c" for x::real and a b c by linarith have fabc: "f contour_integrable_on linepath a b""f contour_integrable_on linepath b c""f contour_integrable_on linepath c a" if"convex hull {a, b, c} ⊆ S"for a b c using segments_subset_convex_hull that by (metis continuous_on_subset f contour_integrable_continuous_linepath)+ note path_bound = has_contour_integral_bound_linepath [simplified norm_minus_commute, OF has_contour_integral_integral]
{ fix f' a b c d assume d: "0 < d" and f': "∧y. [cmod (y - x) ≤ d; y ∈ S]==> cmod (f y - f x - f' * (y - x)) ≤ e * cmod (y - x)" and le: "cmod (a - b) ≤ d""cmod (b - c) ≤ d""cmod (c - a) ≤ d" and xc: "x ∈ convex hull {a, b, c}" and S: "convex hull {a, b, c} ⊆ S" have pa: "contour_integral (linepath a b) f + contour_integral (linepath b c) f + contour_integral (linepath c a) f = contour_integral (linepath a b) (λy. f y - f x - f' * (y-x)) + contour_integral (linepath b c) (λy. f y - f x - f' * (y-x)) + contour_integral (linepath c a) (λy. f y - f x - f' * (y-x))" apply (simp add: contour_integral_diff contour_integral_lmul contour_integrable_lmul contour_integrable_diff fabc [OF S]) apply (simp add: field_simps) done
{ fix y assume yc: "y ∈ convex hull {a,b,c}" have"cmod (f y - f x - f' * (y - x)) ≤ e*norm(y - x)" proof (rule f') show"cmod (y - x) ≤ d" by (metis triangle_points_closer [OF xc yc] le norm_minus_commute order_trans) qed (use S yc in blast) alsohave"…≤ e * (cmod (a - b) + cmod (b - c) + cmod (c - a))" by (simp add: yc e xc disj_le [OF triangle_points_closer]) finallyhave"cmod (f y - f x - f' * (y - x)) ≤ e * (cmod (a - b) + cmod (b - c) + cmod (c - a))" .
} note cm_le = this have"?normle a b c" unfolding dist_norm pa using f' xc S e apply (intro le_of_3 norm_triangle_le add_mono path_bound) apply (simp_all add: contour_integral_diff contour_integral_lmul contour_integrable_lmul contour_integrable_diff fabc) apply (blast intro: cm_le elim: dest: segments_subset_convex_hull [THEN subsetD])+ done
} note * = this show ?thesis usingcd e apply (simp add: field_differentiable_def has_field_derivative_def has_derivative_within_alt approachable_lt_le2 Ball_def) apply (clarify dest!: spec mp) using * unfolding dist_norm apply blast done qed
text‹Hence the most basic theorem for a triangle.›
locale Chain = fixes x0 At Follows assumes At0: "At x0 0" and AtSuc: "∧x n. At x n ==>∃x'. At x' (Suc n) ∧ Follows x' x" begin primrec f where "f 0 = x0"
| "f (Suc n) = (SOME x. At x (Suc n) ∧ Follows x (f n))"
lemma At: "At (f n) n" proof (induct n) case 0 show ?case by (simp add: At0) next case (Suc n) show ?case by (metis (no_types, lifting) AtSuc [OF Suc] f.simps(2) someI_ex) qed
lemma Follows: "Follows (f(Suc n)) (f n)" by (metis (no_types, lifting) AtSuc [OF At [of n]] f.simps(2) someI_ex)
declare f.simps(2) [simp del] end
lemma Chain3: assumes At0: "At x0 y0 z0 0" and AtSuc: "∧x y z n. At x y z n ==>∃x' y' z'. At x' y' z' (Suc n) ∧ Follows x' y' z' x y z" obtains f g h where "f 0 = x0""g 0 = y0""h 0 = z0" "∧n. At (f n) (g n) (h n) n" "∧n. Follows (f(Suc n)) (g(Suc n)) (h(Suc n)) (f n) (g n) (h n)" proof - interpret three: Chain "(x0,y0,z0)""λ(x,y,z). At x y z""λ(x',y',z'). λ(x,y,z). Follows x' y' z' x y z" proofqed (use At0 AtSuc in auto) show ?thesis proof show"∧n. Follows (fst (three.f (Suc n))) (fst (snd (three.f (Suc n)))) (snd (snd (three.f (Suc n)))) (fst (three.f n)) (fst (snd (three.f n))) (snd (snd (three.f n)))" "∧n. At (fst (three.f n)) (fst (snd (three.f n))) (snd (snd (three.f n))) n" using three.At three.Follows by (simp_all add: split_beta') qed auto qed
proposition🍋‹tag unimportant› Cauchy_theorem_triangle: assumes"f holomorphic_on (convex hull {a,b,c})" shows"(f has_contour_integral 0) (linepath a b +++ linepath b c +++ linepath c a)" proof - have contf: "continuous_on (convex hull {a,b,c}) f" by (metis assms holomorphic_on_imp_continuous_on) let ?pathint = "λx y. contour_integral(linepath x y) f"
{ fix y::complex assume fy: "(f has_contour_integral y) (linepath a b +++ linepath b c +++ linepath c a)" and ynz: "y ≠ 0"
define K where"K = 1 + max (dist a b) (max (dist b c) (dist c a))"
define e where"e = norm y / K^2" have K1: "K ≥ 1"by (simp add: K_def max.coboundedI1) thenhave K: "K > 0"by linarith have [iff]: "dist a b ≤ K""dist b c ≤ K""dist c a ≤ K" by (simp_all add: K_def) have e: "e > 0" unfolding e_def using ynz K1 by simp
define At where"At x y z n ⟷ convex hull {x,y,z} ⊆ convex hull {a,b,c} ∧ dist x y ≤ K/2^n ∧ dist y z ≤ K/2^n ∧ dist z x ≤ K/2^n ∧ norm(?pathint x y + ?pathint y z + ?pathint z x) ≥ e*(K/2^n)^2" for x y z n have At0: "At a b c 0" using fy by (simp add: At_def e_def has_chain_integral_chain_integral3)
{ fix x y z n assume At: "At x y z n" thenhave contf': "continuous_on (convex hull {x,y,z}) f" using contf At_def continuous_on_subset by metis have"∃x' y' z'. At x' y' z' (Suc n) ∧ convex hull {x',y',z'} ⊆ convex hull {x,y,z}" using At Cauchy_theorem_quadrisection [OF contf', of "K/2^n" e] apply (simp add: At_def algebra_simps) apply (meson convex_hull_subset empty_subsetI insert_subset subsetCE) done
} note AtSuc = this obtain fa fb fc where f0 [simp]: "fa 0 = a""fb 0 = b""fc 0 = c" and cosb: "∧n. convex hull {fa n, fb n, fc n} ⊆ convex hull {a,b,c}" and dist: "∧n. dist (fa n) (fb n) ≤ K/2^n" "∧n. dist (fb n) (fc n) ≤ K/2^n" "∧n. dist (fc n) (fa n) ≤ K/2^n" and no: "∧n. norm(?pathint (fa n) (fb n) + ?pathint (fb n) (fc n) + ?pathint (fc n) (fa n)) ≥ e * (K/2^n)^2" and conv_le: "∧n. convex hull {fa(Suc n), fb(Suc n), fc(Suc n)} ⊆ convex hull {fa n, fb n, fc n}" by (rule Chain3 [of At, OF At0 AtSuc]) (auto simp: At_def) obtain x where x: "∧n. x ∈ convex hull {fa n, fb n, fc n}" proof (rule bounded_closed_nest) show"∧n. closed (convex hull {fa n, fb n, fc n})" by (simp add: compact_imp_closed finite_imp_compact_convex_hull) show"∧m n. m ≤ n ==> convex hull {fa n, fb n, fc n} ⊆ convex hull {fa m, fb m, fc m}" by (erule transitive_stepwise_le) (auto simp: conv_le) qed (fastforce intro: finite_imp_bounded_convex_hull)+ thenhave xin: "x ∈ convex hull {a,b,c}" using assms f0 by blast thenhave fx: "f field_differentiable at x within (convex hull {a,b,c})" using assms holomorphic_on_def by blast
{ fix k n assume k: "0 < k" and le: "∧x' y' z'. [dist x' y' ≤ k; dist y' z' ≤ k; dist z' x' ≤ k; x ∈ convex hull {x',y',z'}; convex hull {x',y',z'} ⊆ convex hull {a,b,c}] ==> cmod (?pathint x' y' + ?pathint y' z' + ?pathint z' x') * 10 ≤ e * (dist x' y' + dist y' z' + dist z' x')🪙2" and Kk: "K / k < 2 ^ n" have"K / 2 ^ n < k"using Kk k by (auto simp: field_simps) thenhave DD: "dist (fa n) (fb n) ≤ k""dist (fb n) (fc n) ≤ k""dist (fc n) (fa n) ≤ k" using dist [of n] k by linarith+ have dle: "(dist (fa n) (fb n) + dist (fb n) (fc n) + dist (fc n) (fa n))🪙2 ≤ (3 * K / 2 ^ n)🪙2" using dist [of n] e K by (simp add: abs_le_square_iff [symmetric]) have less10: "∧x y::real. 0 < x ==> y ≤ 9*x ==> y < x*10" by linarith have"e * (dist (fa n) (fb n) + dist (fb n) (fc n) + dist (fc n) (fa n))🪙2 ≤ e * (3 * K / 2 ^ n)🪙2" using ynz dle e mult_le_cancel_left_pos by blast alsohave"… < cmod (?pathint (fa n) (fb n) + ?pathint (fb n) (fc n) + ?pathint (fc n) (fa n)) * 10" using no [of n] e K by (simp add: e_def field_simps) (simp only: zero_less_norm_iff [symmetric]) finallyhave False using le [OF DD x cosb] by auto
} then have ?thesis using holomorphic_point_small_triangle [OF xin contf fx, of "e/10"] e apply clarsimp apply (rule_tac y1="K/k"in exE [OF real_arch_pow[of 2]], force+) done
} moreoverhave"f contour_integrable_on (linepath a b +++ linepath b c +++ linepath c a)" by simp (meson contf continuous_on_subset contour_integrable_continuous_linepath segments_subset_convex_hull(1)
segments_subset_convex_hull(3) segments_subset_convex_hull(5)) ultimatelyshow ?thesis using has_contour_integral_integral by fastforce qed
subsection🍋‹tag unimportant›‹Version needing function holomorphic in interior only›
lemma Cauchy_theorem_flat_lemma: assumes f: "continuous_on (convex hull {a,b,c}) f" and c: "c - a = k *🪙R (b - a)" and k: "0 ≤ k" shows"contour_integral (linepath a b) f + contour_integral (linepath b c) f + contour_integral (linepath c a) f = 0" proof - have fabc: "continuous_on (closed_segment a b) f""continuous_on (closed_segment b c) f""continuous_on (closed_segment c a) f" using f continuous_on_subset segments_subset_convex_hull by metis+ show ?thesis proof (cases "k ≤ 1") case True show ?thesis by (simp add: contour_integral_split [OF fabc(1) k True c] contour_integral_reverse_linepath fabc) next case False show ?thesis proof (subst contour_integral_split [symmetric]) show"b - a = (1/k) *🪙R (c - a)" using False c by force show"contour_integral (linepath a c) f + contour_integral (linepath c a) f = 0" by (simp add: contour_integral_reverse_linepath fabc(3)) show"continuous_on (closed_segment a c) f" by (metis closed_segment_commute fabc(3)) qed (use False in auto) qed qed
lemma Cauchy_theorem_flat: assumes f: "continuous_on (convex hull {a,b,c}) f" and c: "c - a = k *🪙R (b - a)" shows"contour_integral (linepath a b) f + contour_integral (linepath b c) f + contour_integral (linepath c a) f = 0" proof (cases "0 ≤ k") case True with assms show ?thesis by (blast intro: Cauchy_theorem_flat_lemma) next case False have"continuous_on (closed_segment a b) f""continuous_on (closed_segment b c) f""continuous_on (closed_segment c a) f" using f continuous_on_subset segments_subset_convex_hull by metis+ moreoverhave"contour_integral (linepath b a) f + contour_integral (linepath a c) f + contour_integral (linepath c b) f = 0" proof (rule Cauchy_theorem_flat_lemma [of b a c f "1-k"]) show"continuous_on (convex hull {b, a, c}) f" by (simp add: f insert_commute) show"c - b = (1 - k) *🪙R (a - b)" using c by (auto simp: algebra_simps) qed (use False in auto) ultimatelyshow ?thesis by (metis (no_types, lifting) contour_integral_reverse_linepath eq_neg_iff_add_eq_0 minus_add_cancel) qed
proposition Cauchy_theorem_triangle_interior: assumes contf: "continuous_on (convex hull {a,b,c}) f" and holf: "f holomorphic_on interior (convex hull {a,b,c})" shows"(f has_contour_integral 0) (linepath a b +++ linepath b c +++ linepath c a)" proof -
define pathint where"pathint ≡ λx y. contour_integral(linepath x y) f" have fabc: "continuous_on (closed_segment a b) f""continuous_on (closed_segment b c) f""continuous_on (closed_segment c a) f" using contf continuous_on_subset segments_subset_convex_hull by metis+ have"bounded (f ` (convex hull {a,b,c}))" by (simp add: compact_continuous_image compact_convex_hull compact_imp_bounded contf) thenobtain B where"0 < B"and Bnf: "∧x. x ∈ convex hull {a,b,c} ==> norm (f x) ≤ B" by (auto simp: dest!: bounded_pos [THEN iffD1]) have"bounded (convex hull {a,b,c})" by (simp add: bounded_convex_hull) thenobtain C where C: "0 < C"and Cno: "∧y. y ∈ convex hull {a,b,c} ==> norm y < C" using bounded_pos_less by blast thenhave diff_2C: "norm(x - y) ≤ 2*C" if x: "x ∈ convex hull {a, b, c}"and y: "y ∈ convex hull {a, b, c}"for x y proof - have"cmod x ≤ C" using x by (meson Cno not_le not_less_iff_gr_or_eq) hence"cmod (x - y) ≤ C + C" using y by (meson Cno add_mono_thms_linordered_field(4) less_eq_real_def norm_triangle_ineq4 order_trans) thus"cmod (x - y) ≤ 2 * C" by (metis mult_2) qed have contf': "continuous_on (convex hull {b,a,c}) f" using contf by (simp add: insert_commute)
{ fix y::complex assume fy: "(f has_contour_integral y) (linepath a b +++ linepath b c +++ linepath c a)" and ynz: "y ≠ 0" have pi_eq_y: "pathint a b + pathint b c + pathint c a= y" unfolding pathint_def by (rule has_chain_integral_chain_integral3 [OF fy]) have ?thesis proof (cases "c=a ∨ a=b ∨ b=c") case True thenshow ?thesis using Cauchy_theorem_flat [OF contf, of 0] using has_chain_integral_chain_integral3 [OF fy] ynz by (force simp: fabc contour_integral_reverse_linepath) next case False thenhave car3: "card {a, b, c} = Suc (DIM(complex))" by auto
{ assume"interior(convex hull {a,b,c}) = {}" thenhave"collinear{a,b,c}" using interior_convex_hull_eq_empty [OF car3] by (simp add: collinear_3_eq_affine_dependent) with False obtain d where"c ≠ a""a ≠ b""b ≠ c""c - b = d *🪙R (a - b)" by (auto simp: collinear_3 collinear_lemma) thenhave"False" using False Cauchy_theorem_flat [OF contf'] pi_eq_y ynz by (simp add: fabc add_eq_0_iff contour_integral_reverse_linepath pathint_def)
} thenobtain d where d: "d ∈ interior (convex hull {a, b, c})" by blast
{ fix d1 assume d1_pos: "0 < d1" and d1: "∧x x'. [x∈convex hull {a, b, c}; x'∈convex hull {a, b, c}; cmod (x' - x) < d1] ==> cmod (f x' - f x) < cmod y / (24 * C)"
define e where"e = min 1 (min (d1/(4*C)) ((norm y / 24 / C) / B))"
define shrink where"shrink x = x - e *🪙R (x - d)"for x have e: "0 < e""e ≤ 1""e ≤ d1 / (4 * C)""e ≤ cmod y / 24 / C / B" using d1_pos ‹C>0›‹B>0› ynz by (simp_all add: e_def) have e_le_d1: "e * (4 * C) ≤ d1" using e ‹C>0›by (simp add: field_simps) have"shrink a ∈ interior(convex hull {a,b,c})" "shrink b ∈ interior(convex hull {a,b,c})" "shrink c ∈ interior(convex hull {a,b,c})" using d e by (auto simp: hull_inc mem_interior_convex_shrink shrink_def) thenhave fhp0: "(f has_contour_integral 0) (linepath (shrink a) (shrink b) +++ linepath (shrink b) (shrink c) +++ linepath (shrink c) (shrink a))" by (simp add: Cauchy_theorem_triangle holomorphic_on_subset [OF holf] hull_minimal) thenhave f_0_shrink: "pathint (shrink a) (shrink b) + pathint (shrink b) (shrink c) + pathint (shrink c) (shrink a) = 0" by (simp add: has_chain_integral_chain_integral3 pathint_def) have fpi_abc: "f contour_integrable_on linepath (shrink a) (shrink b)" "f contour_integrable_on linepath (shrink b) (shrink c)" "f contour_integrable_on linepath (shrink c) (shrink a)" using fhp0 by (auto simp: valid_path_join dest: has_contour_integral_integrable) have cmod_shr: "∧x y. cmod (shrink y - shrink x - (y - x)) = e * cmod (x - y)" using e by (simp add: shrink_def real_vector.scale_right_diff_distrib [symmetric]) have sh_eq: "∧a b d::complex. (b - e *🪙R (b - d)) - (a - e *🪙R (a - d)) - (b - a) = e *🪙R (a - b)" by (simp add: algebra_simps) have"cmod y / (24 * C) ≤ cmod y / cmod (b - a) / 12" using False ‹C>0› diff_2C [of b a] ynz by (auto simp: field_split_simps hull_inc) have less_C: "x * cmod u < C"if"u ∈ convex hull {a,b,c}""0 ≤ x""x ≤ 1"for x u proof (cases "x=0") case False with that show ?thesis using Cno [of u] mult_left_le_one_le [of "cmod u" x] le_less_trans norm_ge_zero by blast qed (simp add: ‹0🚫›)
{ fix u v assume uv: "u ∈ convex hull {a, b, c}""v ∈ convex hull {a, b, c}""u≠v" and fpi_uv: "f contour_integrable_on linepath (shrink u) (shrink v)" have shr_uv: "shrink u ∈ interior(convex hull {a,b,c})" "shrink v ∈ interior(convex hull {a,b,c})" using d e uv by (auto simp: hull_inc mem_interior_convex_shrink shrink_def) have cmod_fuv: "∧x. 0≤x ==> x≤1 ==> cmod (f (linepath (shrink u) (shrink v) x)) ≤B" using shr_uv by (blast intro: Bnf linepath_in_convex_hull interior_subset [THEN subsetD])
{ fix x::real assume x: "0≤x""x≤1" have"∣1 - x∣ * cmod u < C""∣x∣ * cmod v < C" using uv x by (auto intro!: less_C) moreoverhave"∣x∣ * cmod d < C""∣1 - x∣ * cmod d < C" using x d interior_subset by (auto intro!: less_C) ultimately have cmod_less_4C: "cmod ((1 - x) *🪙R u - (1 - x) *🪙R d) + cmod (x *🪙R v - x *??R d) < (C+C) + (C+C)" by (metis add_strict_mono le_less_trans norm_scaleR norm_triangle_ineq4) have ll: "linepath (shrink u) (shrink v) x - linepath u v x = -e * ((1 - x) *🪙R (u - d) + x *🪙R (v - d))" by (simp add: linepath_def shrink_def algebra_simps scaleR_conv_of_real) have cmod_less_dt: "cmod (linepath (shrink u) (shrink v) x - linepath u v x) < d1" unfolding ll norm_mult scaleR_diff_right using‹e>0› cmod_less_4C by (force intro: norm_triangle_lt less_le_trans [OF _ e_le_d1]) have"cmod (f (linepath (shrink u) (shrink v) x)) * cmod (shrink v - shrink u - (v - u)) + cmod (v - u) * cmod (f (linepath (shrink u) (shrink v) x) - f (linepath u v x)) ≤ B * (cmod y / 24 / C / B * 2 * C) + 2 * C * (cmod y / 24 / C)" proof (intro add_mono [OF mult_mono]) show"cmod (f (linepath (shrink u) (shrink v) x)) ≤ B" using cmod_fuv x by blast have"B * (12 * (e * cmod (u - v))) ≤ 24 * e * C * B" using e ‹B>0› diff_2C [of u v] uv by (auto simp: field_simps) alsohave"…≤ cmod y" using‹C>0›‹B>0› e by (simp add: field_simps) finallyshow"cmod (shrink v - shrink u - (v - u)) ≤ cmod y / 24 / C / B * 2 * C" using‹0 🚫›‹0 🚫›by (simp add: cmod_shr mult_ac divide_simps) have"cmod (f (linepath (shrink u) (shrink v) x) - f (linepath u v x)) < cmod y / (24 * C)" using x uv shr_uv cmod_less_dt by (auto simp: hull_inc intro: d1 interior_subset [THEN subsetD] linepath_in_convex_hull) alsohave"…≤ cmod y / cmod (v - u) / 12" using False uv ‹C>0› diff_2C [of v u] ynz by (auto simp: field_split_simps hull_inc) finallyhave"cmod (f (linepath (shrink u) (shrink v) x) - f (linepath u v x)) ≤ cmod y / cmod (v - u) / 12" by simp thenshow"cmod (v - u) * cmod (f (linepath (shrink u) (shrink v) x) - f (linepath u v x)) ≤ 2 * C * (cmod y / 24 / C)" using uv C by (simp add: field_simps) qed (use‹0 🚫›in auto) alsohave"…≤ cmod y / 6" by simp finallyhave"cmod (f (linepath (shrink u) (shrink v) x)) * cmod (shrink v - shrink u - (v - u)) + cmod (v - u) * cmod (f (linepath (shrink u) (shrink v) x) - f (linepath u v x)) ≤ cmod y / 6" .
} note cmod_diff_le = this have f_uv: "continuous_on (closed_segment u v) f" by (blast intro: uv continuous_on_subset [OF contf closed_segment_subset_convex_hull]) have **: "∧f' x' f x::complex. f'*x' - f*x = f' * (x' - x) + x * (f' - f)" by (simp add: algebra_simps) have"norm (pathint (shrink u) (shrink v) - pathint u v) ≤ (B*(norm y /24/C/B)*2*C + (2*C)*(norm y/24/C)) * measure lborel (cbox 0 (1::real))" apply (rule has_integral_bound
[of _ "λx. f(linepath (shrink u) (shrink v) x) * (shrink v - shrink u) - f(linepath u v x)*(v - u)"
_ 0 1]) using ynz ‹0 🚫›‹0 🚫› apply (simp_all add: pathint_def has_integral_diff has_contour_integral_linepath [symmetric] has_contour_integral_integral
fpi_uv f_uv contour_integrable_continuous_linepath del: le_divide_eq_numeral1) apply (auto simp: ** norm_triangle_le norm_mult cmod_diff_le simp del: le_divide_eq_numeral1) done alsohave"…≤ norm y / 6" by simp finallyhave"norm (pathint (shrink u) (shrink v) - pathint u v) ≤ norm y / 6" .
} note * = this have"norm (pathint (shrink a) (shrink b) - pathint a b) ≤ norm y / 6" using False fpi_abc by (rule_tac *) (auto simp: hull_inc) moreover have"norm (pathint (shrink b) (shrink c) - pathint b c) ≤ norm y / 6" using False fpi_abc by (rule_tac *) (auto simp: hull_inc) moreover have"norm (pathint (shrink c) (shrink a) - pathint c a) ≤ norm y / 6" using False fpi_abc by (rule_tac *) (auto simp: hull_inc) ultimately have"norm((pathint (shrink a) (shrink b) - pathint a b) + (pathint (shrink b) (shrink c) - pathint b c) + (pathint (shrink c) (shrink a) - pathint c a)) ≤ norm y / 6 + norm y / 6 + norm y / 6" by (metis norm_triangle_le add_mono) alsohave"… = norm y / 2" by simp finallyhave"norm((pathint (shrink a) (shrink b) + pathint (shrink b) (shrink c) + pathint (shrink c) (shrink a)) - (pathint a b + pathint b c + pathint c a)) ≤ norm y / 2" by (simp add: algebra_simps) then have"norm(pathint a b + pathint b c + pathint c a) ≤ norm y / 2" by (simp add: f_0_shrink) (metis (mono_tags) add.commute minus_add_distrib norm_minus_cancel uminus_add_conv_diff) thenhave"False" using pi_eq_y ynz by auto
} note * = this have"uniformly_continuous_on (convex hull {a,b,c}) f" by (simp add: contf compact_convex_hull compact_uniformly_continuous) moreoverhave"norm y / (24 * C) > 0" using ynz ‹C > 0›by auto ultimatelyobtain δ where"δ > 0"and "∀x∈convex hull {a, b, c}. ∀x'∈convex hull {a, b, c}. dist x' x < δ ⟶ dist (f x') (f x) < cmod y / (24 * C)" using‹C > 0› ynz unfolding uniformly_continuous_on_def dist_norm by blast hence False using *[of δ] by (auto simp: dist_norm) thenshow ?thesis .. qed
} moreoverhave"f contour_integrable_on (linepath a b +++ linepath b c +++ linepath c a)" using fabc contour_integrable_continuous_linepath by auto ultimatelyshow ?thesis using has_contour_integral_integral by fastforce qed
subsection🍋‹tag unimportant›‹Version allowing finite number of exceptional points›
proposition🍋‹tag unimportant› Cauchy_theorem_triangle_cofinite: assumes"continuous_on (convex hull {a,b,c}) f" and"finite S" and"(∧x. x ∈ interior(convex hull {a,b,c}) - S ==> f field_differentiable (at x))" shows"(f has_contour_integral 0) (linepath a b +++ linepath b c +++ linepath c a)" using assms proof (induction"card S" arbitrary: a b c S rule: less_induct) case (less S a b c) show ?case proof (cases "S={}") case True with less show ?thesis by (fastforce simp: holomorphic_on_def field_differentiable_at_within Cauchy_theorem_triangle_interior) next case False thenobtain d S' where d: "S = insert d S'""d ∉ S'" by (meson Set.set_insert all_not_in_conv) thenshow ?thesis proof (cases "d ∈ convex hull {a,b,c}") case False show"(f has_contour_integral 0) (linepath a b +++ linepath b c +++ linepath c a)" proof (rule less.hyps) show"∧x. x ∈ interior (convex hull {a, b, c}) - S' ==> f field_differentiable at x" using False d interior_subset by (auto intro!: less.prems) qed (use d less.prems in auto) next case True have *: "convex hull {a, b, d} ⊆ convex hull {a, b, c}" by (meson True hull_subset insert_subset convex_hull_subset) have abd: "(f has_contour_integral 0) (linepath a b +++ linepath b d +++ linepath d a)" proof (rule less.hyps) show"∧x. x ∈ interior (convex hull {a, b, d}) - S' ==> f field_differentiable at x" using d not_in_interior_convex_hull_3 by (clarsimp intro!: less.prems) (metis * insert_absorb insert_subset interior_mono) qed (use d continuous_on_subset [OF _ *] less.prems in auto) have *: "convex hull {b, c, d} ⊆ convex hull {a, b, c}" by (meson True hull_subset insert_subset convex_hull_subset) have bcd: "(f has_contour_integral 0) (linepath b c +++ linepath c d +++ linepath d b)" proof (rule less.hyps) show"∧x. x ∈ interior (convex hull {b, c, d}) - S' ==> f field_differentiable at x" using d not_in_interior_convex_hull_3 by (clarsimp intro!: less.prems) (metis * insert_absorb insert_subset interior_mono) qed (use d continuous_on_subset [OF _ *] less.prems in auto) have *: "convex hull {c, a, d} ⊆ convex hull {a, b, c}" by (meson True hull_subset insert_subset convex_hull_subset) have cad: "(f has_contour_integral 0) (linepath c a +++ linepath a d +++ linepath d c)" proof (rule less.hyps) show"∧x. x ∈ interior (convex hull {c, a, d}) - S' ==> f field_differentiable at x" using d not_in_interior_convex_hull_3 by (clarsimp intro!: less.prems) (metis * insert_absorb insert_subset interior_mono) qed (use d continuous_on_subset [OF _ *] less.prems in auto) have"f contour_integrable_on linepath a b" using less.prems abd contour_integrable_joinD1 contour_integrable_on_def by blast moreoverhave"f contour_integrable_on linepath b c" using less.prems bcd contour_integrable_joinD1 contour_integrable_on_def by blast moreoverhave"f contour_integrable_on linepath c a" using less.prems cad contour_integrable_joinD1 contour_integrable_on_def by blast ultimatelyhave fpi: "f contour_integrable_on (linepath a b +++ linepath b c +++ linepath c a)" by auto
{ fix y::complex assume fy: "(f has_contour_integral y) (linepath a b +++ linepath b c +++ linepath c a)" and ynz: "y ≠ 0" have cont_ad: "continuous_on (closed_segment a d) f" by (meson "*" continuous_on_subset less.prems(1) segments_subset_convex_hull(3)) have cont_bd: "continuous_on (closed_segment b d) f" by (meson True closed_segment_subset_convex_hull continuous_on_subset hull_subset insert_subset less.prems(1)) have cont_cd: "continuous_on (closed_segment c d) f" by (meson "*" continuous_on_subset less.prems(1) segments_subset_convex_hull(2)) have"contour_integral (linepath a b) f = - (contour_integral (linepath b d) f + (contour_integral (linepath d a) f))" "contour_integral (linepath b c) f = - (contour_integral (linepath c d) f + (contour_integral (linepath d b) f))" "contour_integral (linepath c a) f = - (contour_integral (linepath a d) f + contour_integral (linepath d c) f)" using has_chain_integral_chain_integral3 [OF abd]
has_chain_integral_chain_integral3 [OF bcd]
has_chain_integral_chain_integral3 [OF cad] by (simp_all add: algebra_simps add_eq_0_iff) thenhave ?thesis using cont_ad cont_bd cont_cd fy has_chain_integral_chain_integral3 contour_integral_reverse_linepath by fastforce
} thenshow ?thesis using fpi contour_integrable_on_def by blast qed qed qed
subsection🍋‹tag unimportant›‹Cauchy's theorem for an open starlike set›
lemma starlike_convex_subset: assumes S: "a ∈ S""closed_segment b c ⊆ S"and subs: "∧x. x ∈ S ==> closed_segment a x ⊆ S" shows"convex hull {a,b,c} ⊆ S" proof - have"convex hull {b, c} ⊆ S" using assms(2) segment_convex_hull by auto thenhave"∧u v d. [0 ≤ u; 0 ≤ v; u + v = 1; d ∈ convex hull {b, c}]==> u *🪙R a + v *🪙R d ∈ S" by (meson subs convexD convex_closed_segment ends_in_segment subsetCE) thenshow ?thesis by (auto simp add: convex_hull_insert [of "{b,c}" a]) qed
lemma triangle_contour_integrals_starlike_primitive: assumes contf: "continuous_on S f" and S: "a ∈ S""open S" and x: "x ∈ S" and subs: "∧y. y ∈ S ==> closed_segment a y ⊆ S" and zer: "∧b c. closed_segment b c ⊆ S ==> contour_integral (linepath a b) f + contour_integral (linepath b c) f + contour_integral (linepath c a) f = 0" shows"((λx. contour_integral(linepath a x) f) has_field_derivative f x) (at x)" proof - let ?pathint = "λx y. contour_integral(linepath x y) f"
{ fix e y assume e: "0 < e"and bxe: "ball x e ⊆ S"and close: "cmod (y - x) < e" have y: "y ∈ S" using bxe close by (force simp: dist_norm norm_minus_commute) have cont_ayf: "continuous_on (closed_segment a y) f" using contf continuous_on_subset subs y by blast have xys: "closed_segment x y ⊆ S" by (metis bxe centre_in_ball close closed_segment_subset convex_ball dist_norm dual_order.trans e mem_ball norm_minus_commute) have"?pathint a y - ?pathint a x = ?pathint x y" using zer [OF xys] contour_integral_reverse_linepath [OF cont_ayf] add_eq_0_iff by force
} note [simp] = this
{ fix e::real assume e: "0 < e" have cont_atx: "continuous (at x) f" using x S contf continuous_on_eq_continuous_at by blast thenobtain d1 where d1: "d1>0"and d1_less: "∧y. cmod (y - x) < d1 ==> cmod (f y - f x) < e/2" unfolding continuous_at Lim_at dist_norm using e by (drule_tac x="e/2"in spec) force obtain d2 where d2: "d2>0""ball x d2 ⊆ S"using‹open S› x by (auto simp: open_contains_ball) have dpos: "min d1 d2 > 0"using d1 d2 by simp
{ fix y assume yx: "y ≠ x"and close: "cmod (y - x) < min d1 d2" have y: "y ∈ S" using d2 close by (force simp: dist_norm norm_minus_commute) have"closed_segment x y ⊆ S" using close d2 by (auto simp: dist_norm norm_minus_commute dest!: segment_bound(1)) thenhave fxy: "f contour_integrable_on linepath x y" by (metis contour_integrable_continuous_linepath continuous_on_subset [OF contf]) thenobtain i where i: "(f has_contour_integral i) (linepath x y)" by (auto simp: contour_integrable_on_def) thenhave"((λw. f w - f x) has_contour_integral (i - f x * (y - x))) (linepath x y)" by (rule has_contour_integral_diff [OF _ has_contour_integral_const_linepath]) thenhave"cmod (i - f x * (y - x)) ≤ e / 2 * cmod (y - x)" proof (rule has_contour_integral_bound_linepath) show"∧u. u ∈ closed_segment x y ==> cmod (f u - f x) ≤ e / 2" by (meson close d1_less le_less_trans less_imp_le min.strict_boundedE segment_bound1) qed (use e in simp) alsohave"… < e * cmod (y - x)" by (simp add: e yx) finallyhave"cmod (?pathint x y - f x * (y-x)) / cmod (y-x) < e" using i yx by (simp add: contour_integral_unique divide_less_eq)
} thenhave"∃d>0. ∀y. y ≠ x ∧ cmod (y-x) < d ⟶ cmod (?pathint x y - f x * (y-x)) / cmod (y-x) < e" using dpos by blast
} thenhave"(λy. (?pathint x y - f x * (y - x)) /🪙R cmod (y - x)) ←-x→ 0" by (simp add: Lim_at dist_norm inverse_eq_divide) thenhave"(λy. (1 / cmod (y - x)) *🪙R (?pathint a y - (?pathint a x + f x * (y - x)))) ←-x→ 0" using‹open S› x by (force simp: dist_norm open_contains_ball inverse_eq_divide [symmetric] eventually_at intro: Lim_transform [OF _ tendsto_eventually]) thenshow ?thesis by (simp add: has_field_derivative_def has_derivative_at2 bounded_linear_mult_right) qed
text‹Existence of a primitive› lemma holomorphic_starlike_primitive: fixes f :: "complex ==> complex" assumes contf: "continuous_on S f" and S: "starlike S"and os: "open S" and k: "finite k" and fcd: "∧x. x ∈ S - k ==> f field_differentiable at x" shows"∃g. ∀x ∈ S. (g has_field_derivative f x) (at x)" proof - obtain a where a: "a∈S"and a_cs: "∧x. x∈S ==> closed_segment a x ⊆ S" using S by (auto simp: starlike_def)
{ fix x b c assume"x ∈ S""closed_segment b c ⊆ S" thenhave abcs: "convex hull {a, b, c} ⊆ S" by (simp add: a a_cs starlike_convex_subset) thenhave"continuous_on (convex hull {a, b, c}) f" by (simp add: continuous_on_subset [OF contf]) thenhave"(f has_contour_integral 0) (linepath a b +++ linepath b c +++ linepath c a)" using abcs interior_subset by (force intro: fcd Cauchy_theorem_triangle_cofinite [OF _ k])
} note 0 = this show ?thesis proof (intro exI ballI) show"∧x. x ∈ S ==> ((λx. contour_integral (linepath a x) f) has_field_derivative f x) (at x)" using"0" a a_cs contf has_chain_integral_chain_integral3 os triangle_contour_integrals_starlike_primitive by force qed qed
lemma Cauchy_theorem_starlike: "[open S; starlike S; finite k; continuous_on S f; ∧x. x ∈ S - k ==> f field_differentiable at x; valid_path g; path_image g ⊆ S; pathfinish g = pathstart g] ==> (f has_contour_integral 0) g" by (metis holomorphic_starlike_primitive Cauchy_theorem_primitive at_within_open)
lemma Cauchy_theorem_starlike_simple: "[open S; starlike S; f holomorphic_on S; valid_path g; path_image g ⊆ S; pathfinish g = pathstart g] ==> (f has_contour_integral 0) g" using Cauchy_theorem_starlike [OF _ _ finite.emptyI] by (simp add: holomorphic_on_imp_continuous_on holomorphic_on_imp_differentiable_at)
subsection‹Cauchy's theorem for a convex set›
text‹For a convex set we can avoid assuming openness and boundary analyticity›
lemma triangle_contour_integrals_convex_primitive: assumes contf: "continuous_on S f" and S: "a ∈ S""convex S" and x: "x ∈ S" and zer: "∧b c. [b ∈ S; c ∈ S] ==> contour_integral (linepath a b) f + contour_integral (linepath b c) f + contour_integral (linepath c a) f = 0" shows"((λx. contour_integral(linepath a x) f) has_field_derivative f x) (at x within S)" proof - let ?pathint = "λx y. contour_integral(linepath x y) f"
{ fix y assume y: "y ∈ S" have cont_ayf: "continuous_on (closed_segment a y) f" using S y by (meson contf continuous_on_subset convex_contains_segment) have xys: "closed_segment x y ⊆ S"(*?*) using convex_contains_segment S x y by auto have"?pathint a y - ?pathint a x = ?pathint x y" using zer [OF x y] contour_integral_reverse_linepath [OF cont_ayf] add_eq_0_iff by force
} note [simp] = this
{ fix e::real assume e: "0 < e" have cont_atx: "continuous (at x within S) f" using x S contf by (simp add: continuous_on_eq_continuous_within) thenobtain d1 where d1: "d1>0"and d1_less: "∧y. [y ∈ S; cmod (y - x) < d1]==> cmod (f y - f x) < e/2" unfolding continuous_within Lim_within dist_norm using e by (drule_tac x="e/2"in spec) force
{ fix y assume yx: "y ≠ x"and close: "cmod (y - x) < d1"and y: "y ∈ S" have fxy: "f contour_integrable_on linepath x y" using convex_contains_segment S x y by (blast intro!: contour_integrable_continuous_linepath continuous_on_subset [OF contf]) thenobtain i where i: "(f has_contour_integral i) (linepath x y)" by (auto simp: contour_integrable_on_def) thenhave"((λw. f w - f x) has_contour_integral (i - f x * (y - x))) (linepath x y)" by (rule has_contour_integral_diff [OF _ has_contour_integral_const_linepath]) thenhave"cmod (i - f x * (y - x)) ≤ e / 2 * cmod (y - x)" proof (rule has_contour_integral_bound_linepath) show"∧u. u ∈ closed_segment x y ==> cmod (f u - f x) ≤ e / 2" by (meson assms(3) close convex_contains_segment d1_less le_less_trans less_imp_le segment_bound1 subset_iff x y) qed (use e in simp) alsohave"… < e * cmod (y - x)" by (simp add: e yx) finallyhave"cmod (?pathint x y - f x * (y-x)) / cmod (y-x) < e" using i yx by (simp add: contour_integral_unique divide_less_eq)
} thenhave"∃d>0. ∀y∈S. y ≠ x ∧ cmod (y-x) < d ⟶ cmod (?pathint x y - f x * (y-x)) / cmod (y-x) < e" using d1 by blast
} thenhave"((λy. (?pathint x y - f x * (y - x)) /🪙R cmod (y - x)) ---> 0) (at x within S)" by (simp add: Lim_within dist_norm inverse_eq_divide) thenhave"((λy. (1 / cmod (y - x)) *🪙R (?pathint a y - (?pathint a x + f x * (y - x)))) ---> 0) (at x within S)" using linordered_field_no_ub by (force simp: inverse_eq_divide [symmetric] eventually_at intro: Lim_transform [OF _ tendsto_eventually]) thenshow ?thesis by (simp add: has_field_derivative_def has_derivative_within bounded_linear_mult_right) qed
lemma contour_integral_convex_primitive: assumes"convex S""continuous_on S f" "∧a b c. [a ∈ S; b ∈ S; c ∈ S]==> (f has_contour_integral 0) (linepath a b +++ linepath b c +++ linepath c a)" obtains g where"∧x. x ∈ S ==> (g has_field_derivative f x) (at x within S)" proof (cases "S={}") case False with assms that show ?thesis by (blast intro: triangle_contour_integrals_convex_primitive has_chain_integral_chain_integral3) qed auto
lemma holomorphic_convex_primitive: fixes f :: "complex ==> complex" assumes"convex S""finite K"and contf: "continuous_on S f" and fd: "∧x. x ∈ interior S - K ==> f field_differentiable at x" obtains g where"∧x. x ∈ S ==> (g has_field_derivative f x) (at x within S)" proof (rule contour_integral_convex_primitive [OF ‹convex S› contf Cauchy_theorem_triangle_cofinite]) have *: "convex hull {a, b, c} ⊆ S"if"a ∈ S""b ∈ S""c ∈ S"for a b c by (simp add: ‹convex S› hull_minimal that) show"continuous_on (convex hull {a, b, c}) f"if"a ∈ S""b ∈ S""c ∈ S"for a b c by (meson "*" contf continuous_on_subset that) show"f field_differentiable at x"if"a ∈ S""b ∈ S""c ∈ S""x ∈ interior (convex hull {a, b, c}) - K"for a b c x by (metis "*" DiffD1 DiffD2 DiffI fd interior_mono subsetCE that) qed (use assms in‹force+›)
lemma holomorphic_convex_primitive': fixes f :: "complex ==> complex" assumes"convex S"and"open S"and"f holomorphic_on S" obtains g where"∧x. x ∈ S ==> (g has_field_derivative f x) (at x within S)" proof (rule holomorphic_convex_primitive) fix x assume"x ∈ interior S - {}" with assms show"f field_differentiable at x" by (auto intro!: holomorphic_on_imp_differentiable_at simp: interior_open) qed (use assms in‹auto intro: holomorphic_on_imp_continuous_on›)
corollary🍋‹tag unimportant› Cauchy_theorem_convex: "[continuous_on S f; convex S; finite K; ∧x. x ∈ interior S - K ==> f field_differentiable at x; valid_path g; path_image g ⊆ S; pathfinish g = pathstart g] ==> (f has_contour_integral 0) g" by (metis holomorphic_convex_primitive Cauchy_theorem_primitive)
corollary Cauchy_theorem_convex_simple: assumes holf: "f holomorphic_on S" and"convex S""valid_path g""path_image g ⊆ S""pathfinish g = pathstart g" shows"(f has_contour_integral 0) g" proof - have"f holomorphic_on interior S" by (meson holf holomorphic_on_subset interior_subset) with Cauchy_theorem_convex [where K = "{}"] show ?thesis using assms by (metis Diff_empty finite.emptyI holomorphic_on_imp_continuous_on holomorphic_on_imp_differentiable_at open_interior) qed
text‹In particular for a disc› corollary🍋‹tag unimportant› Cauchy_theorem_disc: "[finite K; continuous_on (cball a e) f; ∧x. x ∈ ball a e - K ==> f field_differentiable at x; valid_path g; path_image g ⊆ cball a e; pathfinish g = pathstart g]==> (f has_contour_integral 0) g" by (auto intro: Cauchy_theorem_convex)
corollary🍋‹tag unimportant› Cauchy_theorem_disc_simple: "[f holomorphic_on (ball a e); valid_path g; path_image g ⊆ ball a e; pathfinish g = pathstart g]==> (f has_contour_integral 0) g" by (simp add: Cauchy_theorem_convex_simple)
subsection🍋‹tag unimportant›‹Generalize integrability to local primitives›
lemma contour_integral_local_primitive_lemma: fixes f :: "complex==>complex" assumes gpd: "g piecewise_differentiable_on {a..b}" and dh: "∧x. x ∈ S ==> (f has_field_derivative f' x) (at x within S)" and gs: "∧x. x ∈ {a..b} ==> g x ∈ S" shows"(λx. f' (g x) * vector_derivative g (at x within {a..b})) integrable_on {a..b}" proof (cases "cbox a b = {}") case False thenshow ?thesis unfolding integrable_on_def by (auto intro: assms contour_integral_primitive_lemma) qed auto
lemma contour_integral_local_primitive_any: fixes f :: "complex ==> complex" assumes gpd: "g piecewise_differentiable_on {a..b}" and dh: "∧x. x ∈ S ==>∃d h. 0 < d ∧ (∀y. norm(y - x) < d ⟶ (h has_field_derivative f y) (at y within S))" and gs: "∧x. x ∈ {a..b} ==> g x ∈ S" shows"(λx. f(g x) * vector_derivative g (at x)) integrable_on {a..b}" proof -
{ fix x assume x: "a ≤ x""x ≤ b" obtain d h where d: "0 < d" and h: "(∧y. norm(y - g x) < d ==> (h has_field_derivative f y) (at y within S))" using x gs dh by (metis atLeastAtMost_iff) have"continuous_on {a..b} g"using gpd piecewise_differentiable_on_def by blast thenobtain e where e: "e>0"and lessd: "∧x'. x' ∈ {a..b} ==>∣x' - x∣ < e ==> cmod (g x' - g x) < d" using x d by (fastforce simp: dist_norm continuous_on_iff) have"∃e>0. ∀u v. u ≤ x ∧ x ≤ v ∧ {u..v} ⊆ ball x e ∧ (u ≤ v ⟶ a ≤ u ∧ v ≤ b) ⟶ (λx. f (g x) * vector_derivative g (at x)) integrable_on {u..v}" proof - have"(λx. f (g x) * vector_derivative g (at x within {u..v})) integrable_on {u..v}" if"u ≤ x""x ≤ v"and ball: "{u..v} ⊆ ball x e"and auvb: "u ≤ v ==> a ≤ u ∧ v ≤ b" for u v proof (rule contour_integral_local_primitive_lemma) show"g piecewise_differentiable_on {u..v}" by (metis atLeastatMost_subset_iff gpd piecewise_differentiable_on_subset auvb) show"∧x. x ∈ g ` {u..v} ==> (h has_field_derivative f x) (at x within g ` {u..v})" using that by (force simp: ball_def dist_norm intro: lessd gs DERIV_subset [OF h]) qed auto thenshow ?thesis using e integrable_on_localized_vector_derivative by blast qed
} then show ?thesis by (force simp: intro!: integrable_on_little_subintervals [of a b, simplified]) qed
lemma contour_integral_local_primitive: fixes f :: "complex ==> complex" assumes g: "valid_path g""path_image g ⊆ S" and dh: "∧x. x ∈ S ==>∃d h. 0 < d ∧ (∀y. norm(y - x) < d ⟶ (h has_field_derivative f y) (at y within S))" shows"f contour_integrable_on g" proof - have"(λx. f (g x) * vector_derivative g (at x)) integrable_on {0..1}" using contour_integral_local_primitive_any [OF _ dh] g unfolding path_image_def valid_path_def by (metis (no_types, lifting) image_subset_iff piecewise_C1_imp_differentiable) thenshow ?thesis using contour_integrable_on by presburger qed
text‹In particular if a function is holomorphic›
lemma contour_integrable_holomorphic: assumes contf: "continuous_on S f" and os: "open S" and k: "finite k" and g: "valid_path g""path_image g ⊆ S" and fcd: "∧x. x ∈ S - k ==> f field_differentiable at x" shows"f contour_integrable_on g" proof -
{ fix z assume z: "z ∈ S" obtain d where"d>0"and d: "ball z d ⊆ S"using‹open S› z by (auto simp: open_contains_ball) thenhave contfb: "continuous_on (ball z d) f" using contf continuous_on_subset by blast obtain h where"∀y∈ball z d. (h has_field_derivative f y) (at y within ball z d)" by (metis holomorphic_convex_primitive [OF convex_ball k contfb fcd] d interior_subset Diff_iff subsetD) thenhave"∀y∈ball z d. (h has_field_derivative f y) (at y within S)" by (metis open_ball at_within_open d os subsetCE) thenhave"∃h. (∀y. cmod (y - z) < d ⟶ (h has_field_derivative f y) (at y within S))" by (force simp: dist_norm norm_minus_commute) thenhave"∃d h. 0 < d ∧ (∀y. cmod (y - z) < d ⟶ (h has_field_derivative f y) (at y within S))" using‹0 🚫›by blast
} thenshow ?thesis by (rule contour_integral_local_primitive [OF g]) qed
lemma contour_integrable_holomorphic_simple: assumes fh: "f holomorphic_on S" and os: "open S" and g: "valid_path g""path_image g ⊆ S" shows"f contour_integrable_on g" proof - have"∧x. x ∈ S ==> f field_differentiable at x" using fh holomorphic_on_imp_differentiable_at os by blast moreoverhave"continuous_on S f" by (simp add: fh holomorphic_on_imp_continuous_on) ultimatelyshow ?thesis by (metis Diff_empty contour_integrable_holomorphic finite.emptyI g os) qed
text‹Key fact that path integral is the same for a "nearby" path. This is the main lemma for the homotopy form of Cauchy's theorem and is also useful if we want "without loss of generality" to assume some nice properties of a path (e.g. smoothness). It can also be used to define the integrals of analytic functions over arbitrary continuous paths. This is just done for winding numbers now. ›
text‹A technical definition to avoid duplication of similar proofs, for paths joined at the ends versus looping paths› definition linked_paths :: "bool ==> (real ==> 'a) ==> (real ==> 'a::topological_space) ==> bool" where"linked_paths atends g h == (if atends then pathstart h = pathstart g ∧ pathfinish h = pathfinish g else pathfinish g = pathstart g ∧ pathfinish h = pathstart h)"
text‹This formulation covers two cases: 🍋‹g› and 🍋‹h› share their
start andend points; 🍋‹g›and🍋‹h› both loop upon themselves.› lemma contour_integral_nearby: assumes os: "open S"and p: "path p""path_image p ⊆ S" shows"∃d. 0 < d ∧ (∀g h. valid_path g ∧ valid_path h ∧ (∀t ∈ {0..1}. norm(g t - p t) < d ∧ norm(h t - p t) < d) ∧ linked_paths atends g h ⟶ path_image g ⊆ S ∧ path_image h ⊆ S ∧ (∀f. f holomorphic_on S ⟶ contour_integral h f = contour_integral g f))" proof - have"∀z. ∃e. z ∈ path_image p ⟶ 0 < e ∧ ball z e ⊆ S" using open_contains_ball os p(2) by blast thenobtain ee where ee: "∧z. z ∈ path_image p ==> 0 < ee z ∧ ball z (ee z) ⊆ S" by metis
define cover where"cover = (λz. ball z (ee z/3)) ` (path_image p)" have"compact (path_image p)" by (metis p(1) compact_path_image) moreoverhave"path_image p ⊆ (∪c∈path_image p. ball c (ee c / 3))" using ee by auto ultimatelyhave"∃D ⊆ cover. finite D ∧ path_image p ⊆∪D" by (simp add: compact_eq_Heine_Borel cover_def) thenobtain D where D: "D ⊆ cover""finite D""path_image p ⊆∪D" by blast thenobtain k where k: "k ⊆ {0..1}""finite k"and D_eq: "D = ((λz. ball z (ee z / 3)) ∘ p) ` k" unfolding cover_def path_image_def image_comp by (meson finite_subset_image) thenhave kne: "k ≠ {}" using D by auto have pi: "∧i. i ∈ k ==> p i ∈ path_image p" using k by (auto simp: path_image_def) thenhave eepi: "∧i. i ∈ k ==> 0 < ee((p i))" by (metis ee)
define e where"e = Min((ee ∘ p) ` k)" have fin_eep: "finite ((ee ∘ p) ` k)" using k by blast have"0 < e" using ee k by (simp add: kne e_def Min_gr_iff [OF fin_eep] eepi) have"uniformly_continuous_on {0..1} p" using p by (simp add: path_def compact_uniformly_continuous) thenobtain d::real where d: "d>0" and de: "∧x x'. ∣x' - x∣ < d ==> x∈{0..1} ==> x'∈{0..1} ==> cmod (p x' - p x) < e/3" unfolding uniformly_continuous_on_def dist_norm real_norm_def by (metis divide_pos_pos ‹0 🚫› zero_less_numeral) thenobtain N::nat where N: "N>0""inverse N < d" using real_arch_inverse [of d] by auto show ?thesis proof (intro exI conjI allI; clarify?) show"e/3 > 0" using‹0 🚫›by simp fix g h assume g: "valid_path g"and ghp: "∀t∈{0..1}. cmod (g t - p t) < e / 3 ∧ cmod (h t - p t) < e / 3" and h: "valid_path h" and joins: "linked_paths atends g h"
{ fix t::real assume t: "0 ≤ t""t ≤ 1" thenobtain u where u: "u ∈ k"and ptu: "p t ∈ ball(p u) (ee(p u) / 3)" using‹path_image p ⊆∪D› D_eq by (force simp: path_image_def) thenhave ele: "e ≤ ee (p u)"using fin_eep by (simp add: e_def) have"cmod (g t - p t) < e / 3""cmod (h t - p t) < e / 3" using ghp t by auto with ele have"cmod (g t - p t) < ee (p u) / 3" "cmod (h t - p t) < ee (p u) / 3" by linarith+ thenhave"g t ∈ ball(p u) (ee(p u))""h t ∈ ball(p u) (ee(p u))" using norm_diff_triangle_ineq [of "g t""p t""p t""p u"]
norm_diff_triangle_ineq [of "h t""p t""p t""p u"] ptu eepi u by (force simp: dist_norm ball_def norm_minus_commute)+ thenhave"g t ∈ S""h t ∈ S"using ee u k by (auto simp: path_image_def ball_def)
} thenhave ghs: "path_image g ⊆ S""path_image h ⊆ S" by (auto simp: path_image_def) moreover
{ fix f assume fhols: "f holomorphic_on S" thenhave fpa: "f contour_integrable_on g""f contour_integrable_on h" using g ghs h holomorphic_on_imp_continuous_on os contour_integrable_holomorphic_simple by blast+ have contf: "continuous_on S f" by (simp add: fhols holomorphic_on_imp_continuous_on)
{ fix z assume z: "z ∈ path_image p" have"f holomorphic_on ball z (ee z)" using fhols ee z holomorphic_on_subset by blast thenhave"∃ff. (∀w ∈ ball z (ee z). (ff has_field_derivative f w) (at w))" using holomorphic_convex_primitive [of "ball z (ee z)""{}" f, simplified] by (metis open_ball at_within_open holomorphic_on_def holomorphic_on_imp_continuous_on mem_ball)
} thenobtain ff where ff: "∧z w. [z ∈ path_image p; w ∈ ball z (ee z)]==> (ff z has_field_derivative f w) (at w)" by metis
{ fix n assume n: "n ≤ N" thenhave"contour_integral(subpath 0 (n/N) h) f - contour_integral(subpath 0 (n/N) g) f = contour_integral(linepath (g(n/N)) (h(n/N))) f - contour_integral(linepath (g 0) (h 0)) f" proof (induct n) case 0 show ?caseby simp next case (Suc n) obtain t where t: "t ∈ k"and"p (n/N) ∈ ball(p t) (ee(p t) / 3)" using‹path_image p ⊆∪D› [THEN subsetD, where c="p (n/N)"] D_eq N Suc.prems by (force simp: path_image_def) thenhave ptu: "cmod (p t - p (n/N)) < ee (p t) / 3" by (simp add: dist_norm) have e3le: "e/3 ≤ ee (p t) / 3"using fin_eep t by (simp add: e_def)
{ fix x assume x: "n/N ≤ x""x ≤ (1 + n)/N" thenhave nN01: "0 ≤ n/N""(1 + n)/N ≤ 1" using Suc.prems by auto thenhave x01: "0 ≤ x""x ≤ 1" using x by linarith+ have"cmod (p t - p x) < ee (p t) / 3 + e/3" proof (rule norm_diff_triangle_less [OF ptu de]) show"∣real n / real N - x∣ < d" using x N by (auto simp: field_simps) qed (use x01 Suc.prems in auto) thenhave ptx: "cmod (p t - p x) < 2*ee (p t)/3" using e3le eepi [OF t] by simp have"cmod (p t - g x) < 2*ee (p t)/3 + e/3" using ghp x01 by (force simp add: norm_minus_commute intro!: norm_diff_triangle_less [OF ptx]) alsohave"…≤ ee (p t)" using e3le eepi [OF t] by simp finallyhave gg: "cmod (p t - g x) < ee (p t)" . have"cmod (p t - h x) < 2*ee (p t)/3 + e/3 " using ghp x01 by (force simp add: norm_minus_commute intro!: norm_diff_triangle_less [OF ptx]) alsohave"…≤ ee (p t)" using e3le eepi [OF t] by simp finallyhave"cmod (p t - g x) < ee (p t)""cmod (p t - h x) < ee (p t)" using gg by auto
} note ptgh_ee = this have"closed_segment (g (n/N)) (h (n/N)) = path_image (linepath (h (n/N)) (g (n/N)))" by (simp add: closed_segment_commute) alsohave pi_hgn: "…⊆ ball (p t) (ee (p t))" using ptgh_ee [of "n/N"] Suc.prems by (auto simp: field_simps dist_norm dest: segment_furthest_le [where y="p t"]) finallyhave gh_ns: "closed_segment (g (n/N)) (h (n/N)) ⊆ S" using ee pi t by blast have pi_ghn': "path_image (linepath (g ((1 + n) / N)) (h ((1 + n) / N))) ⊆ ball (p t) (ee (p t))" using ptgh_ee [of "(1+n)/N"] Suc.prems by (auto simp: field_simps dist_norm dest: segment_furthest_le [where y="p t"]) thenhave gh_n's: "closed_segment (g ((1 + n) / N)) (h ((1 + n) / N)) ⊆ S" using‹N>0› Suc.prems ee pi t by (auto simp: Path_Connected.path_image_join field_simps) have pi_subset_ball: "path_image (subpath (n/N) ((1+n) / N) g +++ linepath (g ((1+n) / N)) (h ((1+n) / N)) +++ subpath ((1+n) / N) (n/N) h +++ linepath (h (n/N)) (g (n/N))) ⊆ ball (p t) (ee (p t))" proof (intro subset_path_image_join pi_hgn pi_ghn') show"path_image (subpath (n/N) ((1+n) / N) g) ⊆ ball (p t) (ee (p t))" "path_image (subpath ((1+n) / N) (n/N) h) ⊆ ball (p t) (ee (p t))" using‹N>0› Suc.prems by (auto simp: path_image_subpath dist_norm field_simps ptgh_ee) qed have pi0: "(f has_contour_integral 0) (subpath (n/ N) ((Suc n)/N) g +++ linepath(g ((Suc n) / N)) (h((Suc n) / N)) +++ subpath ((Suc n) / N) (n/N) h +++ linepath(h (n/N)) (g (n/N)))" proof (rule Cauchy_theorem_primitive) show"∧x. x ∈ ball (p t) (ee (p t)) ==> (ff (p t) has_field_derivative f x) (at x within ball (p t) (ee (p t)))" by (metis ff open_ball at_within_open pi t) qed (use Suc.prems pi_subset_ball in‹simp_all add: valid_path_subpath g h›) have fpa1: "f contour_integrable_on subpath (n/N) (real (Suc n) / real N) g" using Suc.prems by (simp add: contour_integrable_subpath g fpa) have fpa2: "f contour_integrable_on linepath (g (real (Suc n) / real N)) (h (real (Suc n) / real N))" using gh_n's by (auto intro!: contour_integrable_continuous_linepath continuous_on_subset [OF contf]) have fpa3: "f contour_integrable_on linepath (h (n/N)) (g (n/N))" using gh_ns by (auto simp: closed_segment_commute intro!: contour_integrable_continuous_linepath continuous_on_subset [OF contf]) have eq0: "contour_integral (subpath (n/N) ((Suc n) / real N) g) f + contour_integral (linepath (g ((Suc n) / N)) (h ((Suc n) / N))) f + contour_integral (subpath ((Suc n) / N) (n/N) h) f + contour_integral (linepath (h (n/N)) (g (n/N))) f = 0" using contour_integral_unique [OF pi0] Suc.prems by (simp add: g h fpa valid_path_subpath contour_integrable_subpath
fpa1 fpa2 fpa3 algebra_simps del: of_nat_Suc) have *: "∧hn he hn' gn gd gn' hgn ghn gh0 ghn'. [hn - gn = ghn - gh0; gd + ghn' + he + hgn = (0::complex); hn - he = hn'; gn + gd = gn'; hgn = -ghn]==> hn' - gn' = ghn' - gh0" by (auto simp: algebra_simps) have"contour_integral (subpath 0 (n/N) h) f - contour_integral (subpath ((Suc n) / N) (n/N) h) f = contour_integral (subpath 0 (n/N) h) f + contour_integral (subpath (n/N) ((Suc n) / N) h) f" unfolding reversepath_subpath [symmetric, of "((Suc n) / N)"] using Suc.prems by (simp add: h fpa contour_integral_reversepath valid_path_subpath contour_integrable_subpath) alsohave"… = contour_integral (subpath 0 ((Suc n) / N) h) f" using Suc.prems by (simp add: contour_integral_subpath_combine h fpa) finallyhave pi0_eq: "contour_integral (subpath 0 (n/N) h) f - contour_integral (subpath ((Suc n) / N) (n/N) h) f = contour_integral (subpath 0 ((Suc n) / N) h) f" . show ?case proof (rule * [OF Suc.hyps eq0 pi0_eq]) show"contour_integral (subpath 0 (n/N) g) f + contour_integral (subpath (n/N) ((Suc n) / N) g) f = contour_integral (subpath 0 ((Suc n) / N) g) f" using Suc.prems contour_integral_subpath_combine fpa(1) g by auto show"contour_integral (linepath (h (n/N)) (g (n/N))) f = - contour_integral (linepath (g (n/N)) (h (n/N))) f" by (metis contour_integral_unique fpa3 has_contour_integral_integral has_contour_integral_reverse_linepath) qed (use Suc.prems in auto) qed
} note ind = this have"contour_integral h f = contour_integral g f" using ind [OF order_refl] N joins by (simp add: linked_paths_def pathstart_def pathfinish_def split: if_split_asm)
} ultimately show"path_image g ⊆ S ∧ path_image h ⊆ S ∧ (∀f. f holomorphic_on S ⟶ contour_integral h f = contour_integral g f)" by metis qed qed
lemma assumes"open S""path p""path_image p ⊆ S" shows contour_integral_nearby_ends: "∃d. 0 < d ∧ (∀g h. valid_path g ∧ valid_path h ∧ (∀t ∈ {0..1}. norm(g t - p t) < d ∧ norm(h t - p t) < d) ∧ pathstart h = pathstart g ∧ pathfinish h = pathfinish g ⟶ path_image g ⊆ S ∧ path_image h ⊆ S ∧ (∀f. f holomorphic_on S ⟶ contour_integral h f = contour_integral g f))" and contour_integral_nearby_loops: "∃d. 0 < d ∧ (∀g h. valid_path g ∧ valid_path h ∧ (∀t ∈ {0..1}. norm(g t - p t) < d ∧ norm(h t - p t) < d) ∧ pathfinish g = pathstart g ∧ pathfinish h = pathstart h ⟶ path_image g ⊆ S ∧ path_image h ⊆ S ∧ (∀f. f holomorphic_on S ⟶ contour_integral h f = contour_integral g f))" using contour_integral_nearby [OF assms, where atends=True] using contour_integral_nearby [OF assms, where atends=False] unfolding linked_paths_def by simp_all
lemma contour_integral_bound_exists: assumes S: "open S" and g: "valid_path g" and pag: "path_image g ⊆ S" shows"∃L. 0 < L ∧ (∀f B. f holomorphic_on S ∧ (∀z ∈ S. norm(f z) ≤ B) ⟶ norm(contour_integral g f) ≤ L*B)" proof - have"path g"using g by (simp add: valid_path_imp_path) thenobtain d::real and p where d: "0 < d" and p: "polynomial_function p""path_image p ⊆ S" and pi: "∧f. f holomorphic_on S ==> contour_integral g f = contour_integral p f" using contour_integral_nearby_ends [OF S ‹path g› pag] by (metis cancel_comm_monoid_add_class.diff_cancel g norm_zero path_approx_polynomial_function valid_path_polynomial_function) thenobtain p' where p': "polynomial_function p'" "∧x. (p has_vector_derivative (p' x)) (at x)" by (blast intro: has_vector_derivative_polynomial_function that) thenhave"bounded(p' ` {0..1})" using continuous_on_polymonial_function by (force simp: intro!: compact_imp_bounded compact_continuous_image) thenobtain L where L: "L>0"and nop': "∧x. [0 ≤ x; x ≤ 1]==> norm (p' x) ≤ L" by (force simp: bounded_pos)
{ fix f B assume f: "f holomorphic_on S"and B: "∧z. z∈S ==> cmod (f z) ≤ B" thenhave"f contour_integrable_on p ∧ valid_path p" using p S by (blast intro: valid_path_polynomial_function contour_integrable_holomorphic_simple holomorphic_on_imp_continuous_on) moreoverhave"cmod (vector_derivative p (at x)) * cmod (f (p x)) ≤ L * B"if"0 ≤ x""x ≤ 1"for x proof (rule mult_mono) show"cmod (vector_derivative p (at x)) ≤ L" by (metis nop' p'(2) that vector_derivative_at) show"cmod (f (p x)) ≤ B" by (metis B atLeastAtMost_iff imageI p(2) path_defs(4) subset_eq that) qed (use‹L>0›in auto) ultimately have"cmod (integral {0..1} (λx. f (p x) * vector_derivative p (at x))) ≤ L * B" by (intro order_trans [OF integral_norm_bound_integral])
(auto simp: mult.commute norm_mult contour_integrable_on) thenhave"cmod (contour_integral g f) ≤ L * B" using contour_integral_integral f pi by presburger
} then show ?thesis using‹L > 0› by (intro exI[of _ L]) auto qed
subsection‹Homotopy forms of Cauchy's theorem›
lemma Cauchy_theorem_homotopic: assumes hom: "if atends then homotopic_paths S g h else homotopic_loops S g h" and"open S"and f: "f holomorphic_on S" and vpg: "valid_path g"and vph: "valid_path h" shows"contour_integral g f = contour_integral h f" proof - have pathsf: "linked_paths atends g h" using hom by (auto simp: linked_paths_def homotopic_paths_imp_pathstart homotopic_paths_imp_pathfinish homotopic_loops_imp_loop) obtain k :: "real × real ==> complex" where contk: "continuous_on ({0..1} × {0..1}) k" and ks: "k ` ({0..1} × {0..1}) ⊆ S" and k [simp]: "∀x. k (0, x) = g x""∀x. k (1, x) = h x" and ksf: "∀t∈{0..1}. linked_paths atends g (λx. k (t, x))" using hom pathsf by (auto simp: linked_paths_def homotopic_paths_def homotopic_loops_def homotopic_with_def split: if_split_asm) have ucontk: "uniformly_continuous_on ({0..1} × {0..1}) k" by (blast intro: compact_Times compact_uniformly_continuous [OF contk])
{ fix t::real assume t: "t ∈ {0..1}" have"Pair t ` {0..1} ⊆ {0..1} × {0..1}" using t by force thenhave pak: "path (k ∘ (λu. (t, u)))" unfolding path_def by (intro continuous_intros continuous_on_subset [OF contk])+ have pik: "path_image (k ∘ Pair t) ⊆ S" using ks t by (auto simp: path_image_def) obtain e where"e>0"and e: "∧g h. [valid_path g; valid_path h; ∀u∈{0..1}. cmod (g u - (k ∘ Pair t) u) < e ∧ cmod (h u - (k ∘ Pair t) u) < e; linked_paths atends g h] ==> contour_integral h f = contour_integral g f" using contour_integral_nearby [OF ‹open S› pak pik, of atends] f by metis obtain d where"d>0"and d: "∧x x'. [x ∈ {0..1} × {0..1}; x' ∈ {0..1} × {0..1}; norm (x'-x) < d]==> norm (k x' - k x) < e/4" by (rule uniformly_continuous_onE [OF ucontk, of "e/4"]) (auto simp: dist_norm ‹e>0›)
{ fix t1 t2 assume t1: "0 ≤ t1""t1 ≤ 1"and t2: "0 ≤ t2""t2 ≤ 1"and ltd: "∣t1 - t∣ < d""∣t2 - t∣ < d" have no2: "norm(g1 - kt) < e"if"norm(g1 - k1) < e/4""norm(k1 - kt) < e/4"for g1 k1 kt :: complex proof (rule norm_triangle_half_l) show"cmod (g1 - k1) < e/2""cmod (kt - k1) < e/2" using‹e > 0› that by (auto simp: norm_minus_commute intro: order_less_trans) qed have"∃d>0. ∀g1 g2. valid_path g1 ∧ valid_path g2 ∧ (∀u∈{0..1}. cmod (g1 u - k (t1, u)) < d ∧ cmod (g2 u - k (t2, u)) < d) ∧ linked_paths atends g1 g2 ⟶ contour_integral g2 f = contour_integral g1 f" using t t1 t2 ltd ‹e > 0› by (rule_tac x="e/4"in exI) (auto intro!: e simp: d no2 simp del: less_divide_eq_numeral1)
} thenhave"∃e. 0 < e ∧ (∀t1 t2. t1 ∈ {0..1} ∧ t2 ∈ {0..1} ∧∣t1 - t∣ < e ∧∣t2 - t∣ < e ⟶ (∃d. 0 < d ∧ (∀g1 g2. valid_path g1 ∧ valid_path g2 ∧ (∀u ∈ {0..1}. norm(g1 u - k((t1,u))) < d ∧ norm(g2 u - k((t2,u))) < d) ∧ linked_paths atends g1 g2 ⟶ contour_integral g2 f = contour_integral g1 f)))" by (rule_tac x=d in exI) (simp add: ‹d > 0›)
} thenobtain ee where ee: "∧t. t ∈ {0..1} ==> ee t > 0 ∧ (∀t1 t2. t1 ∈ {0..1} ⟶ t2 ∈ {0..1} ⟶∣t1 - t∣ < ee t ⟶∣t2 - t∣ < ee t ⟶ (∃d. 0 < d ∧ (∀g1 g2. valid_path g1 ∧ valid_path g2 ∧ (∀u ∈ {0..1}. norm(g1 u - k((t1,u))) < d ∧ norm(g2 u - k((t2,u))) < d) ∧ linked_paths atends g1 g2 ⟶ contour_integral g2 f = contour_integral g1 f)))" by metis note ee_rule = ee [THEN conjunct2, rule_format, of 0 0 0]
define C where"C = (λt. ball t (ee t / 3)) ` {0..1}" obtain C' where C': "C' ⊆ C""finite C'"and C'01: "{0..1} ⊆∪C'" proof (rule compactE [OF compact_interval]) show"{0..1} ⊆∪C" using ee [THEN conjunct1] by (auto simp: C_def dist_norm) qed (use C_def in auto)
define kk where"kk = {t ∈ {0..1}. ball t (ee t / 3) ∈ C'}" have kk01: "kk ⊆ {0..1}"by (auto simp: kk_def)
define e where"e = Min (ee ` kk)" have C'_eq: "C' = (λt. ball t (ee t / 3)) ` kk" using C' by (auto simp: kk_def C_def) have ee_pos[simp]: "∧t. t ∈ {0..1} ==> ee t > 0" by (simp add: kk_def ee) moreoverhave"finite kk" using‹finite C'› kk01 by (force simp: C'_eq inj_on_def ball_eq_ball_iff dest: ee_pos finite_imageD) moreoverhave"kk ≠ {}"using‹{0..1} ⊆∪C'› C'_eq by force ultimatelyhave"e > 0" using finite_less_Inf_iff [of "ee ` kk" 0] kk01 by (force simp: e_def) thenobtain N::nat where"N > 0"and N: "1/N < e/3" by (meson divide_pos_pos nat_approx_posE zero_less_Suc zero_less_numeral) have e_le_ee: "∧i. i ∈ kk ==> e ≤ ee i" using‹finite kk›by (simp add: e_def Min_le_iff [of "ee ` kk"]) have plus: "∃t ∈ kk. x ∈ ball t (ee t / 3)"if"x ∈ {0..1}"for x using C' subsetD [OF C'01 that] unfolding C'_eq by blast have [OF order_refl]: "∃d. 0 < d ∧ (∀j. valid_path j ∧ (∀u ∈ {0..1}. norm(j u - k (n/N, u)) < d) ∧ linked_paths atends g j ⟶ contour_integral j f = contour_integral g f)" if"n ≤ N"for n using that proof (induct n) case 0 show ?case using ee_rule by clarsimp (metis diff_self norm_eq_zero vpg) next case (Suc n) thenhave N01: "n/N ∈ {0..1}""(Suc n)/N ∈ {0..1}"by auto thenobtain t where t: "t ∈ kk""n/N ∈ ball t (ee t / 3)" using plus [of "n/N"] by blast thenhave nN_less: "∣n/N - t∣ < ee t" by (simp add: dist_norm del: less_divide_eq_numeral1) have n'N_less: "∣real (Suc n) / real N - t∣ < ee t" using t N ‹N > 0› e_le_ee [of t] by (simp add: dist_norm add_divide_distrib abs_diff_less_iff del: less_divide_eq_numeral1) (simp add: field_simps) have t01: "t ∈ {0..1}"using‹kk ⊆ {0..1}›‹t ∈ kk›by blast obtain d1 where"d1 > 0"and d1: "∧g1 g2. [valid_path g1; valid_path g2; ∀u∈{0..1}. cmod (g1 u - k (n/N, u)) < d1 ∧ cmod (g2 u - k ((Suc n) / N, u)) < d1; linked_paths atends g1 g2] ==> contour_integral g2 f = contour_integral g1 f" using ee [THEN conjunct2, rule_format, OF t01 N01 nN_less n'N_less] by fastforce have"n ≤ N"using Suc.prems by auto with Suc.hyps obtain d2 where"d2 > 0" and d2: "∧j. [valid_path j; ∀u∈{0..1}. cmod (j u - k (n/N, u)) < d2; linked_paths atends g j] ==> contour_integral j f = contour_integral g f" by auto have"Pair (n/ N) ` {0..1} ⊆ {0..1} × {0..1}" using N01 by auto thenhave"continuous_on {0..1} (k ∘ (λu. (n/N, u)))" by (intro continuous_intros continuous_on_subset [OF contk]) thenhave pkn: "path (λu. k (n/N, u))" by (simp add: path_def) have min12: "min d1 d2 > 0"by (simp add: ‹0 🚫›‹0 🚫›) obtain p where"polynomial_function p" and psf: "pathstart p = pathstart (λu. k (n/N, u))" "pathfinish p = pathfinish (λu. k (n/N, u))" and pk_le: "∧t. t∈{0..1} ==> cmod (p t - k (n/N, t)) < min d1 d2" using path_approx_polynomial_function [OF pkn min12] by blast thenhave vpp: "valid_path p"using valid_path_polynomial_function by blast have lpa: "linked_paths atends g p" by (metis (mono_tags, lifting) N01(1) ksf linked_paths_def pathfinish_def pathstart_def psf) show ?case proof (intro exI; safe) fix j assume"valid_path j""linked_paths atends g j" and"∀u∈{0..1}. cmod (j u - k (real (Suc n) / real N, u)) < min d1 d2" thenhave"contour_integral j f = contour_integral p f" using pk_le N01(1) ksf by (force intro!: vpp d1 simp add: linked_paths_def psf) alsohave"... = contour_integral g f" using pk_le by (force intro!: vpp d2 lpa) finallyshow"contour_integral j f = contour_integral g f" . qed (simp add: ‹0 🚫›‹0 🚫›) qed thenobtain d where"0 < d" "∧j. valid_path j ∧ (∀u ∈ {0..1}. norm(j u - k (1,u)) < d) ∧ linked_paths atends g j ==> contour_integral j f = contour_integral g f" using‹N>0›by auto thenhave"linked_paths atends g h ==> contour_integral h f = contour_integral g f" using‹N>0› vph by fastforce thenshow ?thesis by (simp add: pathsf) qed
proposition Cauchy_theorem_homotopic_paths: assumes hom: "homotopic_paths S g h" and"open S"and f: "f holomorphic_on S" and vpg: "valid_path g"and vph: "valid_path h" shows"contour_integral g f = contour_integral h f" using Cauchy_theorem_homotopic [of True S g h] assms by simp
proposition Cauchy_theorem_homotopic_loops: assumes hom: "homotopic_loops S g h" and"open S"and f: "f holomorphic_on S" and vpg: "valid_path g"and vph: "valid_path h" shows"contour_integral g f = contour_integral h f" using Cauchy_theorem_homotopic [of False S g h] assms by simp
lemma has_contour_integral_newpath: "[(f has_contour_integral y) h; f contour_integrable_on g; contour_integral g f = contour_integral h f] ==> (f has_contour_integral y) g" using has_contour_integral_integral contour_integral_unique by auto
lemma Cauchy_theorem_null_homotopic: "[f holomorphic_on S; open S; valid_path g; homotopic_loops S g (linepath a a)] ==> (f has_contour_integral 0) g" by (metis Cauchy_theorem_homotopic_loops contour_integrable_holomorphic_simple valid_path_linepath
contour_integral_trivial has_contour_integral_integral homotopic_loops_imp_subset)
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.48 Sekunden
(vorverarbeitet am 2026-04-27)
¤
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 und die Messung sind noch experimentell.