Theory Polylog_Library
section ‹Auxiliary material›
theory Polylog_Library
imports
  "HOL-Complex_Analysis.Complex_Analysis"
  "Linear_Recurrences.Eulerian_Polynomials"
begin
subsection ‹Miscellaneous›
lemma fps_conv_radius_fps_of_poly [simp]:
  fixes p :: "'a :: {banach, real_normed_div_algebra} poly"
  shows "fps_conv_radius (fps_of_poly p) = ∞"
proof -
  have "conv_radius (poly.coeff p) = conv_radius (λ_. 0 :: 'a)"
    using MOST_coeff_eq_0 unfolding cofinite_eq_sequentially by (rule conv_radius_cong')
  also have "… = ∞"
    by simp
  finally show ?thesis
    by (simp add: fps_conv_radius_def)
qed
lemma eval_fps_power: 
  fixes F :: "'a :: {banach, real_normed_div_algebra, comm_ring_1} fps"
  assumes z: "norm z < fps_conv_radius F"
  shows      "eval_fps (F ^ n) z = eval_fps F z ^ n"
proof (induction n)
  case 0
  thus ?case
    by (auto simp: eval_fps_mult)
next
  case (Suc n)
  have "eval_fps (F ^ Suc n) z = eval_fps (F * F ^ n) z"
    by simp
  also from z have "… = eval_fps F z * eval_fps (F ^ n) z"
    by (subst eval_fps_mult) (auto intro!: less_le_trans[OF _ fps_conv_radius_power])
  finally show ?case
    using Suc.IH by simp
qed   
lemma eval_fps_of_poly [simp]: "eval_fps (fps_of_poly p) z = poly p z"
proof -
  have "(λn. poly.coeff p n * z ^ n) sums poly p z"
    unfolding poly_altdef by (rule sums_finite) (auto simp: coeff_eq_0)
  moreover have "(λn. poly.coeff p n * z ^ n) sums eval_fps (fps_of_poly p) z"
    using sums_eval_fps[of z "fps_of_poly p"] by simp
  ultimately show ?thesis
    using sums_unique2 by blast
qed
lemma poly_holomorphic_on [holomorphic_intros]:
  assumes [holomorphic_intros]: "f holomorphic_on A"
  shows   "(λz. poly p (f z)) holomorphic_on A"
  unfolding poly_altdef by (intro holomorphic_intros)
lemma simply_connected_eq_global_primitive:
  assumes "simply_connected S" "open S" "f holomorphic_on S"
  obtains h where "⋀z. z ∈ S ⟹ (h has_field_derivative f z) (at z)"
  using simply_connected_eq_global_primitive[of S] assms that by blast
lemma
  assumes "x ∈ closed_segment y z"
  shows in_closed_segment_imp_Re_in_closed_segment: "Re x ∈ closed_segment (Re y) (Re z)" (is ?th1)
    and in_closed_segment_imp_Im_in_closed_segment: "Im x ∈ closed_segment (Im y) (Im z)" (is ?th2)
proof -
  from assms obtain t where t: "t ∈ {0..1}" "x = linepath y z t"
    by (metis imageE linepath_image_01)
  have "Re x = linepath (Re y) (Re z) t" "Im x = linepath (Im y) (Im z) t"
    by (simp_all add: t Re_linepath' Im_linepath')
  with t(1) show ?th1 ?th2
    using linepath_in_path[of t "Re y" "Re z"] linepath_in_path[of t "Im y" "Im z"] by simp_all
qed
lemma linepath_in_open_segment: "t ∈ {0<..<1} ⟹ x ≠ y ⟹ linepath x y t ∈ open_segment x y"
  unfolding greaterThanLessThan_iff by (metis in_segment(2) linepath_def)
lemma in_open_segment_imp_Re_in_open_segment:
  assumes "x ∈ open_segment y z" "Re y ≠ Re z"
  shows   "Re x ∈ open_segment (Re y) (Re z)"
proof -
  from assms obtain t where t: "t ∈ {0<..<1}" "x = linepath y z t"
    by (metis greaterThanLessThan_iff in_segment(2) linepath_def)
  have "Re x = linepath (Re y) (Re z) t"
    by (simp_all add: t Re_linepath')
  with t(1) show ?thesis
    using linepath_in_open_segment[of t "Re y" "Re z"] assms by auto
qed
lemma in_open_segment_imp_Im_in_open_segment:
  assumes "x ∈ open_segment y z" "Im y ≠ Im z"
  shows   "Im x ∈ open_segment (Im y) (Im z)"
proof -
  from assms obtain t where t: "t ∈ {0<..<1}" "x = linepath y z t"
    by (metis greaterThanLessThan_iff in_segment(2) linepath_def)
  have "Im x = linepath (Im y) (Im z) t"
    by (simp_all add: t Im_linepath')
  with t(1) show ?thesis
    using linepath_in_open_segment[of t "Im y" "Im z"] assms by auto
qed
lemma poly_eulerian_poly_0 [simp]: "poly (eulerian_poly n) 0 = 1"
  by (induction n) (auto simp: eulerian_poly.simps(2) Let_def)
lemma eulerian_poly_at_1 [simp]: "poly (eulerian_poly n) 1 = fact n"
  by (induction n) (auto simp: eulerian_poly.simps(2) Let_def algebra_simps)
subsection ‹The slotted complex plane›
lemma closed_slot_left: "closed (complex_of_real ` {..c})"
  by (intro closed_injective_linear_image) (auto simp: inj_def)
lemma closed_slot_right: "closed (complex_of_real ` {c..})"
  by (intro closed_injective_linear_image) (auto simp: inj_def)
lemma complex_slot_left_eq: "complex_of_real ` {..c} = {z. Re z ≤ c ∧ Im z = 0}"
  by (auto simp: image_iff complex_eq_iff)
lemma complex_slot_right_eq: "complex_of_real ` {c..} = {z. Re z ≥ c ∧ Im z = 0}"
  by (auto simp: image_iff complex_eq_iff)
lemma complex_double_slot_eq:
  "complex_of_real ` ({..c1} ∪ {c2..}) = {z. Im z = 0 ∧ (Re z ≤ c1 ∨ Re z ≥ c2)}"
  by (auto simp: image_iff complex_eq_iff)
lemma starlike_slotted_complex_plane_left_aux:
  assumes z: "z ∈ -(complex_of_real ` {..c})" and c: "c < c'"
  shows   "closed_segment (complex_of_real c') z ⊆ -(complex_of_real ` {..c})"
proof -
  show "closed_segment c' z ⊆ -of_real ` {..c}"
  proof (cases "Im z = 0")
    case True
    thus ?thesis using z c
      by (auto simp: closed_segment_same_Im closed_segment_eq_real_ivl complex_slot_left_eq)
  next
    case False
    show ?thesis
    proof
      fix x assume x: "x ∈ closed_segment (of_real c') z"
      consider "x = of_real c'" | "x = z" | "x ∈ open_segment (of_real c') z"
        unfolding open_segment_def using x by blast
      thus "x ∈ -complex_of_real ` {..c}"
      proof cases
        assume "x ∈ open_segment (of_real c') z"
        hence "Im x ∈ open_segment (Im (complex_of_real c')) (Im z)"
          by (intro in_open_segment_imp_Im_in_open_segment) (use False in auto)
        hence "Im x ≠ 0"
          by (auto simp: open_segment_eq_real_ivl split: if_splits)
        thus ?thesis
          by (auto simp: complex_slot_right_eq)
      qed (use z c in ‹auto simp: complex_slot_left_eq›)
    qed
  qed
qed
lemma starlike_slotted_complex_plane_left: "starlike (-(complex_of_real ` {..c}))"
  unfolding starlike_def
proof (rule bexI[of _ "of_real c + 1"]; (intro ballI)?)
  show "complex_of_real c + 1 ∈ -complex_of_real ` {..c}"
    by (auto simp: complex_eq_iff)
  show "closed_segment (complex_of_real c + 1) z ⊆ - complex_of_real ` {..c}"
    if "z ∈ - complex_of_real ` {..c}" for z
    using starlike_slotted_complex_plane_left_aux[OF that, of "c + 1"] by simp
qed
lemma starlike_slotted_complex_plane_right_aux:
  assumes z: "z ∈ -(complex_of_real ` {c..})" and c: "c > c'"
  shows   "closed_segment (complex_of_real c') z ⊆ -(complex_of_real ` {c..})"
proof -
  show "closed_segment c' z ⊆ -of_real ` {c..}"
  proof (cases "Im z = 0")
    case True
    thus ?thesis using z c
      by (auto simp: closed_segment_same_Im closed_segment_eq_real_ivl complex_slot_right_eq)
  next
    case False
    show ?thesis
    proof
      fix x assume x: "x ∈ closed_segment (of_real c') z"
      consider "x = of_real c'" | "x = z" | "x ∈ open_segment (of_real c') z"
        unfolding open_segment_def using x by blast
      thus "x ∈ -complex_of_real ` {c..}"
      proof cases
        assume "x ∈ open_segment (of_real c') z"
        hence "Im x ∈ open_segment (Im (complex_of_real c')) (Im z)"
          by (intro in_open_segment_imp_Im_in_open_segment) (use False in auto)
        hence "Im x ≠ 0"
          by (auto simp: open_segment_eq_real_ivl split: if_splits)
        thus ?thesis
          by (auto simp: complex_slot_right_eq)
      qed (use z c in ‹auto simp: complex_slot_right_eq›)
    qed
  qed
qed
lemma starlike_slotted_complex_plane_right: "starlike (-(complex_of_real ` {c..}))"
  unfolding starlike_def
proof (rule bexI[of _ "of_real c - 1"]; (intro ballI)?)
  show "complex_of_real c - 1 ∈ -complex_of_real ` {c..}"
    by (auto simp: complex_eq_iff)
  show "closed_segment (complex_of_real c - 1) z ⊆ - complex_of_real ` {c..}"
    if "z ∈ - complex_of_real ` {c..}" for z
    using starlike_slotted_complex_plane_right_aux[OF that, of "c - 1"] by simp
qed
lemma starlike_doubly_slotted_complex_plane_aux:
  assumes z: "z ∈ -(complex_of_real ` ({..c1} ∪ {c2..}))" and c: "c1 < c" "c < c2"
  shows   "closed_segment (complex_of_real c) z ⊆ -(complex_of_real ` ({..c1} ∪ {c2..}))"
proof -
  show "closed_segment c z ⊆ -of_real ` ({..c1} ∪ {c2..})"
  proof (cases "Im z = 0")
    case True
    thus ?thesis using z c
      by (auto simp: closed_segment_same_Im closed_segment_eq_real_ivl complex_double_slot_eq)
  next
    case False
    show ?thesis
    proof
      fix x assume x: "x ∈ closed_segment (of_real c) z"
      consider "x = of_real c" | "x = z" | "x ∈ open_segment (of_real c) z"
        unfolding open_segment_def using x by blast
      thus "x ∈ -complex_of_real ` ({..c1} ∪ {c2..})"
      proof cases
        assume "x ∈ open_segment (of_real c) z"
        hence "Im x ∈ open_segment (Im (complex_of_real c)) (Im z)"
          by (intro in_open_segment_imp_Im_in_open_segment) (use False in auto)
        hence "Im x ≠ 0"
          by (auto simp: open_segment_eq_real_ivl split: if_splits)
        thus ?thesis
          by (auto simp: complex_slot_right_eq)
      qed (use z c in ‹auto simp: complex_slot_right_eq›)
    qed
  qed
qed
lemma starlike_doubly_slotted_complex_plane:
  assumes "c1 < c2"
  shows   "starlike (-(complex_of_real ` ({..c1} ∪ {c2..})))"
proof -
  from assms obtain c where c: "c1 < c" "c < c2"
    using dense by blast
  show ?thesis
    unfolding starlike_def
  proof (rule bexI[of _ "of_real c"]; (intro ballI)?)
    show "complex_of_real c ∈ -complex_of_real ` ({..c1} ∪ {c2..})"
      using c by (auto simp: complex_eq_iff)
    show "closed_segment (complex_of_real c) z ⊆ - complex_of_real ` ({..c1} ∪ {c2..})"
      if "z ∈ - complex_of_real ` ({..c1} ∪ {c2..})" for z
      using starlike_doubly_slotted_complex_plane_aux[OF that, of c] c by simp
  qed
qed
lemma simply_connected_slotted_complex_plane_left:
  "simply_connected (-(complex_of_real ` {..c}))"
  by (intro starlike_imp_simply_connected starlike_slotted_complex_plane_left)
lemma simply_connected_slotted_complex_plane_right:
  "simply_connected (-(complex_of_real ` {c..}))"
  by (intro starlike_imp_simply_connected starlike_slotted_complex_plane_right)
lemma simply_connected_doubly_slotted_complex_plane:
  "c1 < c2 ⟹ simply_connected (-(complex_of_real ` ({..c1} ∪ {c2..})))"
  by (intro starlike_imp_simply_connected starlike_doubly_slotted_complex_plane)
end