src/HOL/Analysis/Gamma_Function.thy
author wenzelm
Wed, 05 Nov 2025 13:20:10 +0100
changeset 83517 d349fb17f699
parent 83346 face91576082
permissions -rw-r--r--
Added tag Isabelle2025-1-RC1 for changeset b596dead9178
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
63992
3aa9837d05c7 updated headers;
wenzelm
parents: 63952
diff changeset
     1
(*  Title:    HOL/Analysis/Gamma_Function.thy
62055
755fda743c49 Multivariate-Analysis: fixed headers and a LaTex error (c.f. Isabelle b0f941e207cf)
hoelzl
parents: 62049
diff changeset
     2
    Author:   Manuel Eberl, TU München
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
     3
*)
62055
755fda743c49 Multivariate-Analysis: fixed headers and a LaTex error (c.f. Isabelle b0f941e207cf)
hoelzl
parents: 62049
diff changeset
     4
755fda743c49 Multivariate-Analysis: fixed headers and a LaTex error (c.f. Isabelle b0f941e207cf)
hoelzl
parents: 62049
diff changeset
     5
section \<open>The Gamma Function\<close>
755fda743c49 Multivariate-Analysis: fixed headers and a LaTex error (c.f. Isabelle b0f941e207cf)
hoelzl
parents: 62049
diff changeset
     6
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
     7
theory Gamma_Function
70196
b7ef9090feed Added embedding_map_into_euclideanreal; reduced dependence on Equivalence_Lebesgue_Henstock_Integration in Analysis theories by moving a few lemmas
paulson <lp15@cam.ac.uk>
parents: 70136
diff changeset
     8
  imports
b7ef9090feed Added embedding_map_into_euclideanreal; reduced dependence on Equivalence_Lebesgue_Henstock_Integration in Analysis theories by moving a few lemmas
paulson <lp15@cam.ac.uk>
parents: 70136
diff changeset
     9
  Equivalence_Lebesgue_Henstock_Integration
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
    10
  Summation_Tests
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    11
  Harmonic_Numbers
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 66447
diff changeset
    12
  "HOL-Library.Nonpos_Ints"
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 66447
diff changeset
    13
  "HOL-Library.Periodic_Fun"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    14
begin
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    15
62055
755fda743c49 Multivariate-Analysis: fixed headers and a LaTex error (c.f. Isabelle b0f941e207cf)
hoelzl
parents: 62049
diff changeset
    16
text \<open>
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    17
  Several equivalent definitions of the Gamma function and its
62055
755fda743c49 Multivariate-Analysis: fixed headers and a LaTex error (c.f. Isabelle b0f941e207cf)
hoelzl
parents: 62049
diff changeset
    18
  most important properties. Also contains the definition and some properties
755fda743c49 Multivariate-Analysis: fixed headers and a LaTex error (c.f. Isabelle b0f941e207cf)
hoelzl
parents: 62049
diff changeset
    19
  of the log-Gamma function and the Digamma function and the other Polygamma functions.
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    20
72318
bc97bd4c0474 prefer old-fashioned {\ss} to prevent problems with encoding in lualatex;
wenzelm
parents: 71633
diff changeset
    21
  Based on the Gamma function, we also prove the Weierstra{\ss} product form of the
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    22
  sin function and, based on this, the solution of the Basel problem (the
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69566
diff changeset
    23
  sum over all \<^term>\<open>1 / (n::nat)^2\<close>.
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    24
\<close>
62055
755fda743c49 Multivariate-Analysis: fixed headers and a LaTex error (c.f. Isabelle b0f941e207cf)
hoelzl
parents: 62049
diff changeset
    25
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    26
lemma pochhammer_eq_0_imp_nonpos_Int:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    27
  "pochhammer (x::'a::field_char_0) n = 0 \<Longrightarrow> x \<in> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    28
  by (auto simp: pochhammer_eq_0_iff)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    29
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    30
lemma closed_nonpos_Ints [simp]: "closed (\<int>\<^sub>\<le>\<^sub>0 :: 'a :: real_normed_algebra_1 set)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    31
proof -
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    32
  have "\<int>\<^sub>\<le>\<^sub>0 = (of_int ` {n. n \<le> 0} :: 'a set)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    33
    by (auto elim!: nonpos_Ints_cases intro!: nonpos_Ints_of_int)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    34
  also have "closed \<dots>" by (rule closed_of_int_image)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    35
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    36
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    37
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    38
lemma sin_series: "(\<lambda>n. ((-1)^n / fact (2*n+1)) *\<^sub>R z^(2*n+1)) sums sin z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    39
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    40
  from sin_converges[of z] have "(\<lambda>n. sin_coeff n *\<^sub>R z^n) sums sin z" .
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    41
  also have "(\<lambda>n. sin_coeff n *\<^sub>R z^n) sums sin z \<longleftrightarrow>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    42
                 (\<lambda>n. ((-1)^n / fact (2*n+1)) *\<^sub>R z^(2*n+1)) sums sin z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    43
    by (subst sums_mono_reindex[of "\<lambda>n. 2*n+1", symmetric])
66447
a1f5c5c26fa6 Replaced subseq with strict_mono
eberlm <eberlm@in.tum.de>
parents: 66286
diff changeset
    44
       (auto simp: sin_coeff_def strict_mono_def ac_simps elim!: oddE)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    45
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    46
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    47
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    48
lemma cos_series: "(\<lambda>n. ((-1)^n / fact (2*n)) *\<^sub>R z^(2*n)) sums cos z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    49
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    50
  from cos_converges[of z] have "(\<lambda>n. cos_coeff n *\<^sub>R z^n) sums cos z" .
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    51
  also have "(\<lambda>n. cos_coeff n *\<^sub>R z^n) sums cos z \<longleftrightarrow>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    52
                 (\<lambda>n. ((-1)^n / fact (2*n)) *\<^sub>R z^(2*n)) sums cos z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    53
    by (subst sums_mono_reindex[of "\<lambda>n. 2*n", symmetric])
66447
a1f5c5c26fa6 Replaced subseq with strict_mono
eberlm <eberlm@in.tum.de>
parents: 66286
diff changeset
    54
       (auto simp: cos_coeff_def strict_mono_def ac_simps elim!: evenE)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    55
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    56
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    57
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    58
lemma sin_z_over_z_series:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    59
  fixes z :: "'a :: {real_normed_field,banach}"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    60
  assumes "z \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    61
  shows   "(\<lambda>n. (-1)^n / fact (2*n+1) * z^(2*n)) sums (sin z / z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    62
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    63
  from sin_series[of z] have "(\<lambda>n. z * ((-1)^n / fact (2*n+1)) * z^(2*n)) sums sin z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    64
    by (simp add: field_simps scaleR_conv_of_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    65
  from sums_mult[OF this, of "inverse z"] and assms show ?thesis
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    66
    by (simp add: field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    67
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    68
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    69
lemma sin_z_over_z_series':
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    70
  fixes z :: "'a :: {real_normed_field,banach}"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    71
  assumes "z \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    72
  shows   "(\<lambda>n. sin_coeff (n+1) *\<^sub>R z^n) sums (sin z / z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    73
proof -
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    74
  from sums_split_initial_segment[OF sin_converges[of z], of 1]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    75
    have "(\<lambda>n. z * (sin_coeff (n+1) *\<^sub>R z ^ n)) sums sin z" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    76
  from sums_mult[OF this, of "inverse z"] assms show ?thesis by (simp add: field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    77
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    78
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    79
lemma has_field_derivative_sin_z_over_z:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    80
  fixes A :: "'a :: {real_normed_field,banach} set"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    81
  shows "((\<lambda>z. if z = 0 then 1 else sin z / z) has_field_derivative 0) (at 0 within A)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    82
      (is "(?f has_field_derivative ?f') _")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    83
proof (rule has_field_derivative_at_within)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    84
  have "((\<lambda>z::'a. \<Sum>n. of_real (sin_coeff (n+1)) * z^n)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    85
            has_field_derivative (\<Sum>n. diffs (\<lambda>n. of_real (sin_coeff (n+1))) n * 0^n)) (at 0)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    86
  proof (rule termdiffs_strong)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    87
    from summable_ignore_initial_segment[OF sums_summable[OF sin_converges[of "1::'a"]], of 1]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    88
      show "summable (\<lambda>n. of_real (sin_coeff (n+1)) * (1::'a)^n)" by (simp add: of_real_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    89
  qed simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    90
  also have "(\<lambda>z::'a. \<Sum>n. of_real (sin_coeff (n+1)) * z^n) = ?f"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    91
  proof
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    92
    fix z
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    93
    show "(\<Sum>n. of_real (sin_coeff (n+1)) * z^n)  = ?f z"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    94
      by (cases "z = 0") (insert sin_z_over_z_series'[of z],
66936
cf8d8fc23891 tuned some proofs and added some lemmas
haftmann
parents: 66526
diff changeset
    95
            simp_all add: scaleR_conv_of_real sums_iff sin_coeff_def)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    96
  qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
    97
  also have "(\<Sum>n. diffs (\<lambda>n. of_real (sin_coeff (n + 1))) n * (0::'a) ^ n) =
66936
cf8d8fc23891 tuned some proofs and added some lemmas
haftmann
parents: 66526
diff changeset
    98
                 diffs (\<lambda>n. of_real (sin_coeff (Suc n))) 0" by simp
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
    99
  also have "\<dots> = 0" by (simp add: sin_coeff_def diffs_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   100
  finally show "((\<lambda>z::'a. if z = 0 then 1 else sin z / z) has_field_derivative 0) (at 0)" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   101
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   102
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   103
lemma round_Re_minimises_norm:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   104
  "norm ((z::complex) - of_int m) \<ge> norm (z - of_int (round (Re z)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   105
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   106
  let ?n = "round (Re z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   107
  have "norm (z - of_int ?n) = sqrt ((Re z - of_int ?n)\<^sup>2 + (Im z)\<^sup>2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   108
    by (simp add: cmod_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   109
  also have "\<bar>Re z - of_int ?n\<bar> \<le> \<bar>Re z - of_int m\<bar>" by (rule round_diff_minimal)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   110
  hence "sqrt ((Re z - of_int ?n)\<^sup>2 + (Im z)\<^sup>2) \<le> sqrt ((Re z - of_int m)\<^sup>2 + (Im z)\<^sup>2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   111
    by (intro real_sqrt_le_mono add_mono) (simp_all add: abs_le_square_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   112
  also have "\<dots> = norm (z - of_int m)" by (simp add: cmod_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   113
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   114
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   115
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   116
lemma Re_pos_in_ball:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   117
  assumes "Re z > 0" "t \<in> ball z (Re z/2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   118
  shows   "Re t > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   119
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   120
  have "Re (z - t) \<le> norm (z - t)" by (rule complex_Re_le_cmod)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   121
  also from assms have "\<dots> < Re z / 2" by (simp add: dist_complex_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   122
  finally show "Re t > 0" using assms by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   123
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   124
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   125
lemma no_nonpos_Int_in_ball_complex:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   126
  assumes "Re z > 0" "t \<in> ball z (Re z/2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   127
  shows   "t \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   128
  using Re_pos_in_ball[OF assms] by (force elim!: nonpos_Ints_cases)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   129
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   130
lemma no_nonpos_Int_in_ball:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   131
  assumes "t \<in> ball z (dist z (round (Re z)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   132
  shows   "t \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   133
proof
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   134
  assume "t \<in> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   135
  then obtain n where "t = of_int n" by (auto elim!: nonpos_Ints_cases)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   136
  have "dist z (of_int n) \<le> dist z t + dist t (of_int n)" by (rule dist_triangle)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   137
  also from assms have "dist z t < dist z (round (Re z))" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   138
  also have "\<dots> \<le> dist z (of_int n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   139
    using round_Re_minimises_norm[of z] by (simp add: dist_complex_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   140
  finally have "dist t (of_int n) > 0" by simp
62072
bf3d9f113474 isabelle update_cartouches -c -t;
wenzelm
parents: 62055
diff changeset
   141
  with \<open>t = of_int n\<close> show False by simp
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   142
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   143
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   144
lemma no_nonpos_Int_in_ball':
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   145
  assumes "(z :: 'a :: {euclidean_space,real_normed_algebra_1}) \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   146
  obtains d where "d > 0" "\<And>t. t \<in> ball z d \<Longrightarrow> t \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   147
proof (rule that)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   148
  from assms show "setdist {z} \<int>\<^sub>\<le>\<^sub>0 > 0" by (subst setdist_gt_0_compact_closed) auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   149
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   150
  fix t assume "t \<in> ball z (setdist {z} \<int>\<^sub>\<le>\<^sub>0)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   151
  thus "t \<notin> \<int>\<^sub>\<le>\<^sub>0" using setdist_le_dist[of z "{z}" t "\<int>\<^sub>\<le>\<^sub>0"] by force
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   152
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   153
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   154
lemma no_nonpos_Real_in_ball:
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   155
  assumes z: "z \<notin> \<real>\<^sub>\<le>\<^sub>0" and t: "t \<in> ball z (if Im z = 0 then Re z / 2 else abs (Im z) / 2)"
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   156
  shows   "t \<notin> \<real>\<^sub>\<le>\<^sub>0"
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   157
using z
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   158
proof (cases "Im z = 0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   159
  assume A: "Im z = 0"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   160
  with z have "Re z > 0" by (force simp add: complex_nonpos_Reals_iff)
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   161
  with t A Re_pos_in_ball[of z t] show ?thesis by (force simp add: complex_nonpos_Reals_iff)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   162
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   163
  assume A: "Im z \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   164
  have "abs (Im z) - abs (Im t) \<le> abs (Im z - Im t)" by linarith
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   165
  also have "\<dots> = abs (Im (z - t))" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   166
  also have "\<dots> \<le> norm (z - t)" by (rule abs_Im_le_cmod)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   167
  also from A t have "\<dots> \<le> abs (Im z) / 2" by (simp add: dist_complex_def)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   168
  finally have "abs (Im t) > 0" using A by simp
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   169
  thus ?thesis by (force simp add: complex_nonpos_Reals_iff)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   170
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   171
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   172
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   173
subsection \<open>The Euler form and the logarithmic Gamma function\<close>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   174
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   175
text \<open>
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   176
  We define the Gamma function by first defining its multiplicative inverse \<open>rGamma\<close>.
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   177
  This is more convenient because \<open>rGamma\<close> is entire, which makes proofs of its
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   178
  properties more convenient because one does not have to watch out for discontinuities.
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   179
  (e.g. \<open>rGamma\<close> fulfils \<open>rGamma z = z * rGamma (z + 1)\<close> everywhere, whereas the \<open>\<Gamma>\<close> function
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   180
  does not fulfil the analogous equation on the non-positive integers)
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   181
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   182
  We define the \<open>\<Gamma>\<close> function (resp.\ its reciprocale) in the Euler form. This form has the advantage
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   183
  that it is a relatively simple limit that converges everywhere. The limit at the poles is 0
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   184
  (due to division by 0). The functional equation \<open>Gamma (z + 1) = z * Gamma z\<close> follows
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   185
  immediately from the definition.
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   186
\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   187
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
   188
definition\<^marker>\<open>tag important\<close> Gamma_series :: "('a :: {banach,real_normed_field}) \<Rightarrow> nat \<Rightarrow> 'a" where
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   189
  "Gamma_series z n = fact n * exp (z * of_real (ln (of_nat n))) / pochhammer z (n+1)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   190
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   191
definition Gamma_series' :: "('a :: {banach,real_normed_field}) \<Rightarrow> nat \<Rightarrow> 'a" where
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   192
  "Gamma_series' z n = fact (n - 1) * exp (z * of_real (ln (of_nat n))) / pochhammer z n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   193
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   194
definition rGamma_series :: "('a :: {banach,real_normed_field}) \<Rightarrow> nat \<Rightarrow> 'a" where
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   195
  "rGamma_series z n = pochhammer z (n+1) / (fact n * exp (z * of_real (ln (of_nat n))))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   196
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   197
lemma Gamma_series_altdef: "Gamma_series z n = inverse (rGamma_series z n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   198
  and rGamma_series_altdef: "rGamma_series z n = inverse (Gamma_series z n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   199
  unfolding Gamma_series_def rGamma_series_def by simp_all
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   200
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   201
lemma rGamma_series_minus_of_nat:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   202
  "eventually (\<lambda>n. rGamma_series (- of_nat k) n = 0) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   203
  using eventually_ge_at_top[of k]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   204
  by eventually_elim (auto simp: rGamma_series_def pochhammer_of_nat_eq_0_iff)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   205
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   206
lemma Gamma_series_minus_of_nat:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   207
  "eventually (\<lambda>n. Gamma_series (- of_nat k) n = 0) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   208
  using eventually_ge_at_top[of k]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   209
  by eventually_elim (auto simp: Gamma_series_def pochhammer_of_nat_eq_0_iff)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   210
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   211
lemma Gamma_series'_minus_of_nat:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   212
  "eventually (\<lambda>n. Gamma_series' (- of_nat k) n = 0) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   213
  using eventually_gt_at_top[of k]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   214
  by eventually_elim (auto simp: Gamma_series'_def pochhammer_of_nat_eq_0_iff)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   215
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   216
lemma rGamma_series_nonpos_Ints_LIMSEQ: "z \<in> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> rGamma_series z \<longlonglongrightarrow> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   217
  by (elim nonpos_Ints_cases', hypsubst, subst tendsto_cong, rule rGamma_series_minus_of_nat, simp)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   218
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   219
lemma Gamma_series_nonpos_Ints_LIMSEQ: "z \<in> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> Gamma_series z \<longlonglongrightarrow> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   220
  by (elim nonpos_Ints_cases', hypsubst, subst tendsto_cong, rule Gamma_series_minus_of_nat, simp)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   221
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   222
lemma Gamma_series'_nonpos_Ints_LIMSEQ: "z \<in> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> Gamma_series' z \<longlonglongrightarrow> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   223
  by (elim nonpos_Ints_cases', hypsubst, subst tendsto_cong, rule Gamma_series'_minus_of_nat, simp)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   224
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   225
lemma Gamma_series_Gamma_series':
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   226
  assumes z: "z \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   227
  shows   "(\<lambda>n. Gamma_series' z n / Gamma_series z n) \<longlonglongrightarrow> 1"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   228
proof (rule Lim_transform_eventually)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   229
  from eventually_gt_at_top[of "0::nat"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   230
    show "eventually (\<lambda>n. z / of_nat n + 1 = Gamma_series' z n / Gamma_series z n) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   231
  proof eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   232
    fix n :: nat assume n: "n > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   233
    from n z have "Gamma_series' z n / Gamma_series z n = (z + of_nat n) / of_nat n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   234
      by (cases n, simp)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   235
         (auto simp add: Gamma_series_def Gamma_series'_def pochhammer_rec'
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   236
               dest: pochhammer_eq_0_imp_nonpos_Int plus_of_nat_eq_0_imp)
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
   237
    also from n have "\<dots> = z / of_nat n + 1" by (simp add: field_split_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   238
    finally show "z / of_nat n + 1 = Gamma_series' z n / Gamma_series z n" ..
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   239
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   240
  have "(\<lambda>x. z / of_nat x) \<longlonglongrightarrow> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   241
    by (rule tendsto_norm_zero_cancel)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   242
       (insert tendsto_mult[OF tendsto_const[of "norm z"] lim_inverse_n],
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   243
        simp add:  norm_divide inverse_eq_divide)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   244
  from tendsto_add[OF this tendsto_const[of 1]] show "(\<lambda>n. z / of_nat n + 1) \<longlonglongrightarrow> 1" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   245
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   246
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   247
text \<open>
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   248
  We now show that the series that defines the \<open>\<Gamma>\<close> function in the Euler form converges
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   249
  and that the function defined by it is continuous on the complex halfspace with positive
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   250
  real part.
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   251
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   252
  We do this by showing that the logarithm of the Euler series is continuous and converges
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   253
  locally uniformly, which means that the log-Gamma function defined by its limit is also
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   254
  continuous.
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   255
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   256
  This will later allow us to lift holomorphicity and continuity from the log-Gamma
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
   257
  function to the inverse of the Gamma function, and from that to the Gamma function itself.
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   258
\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   259
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
   260
definition\<^marker>\<open>tag important\<close> ln_Gamma_series :: "('a :: {banach,real_normed_field,ln}) \<Rightarrow> nat \<Rightarrow> 'a" where
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   261
  "ln_Gamma_series z n = z * ln (of_nat n) - ln z - (\<Sum>k=1..n. ln (z / of_nat k + 1))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   262
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
   263
definition\<^marker>\<open>tag unimportant\<close> ln_Gamma_series' :: "('a :: {banach,real_normed_field,ln}) \<Rightarrow> nat \<Rightarrow> 'a" where
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   264
  "ln_Gamma_series' z n =
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   265
     - euler_mascheroni*z - ln z + (\<Sum>k=1..n. z / of_nat n - ln (z / of_nat k + 1))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   266
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   267
definition ln_Gamma :: "('a :: {banach,real_normed_field,ln}) \<Rightarrow> 'a" where
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   268
  "ln_Gamma z = lim (ln_Gamma_series z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   269
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   270
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   271
text \<open>
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   272
  We now show that the log-Gamma series converges locally uniformly for all complex numbers except
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   273
  the non-positive integers. We do this by proving that the series is locally Cauchy.
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   274
\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   275
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   276
context
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   277
begin
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   278
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   279
private lemma ln_Gamma_series_complex_converges_aux:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   280
  fixes z :: complex and k :: nat
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   281
  assumes z: "z \<noteq> 0" and k: "of_nat k \<ge> 2*norm z" "k \<ge> 2"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   282
  shows "norm (z * ln (1 - 1/of_nat k) + ln (z/of_nat k + 1)) \<le> 2*(norm z + norm z^2) / of_nat k^2"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   283
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   284
  let ?k = "of_nat k :: complex" and ?z = "norm z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   285
  have "z *ln (1 - 1/?k) + ln (z/?k+1) = z*(ln (1 - 1/?k :: complex) + 1/?k) + (ln (1+z/?k) - z/?k)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   286
    by (simp add: algebra_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   287
  also have "norm ... \<le> ?z * norm (ln (1-1/?k) + 1/?k :: complex) + norm (ln (1+z/?k) - z/?k)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   288
    by (subst norm_mult [symmetric], rule norm_triangle_ineq)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   289
  also have "norm (Ln (1 + -1/?k) - (-1/?k)) \<le> (norm (-1/?k))\<^sup>2 / (1 - norm(-1/?k))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   290
    using k by (intro Ln_approx_linear) (simp add: norm_divide)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   291
  hence "?z * norm (ln (1-1/?k) + 1/?k) \<le> ?z * ((norm (1/?k))^2 / (1 - norm (1/?k)))"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   292
    by (intro mult_left_mono) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   293
  also have "... \<le> (?z * (of_nat k / (of_nat k - 1))) / of_nat k^2" using k
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   294
    by (simp add: field_simps power2_eq_square norm_divide)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   295
  also have "... \<le> (?z * 2) / of_nat k^2" using k
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   296
    by (intro divide_right_mono mult_left_mono) (simp_all add: field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   297
  also have "norm (ln (1+z/?k) - z/?k) \<le> norm (z/?k)^2 / (1 - norm (z/?k))" using k
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   298
    by (intro Ln_approx_linear) (simp add: norm_divide)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   299
  hence "norm (ln (1+z/?k) - z/?k) \<le> ?z^2 / of_nat k^2 / (1 - ?z / of_nat k)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   300
    by (simp add: field_simps norm_divide)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   301
  also have "... \<le> (?z^2 * (of_nat k / (of_nat k - ?z))) / of_nat k^2" using k
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   302
    by (simp add: field_simps power2_eq_square)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   303
  also have "... \<le> (?z^2 * 2) / of_nat k^2" using k
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   304
    by (intro divide_right_mono mult_left_mono) (simp_all add: field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   305
  also note add_divide_distrib [symmetric]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   306
  finally show ?thesis by (simp only: distrib_left mult.commute)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   307
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   308
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   309
lemma ln_Gamma_series_complex_converges:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   310
  assumes z: "z \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   311
  assumes d: "d > 0" "\<And>n. n \<in> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> norm (z - of_int n) > d"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   312
  shows "uniformly_convergent_on (ball z d) (\<lambda>n z. ln_Gamma_series z n :: complex)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   313
proof (intro Cauchy_uniformly_convergent uniformly_Cauchy_onI')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   314
  fix e :: real assume e: "e > 0"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
   315
  define e'' where "e'' = (SUP t\<in>ball z d. norm t + norm t^2)"
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
   316
  define e' where "e' = e / (2*e'')"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   317
  have "bounded ((\<lambda>t. norm t + norm t^2) ` cball z d)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   318
    by (intro compact_imp_bounded compact_continuous_image) (auto intro!: continuous_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   319
  hence "bounded ((\<lambda>t. norm t + norm t^2) ` ball z d)" by (rule bounded_subset) auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   320
  hence bdd: "bdd_above ((\<lambda>t. norm t + norm t^2) ` ball z d)" by (rule bounded_imp_bdd_above)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   321
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   322
  with z d(1) d(2)[of "-1"] have e''_pos: "e'' > 0" unfolding e''_def
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   323
    by (subst less_cSUP_iff) (auto intro!: add_pos_nonneg bexI[of _ z])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   324
  have e'': "norm t + norm t^2 \<le> e''" if "t \<in> ball z d" for t unfolding e''_def using that
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   325
    by (rule cSUP_upper[OF _ bdd])
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   326
  from e z e''_pos have e': "e' > 0" unfolding e'_def
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   327
    by (intro divide_pos_pos mult_pos_pos add_pos_pos) (simp_all add: field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   328
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   329
  have "summable (\<lambda>k. inverse ((real_of_nat k)^2))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   330
    by (rule inverse_power_summable) simp
74362
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
   331
  from summable_partial_sum_bound[OF this e']
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
   332
  obtain M where M: "\<And>m n. M \<le> m \<Longrightarrow> norm (\<Sum>k = m..n. inverse ((real k)\<^sup>2)) < e'"
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
   333
    by auto
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   334
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
   335
  define N where "N = max 2 (max (nat \<lceil>2 * (norm z + d)\<rceil>) M)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   336
  {
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   337
    from d have "\<lceil>2 * (cmod z + d)\<rceil> \<ge> \<lceil>0::real\<rceil>"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   338
      by (intro ceiling_mono mult_nonneg_nonneg add_nonneg_nonneg) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   339
    hence "2 * (norm z + d) \<le> of_nat (nat \<lceil>2 * (norm z + d)\<rceil>)" unfolding N_def
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
   340
      by (simp_all)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   341
    also have "... \<le> of_nat N" unfolding N_def
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   342
      by (subst of_nat_le_iff) (rule max.coboundedI2, rule max.cobounded1)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   343
    finally have "of_nat N \<ge> 2 * (norm z + d)" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   344
    moreover have "N \<ge> 2" "N \<ge> M" unfolding N_def by simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   345
    moreover have "(\<Sum>k=m..n. 1/(of_nat k)\<^sup>2) < e'" if "m \<ge> N" for m n
62072
bf3d9f113474 isabelle update_cartouches -c -t;
wenzelm
parents: 62055
diff changeset
   346
      using M[OF order.trans[OF \<open>N \<ge> M\<close> that]] unfolding real_norm_def
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
   347
      by (subst (asm) abs_of_nonneg) (auto intro: sum_nonneg simp: field_split_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   348
    moreover note calculation
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   349
  } note N = this
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   350
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   351
  show "\<exists>M. \<forall>t\<in>ball z d. \<forall>m\<ge>M. \<forall>n>m. dist (ln_Gamma_series t m) (ln_Gamma_series t n) < e"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   352
    unfolding dist_complex_def
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   353
  proof (intro exI[of _ N] ballI allI impI)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   354
    fix t m n assume t: "t \<in> ball z d" and mn: "m \<ge> N" "n > m"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   355
    from d(2)[of 0] t have "0 < dist z 0 - dist z t" by (simp add: field_simps dist_complex_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   356
    also have "dist z 0 - dist z t \<le> dist 0 t" using dist_triangle[of 0 z t]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   357
      by (simp add: dist_commute)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   358
    finally have t_nz: "t \<noteq> 0" by auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   359
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   360
    have "norm t \<le> norm z + norm (t - z)" by (rule norm_triangle_sub)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   361
    also from t have "norm (t - z) < d" by (simp add: dist_complex_def norm_minus_commute)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   362
    also have "2 * (norm z + d) \<le> of_nat N" by (rule N)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   363
    also have "N \<le> m" by (rule mn)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   364
    finally have norm_t: "2 * norm t < of_nat m" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   365
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   366
    have "ln_Gamma_series t m - ln_Gamma_series t n =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   367
              (-(t * Ln (of_nat n)) - (-(t * Ln (of_nat m)))) +
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   368
              ((\<Sum>k=1..n. Ln (t / of_nat k + 1)) - (\<Sum>k=1..m. Ln (t / of_nat k + 1)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   369
      by (simp add: ln_Gamma_series_def algebra_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   370
    also have "(\<Sum>k=1..n. Ln (t / of_nat k + 1)) - (\<Sum>k=1..m. Ln (t / of_nat k + 1)) =
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   371
                 (\<Sum>k\<in>{1..n}-{1..m}. Ln (t / of_nat k + 1))" using mn
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   372
      by (simp add: sum_diff)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   373
    also from mn have "{1..n}-{1..m} = {Suc m..n}" by fastforce
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   374
    also have "-(t * Ln (of_nat n)) - (-(t * Ln (of_nat m))) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   375
                   (\<Sum>k = Suc m..n. t * Ln (of_nat (k - 1)) - t * Ln (of_nat k))" using mn
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   376
      by (subst sum_telescope'' [symmetric]) simp_all
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   377
    also have "... = (\<Sum>k = Suc m..n. t * Ln (of_nat (k - 1) / of_nat k))" using mn N
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   378
      by (intro sum_cong_Suc)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   379
         (simp_all del: of_nat_Suc add: field_simps Ln_of_nat Ln_of_nat_over_of_nat)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   380
    also have "of_nat (k - 1) / of_nat k = 1 - 1 / (of_nat k :: complex)" if "k \<in> {Suc m..n}" for k
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
   381
      using that of_nat_eq_0_iff[of "Suc i" for i] by (cases k) (simp_all add: field_split_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   382
    hence "(\<Sum>k = Suc m..n. t * Ln (of_nat (k - 1) / of_nat k)) =
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   383
             (\<Sum>k = Suc m..n. t * Ln (1 - 1 / of_nat k))" using mn N
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   384
      by (intro sum.cong) simp_all
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   385
    also note sum.distrib [symmetric]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   386
    also have "norm (\<Sum>k=Suc m..n. t * Ln (1 - 1/of_nat k) + Ln (t/of_nat k + 1)) \<le>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   387
      (\<Sum>k=Suc m..n. 2 * (norm t + (norm t)\<^sup>2) / (real_of_nat k)\<^sup>2)" using t_nz N(2) mn norm_t
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   388
      by (intro order.trans[OF norm_sum sum_mono[OF ln_Gamma_series_complex_converges_aux]]) simp_all
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   389
    also have "... \<le> 2 * (norm t + norm t^2) * (\<Sum>k=Suc m..n. 1 / (of_nat k)\<^sup>2)"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   390
      by (simp add: sum_distrib_left)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   391
    also have "... < 2 * (norm t + norm t^2) * e'" using mn z t_nz
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   392
      by (intro mult_strict_left_mono N mult_pos_pos add_pos_pos) simp_all
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   393
    also from e''_pos have "... = e * ((cmod t + (cmod t)\<^sup>2) / e'')"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   394
      by (simp add: e'_def field_simps power2_eq_square)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   395
    also from e''[OF t] e''_pos e
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   396
      have "\<dots> \<le> e * 1" by (intro mult_left_mono) (simp_all add: field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   397
    finally show "norm (ln_Gamma_series t m - ln_Gamma_series t n) < e" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   398
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   399
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   400
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   401
end
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   402
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   403
lemma ln_Gamma_series_complex_converges':
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   404
  assumes z: "(z :: complex) \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   405
  shows "\<exists>d>0. uniformly_convergent_on (ball z d) (\<lambda>n z. ln_Gamma_series z n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   406
proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
   407
  define d' where "d' = Re z"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
   408
  define d where "d = (if d' > 0 then d' / 2 else norm (z - of_int (round d')) / 2)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   409
  have "of_int (round d') \<in> \<int>\<^sub>\<le>\<^sub>0" if "d' \<le> 0" using that
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   410
    by (intro nonpos_Ints_of_int) (simp_all add: round_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   411
  with assms have d_pos: "d > 0" unfolding d_def by (force simp: not_less)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   412
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   413
  have "d < cmod (z - of_int n)" if "n \<in> \<int>\<^sub>\<le>\<^sub>0" for n
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   414
  proof (cases "Re z > 0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   415
    case True
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   416
    from nonpos_Ints_nonpos[OF that] have n: "n \<le> 0" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   417
    from True have "d = Re z/2" by (simp add: d_def d'_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   418
    also from n True have "\<dots> < Re (z - of_int n)" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   419
    also have "\<dots> \<le> norm (z - of_int n)" by (rule complex_Re_le_cmod)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   420
    finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   421
  next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   422
    case False
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   423
    with assms nonpos_Ints_of_int[of "round (Re z)"]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   424
      have "z \<noteq> of_int (round d')" by (auto simp: not_less)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   425
    with False have "d < norm (z - of_int (round d'))" by (simp add: d_def d'_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   426
    also have "\<dots> \<le> norm (z - of_int n)" unfolding d'_def by (rule round_Re_minimises_norm)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   427
    finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   428
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   429
  hence conv: "uniformly_convergent_on (ball z d) (\<lambda>n z. ln_Gamma_series z n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   430
    by (intro ln_Gamma_series_complex_converges d_pos z) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   431
  from d_pos conv show ?thesis by blast
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   432
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   433
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   434
lemma ln_Gamma_series_complex_converges'': "(z :: complex) \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> convergent (ln_Gamma_series z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   435
  by (drule ln_Gamma_series_complex_converges') (auto intro: uniformly_convergent_imp_convergent)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   436
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   437
theorem ln_Gamma_complex_LIMSEQ: "(z :: complex) \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> ln_Gamma_series z \<longlonglongrightarrow> ln_Gamma z"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   438
  using ln_Gamma_series_complex_converges'' by (simp add: convergent_LIMSEQ_iff ln_Gamma_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   439
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   440
lemma exp_ln_Gamma_series_complex:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   441
  assumes "n > 0" "z \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   442
  shows   "exp (ln_Gamma_series z n :: complex) = Gamma_series z n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   443
proof -
63417
c184ec919c70 more lemmas to emphasize {0::nat..(<)n} as canonical representation of intervals on nat
haftmann
parents: 63367
diff changeset
   444
  from assms obtain m where m: "n = Suc m" by (cases n) blast
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   445
  from assms have "z \<noteq> 0" by (intro notI) auto
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   446
  with assms have "exp (ln_Gamma_series z n) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   447
          (of_nat n) powr z / (z * (\<Prod>k=1..n. exp (Ln (z / of_nat k + 1))))"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   448
    unfolding ln_Gamma_series_def powr_def by (simp add: exp_diff exp_sum)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   449
  also from assms have "(\<Prod>k=1..n. exp (Ln (z / of_nat k + 1))) = (\<Prod>k=1..n. z / of_nat k + 1)"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   450
    by (intro prod.cong[OF refl], subst exp_Ln) (auto simp: field_simps plus_of_nat_eq_0_imp)
63417
c184ec919c70 more lemmas to emphasize {0::nat..(<)n} as canonical representation of intervals on nat
haftmann
parents: 63367
diff changeset
   451
  also have "... = (\<Prod>k=1..n. z + k) / fact n"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   452
    by (simp add: fact_prod)
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   453
    (subst prod_dividef [symmetric], simp_all add: field_simps)
63417
c184ec919c70 more lemmas to emphasize {0::nat..(<)n} as canonical representation of intervals on nat
haftmann
parents: 63367
diff changeset
   454
  also from m have "z * ... = (\<Prod>k=0..n. z + k) / fact n"
70113
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
   455
    by (simp add: prod.atLeast0_atMost_Suc_shift prod.atLeast_Suc_atMost_Suc_shift del: prod.cl_ivl_Suc)
63417
c184ec919c70 more lemmas to emphasize {0::nat..(<)n} as canonical representation of intervals on nat
haftmann
parents: 63367
diff changeset
   456
  also have "(\<Prod>k=0..n. z + k) = pochhammer z (Suc n)"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   457
    unfolding pochhammer_prod
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   458
    by (simp add: prod.atLeast0_atMost_Suc atLeastLessThanSuc_atLeastAtMost)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   459
  also have "of_nat n powr z / (pochhammer z (Suc n) / fact n) = Gamma_series z n"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
   460
    unfolding Gamma_series_def using assms by (simp add: field_split_simps powr_def)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   461
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   462
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   463
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   464
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   465
lemma ln_Gamma_series'_aux:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   466
  assumes "(z::complex) \<notin> \<int>\<^sub>\<le>\<^sub>0"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   467
  shows   "(\<lambda>k. z / of_nat (Suc k) - ln (1 + z / of_nat (Suc k))) sums
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   468
              (ln_Gamma z + euler_mascheroni * z + ln z)" (is "?f sums ?s")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   469
unfolding sums_def
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   470
proof (rule Lim_transform)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   471
  show "(\<lambda>n. ln_Gamma_series z n + of_real (harm n - ln (of_nat n)) * z + ln z) \<longlonglongrightarrow> ?s"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   472
    (is "?g \<longlonglongrightarrow> _")
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   473
    by (intro tendsto_intros ln_Gamma_complex_LIMSEQ euler_mascheroni_LIMSEQ_of_real assms)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   474
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   475
  have A: "eventually (\<lambda>n. (\<Sum>k<n. ?f k) - ?g n = 0) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   476
    using eventually_gt_at_top[of "0::nat"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   477
  proof eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   478
    fix n :: nat assume n: "n > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   479
    have "(\<Sum>k<n. ?f k) = (\<Sum>k=1..n. z / of_nat k - ln (1 + z / of_nat k))"
70113
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
   480
      by (subst atLeast0LessThan [symmetric], subst sum.shift_bounds_Suc_ivl [symmetric],
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   481
          subst atLeastLessThanSuc_atLeastAtMost) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   482
    also have "\<dots> = z * of_real (harm n) - (\<Sum>k=1..n. ln (1 + z / of_nat k))"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   483
      by (simp add: harm_def sum_subtractf sum_distrib_left divide_inverse)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   484
    also from n have "\<dots> - ?g n = 0"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
   485
      by (simp add: ln_Gamma_series_def sum_subtractf algebra_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   486
    finally show "(\<Sum>k<n. ?f k) - ?g n = 0" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   487
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   488
  show "(\<lambda>n. (\<Sum>k<n. ?f k) - ?g n) \<longlonglongrightarrow> 0" by (subst tendsto_cong[OF A]) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   489
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   490
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   491
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   492
lemma uniformly_summable_deriv_ln_Gamma:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   493
  assumes z: "(z :: 'a :: {real_normed_field,banach}) \<noteq> 0" and d: "d > 0" "d \<le> norm z/2"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   494
  shows "uniformly_convergent_on (ball z d)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   495
            (\<lambda>k z. \<Sum>i<k. inverse (of_nat (Suc i)) - inverse (z + of_nat (Suc i)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   496
           (is "uniformly_convergent_on _ (\<lambda>k z. \<Sum>i<k. ?f i z)")
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
   497
proof (rule Weierstrass_m_test'_ev)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   498
  {
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   499
    fix t assume t: "t \<in> ball z d"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   500
    have "norm z = norm (t + (z - t))" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   501
    have "norm (t + (z - t)) \<le> norm t + norm (z - t)" by (rule norm_triangle_ineq)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   502
    also from t d have "norm (z - t) < norm z / 2" by (simp add: dist_norm)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   503
    finally have A: "norm t > norm z / 2" using z by (simp add: field_simps)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   504
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   505
    have "norm t = norm (z + (t - z))" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   506
    also have "\<dots> \<le> norm z + norm (t - z)" by (rule norm_triangle_ineq)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   507
    also from t d have "norm (t - z) \<le> norm z / 2" by (simp add: dist_norm norm_minus_commute)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   508
    also from z have "\<dots> < norm z" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   509
    finally have B: "norm t < 2 * norm z" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   510
    note A B
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   511
  } note ball = this
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   512
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   513
  show "eventually (\<lambda>n. \<forall>t\<in>ball z d. norm (?f n t) \<le> 4 * norm z * inverse (of_nat (Suc n)^2)) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   514
    using eventually_gt_at_top apply eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   515
  proof safe
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   516
    fix t :: 'a assume t: "t \<in> ball z d"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   517
    from z ball[OF t] have t_nz: "t \<noteq> 0" by auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   518
    fix n :: nat assume n: "n > nat \<lceil>4 * norm z\<rceil>"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   519
    from ball[OF t] t_nz have "4 * norm z > 2 * norm t" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   520
    also from n have "\<dots>  < of_nat n" by linarith
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   521
    finally have n: "of_nat n > 2 * norm t" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   522
    hence "of_nat n > norm t" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   523
    hence t': "t \<noteq> -of_nat (Suc n)" by (intro notI) (simp del: of_nat_Suc)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   524
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   525
    with t_nz have "?f n t = 1 / (of_nat (Suc n) * (1 + of_nat (Suc n)/t))"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
   526
      by (simp add: field_split_simps eq_neg_iff_add_eq_0 del: of_nat_Suc)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   527
    also have "norm \<dots> = inverse (of_nat (Suc n)) * inverse (norm (of_nat (Suc n)/t + 1))"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
   528
      by (simp add: norm_divide norm_mult field_split_simps del: of_nat_Suc)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   529
    also {
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   530
      from z t_nz ball[OF t] have "of_nat (Suc n) / (4 * norm z) \<le> of_nat (Suc n) / (2 * norm t)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   531
        by (intro divide_left_mono mult_pos_pos) simp_all
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   532
      also have "\<dots> < norm (of_nat (Suc n) / t) - norm (1 :: 'a)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   533
        using t_nz n by (simp add: field_simps norm_divide del: of_nat_Suc)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   534
      also have "\<dots> \<le> norm (of_nat (Suc n)/t + 1)" by (rule norm_diff_ineq)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   535
      finally have "inverse (norm (of_nat (Suc n)/t + 1)) \<le> 4 * norm z / of_nat (Suc n)"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
   536
        using z by (simp add: field_split_simps norm_divide mult_ac del: of_nat_Suc)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   537
    }
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   538
    also have "inverse (real_of_nat (Suc n)) * (4 * norm z / real_of_nat (Suc n)) =
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   539
                 4 * norm z * inverse (of_nat (Suc n)^2)"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
   540
                 by (simp add: field_split_simps power2_eq_square del: of_nat_Suc)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   541
    finally show "norm (?f n t) \<le> 4 * norm z * inverse (of_nat (Suc n)^2)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   542
      by (simp del: of_nat_Suc)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   543
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   544
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   545
  show "summable (\<lambda>n. 4 * norm z * inverse ((of_nat (Suc n))^2))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   546
    by (subst summable_Suc_iff) (simp add: summable_mult inverse_power_summable)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   547
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   548
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   549
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   550
subsection \<open>The Polygamma functions\<close>
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   551
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   552
lemma summable_deriv_ln_Gamma:
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   553
  "z \<noteq> (0 :: 'a :: {real_normed_field,banach}) \<Longrightarrow>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   554
     summable (\<lambda>n. inverse (of_nat (Suc n)) - inverse (z + of_nat (Suc n)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   555
  unfolding summable_iff_convergent
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   556
  by (rule uniformly_convergent_imp_convergent,
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   557
      rule uniformly_summable_deriv_ln_Gamma[of z "norm z/2"]) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   558
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
   559
definition\<^marker>\<open>tag important\<close> Polygamma :: "nat \<Rightarrow> ('a :: {real_normed_field,banach}) \<Rightarrow> 'a" where
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   560
  "Polygamma n z = (if n = 0 then
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   561
      (\<Sum>k. inverse (of_nat (Suc k)) - inverse (z + of_nat k)) - euler_mascheroni else
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   562
      (-1)^Suc n * fact n * (\<Sum>k. inverse ((z + of_nat k)^Suc n)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   563
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
   564
abbreviation\<^marker>\<open>tag important\<close> Digamma :: "('a :: {real_normed_field,banach}) \<Rightarrow> 'a" where
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   565
  "Digamma \<equiv> Polygamma 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   566
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   567
lemma Digamma_def:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   568
  "Digamma z = (\<Sum>k. inverse (of_nat (Suc k)) - inverse (z + of_nat k)) - euler_mascheroni"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   569
  by (simp add: Polygamma_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   570
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   571
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   572
lemma summable_Digamma:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   573
  assumes "(z :: 'a :: {real_normed_field,banach}) \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   574
  shows   "summable (\<lambda>n. inverse (of_nat (Suc n)) - inverse (z + of_nat n))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   575
proof -
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   576
  have sums: "(\<lambda>n. inverse (z + of_nat (Suc n)) - inverse (z + of_nat n)) sums
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   577
                       (0 - inverse (z + of_nat 0))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   578
    by (intro telescope_sums filterlim_compose[OF tendsto_inverse_0]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   579
              tendsto_add_filterlim_at_infinity[OF tendsto_const] tendsto_of_nat)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   580
  from summable_add[OF summable_deriv_ln_Gamma[OF assms] sums_summable[OF sums]]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   581
    show "summable (\<lambda>n. inverse (of_nat (Suc n)) - inverse (z + of_nat n))" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   582
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   583
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   584
lemma summable_offset:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   585
  assumes "summable (\<lambda>n. f (n + k) :: 'a :: real_normed_vector)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   586
  shows   "summable f"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   587
proof -
73005
83b114a6545f A few more simprules for iff-reasoning
paulson <lp15@cam.ac.uk>
parents: 72318
diff changeset
   588
  from assms have "convergent (\<lambda>m. \<Sum>n<m. f (n + k))"
83b114a6545f A few more simprules for iff-reasoning
paulson <lp15@cam.ac.uk>
parents: 72318
diff changeset
   589
    using summable_iff_convergent by blast
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   590
  hence "convergent (\<lambda>m. (\<Sum>n<k. f n) + (\<Sum>n<m. f (n + k)))"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   591
    by (intro convergent_add convergent_const)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   592
  also have "(\<lambda>m. (\<Sum>n<k. f n) + (\<Sum>n<m. f (n + k))) = (\<lambda>m. \<Sum>n<m+k. f n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   593
  proof
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   594
    fix m :: nat
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   595
    have "{..<m+k} = {..<k} \<union> {k..<m+k}" by auto
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   596
    also have "(\<Sum>n\<in>\<dots>. f n) = (\<Sum>n<k. f n) + (\<Sum>n=k..<m+k. f n)"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   597
      by (rule sum.union_disjoint) auto
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   598
    also have "(\<Sum>n=k..<m+k. f n) = (\<Sum>n=0..<m+k-k. f (n + k))"
70113
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
   599
      using sum.shift_bounds_nat_ivl [of f 0 k m] by simp
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   600
    finally show "(\<Sum>n<k. f n) + (\<Sum>n<m. f (n + k)) = (\<Sum>n<m+k. f n)" by (simp add: atLeast0LessThan)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   601
  qed
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   602
  finally have "(\<lambda>a. sum f {..<a}) \<longlonglongrightarrow> lim (\<lambda>m. sum f {..<m + k})"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   603
    by (auto simp: convergent_LIMSEQ_iff dest: LIMSEQ_offset)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   604
  thus ?thesis by (auto simp: summable_iff_convergent convergent_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   605
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   606
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   607
lemma Polygamma_converges:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   608
  fixes z :: "'a :: {real_normed_field,banach}"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   609
  assumes z: "z \<noteq> 0" and n: "n \<ge> 2"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   610
  shows "uniformly_convergent_on (ball z d) (\<lambda>k z. \<Sum>i<k. inverse ((z + of_nat i)^n))"
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
   611
proof (rule Weierstrass_m_test'_ev)
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
   612
  define e where "e = (1 + d / norm z)"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
   613
  define m where "m = nat \<lceil>norm z * e\<rceil>"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   614
  {
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   615
    fix t assume t: "t \<in> ball z d"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   616
    have "norm t = norm (z + (t - z))" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   617
    also have "\<dots> \<le> norm z + norm (t - z)" by (rule norm_triangle_ineq)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   618
    also from t have "norm (t - z) < d" by (simp add: dist_norm norm_minus_commute)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   619
    finally have "norm t < norm z * e" using z by (simp add: divide_simps e_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   620
  } note ball = this
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   621
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   622
  show "eventually (\<lambda>k. \<forall>t\<in>ball z d. norm (inverse ((t + of_nat k)^n)) \<le>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   623
            inverse (of_nat (k - m)^n)) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   624
    using eventually_gt_at_top[of m] apply eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   625
  proof (intro ballI)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   626
    fix k :: nat and t :: 'a assume k: "k > m" and t: "t \<in> ball z d"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   627
    from k have "real_of_nat (k - m) = of_nat k - of_nat m" by (simp add: of_nat_diff)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   628
    also have "\<dots> \<le> norm (of_nat k :: 'a) - norm z * e"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   629
      unfolding m_def by (subst norm_of_nat) linarith
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   630
    also from ball[OF t] have "\<dots> \<le> norm (of_nat k :: 'a) - norm t" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   631
    also have "\<dots> \<le> norm (of_nat k + t)" by (rule norm_diff_ineq)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   632
    finally have "inverse ((norm (t + of_nat k))^n) \<le> inverse (real_of_nat (k - m)^n)" using k n
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   633
      by (intro le_imp_inverse_le power_mono) (simp_all add: add_ac del: of_nat_Suc)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   634
    thus "norm (inverse ((t + of_nat k)^n)) \<le> inverse (of_nat (k - m)^n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   635
      by (simp add: norm_inverse norm_power power_inverse)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   636
  qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   637
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   638
  have "summable (\<lambda>k. inverse ((real_of_nat k)^n))"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   639
    using inverse_power_summable[of n] n by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   640
  hence "summable (\<lambda>k. inverse ((real_of_nat (k + m - m))^n))" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   641
  thus "summable (\<lambda>k. inverse ((real_of_nat (k - m))^n))" by (rule summable_offset)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   642
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   643
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   644
lemma Polygamma_converges':
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   645
  fixes z :: "'a :: {real_normed_field,banach}"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   646
  assumes z: "z \<noteq> 0" and n: "n \<ge> 2"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   647
  shows "summable (\<lambda>k. inverse ((z + of_nat k)^n))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   648
  using uniformly_convergent_imp_convergent[OF Polygamma_converges[OF assms, of 1], of z]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   649
  by (simp add: summable_iff_convergent)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   650
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   651
theorem Digamma_LIMSEQ:
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   652
  fixes z :: "'a :: {banach,real_normed_field}"
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   653
  assumes z: "z \<noteq> 0"
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   654
  shows   "(\<lambda>m. of_real (ln (real m)) - (\<Sum>n<m. inverse (z + of_nat n))) \<longlonglongrightarrow> Digamma z"
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   655
proof -
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   656
  have "(\<lambda>n. of_real (ln (real n / (real (Suc n))))) \<longlonglongrightarrow> (of_real (ln 1) :: 'a)"
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   657
    by (intro tendsto_intros LIMSEQ_n_over_Suc_n) simp_all
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   658
  hence "(\<lambda>n. of_real (ln (real n / (real n + 1)))) \<longlonglongrightarrow> (0 :: 'a)" by (simp add: add_ac)
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   659
  hence lim: "(\<lambda>n. of_real (ln (real n)) - of_real (ln (real n + 1))) \<longlonglongrightarrow> (0::'a)"
70532
fcf3b891ccb1 new material; rotated premises of Lim_transform_eventually
paulson <lp15@cam.ac.uk>
parents: 70196
diff changeset
   660
  proof (rule Lim_transform_eventually)
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
   661
    show "eventually (\<lambda>n. of_real (ln (real n / (real n + 1))) =
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   662
            of_real (ln (real n)) - (of_real (ln (real n + 1)) :: 'a)) at_top"
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   663
      using eventually_gt_at_top[of "0::nat"] by eventually_elim (simp add: ln_div)
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   664
  qed
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   665
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   666
  from summable_Digamma[OF z]
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
   667
    have "(\<lambda>n. inverse (of_nat (n+1)) - inverse (z + of_nat n))
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   668
              sums (Digamma z + euler_mascheroni)"
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   669
    by (simp add: Digamma_def summable_sums)
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   670
  from sums_diff[OF this euler_mascheroni_sum]
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   671
    have "(\<lambda>n. of_real (ln (real (Suc n) + 1)) - of_real (ln (real n + 1)) - inverse (z + of_nat n))
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   672
            sums Digamma z" by (simp add: add_ac)
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
   673
  hence "(\<lambda>m. (\<Sum>n<m. of_real (ln (real (Suc n) + 1)) - of_real (ln (real n + 1))) -
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   674
              (\<Sum>n<m. inverse (z + of_nat n))) \<longlonglongrightarrow> Digamma z"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   675
    by (simp add: sums_def sum_subtractf)
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
   676
  also have "(\<lambda>m. (\<Sum>n<m. of_real (ln (real (Suc n) + 1)) - of_real (ln (real n + 1)))) =
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   677
                 (\<lambda>m. of_real (ln (m + 1)) :: 'a)"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   678
    by (subst sum_lessThan_telescope) simp_all
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   679
  finally show ?thesis by (rule Lim_transform) (insert lim, simp)
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   680
qed
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
   681
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   682
theorem Polygamma_LIMSEQ:
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   683
  fixes z :: "'a :: {banach,real_normed_field}"
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   684
  assumes "z \<noteq> 0" and "n > 0"
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   685
  shows   "(\<lambda>k. inverse ((z + of_nat k)^Suc n)) sums ((-1) ^ Suc n * Polygamma n z / fact n)"
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   686
  using Polygamma_converges'[OF assms(1), of "Suc n"] assms(2)
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   687
  by (simp add: sums_iff Polygamma_def)
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   688
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   689
theorem has_field_derivative_ln_Gamma_complex [derivative_intros]:
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   690
  fixes z :: complex
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   691
  assumes z: "z \<notin> \<real>\<^sub>\<le>\<^sub>0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   692
  shows   "(ln_Gamma has_field_derivative Digamma z) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   693
proof -
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   694
  have not_nonpos_Int [simp]: "t \<notin> \<int>\<^sub>\<le>\<^sub>0" if "Re t > 0" for t
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   695
    using that by (auto elim!: nonpos_Ints_cases')
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   696
  from z have z': "z \<notin> \<int>\<^sub>\<le>\<^sub>0" and z'': "z \<noteq> 0" using nonpos_Ints_subset_nonpos_Reals nonpos_Reals_zero_I
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   697
     by blast+
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   698
  let ?f' = "\<lambda>z k. inverse (of_nat (Suc k)) - inverse (z + of_nat (Suc k))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   699
  let ?f = "\<lambda>z k. z / of_nat (Suc k) - ln (1 + z / of_nat (Suc k))" and ?F' = "\<lambda>z. \<Sum>n. ?f' z n"
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
   700
  define d where "d = min (norm z/2) (if Im z = 0 then Re z / 2 else abs (Im z) / 2)"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   701
  from z have d: "d > 0" "norm z/2 \<ge> d" by (auto simp add: complex_nonpos_Reals_iff d_def)
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   702
  have ball: "Im t = 0 \<longrightarrow> Re t > 0" if "dist z t < d" for t
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   703
    using no_nonpos_Real_in_ball[OF z, of t] that unfolding d_def by (force simp add: complex_nonpos_Reals_iff)
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   704
  have sums: "(\<lambda>n. inverse (z + of_nat (Suc n)) - inverse (z + of_nat n)) sums
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   705
                       (0 - inverse (z + of_nat 0))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   706
    by (intro telescope_sums filterlim_compose[OF tendsto_inverse_0]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   707
              tendsto_add_filterlim_at_infinity[OF tendsto_const] tendsto_of_nat)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   708
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   709
  have "((\<lambda>z. \<Sum>n. ?f z n) has_field_derivative ?F' z) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   710
    using d z ln_Gamma_series'_aux[OF z']
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   711
    apply (intro has_field_derivative_series'(2)[of "ball z d" _ _ z] uniformly_summable_deriv_ln_Gamma)
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   712
    apply (auto intro!: derivative_eq_intros add_pos_pos mult_pos_pos dest!: ball
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   713
             simp: field_simps sums_iff nonpos_Reals_divide_of_nat_iff
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   714
             simp del: of_nat_Suc)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   715
    apply (auto simp add: complex_nonpos_Reals_iff)
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   716
    done
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   717
  with z have "((\<lambda>z. (\<Sum>k. ?f z k) - euler_mascheroni * z - Ln z) has_field_derivative
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   718
                   ?F' z - euler_mascheroni - inverse z) (at z)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   719
    by (force intro!: derivative_eq_intros simp: Digamma_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   720
  also have "?F' z - euler_mascheroni - inverse z = (?F' z + -inverse z) - euler_mascheroni" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   721
  also from sums have "-inverse z = (\<Sum>n. inverse (z + of_nat (Suc n)) - inverse (z + of_nat n))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   722
    by (simp add: sums_iff)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   723
  also from sums summable_deriv_ln_Gamma[OF z'']
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   724
    have "?F' z + \<dots> =  (\<Sum>n. inverse (of_nat (Suc n)) - inverse (z + of_nat n))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   725
    by (subst suminf_add) (simp_all add: add_ac sums_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   726
  also have "\<dots> - euler_mascheroni = Digamma z" by (simp add: Digamma_def)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   727
  finally have "((\<lambda>z. (\<Sum>k. ?f z k) - euler_mascheroni * z - Ln z)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   728
                    has_field_derivative Digamma z) (at z)" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   729
  moreover from eventually_nhds_ball[OF d(1), of z]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   730
    have "eventually (\<lambda>z. ln_Gamma z = (\<Sum>k. ?f z k) - euler_mascheroni * z - Ln z) (nhds z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   731
  proof eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   732
    fix t assume "t \<in> ball z d"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   733
    hence "t \<notin> \<int>\<^sub>\<le>\<^sub>0" by (auto dest!: ball elim!: nonpos_Ints_cases)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   734
    from ln_Gamma_series'_aux[OF this]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   735
      show "ln_Gamma t = (\<Sum>k. ?f t k) - euler_mascheroni * t - Ln t" by (simp add: sums_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   736
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   737
  ultimately show ?thesis by (subst DERIV_cong_ev[OF refl _ refl])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   738
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   739
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   740
declare has_field_derivative_ln_Gamma_complex[THEN DERIV_chain2, derivative_intros]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   741
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   742
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   743
lemma Digamma_1 [simp]: "Digamma (1 :: 'a :: {real_normed_field,banach}) = - euler_mascheroni"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   744
  by (simp add: Digamma_def)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   745
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   746
lemma Digamma_plus1:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   747
  assumes "z \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   748
  shows   "Digamma (z+1) = Digamma z + 1/z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   749
proof -
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   750
  have sums: "(\<lambda>k. inverse (z + of_nat k) - inverse (z + of_nat (Suc k)))
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   751
                  sums (inverse (z + of_nat 0) - 0)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   752
    by (intro telescope_sums'[OF filterlim_compose[OF tendsto_inverse_0]]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   753
              tendsto_add_filterlim_at_infinity[OF tendsto_const] tendsto_of_nat)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   754
  have "Digamma (z+1) = (\<Sum>k. inverse (of_nat (Suc k)) - inverse (z + of_nat (Suc k))) -
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   755
          euler_mascheroni" (is "_ = suminf ?f - _") by (simp add: Digamma_def add_ac)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   756
  also have "suminf ?f = (\<Sum>k. inverse (of_nat (Suc k)) - inverse (z + of_nat k)) +
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   757
                         (\<Sum>k. inverse (z + of_nat k) - inverse (z + of_nat (Suc k)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   758
    using summable_Digamma[OF assms] sums by (subst suminf_add) (simp_all add: add_ac sums_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   759
  also have "(\<Sum>k. inverse (z + of_nat k) - inverse (z + of_nat (Suc k))) = 1/z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   760
    using sums by (simp add: sums_iff inverse_eq_divide)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   761
  finally show ?thesis by (simp add: Digamma_def[of z])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   762
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   763
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   764
theorem Polygamma_plus1:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   765
  assumes "z \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   766
  shows   "Polygamma n (z + 1) = Polygamma n z + (-1)^n * fact n / (z ^ Suc n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   767
proof (cases "n = 0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   768
  assume n: "n \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   769
  let ?f = "\<lambda>k. inverse ((z + of_nat k) ^ Suc n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   770
  have "Polygamma n (z + 1) = (-1) ^ Suc n * fact n * (\<Sum>k. ?f (k+1))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   771
    using n by (simp add: Polygamma_def add_ac)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   772
  also have "(\<Sum>k. ?f (k+1)) + (\<Sum>k<1. ?f k) = (\<Sum>k. ?f k)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   773
    using Polygamma_converges'[OF assms, of "Suc n"] n
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   774
    by (subst suminf_split_initial_segment [symmetric]) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   775
  hence "(\<Sum>k. ?f (k+1)) = (\<Sum>k. ?f k) - inverse (z ^ Suc n)" by (simp add: algebra_simps)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   776
  also have "(-1) ^ Suc n * fact n * ((\<Sum>k. ?f k) - inverse (z ^ Suc n)) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   777
               Polygamma n z + (-1)^n * fact n / (z ^ Suc n)" using n
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   778
    by (simp add: inverse_eq_divide algebra_simps Polygamma_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   779
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   780
qed (insert assms, simp add: Digamma_plus1 inverse_eq_divide)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   781
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   782
theorem Digamma_of_nat:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   783
  "Digamma (of_nat (Suc n) :: 'a :: {real_normed_field,banach}) = harm n - euler_mascheroni"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   784
proof (induction n)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   785
  case (Suc n)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   786
  have "Digamma (of_nat (Suc (Suc n)) :: 'a) = Digamma (of_nat (Suc n) + 1)" by simp
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   787
  also have "\<dots> = Digamma (of_nat (Suc n)) + inverse (of_nat (Suc n))"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   788
    by (subst Digamma_plus1) (simp_all add: inverse_eq_divide del: of_nat_Suc)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   789
  also have "Digamma (of_nat (Suc n) :: 'a) = harm n - euler_mascheroni " by (rule Suc)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   790
  also have "\<dots> + inverse (of_nat (Suc n)) = harm (Suc n) - euler_mascheroni"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   791
    by (simp add: harm_Suc)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   792
  finally show ?case .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   793
qed (simp add: harm_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   794
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   795
lemma Digamma_numeral: "Digamma (numeral n) = harm (pred_numeral n) - euler_mascheroni"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   796
  by (subst of_nat_numeral[symmetric], subst numeral_eq_Suc, subst Digamma_of_nat) (rule refl)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   797
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   798
lemma Polygamma_of_real: "x \<noteq> 0 \<Longrightarrow> Polygamma n (of_real x) = of_real (Polygamma n x)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   799
  unfolding Polygamma_def using summable_Digamma[of x] Polygamma_converges'[of x "Suc n"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   800
  by (simp_all add: suminf_of_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   801
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   802
lemma Polygamma_Real: "z \<in> \<real> \<Longrightarrow> z \<noteq> 0 \<Longrightarrow> Polygamma n z \<in> \<real>"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   803
  by (elim Reals_cases, hypsubst, subst Polygamma_of_real) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   804
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   805
lemma Digamma_half_integer:
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   806
  "Digamma (of_nat n + 1/2 :: 'a :: {real_normed_field,banach}) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   807
      (\<Sum>k<n. 2 / (of_nat (2*k+1))) - euler_mascheroni - of_real (2 * ln 2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   808
proof (induction n)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   809
  case 0
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   810
  have "Digamma (1/2 :: 'a) = of_real (Digamma (1/2))" by (simp add: Polygamma_of_real [symmetric])
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   811
  also have "Digamma (1/2::real) =
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   812
               (\<Sum>k. inverse (of_nat (Suc k)) - inverse (of_nat k + 1/2)) - euler_mascheroni"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   813
    by (simp add: Digamma_def add_ac)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   814
  also have "(\<Sum>k. inverse (of_nat (Suc k) :: real) - inverse (of_nat k + 1/2)) =
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   815
             (\<Sum>k. inverse (1/2) * (inverse (2 * of_nat (Suc k)) - inverse (2 * of_nat k + 1)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   816
    by (simp_all add: add_ac inverse_mult_distrib[symmetric] ring_distribs del: inverse_divide)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   817
  also have "\<dots> = - 2 * ln 2" using sums_minus[OF alternating_harmonic_series_sums']
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   818
    by (subst suminf_mult) (simp_all add: algebra_simps sums_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   819
  finally show ?case by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   820
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   821
  case (Suc n)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   822
  have nz: "2 * of_nat n + (1:: 'a) \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   823
     using of_nat_neq_0[of "2*n"] by (simp only: of_nat_Suc) (simp add: add_ac)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   824
  hence nz': "of_nat n + (1/2::'a) \<noteq> 0" by (simp add: field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   825
  have "Digamma (of_nat (Suc n) + 1/2 :: 'a) = Digamma (of_nat n + 1/2 + 1)" by simp
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
   826
  also from nz' have "\<dots> = Digamma (of_nat n + 1/2) + 1 / (of_nat n + 1/2)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   827
    by (rule Digamma_plus1)
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
   828
  also from nz nz' have "1 / (of_nat n + 1/2 :: 'a) = 2 / (2 * of_nat n + 1)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   829
    by (subst divide_eq_eq) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   830
  also note Suc
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   831
  finally show ?case by (simp add: add_ac)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   832
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   833
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   834
lemma Digamma_one_half: "Digamma (1/2) = - euler_mascheroni - of_real (2 * ln 2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   835
  using Digamma_half_integer[of 0] by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   836
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   837
lemma Digamma_real_three_halves_pos: "Digamma (3/2 :: real) > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   838
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   839
  have "-Digamma (3/2 :: real) = -Digamma (of_nat 1 + 1/2)" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   840
  also have "\<dots> = 2 * ln 2 + euler_mascheroni - 2" by (subst Digamma_half_integer) simp
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
   841
  also note euler_mascheroni_less_13_over_22
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
   842
  also note ln2_le_25_over_36
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   843
  finally show ?thesis by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   844
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   845
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   846
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
   847
theorem has_field_derivative_Polygamma [derivative_intros]:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   848
  fixes z :: "'a :: {real_normed_field,euclidean_space}"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   849
  assumes z: "z \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   850
  shows "(Polygamma n has_field_derivative Polygamma (Suc n) z) (at z within A)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   851
proof (rule has_field_derivative_at_within, cases "n = 0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   852
  assume n: "n = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   853
  let ?f = "\<lambda>k z. inverse (of_nat (Suc k)) - inverse (z + of_nat k)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   854
  let ?F = "\<lambda>z. \<Sum>k. ?f k z" and ?f' = "\<lambda>k z. inverse ((z + of_nat k)\<^sup>2)"
74362
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
   855
  from no_nonpos_Int_in_ball'[OF z] obtain d where d: "0 < d" "\<And>t. t \<in> ball z d \<Longrightarrow> t \<notin> \<int>\<^sub>\<le>\<^sub>0"
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
   856
    by auto
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   857
  from z have summable: "summable (\<lambda>k. inverse (of_nat (Suc k)) - inverse (z + of_nat k))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   858
    by (intro summable_Digamma) force
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   859
  from z have conv: "uniformly_convergent_on (ball z d) (\<lambda>k z. \<Sum>i<k. inverse ((z + of_nat i)\<^sup>2))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   860
    by (intro Polygamma_converges) auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   861
  with d have "summable (\<lambda>k. inverse ((z + of_nat k)\<^sup>2))" unfolding summable_iff_convergent
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   862
    by (auto dest!: uniformly_convergent_imp_convergent simp: summable_iff_convergent )
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   863
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   864
  have "(?F has_field_derivative (\<Sum>k. ?f' k z)) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   865
  proof (rule has_field_derivative_series'[of "ball z d" _ _ z])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   866
    fix k :: nat and t :: 'a assume t: "t \<in> ball z d"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   867
    from t d(2)[of t] show "((\<lambda>z. ?f k z) has_field_derivative ?f' k t) (at t within ball z d)"
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   868
      by (auto intro!: derivative_eq_intros simp: power2_eq_square simp del: of_nat_Suc
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   869
               dest!: plus_of_nat_eq_0_imp elim!: nonpos_Ints_cases)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   870
  qed (insert d(1) summable conv, (assumption|simp)+)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   871
  with z show "(Polygamma n has_field_derivative Polygamma (Suc n) z) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   872
    unfolding Digamma_def [abs_def] Polygamma_def [abs_def] using n
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   873
    by (force simp: power2_eq_square intro!: derivative_eq_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   874
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   875
  assume n: "n \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   876
  from z have z': "z \<noteq> 0" by auto
74362
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
   877
  from no_nonpos_Int_in_ball'[OF z] obtain d where d: "0 < d" "\<And>t. t \<in> ball z d \<Longrightarrow> t \<notin> \<int>\<^sub>\<le>\<^sub>0"
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
   878
    by auto
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
   879
  define n' where "n' = Suc n"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   880
  from n have n': "n' \<ge> 2" by (simp add: n'_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   881
  have "((\<lambda>z. \<Sum>k. inverse ((z + of_nat k) ^ n')) has_field_derivative
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   882
                (\<Sum>k. - of_nat n' * inverse ((z + of_nat k) ^ (n'+1)))) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   883
  proof (rule has_field_derivative_series'[of "ball z d" _ _ z])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   884
    fix k :: nat and t :: 'a assume t: "t \<in> ball z d"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   885
    with d have t': "t \<notin> \<int>\<^sub>\<le>\<^sub>0" "t \<noteq> 0" by auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   886
    show "((\<lambda>a. inverse ((a + of_nat k) ^ n')) has_field_derivative
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   887
                - of_nat n' * inverse ((t + of_nat k) ^ (n'+1))) (at t within ball z d)" using t'
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   888
      by (fastforce intro!: derivative_eq_intros simp: divide_simps power_diff dest: plus_of_nat_eq_0_imp)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   889
  next
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   890
    have "uniformly_convergent_on (ball z d)
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   891
              (\<lambda>k z. (- of_nat n' :: 'a) * (\<Sum>i<k. inverse ((z + of_nat i) ^ (n'+1))))"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   892
      using z' n by (intro uniformly_convergent_mult Polygamma_converges) (simp_all add: n'_def)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   893
    thus "uniformly_convergent_on (ball z d)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   894
              (\<lambda>k z. \<Sum>i<k. - of_nat n' * inverse ((z + of_nat i :: 'a) ^ (n'+1)))"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
   895
      by (subst (asm) sum_distrib_left) simp
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   896
  qed (insert Polygamma_converges'[OF z' n'] d, simp_all)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   897
  also have "(\<Sum>k. - of_nat n' * inverse ((z + of_nat k) ^ (n' + 1))) =
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   898
               (- of_nat n') * (\<Sum>k. inverse ((z + of_nat k) ^ (n' + 1)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   899
    using Polygamma_converges'[OF z', of "n'+1"] n' by (subst suminf_mult) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   900
  finally have "((\<lambda>z. \<Sum>k. inverse ((z + of_nat k) ^ n')) has_field_derivative
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   901
                    - of_nat n' * (\<Sum>k. inverse ((z + of_nat k) ^ (n' + 1)))) (at z)" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   902
  from DERIV_cmult[OF this, of "(-1)^Suc n * fact n :: 'a"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   903
    show "(Polygamma n has_field_derivative Polygamma (Suc n) z) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   904
    unfolding n'_def Polygamma_def[abs_def] using n by (simp add: algebra_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   905
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   906
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   907
declare has_field_derivative_Polygamma[THEN DERIV_chain2, derivative_intros]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   908
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   909
lemma isCont_Polygamma [continuous_intros]:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   910
  fixes f :: "_ \<Rightarrow> 'a :: {real_normed_field,euclidean_space}"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   911
  shows "isCont f z \<Longrightarrow> f z \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> isCont (\<lambda>x. Polygamma n (f x)) z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   912
  by (rule isCont_o2[OF _  DERIV_isCont[OF has_field_derivative_Polygamma]])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   913
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   914
lemma continuous_on_Polygamma:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   915
  "A \<inter> \<int>\<^sub>\<le>\<^sub>0 = {} \<Longrightarrow> continuous_on A (Polygamma n :: _ \<Rightarrow> 'a :: {real_normed_field,euclidean_space})"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   916
  by (intro continuous_at_imp_continuous_on isCont_Polygamma[OF continuous_ident] ballI) blast
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   917
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   918
lemma isCont_ln_Gamma_complex [continuous_intros]:
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   919
  fixes f :: "'a::t2_space \<Rightarrow> complex"
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   920
  shows "isCont f z \<Longrightarrow> f z \<notin> \<real>\<^sub>\<le>\<^sub>0 \<Longrightarrow> isCont (\<lambda>z. ln_Gamma (f z)) z"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   921
  by (rule isCont_o2[OF _  DERIV_isCont[OF has_field_derivative_ln_Gamma_complex]])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   922
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   923
lemma continuous_on_ln_Gamma_complex [continuous_intros]:
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   924
  fixes A :: "complex set"
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   925
  shows "A \<inter> \<real>\<^sub>\<le>\<^sub>0 = {} \<Longrightarrow> continuous_on A ln_Gamma"
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   926
  by (intro continuous_at_imp_continuous_on ballI isCont_ln_Gamma_complex[OF continuous_ident])
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   927
     fastforce
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
   928
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   929
lemma deriv_Polygamma:
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   930
  assumes "z \<notin> \<int>\<^sub>\<le>\<^sub>0"
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
   931
  shows   "deriv (Polygamma m) z =
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   932
             Polygamma (Suc m) (z :: 'a :: {real_normed_field,euclidean_space})"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   933
  by (intro DERIV_imp_deriv has_field_derivative_Polygamma assms)
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   934
    thm has_field_derivative_Polygamma
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   935
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   936
lemma higher_deriv_Polygamma:
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   937
  assumes "z \<notin> \<int>\<^sub>\<le>\<^sub>0"
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
   938
  shows   "(deriv ^^ n) (Polygamma m) z =
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   939
             Polygamma (m + n) (z :: 'a :: {real_normed_field,euclidean_space})"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   940
proof -
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   941
  have "eventually (\<lambda>u. (deriv ^^ n) (Polygamma m) u = Polygamma (m + n) u) (nhds z)"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   942
  proof (induction n)
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   943
    case (Suc n)
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   944
    from Suc.IH have "eventually (\<lambda>z. eventually (\<lambda>u. (deriv ^^ n) (Polygamma m) u = Polygamma (m + n) u) (nhds z)) (nhds z)"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   945
      by (simp add: eventually_eventually)
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
   946
    hence "eventually (\<lambda>z. deriv ((deriv ^^ n) (Polygamma m)) z =
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   947
             deriv (Polygamma (m + n)) z) (nhds z)"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   948
      by eventually_elim (intro deriv_cong_ev refl)
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   949
    moreover have "eventually (\<lambda>z. z \<in> UNIV - \<int>\<^sub>\<le>\<^sub>0) (nhds z)" using assms
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   950
      by (intro eventually_nhds_in_open open_Diff open_UNIV) auto
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   951
    ultimately show ?case by eventually_elim (simp_all add: deriv_Polygamma)
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   952
  qed simp_all
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   953
  thus ?thesis by (rule eventually_nhds_x_imp_x)
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   954
qed
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   955
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   956
lemma deriv_ln_Gamma_complex:
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   957
  assumes "z \<notin> \<real>\<^sub>\<le>\<^sub>0"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   958
  shows   "deriv ln_Gamma z = Digamma (z :: complex)"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   959
  by (intro DERIV_imp_deriv has_field_derivative_ln_Gamma_complex assms)
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   960
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
   961
73928
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   962
lemma higher_deriv_ln_Gamma_complex:
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   963
  assumes "(x::complex) \<notin> \<real>\<^sub>\<le>\<^sub>0"
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   964
  shows   "(deriv ^^ j) ln_Gamma x = (if j = 0 then ln_Gamma x else Polygamma (j - 1) x)"
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   965
proof (cases j)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   966
  case (Suc j')
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   967
  have "(deriv ^^ j') (deriv ln_Gamma) x = (deriv ^^ j') Digamma x"
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   968
    using eventually_nhds_in_open[of "UNIV - \<real>\<^sub>\<le>\<^sub>0" x] assms
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   969
    by (intro higher_deriv_cong_ev refl)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   970
       (auto elim!: eventually_mono simp: open_Diff deriv_ln_Gamma_complex)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   971
  also have "\<dots> = Polygamma j' x" using assms
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   972
    by (subst higher_deriv_Polygamma)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   973
       (auto elim!: nonpos_Ints_cases simp: complex_nonpos_Reals_iff)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   974
  finally show ?thesis using Suc by (simp del: funpow.simps add: funpow_Suc_right)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   975
qed simp_all
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
   976
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   977
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   978
text \<open>
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   979
  We define a type class that captures all the fundamental properties of the inverse of the Gamma function
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   980
  and defines the Gamma function upon that. This allows us to instantiate the type class both for
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   981
  the reals and for the complex numbers with a minimal amount of proof duplication.
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   982
\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   983
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
   984
class\<^marker>\<open>tag unimportant\<close> Gamma = real_normed_field + complete_space +
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   985
  fixes rGamma :: "'a \<Rightarrow> 'a"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   986
  assumes rGamma_eq_zero_iff_aux: "rGamma z = 0 \<longleftrightarrow> (\<exists>n. z = - of_nat n)"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   987
  assumes differentiable_rGamma_aux1:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   988
    "(\<And>n. z \<noteq> - of_nat n) \<Longrightarrow>
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   989
     let d = (THE d. (\<lambda>n. \<Sum>k<n. inverse (of_nat (Suc k)) - inverse (z + of_nat k))
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   990
               \<longlonglongrightarrow> d) - scaleR euler_mascheroni 1
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   991
     in  filterlim (\<lambda>y. (rGamma y - rGamma z + rGamma z * d * (y - z)) /\<^sub>R
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   992
                        norm (y - z)) (nhds 0) (at z)"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   993
  assumes differentiable_rGamma_aux2:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   994
    "let z = - of_nat n
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   995
     in  filterlim (\<lambda>y. (rGamma y - rGamma z - (-1)^n * (prod of_nat {1..n}) * (y - z)) /\<^sub>R
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   996
                        norm (y - z)) (nhds 0) (at z)"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
   997
  assumes rGamma_series_aux: "(\<And>n. z \<noteq> - of_nat n) \<Longrightarrow>
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   998
             let fact' = (\<lambda>n. prod of_nat {1..n});
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
   999
                 exp = (\<lambda>x. THE e. (\<lambda>n. \<Sum>k<n. x^k /\<^sub>R fact k) \<longlonglongrightarrow> e);
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1000
                 pochhammer' = (\<lambda>a n. (\<Prod>n = 0..n. a + of_nat n))
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1001
             in  filterlim (\<lambda>n. pochhammer' z n / (fact' n * exp (z * (ln (of_nat n) *\<^sub>R 1))))
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1002
                     (nhds (rGamma z)) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1003
begin
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1004
subclass banach ..
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1005
end
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1006
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1007
definition "Gamma z = inverse (rGamma z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1008
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1009
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1010
subsection \<open>Basic properties\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1011
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1012
lemma Gamma_nonpos_Int: "z \<in> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> Gamma z = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1013
  and rGamma_nonpos_Int: "z \<in> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> rGamma z = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1014
  using rGamma_eq_zero_iff_aux[of z] unfolding Gamma_def by (auto elim!: nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1015
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1016
lemma Gamma_nonzero: "z \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> Gamma z \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1017
  and rGamma_nonzero: "z \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> rGamma z \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1018
  using rGamma_eq_zero_iff_aux[of z] unfolding Gamma_def by (auto elim!: nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1019
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1020
lemma Gamma_eq_zero_iff: "Gamma z = 0 \<longleftrightarrow> z \<in> \<int>\<^sub>\<le>\<^sub>0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1021
  and rGamma_eq_zero_iff: "rGamma z = 0 \<longleftrightarrow> z \<in> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1022
  using rGamma_eq_zero_iff_aux[of z] unfolding Gamma_def by (auto elim!: nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1023
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1024
lemma rGamma_inverse_Gamma: "rGamma z = inverse (Gamma z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1025
  unfolding Gamma_def by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1026
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1027
lemma rGamma_series_LIMSEQ [tendsto_intros]:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1028
  "rGamma_series z \<longlonglongrightarrow> rGamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1029
proof (cases "z \<in> \<int>\<^sub>\<le>\<^sub>0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1030
  case False
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1031
  hence "z \<noteq> - of_nat n" for n by auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1032
  from rGamma_series_aux[OF this] show ?thesis
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  1033
    by (simp add: rGamma_series_def[abs_def] fact_prod pochhammer_Suc_prod
63367
6c731c8b7f03 simplified definitions of combinatorial functions
haftmann
parents: 63317
diff changeset
  1034
                  exp_def of_real_def[symmetric] suminf_def sums_def[abs_def] atLeast0AtMost)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1035
qed (insert rGamma_eq_zero_iff[of z], simp_all add: rGamma_series_nonpos_Ints_LIMSEQ)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1036
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  1037
theorem Gamma_series_LIMSEQ [tendsto_intros]:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1038
  "Gamma_series z \<longlonglongrightarrow> Gamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1039
proof (cases "z \<in> \<int>\<^sub>\<le>\<^sub>0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1040
  case False
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1041
  hence "(\<lambda>n. inverse (rGamma_series z n)) \<longlonglongrightarrow> inverse (rGamma z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1042
    by (intro tendsto_intros) (simp_all add: rGamma_eq_zero_iff)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1043
  also have "(\<lambda>n. inverse (rGamma_series z n)) = Gamma_series z"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1044
    by (simp add: rGamma_series_def Gamma_series_def[abs_def])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1045
  finally show ?thesis by (simp add: Gamma_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1046
qed (insert Gamma_eq_zero_iff[of z], simp_all add: Gamma_series_nonpos_Ints_LIMSEQ)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1047
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1048
lemma Gamma_altdef: "Gamma z = lim (Gamma_series z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1049
  using Gamma_series_LIMSEQ[of z] by (simp add: limI)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1050
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1051
lemma rGamma_1 [simp]: "rGamma 1 = 1"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1052
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1053
  have A: "eventually (\<lambda>n. rGamma_series 1 n = of_nat (Suc n) / of_nat n) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1054
    using eventually_gt_at_top[of "0::nat"]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1055
    by (force elim!: eventually_mono simp: rGamma_series_def exp_of_real pochhammer_fact
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  1056
                    field_split_simps pochhammer_rec' dest!: pochhammer_eq_0_imp_nonpos_Int)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1057
  have "rGamma_series 1 \<longlonglongrightarrow> 1" by (subst tendsto_cong[OF A]) (rule LIMSEQ_Suc_n_over_n)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1058
  moreover have "rGamma_series 1 \<longlonglongrightarrow> rGamma 1" by (rule tendsto_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1059
  ultimately show ?thesis by (intro LIMSEQ_unique)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1060
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1061
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1062
lemma rGamma_plus1: "z * rGamma (z + 1) = rGamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1063
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1064
  let ?f = "\<lambda>n. (z + 1) * inverse (of_nat n) + 1"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1065
  have "eventually (\<lambda>n. ?f n * rGamma_series z n = z * rGamma_series (z + 1) n) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1066
    using eventually_gt_at_top[of "0::nat"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1067
  proof eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1068
    fix n :: nat assume n: "n > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1069
    hence "z * rGamma_series (z + 1) n = inverse (of_nat n) *
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1070
             pochhammer z (Suc (Suc n)) / (fact n * exp (z * of_real (ln (of_nat n))))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1071
      by (subst pochhammer_rec) (simp add: rGamma_series_def field_simps exp_add exp_of_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1072
    also from n have "\<dots> = ?f n * rGamma_series z n"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  1073
      by (subst pochhammer_rec') (simp_all add: field_split_simps rGamma_series_def)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1074
    finally show "?f n * rGamma_series z n = z * rGamma_series (z + 1) n" ..
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1075
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1076
  moreover have "(\<lambda>n. ?f n * rGamma_series z n) \<longlonglongrightarrow> ((z+1) * 0 + 1) * rGamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1077
    by (intro tendsto_intros lim_inverse_n)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1078
  hence "(\<lambda>n. ?f n * rGamma_series z n) \<longlonglongrightarrow> rGamma z" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1079
  ultimately have "(\<lambda>n. z * rGamma_series (z + 1) n) \<longlonglongrightarrow> rGamma z"
70532
fcf3b891ccb1 new material; rotated premises of Lim_transform_eventually
paulson <lp15@cam.ac.uk>
parents: 70196
diff changeset
  1080
    by (blast intro: Lim_transform_eventually)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1081
  moreover have "(\<lambda>n. z * rGamma_series (z + 1) n) \<longlonglongrightarrow> z * rGamma (z + 1)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1082
    by (intro tendsto_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1083
  ultimately show "z * rGamma (z + 1) = rGamma z" using LIMSEQ_unique by blast
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1084
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1085
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1086
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1087
lemma pochhammer_rGamma: "rGamma z = pochhammer z n * rGamma (z + of_nat n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1088
proof (induction n arbitrary: z)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1089
  case (Suc n z)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1090
  have "rGamma z = pochhammer z n * rGamma (z + of_nat n)" by (rule Suc.IH)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1091
  also note rGamma_plus1 [symmetric]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1092
  finally show ?case by (simp add: add_ac pochhammer_rec')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1093
qed simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1094
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  1095
theorem Gamma_plus1: "z \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> Gamma (z + 1) = z * Gamma z"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1096
  using rGamma_plus1[of z] by (simp add: rGamma_inverse_Gamma field_simps Gamma_eq_zero_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1097
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  1098
theorem pochhammer_Gamma: "z \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> pochhammer z n = Gamma (z + of_nat n) / Gamma z"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1099
  using pochhammer_rGamma[of z]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1100
  by (simp add: rGamma_inverse_Gamma Gamma_eq_zero_iff field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1101
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1102
lemma Gamma_0 [simp]: "Gamma 0 = 0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1103
  and rGamma_0 [simp]: "rGamma 0 = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1104
  and Gamma_neg_1 [simp]: "Gamma (- 1) = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1105
  and rGamma_neg_1 [simp]: "rGamma (- 1) = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1106
  and Gamma_neg_numeral [simp]: "Gamma (- numeral n) = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1107
  and rGamma_neg_numeral [simp]: "rGamma (- numeral n) = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1108
  and Gamma_neg_of_nat [simp]: "Gamma (- of_nat m) = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1109
  and rGamma_neg_of_nat [simp]: "rGamma (- of_nat m) = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1110
  by (simp_all add: rGamma_eq_zero_iff Gamma_eq_zero_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1111
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1112
lemma Gamma_1 [simp]: "Gamma 1 = 1" unfolding Gamma_def by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1113
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  1114
theorem Gamma_fact: "Gamma (1 + of_nat n) = fact n"
68403
223172b97d0b reorient -> split; documented split
nipkow
parents: 68224
diff changeset
  1115
  by (simp add: pochhammer_fact pochhammer_Gamma of_nat_in_nonpos_Ints_iff flip: of_nat_Suc)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1116
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1117
lemma Gamma_numeral: "Gamma (numeral n) = fact (pred_numeral n)"
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
  1118
  by (subst of_nat_numeral[symmetric], subst numeral_eq_Suc,
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  1119
      subst of_nat_Suc, subst Gamma_fact) (rule refl)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1120
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1121
lemma Gamma_of_int: "Gamma (of_int n) = (if n > 0 then fact (nat (n - 1)) else 0)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1122
proof (cases "n > 0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1123
  case True
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1124
  hence "Gamma (of_int n) = Gamma (of_nat (Suc (nat (n - 1))))" by (subst of_nat_Suc) simp_all
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  1125
  with True show ?thesis by (subst (asm) of_nat_Suc, subst (asm) Gamma_fact) simp
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1126
qed (simp_all add: Gamma_eq_zero_iff nonpos_Ints_of_int)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1127
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1128
lemma rGamma_of_int: "rGamma (of_int n) = (if n > 0 then inverse (fact (nat (n - 1))) else 0)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1129
  by (simp add: Gamma_of_int rGamma_inverse_Gamma)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1130
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1131
lemma Gamma_seriesI:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1132
  assumes "(\<lambda>n. g n / Gamma_series z n) \<longlonglongrightarrow> 1"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1133
  shows   "g \<longlonglongrightarrow> Gamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1134
proof (rule Lim_transform_eventually)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1135
  have "1/2 > (0::real)" by simp
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1136
  from tendstoD[OF assms, OF this]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1137
    show "eventually (\<lambda>n. g n / Gamma_series z n * Gamma_series z n = g n) sequentially"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  1138
    by (force elim!: eventually_mono simp: dist_real_def)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1139
  from assms have "(\<lambda>n. g n / Gamma_series z n * Gamma_series z n) \<longlonglongrightarrow> 1 * Gamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1140
    by (intro tendsto_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1141
  thus "(\<lambda>n. g n / Gamma_series z n * Gamma_series z n) \<longlonglongrightarrow> Gamma z" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1142
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1143
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1144
lemma Gamma_seriesI':
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1145
  assumes "f \<longlonglongrightarrow> rGamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1146
  assumes "(\<lambda>n. g n * f n) \<longlonglongrightarrow> 1"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1147
  assumes "z \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1148
  shows   "g \<longlonglongrightarrow> Gamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1149
proof (rule Lim_transform_eventually)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1150
  have "1/2 > (0::real)" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1151
  from tendstoD[OF assms(2), OF this] show "eventually (\<lambda>n. g n * f n / f n = g n) sequentially"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  1152
    by (force elim!: eventually_mono simp: dist_real_def)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1153
  from assms have "(\<lambda>n. g n * f n / f n) \<longlonglongrightarrow> 1 / rGamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1154
    by (intro tendsto_divide assms) (simp_all add: rGamma_eq_zero_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1155
  thus "(\<lambda>n. g n * f n / f n) \<longlonglongrightarrow> Gamma z" by (simp add: Gamma_def divide_inverse)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1156
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1157
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1158
lemma Gamma_series'_LIMSEQ: "Gamma_series' z \<longlonglongrightarrow> Gamma z"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1159
  by (cases "z \<in> \<int>\<^sub>\<le>\<^sub>0") (simp_all add: Gamma_nonpos_Int Gamma_seriesI[OF Gamma_series_Gamma_series']
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1160
                                      Gamma_series'_nonpos_Ints_LIMSEQ[of z])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1161
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1162
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1163
subsection \<open>Differentiability\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1164
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1165
lemma has_field_derivative_rGamma_no_nonpos_int:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1166
  assumes "z \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1167
  shows   "(rGamma has_field_derivative -rGamma z * Digamma z) (at z within A)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1168
proof (rule has_field_derivative_at_within)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1169
  from assms have "z \<noteq> - of_nat n" for n by auto
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1170
  from differentiable_rGamma_aux1[OF this]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1171
    show "(rGamma has_field_derivative -rGamma z * Digamma z) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1172
         unfolding Digamma_def suminf_def sums_def[abs_def]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1173
                   has_field_derivative_def has_derivative_def netlimit_at
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1174
    by (simp add: Let_def bounded_linear_mult_right mult_ac of_real_def [symmetric])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1175
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1176
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1177
lemma has_field_derivative_rGamma_nonpos_int:
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1178
  "(rGamma has_field_derivative (-1)^n * fact n) (at (- of_nat n) within A)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1179
  apply (rule has_field_derivative_at_within)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1180
  using differentiable_rGamma_aux2[of n]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1181
  unfolding Let_def has_field_derivative_def has_derivative_def netlimit_at
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  1182
  by (simp only: bounded_linear_mult_right mult_ac of_real_def [symmetric] fact_prod) simp
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1183
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1184
lemma has_field_derivative_rGamma [derivative_intros]:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1185
  "(rGamma has_field_derivative (if z \<in> \<int>\<^sub>\<le>\<^sub>0 then (-1)^(nat \<lfloor>norm z\<rfloor>) * fact (nat \<lfloor>norm z\<rfloor>)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1186
      else -rGamma z * Digamma z)) (at z within A)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1187
using has_field_derivative_rGamma_no_nonpos_int[of z A]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1188
      has_field_derivative_rGamma_nonpos_int[of "nat \<lfloor>norm z\<rfloor>" A]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1189
  by (auto elim!: nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1190
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1191
declare has_field_derivative_rGamma_no_nonpos_int [THEN DERIV_chain2, derivative_intros]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1192
declare has_field_derivative_rGamma [THEN DERIV_chain2, derivative_intros]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1193
declare has_field_derivative_rGamma_nonpos_int [derivative_intros]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1194
declare has_field_derivative_rGamma_no_nonpos_int [derivative_intros]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1195
declare has_field_derivative_rGamma [derivative_intros]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1196
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  1197
theorem has_field_derivative_Gamma [derivative_intros]:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1198
  "z \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> (Gamma has_field_derivative Gamma z * Digamma z) (at z within A)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1199
  unfolding Gamma_def [abs_def]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1200
  by (fastforce intro!: derivative_eq_intros simp: rGamma_eq_zero_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1201
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1202
declare has_field_derivative_Gamma[THEN DERIV_chain2, derivative_intros]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1203
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1204
(* TODO: Hide ugly facts properly *)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1205
hide_fact rGamma_eq_zero_iff_aux differentiable_rGamma_aux1 differentiable_rGamma_aux2
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1206
          differentiable_rGamma_aux2 rGamma_series_aux Gamma_class.rGamma_eq_zero_iff_aux
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1207
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1208
lemma continuous_on_rGamma [continuous_intros]: "continuous_on A rGamma"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1209
  by (rule DERIV_continuous_on has_field_derivative_rGamma)+
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1210
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1211
lemma continuous_on_Gamma [continuous_intros]: "A \<inter> \<int>\<^sub>\<le>\<^sub>0 = {} \<Longrightarrow> continuous_on A Gamma"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1212
  by (rule DERIV_continuous_on has_field_derivative_Gamma)+ blast
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1213
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1214
lemma isCont_rGamma [continuous_intros]:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1215
  "isCont f z \<Longrightarrow> isCont (\<lambda>x. rGamma (f x)) z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1216
  by (rule isCont_o2[OF _  DERIV_isCont[OF has_field_derivative_rGamma]])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1217
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1218
lemma isCont_Gamma [continuous_intros]:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1219
  "isCont f z \<Longrightarrow> f z \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> isCont (\<lambda>x. Gamma (f x)) z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1220
  by (rule isCont_o2[OF _  DERIV_isCont[OF has_field_derivative_Gamma]])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1221
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
  1222
subsection\<^marker>\<open>tag unimportant\<close> \<open>The complex Gamma function\<close>
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
  1223
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
  1224
instantiation\<^marker>\<open>tag unimportant\<close> complex :: Gamma
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1225
begin
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1226
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
  1227
definition\<^marker>\<open>tag unimportant\<close> rGamma_complex :: "complex \<Rightarrow> complex" where
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1228
  "rGamma_complex z = lim (rGamma_series z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1229
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1230
lemma rGamma_series_complex_converges:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1231
        "convergent (rGamma_series (z :: complex))" (is "?thesis1")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1232
  and rGamma_complex_altdef:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1233
        "rGamma z = (if z \<in> \<int>\<^sub>\<le>\<^sub>0 then 0 else exp (-ln_Gamma z))" (is "?thesis2")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1234
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1235
  have "?thesis1 \<and> ?thesis2"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1236
  proof (cases "z \<in> \<int>\<^sub>\<le>\<^sub>0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1237
    case False
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1238
    have "rGamma_series z \<longlonglongrightarrow> exp (- ln_Gamma z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1239
    proof (rule Lim_transform_eventually)
74362
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1240
      from ln_Gamma_series_complex_converges'[OF False]
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1241
      obtain d where "0 < d" "uniformly_convergent_on (ball z d) (\<lambda>n z. ln_Gamma_series z n)"
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1242
        by auto
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1243
      from this(1) uniformly_convergent_imp_convergent[OF this(2), of z]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1244
        have "ln_Gamma_series z \<longlonglongrightarrow> lim (ln_Gamma_series z)" by (simp add: convergent_LIMSEQ_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1245
      thus "(\<lambda>n. exp (-ln_Gamma_series z n)) \<longlonglongrightarrow> exp (- ln_Gamma z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1246
        unfolding convergent_def ln_Gamma_def by (intro tendsto_exp tendsto_minus)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1247
      from eventually_gt_at_top[of "0::nat"] exp_ln_Gamma_series_complex False
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1248
        show "eventually (\<lambda>n. exp (-ln_Gamma_series z n) = rGamma_series z n) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1249
        by (force elim!: eventually_mono simp: exp_minus Gamma_series_def rGamma_series_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1250
    qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1251
    with False show ?thesis
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1252
      by (auto simp: convergent_def rGamma_complex_def intro!: limI)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1253
  next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1254
    case True
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1255
    then obtain k where "z = - of_nat k" by (erule nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1256
    also have "rGamma_series \<dots> \<longlonglongrightarrow> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1257
      by (subst tendsto_cong[OF rGamma_series_minus_of_nat]) (simp_all add: convergent_const)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1258
    finally show ?thesis using True
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1259
      by (auto simp: rGamma_complex_def convergent_def intro!: limI)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1260
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1261
  thus "?thesis1" "?thesis2" by blast+
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1262
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1263
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
  1264
context\<^marker>\<open>tag unimportant\<close>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1265
begin
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1266
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1267
(* TODO: duplication *)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1268
private lemma rGamma_complex_plus1: "z * rGamma (z + 1) = rGamma (z :: complex)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1269
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1270
  let ?f = "\<lambda>n. (z + 1) * inverse (of_nat n) + 1"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1271
  have "eventually (\<lambda>n. ?f n * rGamma_series z n = z * rGamma_series (z + 1) n) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1272
    using eventually_gt_at_top[of "0::nat"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1273
  proof eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1274
    fix n :: nat assume n: "n > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1275
    hence "z * rGamma_series (z + 1) n = inverse (of_nat n) *
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1276
             pochhammer z (Suc (Suc n)) / (fact n * exp (z * of_real (ln (of_nat n))))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1277
      by (subst pochhammer_rec) (simp add: rGamma_series_def field_simps exp_add exp_of_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1278
    also from n have "\<dots> = ?f n * rGamma_series z n"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  1279
      by (subst pochhammer_rec') (simp_all add: field_split_simps rGamma_series_def add_ac)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1280
    finally show "?f n * rGamma_series z n = z * rGamma_series (z + 1) n" ..
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1281
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1282
  moreover have "(\<lambda>n. ?f n * rGamma_series z n) \<longlonglongrightarrow> ((z+1) * 0 + 1) * rGamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1283
    using rGamma_series_complex_converges
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1284
    by (intro tendsto_intros lim_inverse_n)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1285
       (simp_all add: convergent_LIMSEQ_iff rGamma_complex_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1286
  hence "(\<lambda>n. ?f n * rGamma_series z n) \<longlonglongrightarrow> rGamma z" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1287
  ultimately have "(\<lambda>n. z * rGamma_series (z + 1) n) \<longlonglongrightarrow> rGamma z"
70532
fcf3b891ccb1 new material; rotated premises of Lim_transform_eventually
paulson <lp15@cam.ac.uk>
parents: 70196
diff changeset
  1288
    by (blast intro: Lim_transform_eventually)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1289
  moreover have "(\<lambda>n. z * rGamma_series (z + 1) n) \<longlonglongrightarrow> z * rGamma (z + 1)"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1290
    using rGamma_series_complex_converges
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1291
    by (auto intro!: tendsto_mult simp: rGamma_complex_def convergent_LIMSEQ_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1292
  ultimately show "z * rGamma (z + 1) = rGamma z" using LIMSEQ_unique by blast
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1293
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1294
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1295
private lemma has_field_derivative_rGamma_complex_no_nonpos_Int:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1296
  assumes "(z :: complex) \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1297
  shows   "(rGamma has_field_derivative - rGamma z * Digamma z) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1298
proof -
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1299
  have diff: "(rGamma has_field_derivative - rGamma z * Digamma z) (at z)" if "Re z > 0" for z
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1300
  proof (subst DERIV_cong_ev[OF refl _ refl])
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1301
    from that have "eventually (\<lambda>t. t \<in> ball z (Re z/2)) (nhds z)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1302
      by (intro eventually_nhds_in_nhd) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1303
    thus "eventually (\<lambda>t. rGamma t = exp (- ln_Gamma t)) (nhds z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1304
      using no_nonpos_Int_in_ball_complex[OF that]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1305
      by (auto elim!: eventually_mono simp: rGamma_complex_altdef)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1306
  next
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1307
    have "z \<notin> \<real>\<^sub>\<le>\<^sub>0" using that by (simp add: complex_nonpos_Reals_iff)
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1308
    with that show "((\<lambda>t. exp (- ln_Gamma t)) has_field_derivative (-rGamma z * Digamma z)) (at z)"
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1309
     by (force elim!: nonpos_Ints_cases intro!: derivative_eq_intros simp: rGamma_complex_altdef)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1310
  qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1311
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1312
  from assms show "(rGamma has_field_derivative - rGamma z * Digamma z) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1313
  proof (induction "nat \<lfloor>1 - Re z\<rfloor>" arbitrary: z)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1314
    case (Suc n z)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1315
    from Suc.prems have z: "z \<noteq> 0" by auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1316
    from Suc.hyps have "n = nat \<lfloor>- Re z\<rfloor>" by linarith
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1317
    hence A: "n = nat \<lfloor>1 - Re (z + 1)\<rfloor>" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1318
    from Suc.prems have B: "z + 1 \<notin> \<int>\<^sub>\<le>\<^sub>0" by (force dest: plus_one_in_nonpos_Ints_imp)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1319
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1320
    have "((\<lambda>z. z * (rGamma \<circ> (\<lambda>z. z + 1)) z) has_field_derivative
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1321
      -rGamma (z + 1) * (Digamma (z + 1) * z - 1)) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1322
      by (rule derivative_eq_intros DERIV_chain Suc refl A B)+ (simp add: algebra_simps)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1323
    also have "(\<lambda>z. z * (rGamma \<circ> (\<lambda>z. z + 1 :: complex)) z) = rGamma"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1324
      by (simp add: rGamma_complex_plus1)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1325
    also from z have "Digamma (z + 1) * z - 1 = z * Digamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1326
      by (subst Digamma_plus1) (simp_all add: field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1327
    also have "-rGamma (z + 1) * (z * Digamma z) = -rGamma z * Digamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1328
      by (simp add: rGamma_complex_plus1[of z, symmetric])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1329
    finally show ?case .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1330
  qed (intro diff, simp)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1331
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1332
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1333
private lemma rGamma_complex_1: "rGamma (1 :: complex) = 1"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1334
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1335
  have A: "eventually (\<lambda>n. rGamma_series 1 n = of_nat (Suc n) / of_nat n) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1336
    using eventually_gt_at_top[of "0::nat"]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1337
    by (force elim!: eventually_mono simp: rGamma_series_def exp_of_real pochhammer_fact
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  1338
                    field_split_simps pochhammer_rec' dest!: pochhammer_eq_0_imp_nonpos_Int)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1339
  have "rGamma_series 1 \<longlonglongrightarrow> 1" by (subst tendsto_cong[OF A]) (rule LIMSEQ_Suc_n_over_n)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1340
  thus "rGamma 1 = (1 :: complex)" unfolding rGamma_complex_def by (rule limI)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1341
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1342
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1343
private lemma has_field_derivative_rGamma_complex_nonpos_Int:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1344
  "(rGamma has_field_derivative (-1)^n * fact n) (at (- of_nat n :: complex))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1345
proof (induction n)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1346
  case 0
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1347
  have A: "(0::complex) + 1 \<notin> \<int>\<^sub>\<le>\<^sub>0" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1348
  have "((\<lambda>z. z * (rGamma \<circ> (\<lambda>z. z + 1 :: complex)) z) has_field_derivative 1) (at 0)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1349
    by (rule derivative_eq_intros DERIV_chain refl
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1350
             has_field_derivative_rGamma_complex_no_nonpos_Int A)+ (simp add: rGamma_complex_1)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1351
    thus ?case by (simp add: rGamma_complex_plus1)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1352
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1353
  case (Suc n)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1354
  hence A: "(rGamma has_field_derivative (-1)^n * fact n)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1355
                (at (- of_nat (Suc n) + 1 :: complex))" by simp
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1356
   have "((\<lambda>z. z * (rGamma \<circ> (\<lambda>z. z + 1 :: complex)) z) has_field_derivative
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1357
             (- 1) ^ Suc n * fact (Suc n)) (at (- of_nat (Suc n)))"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1358
     by (rule derivative_eq_intros refl A DERIV_chain)+
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1359
        (simp add: algebra_simps rGamma_complex_altdef)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1360
  thus ?case by (simp add: rGamma_complex_plus1)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1361
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1362
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1363
instance proof
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1364
  fix z :: complex show "(rGamma z = 0) \<longleftrightarrow> (\<exists>n. z = - of_nat n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1365
    by (auto simp: rGamma_complex_altdef elim!: nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1366
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1367
  fix z :: complex assume "\<And>n. z \<noteq> - of_nat n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1368
  hence "z \<notin> \<int>\<^sub>\<le>\<^sub>0" by (auto elim!: nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1369
  from has_field_derivative_rGamma_complex_no_nonpos_Int[OF this]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1370
    show "let d = (THE d. (\<lambda>n. \<Sum>k<n. inverse (of_nat (Suc k)) - inverse (z + of_nat k))
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1371
                       \<longlonglongrightarrow> d) - euler_mascheroni *\<^sub>R 1 in  (\<lambda>y. (rGamma y - rGamma z +
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1372
              rGamma z * d * (y - z)) /\<^sub>R  cmod (y - z)) \<midarrow>z\<rightarrow> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1373
      by (simp add: has_field_derivative_def has_derivative_def Digamma_def sums_def [abs_def]
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  1374
                    of_real_def[symmetric] suminf_def)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1375
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1376
  fix n :: nat
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1377
  from has_field_derivative_rGamma_complex_nonpos_Int[of n]
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  1378
  show "let z = - of_nat n in (\<lambda>y. (rGamma y - rGamma z - (- 1) ^ n * prod of_nat {1..n} *
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1379
                  (y - z)) /\<^sub>R cmod (y - z)) \<midarrow>z\<rightarrow> 0"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  1380
    by (simp add: has_field_derivative_def has_derivative_def fact_prod Let_def)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1381
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1382
  fix z :: complex
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1383
  from rGamma_series_complex_converges[of z] have "rGamma_series z \<longlonglongrightarrow> rGamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1384
    by (simp add: convergent_LIMSEQ_iff rGamma_complex_def)
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  1385
  thus "let fact' = \<lambda>n. prod of_nat {1..n};
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1386
            exp = \<lambda>x. THE e. (\<lambda>n. \<Sum>k<n. x ^ k /\<^sub>R fact k) \<longlonglongrightarrow> e;
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1387
            pochhammer' = \<lambda>a n. \<Prod>n = 0..n. a + of_nat n
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1388
        in  (\<lambda>n. pochhammer' z n / (fact' n * exp (z * ln (real_of_nat n) *\<^sub>R 1))) \<longlonglongrightarrow> rGamma z"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  1389
    by (simp add: fact_prod pochhammer_Suc_prod rGamma_series_def [abs_def] exp_def
63367
6c731c8b7f03 simplified definitions of combinatorial functions
haftmann
parents: 63317
diff changeset
  1390
                  of_real_def [symmetric] suminf_def sums_def [abs_def] atLeast0AtMost)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1391
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1392
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1393
end
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1394
end
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1395
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1396
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1397
lemma Gamma_complex_altdef:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1398
  "Gamma z = (if z \<in> \<int>\<^sub>\<le>\<^sub>0 then 0 else exp (ln_Gamma (z :: complex)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1399
  unfolding Gamma_def rGamma_complex_altdef by (simp add: exp_minus)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1400
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1401
lemma cnj_rGamma: "cnj (rGamma z) = rGamma (cnj z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1402
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1403
  have "rGamma_series (cnj z) = (\<lambda>n. cnj (rGamma_series z n))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1404
    by (intro ext) (simp_all add: rGamma_series_def exp_cnj)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1405
  also have "... \<longlonglongrightarrow> cnj (rGamma z)" by (intro tendsto_cnj tendsto_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1406
  finally show ?thesis unfolding rGamma_complex_def by (intro sym[OF limI])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1407
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1408
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1409
lemma cnj_Gamma: "cnj (Gamma z) = Gamma (cnj z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1410
  unfolding Gamma_def by (simp add: cnj_rGamma)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1411
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1412
lemma Gamma_complex_real:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1413
  "z \<in> \<real> \<Longrightarrow> Gamma z \<in> (\<real> :: complex set)" and rGamma_complex_real: "z \<in> \<real> \<Longrightarrow> rGamma z \<in> \<real>"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1414
  by (simp_all add: Reals_cnj_iff cnj_Gamma cnj_rGamma)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1415
62534
6855b348e828 complex_differentiable -> field_differentiable, etc. (making these theorems also available for type real)
paulson <lp15@cam.ac.uk>
parents: 62533
diff changeset
  1416
lemma field_differentiable_rGamma: "rGamma field_differentiable (at z within A)"
6855b348e828 complex_differentiable -> field_differentiable, etc. (making these theorems also available for type real)
paulson <lp15@cam.ac.uk>
parents: 62533
diff changeset
  1417
  using has_field_derivative_rGamma[of z] unfolding field_differentiable_def by blast
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1418
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1419
lemma holomorphic_rGamma [holomorphic_intros]: "rGamma holomorphic_on A"
62534
6855b348e828 complex_differentiable -> field_differentiable, etc. (making these theorems also available for type real)
paulson <lp15@cam.ac.uk>
parents: 62533
diff changeset
  1420
  unfolding holomorphic_on_def by (auto intro!: field_differentiable_rGamma)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1421
68721
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1422
lemma holomorphic_rGamma' [holomorphic_intros]: 
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1423
  assumes "f holomorphic_on A"
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1424
  shows   "(\<lambda>x. rGamma (f x)) holomorphic_on A"
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1425
proof -
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1426
  have "rGamma \<circ> f holomorphic_on A" using assms
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1427
    by (intro holomorphic_on_compose assms holomorphic_rGamma)
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1428
  thus ?thesis by (simp only: o_def)
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1429
qed
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1430
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1431
lemma analytic_rGamma: "rGamma analytic_on A"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1432
  unfolding analytic_on_def by (auto intro!: exI[of _ 1] holomorphic_rGamma)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1433
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1434
62534
6855b348e828 complex_differentiable -> field_differentiable, etc. (making these theorems also available for type real)
paulson <lp15@cam.ac.uk>
parents: 62533
diff changeset
  1435
lemma field_differentiable_Gamma: "z \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> Gamma field_differentiable (at z within A)"
6855b348e828 complex_differentiable -> field_differentiable, etc. (making these theorems also available for type real)
paulson <lp15@cam.ac.uk>
parents: 62533
diff changeset
  1436
  using has_field_derivative_Gamma[of z] unfolding field_differentiable_def by auto
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1437
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1438
lemma holomorphic_Gamma [holomorphic_intros]: "A \<inter> \<int>\<^sub>\<le>\<^sub>0 = {} \<Longrightarrow> Gamma holomorphic_on A"
62534
6855b348e828 complex_differentiable -> field_differentiable, etc. (making these theorems also available for type real)
paulson <lp15@cam.ac.uk>
parents: 62533
diff changeset
  1439
  unfolding holomorphic_on_def by (auto intro!: field_differentiable_Gamma)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1440
68721
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1441
lemma holomorphic_Gamma' [holomorphic_intros]: 
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1442
  assumes "f holomorphic_on A" and "\<And>x. x \<in> A \<Longrightarrow> f x \<notin> \<int>\<^sub>\<le>\<^sub>0"
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1443
  shows   "(\<lambda>x. Gamma (f x)) holomorphic_on A"
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1444
proof -
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1445
  have "Gamma \<circ> f holomorphic_on A" using assms
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1446
    by (intro holomorphic_on_compose assms holomorphic_Gamma) auto
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1447
  thus ?thesis by (simp only: o_def)
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1448
qed
53ad5c01be3f Small lemmas about analysis
eberlm <eberlm@in.tum.de>
parents: 68624
diff changeset
  1449
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1450
lemma analytic_Gamma: "A \<inter> \<int>\<^sub>\<le>\<^sub>0 = {} \<Longrightarrow> Gamma analytic_on A"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1451
  by (rule analytic_on_subset[of _ "UNIV - \<int>\<^sub>\<le>\<^sub>0"], subst analytic_on_open)
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1452
     (auto intro!: holomorphic_Gamma)
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1453
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1454
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1455
lemma field_differentiable_ln_Gamma_complex:
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1456
  "z \<notin> \<real>\<^sub>\<le>\<^sub>0 \<Longrightarrow> ln_Gamma field_differentiable (at (z::complex) within A)"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1457
  by (rule field_differentiable_within_subset[of _ _ UNIV])
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1458
     (force simp: field_differentiable_def intro!: derivative_intros)+
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1459
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1460
lemma holomorphic_ln_Gamma [holomorphic_intros]: "A \<inter> \<real>\<^sub>\<le>\<^sub>0 = {} \<Longrightarrow> ln_Gamma holomorphic_on A"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1461
  unfolding holomorphic_on_def by (auto intro!: field_differentiable_ln_Gamma_complex)
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1462
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1463
lemma analytic_ln_Gamma: "A \<inter> \<real>\<^sub>\<le>\<^sub>0 = {} \<Longrightarrow> ln_Gamma analytic_on A"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1464
  by (rule analytic_on_subset[of _ "UNIV - \<real>\<^sub>\<le>\<^sub>0"], subst analytic_on_open)
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1465
     (auto intro!: holomorphic_ln_Gamma)
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1466
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1467
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1468
lemma has_field_derivative_rGamma_complex' [derivative_intros]:
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1469
  "(rGamma has_field_derivative (if z \<in> \<int>\<^sub>\<le>\<^sub>0 then (-1)^(nat \<lfloor>-Re z\<rfloor>) * fact (nat \<lfloor>-Re z\<rfloor>) else
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1470
        -rGamma z * Digamma z)) (at z within A)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1471
  using has_field_derivative_rGamma[of z] by (auto elim!: nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1472
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1473
declare has_field_derivative_rGamma_complex'[THEN DERIV_chain2, derivative_intros]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1474
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1475
62534
6855b348e828 complex_differentiable -> field_differentiable, etc. (making these theorems also available for type real)
paulson <lp15@cam.ac.uk>
parents: 62533
diff changeset
  1476
lemma field_differentiable_Polygamma:
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1477
  fixes z :: complex
62533
bc25f3916a99 new material to Blochj's theorem, as well as supporting lemmas
paulson <lp15@cam.ac.uk>
parents: 62398
diff changeset
  1478
  shows
62534
6855b348e828 complex_differentiable -> field_differentiable, etc. (making these theorems also available for type real)
paulson <lp15@cam.ac.uk>
parents: 62533
diff changeset
  1479
  "z \<notin> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> Polygamma n field_differentiable (at z within A)"
6855b348e828 complex_differentiable -> field_differentiable, etc. (making these theorems also available for type real)
paulson <lp15@cam.ac.uk>
parents: 62533
diff changeset
  1480
  using has_field_derivative_Polygamma[of z n] unfolding field_differentiable_def by auto
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1481
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1482
lemma holomorphic_on_Polygamma [holomorphic_intros]: "A \<inter> \<int>\<^sub>\<le>\<^sub>0 = {} \<Longrightarrow> Polygamma n holomorphic_on A"
62534
6855b348e828 complex_differentiable -> field_differentiable, etc. (making these theorems also available for type real)
paulson <lp15@cam.ac.uk>
parents: 62533
diff changeset
  1483
  unfolding holomorphic_on_def by (auto intro!: field_differentiable_Polygamma)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1484
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1485
lemma analytic_on_Polygamma: "A \<inter> \<int>\<^sub>\<le>\<^sub>0 = {} \<Longrightarrow> Polygamma n analytic_on A"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1486
  by (rule analytic_on_subset[of _ "UNIV - \<int>\<^sub>\<le>\<^sub>0"], subst analytic_on_open)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1487
     (auto intro!: holomorphic_on_Polygamma)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1488
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1489
79857
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1490
lemma analytic_on_rGamma [analytic_intros]: "f analytic_on A \<Longrightarrow> (\<lambda>w. rGamma (f w)) analytic_on A"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1491
  using analytic_on_compose[OF _ analytic_rGamma, of f A] by (simp add: o_def)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1492
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1493
lemma analytic_on_ln_Gamma [analytic_intros]:
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1494
  "f analytic_on A \<Longrightarrow> (\<And>z. z \<in> A \<Longrightarrow> f z \<notin> \<real>\<^sub>\<le>\<^sub>0) \<Longrightarrow> (\<lambda>w. ln_Gamma (f w)) analytic_on A"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1495
  by (rule analytic_on_compose[OF _ analytic_ln_Gamma, unfolded o_def]) (auto simp: o_def)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1496
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1497
lemma Polygamma_plus_of_nat:
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1498
  assumes "\<forall>k<m. z \<noteq> -of_nat k"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1499
  shows   "Polygamma n (z + of_nat m) =
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1500
             Polygamma n z + (-1) ^ n * fact n * (\<Sum>k<m. 1 / (z + of_nat k) ^ Suc n)"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1501
  using assms
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1502
proof (induction m)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1503
  case (Suc m)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1504
  have "Polygamma n (z + of_nat (Suc m)) = Polygamma n (z + of_nat m + 1)"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1505
    by (simp add: add_ac)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1506
  also have "\<dots> = Polygamma n (z + of_nat m) + (-1) ^ n * fact n * (1 / ((z + of_nat m) ^ Suc n))"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1507
    using Suc.prems by (subst Polygamma_plus1) (auto simp: add_eq_0_iff2)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1508
  also have "Polygamma n (z + of_nat m) =
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1509
               Polygamma n z + (-1) ^ n * (\<Sum>k<m. 1 / (z + of_nat k) ^ Suc n) * fact n"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1510
    using Suc.prems by (subst Suc.IH) auto
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1511
  finally show ?case
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1512
    by (simp add: algebra_simps)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1513
qed auto
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1514
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1515
lemma tendsto_Gamma [tendsto_intros]:
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1516
  assumes "(f \<longlongrightarrow> c) F" "c \<notin> \<int>\<^sub>\<le>\<^sub>0"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1517
  shows   "((\<lambda>z. Gamma (f z)) \<longlongrightarrow> Gamma c) F"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1518
  by (intro isCont_tendsto_compose[OF _ assms(1)] continuous_intros assms)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1519
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1520
lemma tendsto_Polygamma [tendsto_intros]:
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1521
  fixes f :: "_ \<Rightarrow> 'a :: {real_normed_field,euclidean_space}"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1522
  assumes "(f \<longlongrightarrow> c) F" "c \<notin> \<int>\<^sub>\<le>\<^sub>0"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1523
  shows   "((\<lambda>z. Polygamma n (f z)) \<longlongrightarrow> Polygamma n c) F"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1524
  by (intro isCont_tendsto_compose[OF _ assms(1)] continuous_intros assms)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1525
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1526
lemma analytic_on_Gamma' [analytic_intros]:
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1527
  assumes "f analytic_on A" "\<forall>x\<in>A. f x \<notin> \<int>\<^sub>\<le>\<^sub>0" 
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1528
  shows   "(\<lambda>z. Gamma (f z)) analytic_on A"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1529
  using analytic_on_compose_gen[OF assms(1) analytic_Gamma[of "f ` A"]] assms(2)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1530
  by (auto simp: o_def)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1531
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1532
lemma analytic_on_Polygamma' [analytic_intros]:
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1533
  assumes "f analytic_on A" "\<forall>x\<in>A. f x \<notin> \<int>\<^sub>\<le>\<^sub>0" 
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1534
  shows   "(\<lambda>z. Polygamma n (f z)) analytic_on A"
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1535
  using analytic_on_compose_gen[OF assms(1) analytic_on_Polygamma[of "f ` A" n]] assms(2)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1536
  by (auto simp: o_def)
819c28a7280f New material by Wenda Li and Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 74362
diff changeset
  1537
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1538
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
  1539
subsection\<^marker>\<open>tag unimportant\<close> \<open>The real Gamma function\<close>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1540
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1541
lemma rGamma_series_real:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1542
  "eventually (\<lambda>n. rGamma_series x n = Re (rGamma_series (of_real x) n)) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1543
  using eventually_gt_at_top[of "0 :: nat"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1544
proof eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1545
  fix n :: nat assume n: "n > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1546
  have "Re (rGamma_series (of_real x) n) =
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1547
          Re (of_real (pochhammer x (Suc n)) / (fact n * exp (of_real (x * ln (real_of_nat n)))))"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  1548
    using n by (simp add: rGamma_series_def powr_def pochhammer_of_real)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1549
  also from n have "\<dots> = Re (of_real ((pochhammer x (Suc n)) /
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1550
                              (fact n * (exp (x * ln (real_of_nat n))))))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1551
    by (subst exp_of_real) simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1552
  also from n have "\<dots> = rGamma_series x n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1553
    by (subst Re_complex_of_real) (simp add: rGamma_series_def powr_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1554
  finally show "rGamma_series x n = Re (rGamma_series (of_real x) n)" ..
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1555
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1556
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
  1557
instantiation\<^marker>\<open>tag unimportant\<close> real :: Gamma
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1558
begin
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1559
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1560
definition "rGamma_real x = Re (rGamma (of_real x :: complex))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1561
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1562
instance proof
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1563
  fix x :: real
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1564
  have "rGamma x = Re (rGamma (of_real x))" by (simp add: rGamma_real_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1565
  also have "of_real \<dots> = rGamma (of_real x :: complex)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1566
    by (intro of_real_Re rGamma_complex_real) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1567
  also have "\<dots> = 0 \<longleftrightarrow> x \<in> \<int>\<^sub>\<le>\<^sub>0" by (simp add: rGamma_eq_zero_iff of_real_in_nonpos_Ints_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1568
  also have "\<dots> \<longleftrightarrow> (\<exists>n. x = - of_nat n)" by (auto elim!: nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1569
  finally show "(rGamma x) = 0 \<longleftrightarrow> (\<exists>n. x = - real_of_nat n)" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1570
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1571
  fix x :: real assume "\<And>n. x \<noteq> - of_nat n"
63539
70d4d9e5707b tuned proofs -- avoid improper use of "this";
wenzelm
parents: 63417
diff changeset
  1572
  hence x: "complex_of_real x \<notin> \<int>\<^sub>\<le>\<^sub>0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1573
    by (subst of_real_in_nonpos_Ints_iff) (auto elim!: nonpos_Ints_cases')
63539
70d4d9e5707b tuned proofs -- avoid improper use of "this";
wenzelm
parents: 63417
diff changeset
  1574
  then have "x \<noteq> 0" by auto
70d4d9e5707b tuned proofs -- avoid improper use of "this";
wenzelm
parents: 63417
diff changeset
  1575
  with x have "(rGamma has_field_derivative - rGamma x * Digamma x) (at x)"
70707
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70532
diff changeset
  1576
    by (fastforce intro!: derivative_eq_intros has_vector_derivative_real_field
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1577
                  simp: Polygamma_of_real rGamma_real_def [abs_def])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1578
  thus "let d = (THE d. (\<lambda>n. \<Sum>k<n. inverse (of_nat (Suc k)) - inverse (x + of_nat k))
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1579
                       \<longlonglongrightarrow> d) - euler_mascheroni *\<^sub>R 1 in  (\<lambda>y. (rGamma y - rGamma x +
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1580
              rGamma x * d * (y - x)) /\<^sub>R  norm (y - x)) \<midarrow>x\<rightarrow> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1581
      by (simp add: has_field_derivative_def has_derivative_def Digamma_def sums_def [abs_def]
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  1582
                    of_real_def[symmetric] suminf_def)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1583
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1584
  fix n :: nat
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1585
  have "(rGamma has_field_derivative (-1)^n * fact n) (at (- of_nat n :: real))"
70707
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70532
diff changeset
  1586
    by (fastforce intro!: derivative_eq_intros has_vector_derivative_real_field
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1587
                  simp: Polygamma_of_real rGamma_real_def [abs_def])
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  1588
  thus "let x = - of_nat n in (\<lambda>y. (rGamma y - rGamma x - (- 1) ^ n * prod of_nat {1..n} *
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1589
                  (y - x)) /\<^sub>R norm (y - x)) \<midarrow>x::real\<rightarrow> 0"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  1590
    by (simp add: has_field_derivative_def has_derivative_def fact_prod Let_def)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1591
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1592
  fix x :: real
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1593
  have "rGamma_series x \<longlonglongrightarrow> rGamma x"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1594
  proof (rule Lim_transform_eventually)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1595
    show "(\<lambda>n. Re (rGamma_series (of_real x) n)) \<longlonglongrightarrow> rGamma x" unfolding rGamma_real_def
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1596
      by (intro tendsto_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1597
  qed (insert rGamma_series_real, simp add: eq_commute)
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  1598
  thus "let fact' = \<lambda>n. prod of_nat {1..n};
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1599
            exp = \<lambda>x. THE e. (\<lambda>n. \<Sum>k<n. x ^ k /\<^sub>R fact k) \<longlonglongrightarrow> e;
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1600
            pochhammer' = \<lambda>a n. \<Prod>n = 0..n. a + of_nat n
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1601
        in  (\<lambda>n. pochhammer' x n / (fact' n * exp (x * ln (real_of_nat n) *\<^sub>R 1))) \<longlonglongrightarrow> rGamma x"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  1602
    by (simp add: fact_prod pochhammer_Suc_prod rGamma_series_def [abs_def] exp_def
63367
6c731c8b7f03 simplified definitions of combinatorial functions
haftmann
parents: 63317
diff changeset
  1603
                  of_real_def [symmetric] suminf_def sums_def [abs_def] atLeast0AtMost)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1604
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1605
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1606
end
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1607
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1608
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1609
lemma rGamma_complex_of_real: "rGamma (complex_of_real x) = complex_of_real (rGamma x)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1610
  unfolding rGamma_real_def using rGamma_complex_real by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1611
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1612
lemma Gamma_complex_of_real: "Gamma (complex_of_real x) = complex_of_real (Gamma x)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1613
  unfolding Gamma_def by (simp add: rGamma_complex_of_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1614
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1615
lemma rGamma_real_altdef: "rGamma x = lim (rGamma_series (x :: real))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1616
  by (rule sym, rule limI, rule tendsto_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1617
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1618
lemma Gamma_real_altdef1: "Gamma x = lim (Gamma_series (x :: real))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1619
  by (rule sym, rule limI, rule tendsto_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1620
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1621
lemma Gamma_real_altdef2: "Gamma x = Re (Gamma (of_real x))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1622
  using rGamma_complex_real[OF Reals_of_real[of x]]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1623
  by (elim Reals_cases)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1624
     (simp only: Gamma_def rGamma_real_def of_real_inverse[symmetric] Re_complex_of_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1625
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1626
lemma ln_Gamma_series_complex_of_real:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1627
  "x > 0 \<Longrightarrow> n > 0 \<Longrightarrow> ln_Gamma_series (complex_of_real x) n = of_real (ln_Gamma_series x n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1628
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1629
  assume xn: "x > 0" "n > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1630
  have "Ln (complex_of_real x / of_nat k + 1) = of_real (ln (x / of_nat k + 1))" if "k \<ge> 1" for k
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1631
    using that xn by (subst Ln_of_real [symmetric]) (auto intro!: add_nonneg_pos simp: field_simps)
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  1632
  with xn show ?thesis by (simp add: ln_Gamma_series_def Ln_of_real)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1633
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1634
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1635
lemma ln_Gamma_real_converges:
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1636
  assumes "(x::real) > 0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1637
  shows   "convergent (ln_Gamma_series x)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1638
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1639
  have "(\<lambda>n. ln_Gamma_series (complex_of_real x) n) \<longlonglongrightarrow> ln_Gamma (of_real x)" using assms
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1640
    by (intro ln_Gamma_complex_LIMSEQ) (auto simp: of_real_in_nonpos_Ints_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1641
  moreover from eventually_gt_at_top[of "0::nat"]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1642
    have "eventually (\<lambda>n. complex_of_real (ln_Gamma_series x n) =
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1643
            ln_Gamma_series (complex_of_real x) n) sequentially"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1644
    by eventually_elim (simp add: ln_Gamma_series_complex_of_real assms)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1645
  ultimately have "(\<lambda>n. complex_of_real (ln_Gamma_series x n)) \<longlonglongrightarrow> ln_Gamma (of_real x)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1646
    by (subst tendsto_cong) assumption+
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1647
  from tendsto_Re[OF this] show ?thesis by (auto simp: convergent_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1648
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1649
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1650
lemma ln_Gamma_real_LIMSEQ: "(x::real) > 0 \<Longrightarrow> ln_Gamma_series x \<longlonglongrightarrow> ln_Gamma x"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1651
  using ln_Gamma_real_converges[of x] unfolding ln_Gamma_def by (simp add: convergent_LIMSEQ_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1652
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1653
lemma ln_Gamma_complex_of_real: "x > 0 \<Longrightarrow> ln_Gamma (complex_of_real x) = of_real (ln_Gamma x)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1654
proof (unfold ln_Gamma_def, rule limI, rule Lim_transform_eventually)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1655
  assume x: "x > 0"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1656
  show "eventually (\<lambda>n. of_real (ln_Gamma_series x n) =
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1657
            ln_Gamma_series (complex_of_real x) n) sequentially"
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1658
    using eventually_gt_at_top[of "0::nat"]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1659
    by eventually_elim (simp add: ln_Gamma_series_complex_of_real x)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1660
qed (intro tendsto_of_real, insert ln_Gamma_real_LIMSEQ[of x], simp add: ln_Gamma_def)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1661
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1662
lemma Gamma_real_pos_exp: "x > (0 :: real) \<Longrightarrow> Gamma x = exp (ln_Gamma x)"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1663
  by (auto simp: Gamma_real_altdef2 Gamma_complex_altdef of_real_in_nonpos_Ints_iff
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1664
                 ln_Gamma_complex_of_real exp_of_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1665
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1666
lemma ln_Gamma_real_pos: "x > 0 \<Longrightarrow> ln_Gamma x = ln (Gamma x :: real)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1667
  unfolding Gamma_real_pos_exp by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1668
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1669
lemma ln_Gamma_complex_conv_fact: "n > 0 \<Longrightarrow> ln_Gamma (of_nat n :: complex) = ln (fact (n - 1))"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1670
  using ln_Gamma_complex_of_real[of "real n"] Gamma_fact[of "n - 1", where 'a = real]
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1671
  by (simp add: ln_Gamma_real_pos of_nat_diff Ln_of_real [symmetric])
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1672
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1673
lemma ln_Gamma_real_conv_fact: "n > 0 \<Longrightarrow> ln_Gamma (real n) = ln (fact (n - 1))"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1674
  using Gamma_fact[of "n - 1", where 'a = real]
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1675
  by (simp add: ln_Gamma_real_pos of_nat_diff Ln_of_real [symmetric])
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1676
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  1677
lemma Gamma_real_pos [simp, intro]: "x > (0::real) \<Longrightarrow> Gamma x > 0"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  1678
  by (simp add: Gamma_real_pos_exp)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  1679
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  1680
lemma Gamma_real_nonneg [simp, intro]: "x > (0::real) \<Longrightarrow> Gamma x \<ge> 0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1681
  by (simp add: Gamma_real_pos_exp)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1682
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1683
lemma has_field_derivative_ln_Gamma_real [derivative_intros]:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1684
  assumes x: "x > (0::real)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1685
  shows "(ln_Gamma has_field_derivative Digamma x) (at x)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1686
proof (subst DERIV_cong_ev[OF refl _ refl])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1687
  from assms show "((Re \<circ> ln_Gamma \<circ> complex_of_real) has_field_derivative Digamma x) (at x)"
70707
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70532
diff changeset
  1688
    by (auto intro!: derivative_eq_intros has_vector_derivative_real_field
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1689
             simp: Polygamma_of_real o_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1690
  from eventually_nhds_in_nhd[of x "{0<..}"] assms
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1691
    show "eventually (\<lambda>y. ln_Gamma y = (Re \<circ> ln_Gamma \<circ> of_real) y) (nhds x)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1692
    by (auto elim!: eventually_mono simp: ln_Gamma_complex_of_real interior_open)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1693
qed
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1694
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1695
lemma field_differentiable_ln_Gamma_real:
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1696
  "x > 0 \<Longrightarrow> ln_Gamma field_differentiable (at (x::real) within A)"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1697
  by (rule field_differentiable_within_subset[of _ _ UNIV])
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1698
     (auto simp: field_differentiable_def intro!: derivative_intros)+
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1699
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1700
declare has_field_derivative_ln_Gamma_real[THEN DERIV_chain2, derivative_intros]
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1701
64969
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1702
lemma deriv_ln_Gamma_real:
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1703
  assumes "z > 0"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1704
  shows   "deriv ln_Gamma z = Digamma (z :: real)"
a6953714799d Simplified Gamma_Function
eberlm <eberlm@in.tum.de>
parents: 64272
diff changeset
  1705
  by (intro DERIV_imp_deriv has_field_derivative_ln_Gamma_real assms)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1706
73928
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1707
lemma higher_deriv_ln_Gamma_real:
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1708
  assumes "(x::real) > 0"
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1709
  shows   "(deriv ^^ j) ln_Gamma x = (if j = 0 then ln_Gamma x else Polygamma (j - 1) x)"
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1710
proof (cases j)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1711
  case (Suc j')
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1712
  have "(deriv ^^ j') (deriv ln_Gamma) x = (deriv ^^ j') Digamma x"
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1713
    using eventually_nhds_in_open[of "{0<..}" x] assms
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1714
    by (intro higher_deriv_cong_ev refl)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1715
       (auto elim!: eventually_mono simp: open_Diff deriv_ln_Gamma_real)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1716
  also have "\<dots> = Polygamma j' x" using assms
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1717
    by (subst higher_deriv_Polygamma)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1718
       (auto elim!: nonpos_Ints_cases simp: complex_nonpos_Reals_iff)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1719
  finally show ?thesis using Suc by (simp del: funpow.simps add: funpow_Suc_right)
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1720
qed simp_all
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1721
  
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1722
lemma higher_deriv_ln_Gamma_complex_of_real:
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1723
  assumes "(x :: real) > 0"
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1724
  shows   "(deriv ^^ j) ln_Gamma (complex_of_real x) = of_real ((deriv ^^ j) ln_Gamma x)"
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1725
    using assms
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1726
    by (auto simp: higher_deriv_ln_Gamma_real higher_deriv_ln_Gamma_complex
3b76524f5a85 Imported lots of material from Stirling_Formula/Gamma_Asymptotics
paulson <lp15@cam.ac.uk>
parents: 73005
diff changeset
  1727
                   ln_Gamma_complex_of_real Polygamma_of_real)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1728
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1729
lemma has_field_derivative_rGamma_real' [derivative_intros]:
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1730
  "(rGamma has_field_derivative (if x \<in> \<int>\<^sub>\<le>\<^sub>0 then (-1)^(nat \<lfloor>-x\<rfloor>) * fact (nat \<lfloor>-x\<rfloor>) else
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1731
        -rGamma x * Digamma x)) (at x within A)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1732
  using has_field_derivative_rGamma[of x] by (force elim!: nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1733
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1734
declare has_field_derivative_rGamma_real'[THEN DERIV_chain2, derivative_intros]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1735
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1736
lemma Polygamma_real_odd_pos:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1737
  assumes "(x::real) \<notin> \<int>\<^sub>\<le>\<^sub>0" "odd n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1738
  shows   "Polygamma n x > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1739
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1740
  from assms have "x \<noteq> 0" by auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1741
  with assms show ?thesis
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1742
    unfolding Polygamma_def using Polygamma_converges'[of x "Suc n"]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1743
    by (auto simp: zero_less_power_eq simp del: power_Suc
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1744
             dest: plus_of_nat_eq_0_imp intro!: mult_pos_pos suminf_pos)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1745
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1746
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1747
lemma Polygamma_real_even_neg:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1748
  assumes "(x::real) > 0" "n > 0" "even n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1749
  shows   "Polygamma n x < 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1750
  using assms unfolding Polygamma_def using Polygamma_converges'[of x "Suc n"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1751
  by (auto intro!: mult_pos_pos suminf_pos)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1752
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1753
lemma Polygamma_real_strict_mono:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1754
  assumes "x > 0" "x < (y::real)" "even n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1755
  shows   "Polygamma n x < Polygamma n y"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1756
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1757
  have "\<exists>\<xi>. x < \<xi> \<and> \<xi> < y \<and> Polygamma n y - Polygamma n x = (y - x) * Polygamma (Suc n) \<xi>"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1758
    using assms by (intro MVT2 derivative_intros impI allI) (auto elim!: nonpos_Ints_cases)
74362
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1759
  then obtain \<xi>
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1760
    where \<xi>: "x < \<xi>" "\<xi> < y"
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1761
      and Polygamma: "Polygamma n y - Polygamma n x = (y - x) * Polygamma (Suc n) \<xi>"
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1762
    by auto
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1763
  note Polygamma
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1764
  also from \<xi> assms have "(y - x) * Polygamma (Suc n) \<xi> > 0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1765
    by (intro mult_pos_pos Polygamma_real_odd_pos) (auto elim!: nonpos_Ints_cases)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1766
  finally show ?thesis by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1767
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1768
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1769
lemma Polygamma_real_strict_antimono:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1770
  assumes "x > 0" "x < (y::real)" "odd n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1771
  shows   "Polygamma n x > Polygamma n y"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1772
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1773
  have "\<exists>\<xi>. x < \<xi> \<and> \<xi> < y \<and> Polygamma n y - Polygamma n x = (y - x) * Polygamma (Suc n) \<xi>"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1774
    using assms by (intro MVT2 derivative_intros impI allI) (auto elim!: nonpos_Ints_cases)
74362
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1775
  then obtain \<xi>
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1776
    where \<xi>: "x < \<xi>" "\<xi> < y"
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1777
      and Polygamma: "Polygamma n y - Polygamma n x = (y - x) * Polygamma (Suc n) \<xi>"
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1778
    by auto
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1779
  note Polygamma
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1780
  also from \<xi> assms have "(y - x) * Polygamma (Suc n) \<xi> < 0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1781
    by (intro mult_pos_neg Polygamma_real_even_neg) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1782
  finally show ?thesis by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1783
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1784
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1785
lemma Polygamma_real_mono:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1786
  assumes "x > 0" "x \<le> (y::real)" "even n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1787
  shows   "Polygamma n x \<le> Polygamma n y"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1788
  using Polygamma_real_strict_mono[OF assms(1) _ assms(3), of y] assms(2)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1789
  by (cases "x = y") simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1790
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  1791
lemma Digamma_real_strict_mono: "(0::real) < x \<Longrightarrow> x < y \<Longrightarrow> Digamma x < Digamma y"
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  1792
  by (rule Polygamma_real_strict_mono) simp_all
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  1793
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  1794
lemma Digamma_real_mono: "(0::real) < x \<Longrightarrow> x \<le> y \<Longrightarrow> Digamma x \<le> Digamma y"
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  1795
  by (rule Polygamma_real_mono) simp_all
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  1796
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1797
lemma Digamma_real_ge_three_halves_pos:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1798
  assumes "x \<ge> 3/2"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1799
  shows   "Digamma (x :: real) > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1800
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1801
  have "0 < Digamma (3/2 :: real)" by (fact Digamma_real_three_halves_pos)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1802
  also from assms have "\<dots> \<le> Digamma x" by (intro Polygamma_real_mono) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1803
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1804
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1805
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1806
lemma ln_Gamma_real_strict_mono:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1807
  assumes "x \<ge> 3/2" "x < y"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1808
  shows   "ln_Gamma (x :: real) < ln_Gamma y"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1809
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1810
  have "\<exists>\<xi>. x < \<xi> \<and> \<xi> < y \<and> ln_Gamma y - ln_Gamma x = (y - x) * Digamma \<xi>"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1811
    using assms by (intro MVT2 derivative_intros impI allI) (auto elim!: nonpos_Ints_cases)
74362
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1812
  then obtain \<xi> where \<xi>: "x < \<xi>" "\<xi> < y"
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1813
    and ln_Gamma: "ln_Gamma y - ln_Gamma x = (y - x) * Digamma \<xi>"
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1814
    by auto
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1815
  note ln_Gamma
0135a0c77b64 tuned proofs --- avoid 'guess';
wenzelm
parents: 73928
diff changeset
  1816
  also from \<xi> assms have "(y - x) * Digamma \<xi> > 0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1817
    by (intro mult_pos_pos Digamma_real_ge_three_halves_pos) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1818
  finally show ?thesis by simp
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1819
qed
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1820
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1821
lemma Gamma_real_strict_mono:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1822
  assumes "x \<ge> 3/2" "x < y"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1823
  shows   "Gamma (x :: real) < Gamma y"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1824
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1825
  from Gamma_real_pos_exp[of x] assms have "Gamma x = exp (ln_Gamma x)" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1826
  also have "\<dots> < exp (ln_Gamma y)" by (intro exp_less_mono ln_Gamma_real_strict_mono assms)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1827
  also from Gamma_real_pos_exp[of y] assms have "\<dots> = Gamma y" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1828
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1829
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1830
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  1831
theorem log_convex_Gamma_real: "convex_on {0<..} (ln \<circ> Gamma :: real \<Rightarrow> real)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1832
  by (rule convex_on_realI[of _ _ Digamma])
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  1833
     (auto intro!: derivative_eq_intros Polygamma_real_mono Gamma_real_pos
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1834
           simp: o_def Gamma_eq_zero_iff elim!: nonpos_Ints_cases')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1835
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1836
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1837
subsection \<open>The uniqueness of the real Gamma function\<close>
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1838
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1839
text \<open>
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1840
  The following is a proof of the Bohr--Mollerup theorem, which states that
69566
c41954ee87cf more antiquotations -- less LaTeX macros;
wenzelm
parents: 69529
diff changeset
  1841
  any log-convex function \<open>G\<close> on the positive reals that fulfils \<open>G(1) = 1\<close> and
c41954ee87cf more antiquotations -- less LaTeX macros;
wenzelm
parents: 69529
diff changeset
  1842
  satisfies the functional equation \<open>G(x + 1) = x G(x)\<close> must be equal to the
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1843
  Gamma function.
69566
c41954ee87cf more antiquotations -- less LaTeX macros;
wenzelm
parents: 69529
diff changeset
  1844
  In principle, if \<open>G\<close> is a holomorphic complex function, one could then extend
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1845
  this from the positive reals to the entire complex plane (minus the non-positive
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1846
  integers, where the Gamma function is not defined).
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1847
\<close>
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1848
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
  1849
context\<^marker>\<open>tag unimportant\<close>
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1850
  fixes G :: "real \<Rightarrow> real"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1851
  assumes G_1: "G 1 = 1"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1852
  assumes G_plus1: "x > 0 \<Longrightarrow> G (x + 1) = x * G x"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1853
  assumes G_pos: "x > 0 \<Longrightarrow> G x > 0"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1854
  assumes log_convex_G: "convex_on {0<..} (ln \<circ> G)"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1855
begin
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1856
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1857
private lemma G_fact: "G (of_nat n + 1) = fact n"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1858
  using G_plus1[of "real n + 1" for n]
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1859
  by (induction n) (simp_all add: G_1 G_plus1)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1860
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1861
private definition S :: "real \<Rightarrow> real \<Rightarrow> real" where
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1862
  "S x y = (ln (G y) - ln (G x)) / (y - x)"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1863
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1864
private lemma S_eq:
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1865
  "n \<ge> 2 \<Longrightarrow> S (of_nat n) (of_nat n + x) = (ln (G (real n + x)) - ln (fact (n - 1))) / x"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1866
  by (subst G_fact [symmetric]) (simp add: S_def add_ac of_nat_diff)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1867
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1868
private lemma G_lower:
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1869
  assumes x: "x > 0" and n: "n \<ge> 1"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1870
  shows  "Gamma_series x n \<le> G x"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1871
proof -
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1872
  have "(ln \<circ> G) (real (Suc n)) \<le> ((ln \<circ> G) (real (Suc n) + x) -
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1873
          (ln \<circ> G) (real (Suc n) - 1)) / (real (Suc n) + x - (real (Suc n) - 1)) *
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1874
           (real (Suc n) - (real (Suc n) - 1)) + (ln \<circ> G) (real (Suc n) - 1)"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1875
    using x n by (intro convex_onD_Icc' convex_on_subset[OF log_convex_G]) auto
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1876
  hence "S (of_nat n) (of_nat (Suc n)) \<le> S (of_nat (Suc n)) (of_nat (Suc n) + x)"
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1877
    unfolding S_def using x by (simp add: field_simps)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1878
  also have "S (of_nat n) (of_nat (Suc n)) = ln (fact n) - ln (fact (n-1))"
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1879
    unfolding S_def using n
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1880
    by (subst (1 2) G_fact [symmetric]) (simp_all add: add_ac of_nat_diff)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1881
  also have "\<dots> = ln (fact n / fact (n-1))" by (subst ln_div) simp_all
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1882
  also from n have "fact n / fact (n - 1) = n" by (cases n) simp_all
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1883
  finally have "x * ln (real n) + ln (fact n) \<le> ln (G (real (Suc n) + x))"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1884
    using x n by (subst (asm) S_eq) (simp_all add: field_simps)
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1885
  also have "x * ln (real n) + ln (fact n) = ln (exp (x * ln (real n)) * fact n)"
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1886
    using x by (simp add: ln_mult)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1887
  finally have "exp (x * ln (real n)) * fact n \<le> G (real (Suc n) + x)" using x
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1888
    by (subst (asm) ln_le_cancel_iff) (simp_all add: G_pos)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1889
  also have "G (real (Suc n) + x) = pochhammer x (Suc n) * G x"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1890
    using G_plus1[of "real (Suc n) + x" for n] G_plus1[of x] x
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1891
    by (induction n) (simp_all add: pochhammer_Suc add_ac)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1892
  finally show "Gamma_series x n \<le> G x"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1893
    using x by (simp add: field_simps pochhammer_pos Gamma_series_def)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1894
qed
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1895
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1896
private lemma G_upper:
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1897
  assumes x: "x > 0" "x \<le> 1" and n: "n \<ge> 2"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1898
  shows  "G x \<le> Gamma_series x n * (1 + x / real n)"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1899
proof -
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1900
  have "(ln \<circ> G) (real n + x) \<le> ((ln \<circ> G) (real n + 1) -
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1901
          (ln \<circ> G) (real n)) / (real n + 1 - (real n)) *
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1902
           ((real n + x) - real n) + (ln \<circ> G) (real n)"
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1903
    using x n by (intro convex_onD_Icc' convex_on_subset[OF log_convex_G]) auto
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1904
  hence "S (of_nat n) (of_nat n + x) \<le> S (of_nat n) (of_nat n + 1)"
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1905
    unfolding S_def using x by (simp add: field_simps)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1906
  also from n have "S (of_nat n) (of_nat n + 1) = ln (fact n) - ln (fact (n-1))"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1907
    by (subst (1 2) G_fact [symmetric]) (simp add: S_def add_ac of_nat_diff)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1908
  also have "\<dots> = ln (fact n / (fact (n-1)))" using n by (subst ln_div) simp_all
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1909
  also from n have "fact n / fact (n - 1) = n" by (cases n) simp_all
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1910
  finally have "ln (G (real n + x)) \<le> x * ln (real n) + ln (fact (n - 1))"
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1911
    using x n by (subst (asm) S_eq) (simp_all add: field_simps)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1912
  also have "\<dots> = ln (exp (x * ln (real n)) * fact (n - 1))" using x
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1913
    by (simp add: ln_mult)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1914
  finally have "G (real n + x) \<le> exp (x * ln (real n)) * fact (n - 1)" using x
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1915
    by (subst (asm) ln_le_cancel_iff) (simp_all add: G_pos)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1916
  also have "G (real n + x) = pochhammer x n * G x"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1917
    using G_plus1[of "real n + x" for n] x
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1918
    by (induction n) (simp_all add: pochhammer_Suc add_ac)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1919
  finally have "G x \<le> exp (x * ln (real n)) * fact (n- 1) / pochhammer x n"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1920
    using x by (simp add: field_simps pochhammer_pos)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1921
  also from n have "fact (n - 1) = fact n / n" by (cases n) simp_all
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1922
  also have "exp (x * ln (real n)) * \<dots> / pochhammer x n =
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1923
               Gamma_series x n * (1 + x / real n)" using n x
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1924
    by (simp add: Gamma_series_def divide_simps pochhammer_Suc)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1925
  finally show ?thesis .
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1926
qed
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1927
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1928
private lemma G_eq_Gamma_aux:
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1929
  assumes x: "x > 0" "x \<le> 1"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1930
  shows   "G x = Gamma x"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1931
proof (rule antisym)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1932
  show "G x \<ge> Gamma x"
63952
354808e9f44b new material connected with HOL Light measure theory, plus more rationalisation
paulson <lp15@cam.ac.uk>
parents: 63918
diff changeset
  1933
  proof (rule tendsto_upperbound)
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1934
    from G_lower[of x] show "eventually (\<lambda>n. Gamma_series x n \<le> G x) sequentially"
65578
e4997c181cce New material from PNT proof, as well as more default [simp] declarations. Also removed duplicate theorems about geometric series
paulson <lp15@cam.ac.uk>
parents: 64969
diff changeset
  1935
      using  x by (auto intro: eventually_mono[OF eventually_ge_at_top[of "1::nat"]])
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1936
  qed (simp_all add: Gamma_series_LIMSEQ)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1937
next
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1938
  show "G x \<le> Gamma x"
63952
354808e9f44b new material connected with HOL Light measure theory, plus more rationalisation
paulson <lp15@cam.ac.uk>
parents: 63918
diff changeset
  1939
  proof (rule tendsto_lowerbound)
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1940
    have "(\<lambda>n. Gamma_series x n * (1 + x / real n)) \<longlonglongrightarrow> Gamma x * (1 + 0)"
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1941
      by (rule tendsto_intros real_tendsto_divide_at_top
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1942
               Gamma_series_LIMSEQ filterlim_real_sequentially)+
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1943
    thus "(\<lambda>n. Gamma_series x n * (1 + x / real n)) \<longlonglongrightarrow> Gamma x" by simp
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1944
  next
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1945
    from G_upper[of x] show "eventually (\<lambda>n. Gamma_series x n * (1 + x / real n) \<ge> G x) sequentially"
65578
e4997c181cce New material from PNT proof, as well as more default [simp] declarations. Also removed duplicate theorems about geometric series
paulson <lp15@cam.ac.uk>
parents: 64969
diff changeset
  1946
      using x by (auto intro: eventually_mono[OF eventually_ge_at_top[of "2::nat"]])
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1947
  qed simp_all
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1948
qed
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1949
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1950
theorem Gamma_pos_real_unique:
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1951
  assumes x: "x > 0"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1952
  shows   "G x = Gamma x"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1953
proof -
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1954
  have G_eq: "G (real n + x) = Gamma (real n + x)" if "x \<in> {0<..1}" for n x using that
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1955
  proof (induction n)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1956
    case (Suc n)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1957
    from Suc have "x + real n > 0" by simp
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1958
    hence "x + real n \<notin> \<int>\<^sub>\<le>\<^sub>0" by auto
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1959
    with Suc show ?case using G_plus1[of "real n + x"] Gamma_plus1[of "real n + x"]
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1960
      by (auto simp: add_ac)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1961
  qed (simp_all add: G_eq_Gamma_aux)
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  1962
63725
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1963
  show ?thesis
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1964
  proof (cases "frac x = 0")
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1965
    case True
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1966
    hence "x = of_int (floor x)" by (simp add: frac_def)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1967
    with x have x_eq: "x = of_nat (nat (floor x) - 1) + 1" by simp
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1968
    show ?thesis by (subst (1 2) x_eq, rule G_eq) simp_all
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1969
  next
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1970
    case False
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1971
    from assms have x_eq: "x = of_nat (nat (floor x)) + frac x"
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1972
      by (simp add: frac_def)
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1973
    have frac_le_1: "frac x \<le> 1" unfolding frac_def by linarith
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1974
    show ?thesis
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1975
      by (subst (1 2) x_eq, rule G_eq, insert False frac_le_1) simp_all
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1976
  qed
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1977
qed
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1978
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1979
end
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1980
4c00ba1ad11a Bohr-Mollerup theorem for the Gamma function
Manuel Eberl <eberlm@in.tum.de>
parents: 63721
diff changeset
  1981
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  1982
subsection \<open>The Beta function\<close>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1983
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1984
definition Beta where "Beta a b = Gamma a * Gamma b / Gamma (a + b)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1985
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1986
lemma Beta_altdef: "Beta a b = Gamma a * Gamma b * rGamma (a + b)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1987
  by (simp add: inverse_eq_divide Beta_def Gamma_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1988
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1989
lemma Beta_commute: "Beta a b = Beta b a"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1990
  unfolding Beta_def by (simp add: ac_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  1991
83346
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  1992
lemma holomorphic_Beta [holomorphic_intros]:
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  1993
  assumes "f holomorphic_on A" "g holomorphic_on A"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  1994
  assumes "\<And>z. z \<in> A \<Longrightarrow> f z \<notin> \<int>\<^sub>\<le>\<^sub>0" "\<And>z. z \<in> A \<Longrightarrow> g z \<notin> \<int>\<^sub>\<le>\<^sub>0"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  1995
  shows   "(\<lambda>z. Beta (f z) (g z)) holomorphic_on A"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  1996
  unfolding Beta_altdef by (intro holomorphic_intros assms)
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  1997
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  1998
lemma analytic_Beta [analytic_intros]:
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  1999
  assumes "f analytic_on A" "g analytic_on A"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  2000
  assumes "\<And>z. z \<in> A \<Longrightarrow> f z \<notin> \<int>\<^sub>\<le>\<^sub>0" "\<And>z. z \<in> A \<Longrightarrow> g z \<notin> \<int>\<^sub>\<le>\<^sub>0"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  2001
  shows   "(\<lambda>z. Beta (f z) (g z)) analytic_on A"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  2002
  unfolding Beta_altdef by (intro analytic_intros assms) (use assms in auto)
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  2003
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2004
lemma has_field_derivative_Beta1 [derivative_intros]:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2005
  assumes "x \<notin> \<int>\<^sub>\<le>\<^sub>0" "x + y \<notin> \<int>\<^sub>\<le>\<^sub>0"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2006
  shows   "((\<lambda>x. Beta x y) has_field_derivative (Beta x y * (Digamma x - Digamma (x + y))))
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2007
               (at x within A)" unfolding Beta_altdef
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2008
  by (rule DERIV_cong, (rule derivative_intros assms)+) (simp add: algebra_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2009
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2010
lemma Beta_pole1: "x \<in> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> Beta x y = 0"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2011
  by (auto simp add: Beta_def elim!: nonpos_Ints_cases')
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2012
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2013
lemma Beta_pole2: "y \<in> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> Beta x y = 0"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2014
  by (auto simp add: Beta_def elim!: nonpos_Ints_cases')
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
  2015
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2016
lemma Beta_zero: "x + y \<in> \<int>\<^sub>\<le>\<^sub>0 \<Longrightarrow> Beta x y = 0"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2017
  by (auto simp add: Beta_def elim!: nonpos_Ints_cases')
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
  2018
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2019
lemma has_field_derivative_Beta2 [derivative_intros]:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2020
  assumes "y \<notin> \<int>\<^sub>\<le>\<^sub>0" "x + y \<notin> \<int>\<^sub>\<le>\<^sub>0"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2021
  shows   "((\<lambda>y. Beta x y) has_field_derivative (Beta x y * (Digamma y - Digamma (x + y))))
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2022
               (at y within A)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2023
  using has_field_derivative_Beta1[of y x A] assms by (simp add: Beta_commute add_ac)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2024
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  2025
theorem Beta_plus1_plus1:
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2026
  assumes "x \<notin> \<int>\<^sub>\<le>\<^sub>0" "y \<notin> \<int>\<^sub>\<le>\<^sub>0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2027
  shows   "Beta (x + 1) y + Beta x (y + 1) = Beta x y"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2028
proof -
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2029
  have "Beta (x + 1) y + Beta x (y + 1) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2030
            (Gamma (x + 1) * Gamma y + Gamma x * Gamma (y + 1)) * rGamma ((x + y) + 1)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2031
    by (simp add: Beta_altdef add_divide_distrib algebra_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2032
  also have "\<dots> = (Gamma x * Gamma y) * ((x + y) * rGamma ((x + y) + 1))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2033
    by (subst assms[THEN Gamma_plus1])+ (simp add: algebra_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2034
  also from assms have "\<dots> = Beta x y" unfolding Beta_altdef by (subst rGamma_plus1) simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2035
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2036
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2037
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  2038
theorem Beta_plus1_left:
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2039
  assumes "x \<notin> \<int>\<^sub>\<le>\<^sub>0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2040
  shows   "(x + y) * Beta (x + 1) y = x * Beta x y"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2041
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2042
  have "(x + y) * Beta (x + 1) y = Gamma (x + 1) * Gamma y * ((x + y) * rGamma ((x + y) + 1))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2043
    unfolding Beta_altdef by (simp only: ac_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2044
  also have "\<dots> = x * Beta x y" unfolding Beta_altdef
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2045
     by (subst assms[THEN Gamma_plus1] rGamma_plus1)+ (simp only: ac_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2046
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2047
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2048
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  2049
theorem Beta_plus1_right:
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2050
  assumes "y \<notin> \<int>\<^sub>\<le>\<^sub>0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2051
  shows   "(x + y) * Beta x (y + 1) = y * Beta x y"
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2052
  using Beta_plus1_left[of y x] assms by (simp_all add: Beta_commute add.commute)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2053
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2054
lemma Gamma_Gamma_Beta:
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2055
  assumes "x + y \<notin> \<int>\<^sub>\<le>\<^sub>0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2056
  shows   "Gamma x * Gamma y = Beta x y * Gamma (x + y)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2057
  unfolding Beta_altdef using assms Gamma_eq_zero_iff[of "x+y"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2058
  by (simp add: rGamma_inverse_Gamma)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2059
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2060
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2061
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2062
subsection \<open>Legendre duplication theorem\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2063
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2064
context
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2065
begin
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2066
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2067
private lemma Gamma_legendre_duplication_aux:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2068
  fixes z :: "'a :: Gamma"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2069
  assumes "z \<notin> \<int>\<^sub>\<le>\<^sub>0" "z + 1/2 \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2070
  shows "Gamma z * Gamma (z + 1/2) = exp ((1 - 2*z) * of_real (ln 2)) * Gamma (1/2) * Gamma (2*z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2071
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2072
  let ?powr = "\<lambda>b a. exp (a * of_real (ln (of_nat b)))"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2073
  let ?h = "\<lambda>n. (fact (n-1))\<^sup>2 / fact (2*n-1) * of_nat (2^(2*n)) *
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2074
                exp (1/2 * of_real (ln (real_of_nat n)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2075
  {
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2076
    fix z :: 'a assume z: "z \<notin> \<int>\<^sub>\<le>\<^sub>0" "z + 1/2 \<notin> \<int>\<^sub>\<le>\<^sub>0"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2077
    let ?g = "\<lambda>n. ?powr 2 (2*z) * Gamma_series' z n * Gamma_series' (z + 1/2) n /
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2078
                      Gamma_series' (2*z) (2*n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2079
    have "eventually (\<lambda>n. ?g n = ?h n) sequentially" using eventually_gt_at_top
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2080
    proof eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2081
      fix n :: nat assume n: "n > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2082
      let ?f = "fact (n - 1) :: 'a" and ?f' = "fact (2*n - 1) :: 'a"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2083
      have A: "exp t * exp t = exp (2*t :: 'a)" for t by (subst exp_add [symmetric]) simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2084
      have A: "Gamma_series' z n * Gamma_series' (z + 1/2) n = ?f^2 * ?powr n (2*z + 1/2) /
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2085
                (pochhammer z n * pochhammer (z + 1/2) n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2086
        by (simp add: Gamma_series'_def exp_add ring_distribs power2_eq_square A mult_ac)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2087
      have B: "Gamma_series' (2*z) (2*n) =
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2088
                       ?f' * ?powr 2 (2*z) * ?powr n (2*z) /
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2089
                       (of_nat (2^(2*n)) * pochhammer z n * pochhammer (z+1/2) n)" using n
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2090
        by (simp add: Gamma_series'_def ln_mult exp_add ring_distribs pochhammer_double)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2091
      from z have "pochhammer z n \<noteq> 0" by (auto dest: pochhammer_eq_0_imp_nonpos_Int)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2092
      moreover from z have "pochhammer (z + 1/2) n \<noteq> 0" by (auto dest: pochhammer_eq_0_imp_nonpos_Int)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2093
      ultimately have "?powr 2 (2*z) * (Gamma_series' z n * Gamma_series' (z + 1/2) n) / Gamma_series' (2*z) (2*n) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2094
         ?f^2 / ?f' * of_nat (2^(2*n)) * (?powr n ((4*z + 1)/2) * ?powr n (-2*z))"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  2095
        using n unfolding A B by (simp add: field_split_simps exp_minus)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2096
      also have "?powr n ((4*z + 1)/2) * ?powr n (-2*z) = ?powr n (1/2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2097
        by (simp add: algebra_simps exp_add[symmetric] add_divide_distrib)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2098
      finally show "?g n = ?h n" by (simp only: mult_ac)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2099
    qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2100
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2101
    moreover from z double_in_nonpos_Ints_imp[of z] have "2 * z \<notin> \<int>\<^sub>\<le>\<^sub>0" by auto
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2102
    hence "?g \<longlonglongrightarrow> ?powr 2 (2*z) * Gamma z * Gamma (z+1/2) / Gamma (2*z)"
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 68721
diff changeset
  2103
      using LIMSEQ_subseq_LIMSEQ[OF Gamma_series'_LIMSEQ, of "(*)2" "2*z"]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2104
      by (intro tendsto_intros Gamma_series'_LIMSEQ)
66447
a1f5c5c26fa6 Replaced subseq with strict_mono
eberlm <eberlm@in.tum.de>
parents: 66286
diff changeset
  2105
         (simp_all add: o_def strict_mono_def Gamma_eq_zero_iff)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2106
    ultimately have "?h \<longlonglongrightarrow> ?powr 2 (2*z) * Gamma z * Gamma (z+1/2) / Gamma (2*z)"
70532
fcf3b891ccb1 new material; rotated premises of Lim_transform_eventually
paulson <lp15@cam.ac.uk>
parents: 70196
diff changeset
  2107
      by (blast intro: Lim_transform_eventually)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2108
  } note lim = this
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2109
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2110
  from assms double_in_nonpos_Ints_imp[of z] have z': "2 * z \<notin> \<int>\<^sub>\<le>\<^sub>0" by auto
82519
2886a76359f3 removed duplicate lemmas
Manuel Eberl <manuel@pruvisto.org>
parents: 82518
diff changeset
  2111
  from fraction_not_in_Ints[of 2 1] have "(1/2 :: 'a) \<notin> \<int>\<^sub>\<le>\<^sub>0"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2112
    by (intro not_in_Ints_imp_not_in_nonpos_Ints) simp_all
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  2113
  with lim[of "1/2 :: 'a"] have "?h \<longlonglongrightarrow> 2 * Gamma (1/2 :: 'a)" by (simp add: exp_of_real)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2114
  from LIMSEQ_unique[OF this lim[OF assms]] z' show ?thesis
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2115
    by (simp add: field_split_simps Gamma_eq_zero_iff ring_distribs exp_diff exp_of_real)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2116
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2117
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2118
text \<open>
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2119
  The following lemma is somewhat annoying. With a little bit of complex analysis
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2120
  (Cauchy's integral theorem, to be exact), this would be completely trivial. However,
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2121
  we want to avoid depending on the complex analysis session at this point, so we prove it
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2122
  the hard way.
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2123
\<close>
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2124
private lemma Gamma_reflection_aux:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2125
  defines "h \<equiv> \<lambda>z::complex. if z \<in> \<int> then 0 else
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2126
                 (of_real pi * cot (of_real pi*z) + Digamma z - Digamma (1 - z))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2127
  defines "a \<equiv> complex_of_real pi"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2128
  obtains h' where "continuous_on UNIV h'" "\<And>z. (h has_field_derivative (h' z)) (at z)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2129
proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2130
  define f where "f n = a * of_real (cos_coeff (n+1) - sin_coeff (n+2))" for n
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2131
  define F where "F z = (if z = 0 then 0 else (cos (a*z) - sin (a*z)/(a*z)) / z)" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2132
  define g where "g n = complex_of_real (sin_coeff (n+1))" for n
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2133
  define G where "G z = (if z = 0 then 1 else sin (a*z)/(a*z))" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2134
  have a_nz: "a \<noteq> 0" unfolding a_def by simp
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2135
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2136
  have "(\<lambda>n. f n * (a*z)^n) sums (F z) \<and> (\<lambda>n. g n * (a*z)^n) sums (G z)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2137
    if "abs (Re z) < 1" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2138
  proof (cases "z = 0"; rule conjI)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2139
    assume "z \<noteq> 0"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2140
    note z = this that
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2141
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2142
    from z have sin_nz: "sin (a*z) \<noteq> 0" unfolding a_def by (auto simp: sin_eq_0)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2143
    have "(\<lambda>n. of_real (sin_coeff n) * (a*z)^n) sums (sin (a*z))" using sin_converges[of "a*z"]
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2144
      by (simp add: scaleR_conv_of_real)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2145
    from sums_split_initial_segment[OF this, of 1]
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2146
      have "(\<lambda>n. (a*z) * of_real (sin_coeff (n+1)) * (a*z)^n) sums (sin (a*z))" by (simp add: mult_ac)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2147
    from sums_mult[OF this, of "inverse (a*z)"] z a_nz
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2148
      have A: "(\<lambda>n. g n * (a*z)^n) sums (sin (a*z)/(a*z))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2149
      by (simp add: field_simps g_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2150
    with z show "(\<lambda>n. g n * (a*z)^n) sums (G z)" by (simp add: G_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2151
    from A z a_nz sin_nz have g_nz: "(\<Sum>n. g n * (a*z)^n) \<noteq> 0" by (simp add: sums_iff g_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2152
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2153
    have [simp]: "sin_coeff (Suc 0) = 1" by (simp add: sin_coeff_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2154
    from sums_split_initial_segment[OF sums_diff[OF cos_converges[of "a*z"] A], of 1]
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2155
    have "(\<lambda>n. z * f n * (a*z)^n) sums (cos (a*z) - sin (a*z) / (a*z))"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2156
      by (simp add: mult_ac scaleR_conv_of_real ring_distribs f_def g_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2157
    from sums_mult[OF this, of "inverse z"] z assms
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2158
      show "(\<lambda>n. f n * (a*z)^n) sums (F z)" by (simp add: divide_simps mult_ac f_def F_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2159
  next
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2160
    assume z: "z = 0"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2161
    have "(\<lambda>n. f n * (a * z) ^ n) sums f 0" using powser_sums_zero[of f] z by simp
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2162
    with z show "(\<lambda>n. f n * (a * z) ^ n) sums (F z)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2163
      by (simp add: f_def F_def sin_coeff_def cos_coeff_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2164
    have "(\<lambda>n. g n * (a * z) ^ n) sums g 0" using powser_sums_zero[of g] z by simp
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2165
    with z show "(\<lambda>n. g n * (a * z) ^ n) sums (G z)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2166
      by (simp add: g_def G_def sin_coeff_def cos_coeff_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2167
  qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2168
  note sums = conjunct1[OF this] conjunct2[OF this]
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2169
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2170
  define h2 where [abs_def]:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2171
    "h2 z = (\<Sum>n. f n * (a*z)^n) / (\<Sum>n. g n * (a*z)^n) + Digamma (1 + z) - Digamma (1 - z)" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2172
  define POWSER where [abs_def]: "POWSER f z = (\<Sum>n. f n * (z^n :: complex))" for f z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2173
  define POWSER' where [abs_def]: "POWSER' f z = (\<Sum>n. diffs f n * (z^n))" for f and z :: complex
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2174
  define h2' where [abs_def]:
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2175
    "h2' z = a * (POWSER g (a*z) * POWSER' f (a*z) - POWSER f (a*z) * POWSER' g (a*z)) /
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2176
      (POWSER g (a*z))^2 + Polygamma 1 (1 + z) + Polygamma 1 (1 - z)" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2177
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2178
  have h_eq: "h t = h2 t" if "abs (Re t) < 1" for t
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2179
  proof -
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2180
    from that have t: "t \<in> \<int> \<longleftrightarrow> t = 0" by (auto elim!: Ints_cases)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2181
    hence "h t = a*cot (a*t) - 1/t + Digamma (1 + t) - Digamma (1 - t)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2182
      unfolding h_def using Digamma_plus1[of t] by (force simp: field_simps a_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2183
    also have "a*cot (a*t) - 1/t = (F t) / (G t)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2184
      using t by (auto simp add: divide_simps sin_eq_0 cot_def a_def F_def G_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2185
    also have "\<dots> = (\<Sum>n. f n * (a*t)^n) / (\<Sum>n. g n * (a*t)^n)"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2186
      using sums[of t] that by (simp add: sums_iff)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2187
    finally show "h t = h2 t" by (simp only: h2_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2188
  qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2190
  let ?A = "{z. abs (Re z) < 1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2191
  have "open ({z. Re z < 1} \<inter> {z. Re z > -1})"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2192
    using open_halfspace_Re_gt open_halfspace_Re_lt by auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2193
  also have "({z. Re z < 1} \<inter> {z. Re z > -1}) = {z. abs (Re z) < 1}" by auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2194
  finally have open_A: "open ?A" .
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2195
  hence [simp]: "interior ?A = ?A" by (simp add: interior_open)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2196
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2197
  have summable_f: "summable (\<lambda>n. f n * z^n)" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2198
    by (rule powser_inside, rule sums_summable, rule sums[of "\<i> * of_real (norm z + 1) / a"])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2199
       (simp_all add: norm_mult a_def del: of_real_add)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2200
  have summable_g: "summable (\<lambda>n. g n * z^n)" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2201
    by (rule powser_inside, rule sums_summable, rule sums[of "\<i> * of_real (norm z + 1) / a"])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2202
       (simp_all add: norm_mult a_def del: of_real_add)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2203
  have summable_fg': "summable (\<lambda>n. diffs f n * z^n)" "summable (\<lambda>n. diffs g n * z^n)" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2204
    by (intro termdiff_converges_all summable_f summable_g)+
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2205
  have "(POWSER f has_field_derivative (POWSER' f z)) (at z)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2206
               "(POWSER g has_field_derivative (POWSER' g z)) (at z)" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2207
    unfolding POWSER_def POWSER'_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2208
    by (intro termdiffs_strong_converges_everywhere summable_f summable_g)+
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2209
  note derivs = this[THEN DERIV_chain2[OF _ DERIV_cmult[OF DERIV_ident]], unfolded POWSER_def]
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2210
  have "isCont (POWSER f) z" "isCont (POWSER g) z" "isCont (POWSER' f) z" "isCont (POWSER' g) z"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2211
    for z unfolding POWSER_def POWSER'_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2212
    by (intro isCont_powser_converges_everywhere summable_f summable_g summable_fg')+
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2213
  note cont = this[THEN isCont_o2[rotated], unfolded POWSER_def POWSER'_def]
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2214
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2215
  {
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2216
    fix z :: complex assume z: "abs (Re z) < 1"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2217
    define d where "d = \<i> * of_real (norm z + 1)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2218
    have d: "abs (Re d) < 1" "norm z < norm d" by (simp_all add: d_def norm_mult del: of_real_add)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2219
    have "eventually (\<lambda>z. h z = h2 z) (nhds z)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2220
      using eventually_nhds_in_nhd[of z ?A] using h_eq z
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2221
      by (auto elim!: eventually_mono)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2222
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2223
    moreover from sums(2)[OF z] z have nz: "(\<Sum>n. g n * (a * z) ^ n) \<noteq> 0"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2224
      unfolding G_def by (auto simp: sums_iff sin_eq_0 a_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2225
    have A: "z \<in> \<int> \<longleftrightarrow> z = 0" using z by (auto elim!: Ints_cases)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2226
    have no_int: "1 + z \<in> \<int> \<longleftrightarrow> z = 0" using z Ints_diff[of "1+z" 1] A
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2227
      by (auto elim!: nonpos_Ints_cases)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2228
    have no_int': "1 - z \<in> \<int> \<longleftrightarrow> z = 0" using z Ints_diff[of 1 "1-z"] A
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2229
      by (auto elim!: nonpos_Ints_cases)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2230
    from no_int no_int' have no_int: "1 - z \<notin> \<int>\<^sub>\<le>\<^sub>0" "1 + z \<notin> \<int>\<^sub>\<le>\<^sub>0" by auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2231
    have "(h2 has_field_derivative h2' z) (at z)" unfolding h2_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2232
      by (rule DERIV_cong, (rule derivative_intros refl derivs[unfolded POWSER_def] nz no_int)+)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2233
         (auto simp: h2'_def POWSER_def field_simps power2_eq_square)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2234
    ultimately have deriv: "(h has_field_derivative h2' z) (at z)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2235
      by (subst DERIV_cong_ev[OF refl _ refl])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2236
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2237
    from sums(2)[OF z] z have "(\<Sum>n. g n * (a * z) ^ n) \<noteq> 0"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2238
      unfolding G_def by (auto simp: sums_iff a_def sin_eq_0)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2239
    hence "isCont h2' z" using no_int unfolding h2'_def[abs_def] POWSER_def POWSER'_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2240
      by (intro continuous_intros cont
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2241
            continuous_on_compose2[OF _ continuous_on_Polygamma[of "{z. Re z > 0}"]]) auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2242
    note deriv and this
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2243
  } note A = this
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2244
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2245
  interpret h: periodic_fun_simple' h
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2246
  proof
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2247
    fix z :: complex
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2248
    show "h (z + 1) = h z"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2249
    proof (cases "z \<in> \<int>")
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2250
      assume z: "z \<notin> \<int>"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2251
      hence A: "z + 1 \<notin> \<int>" "z \<noteq> 0" using Ints_diff[of "z+1" 1] by auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2252
      hence "Digamma (z + 1) - Digamma (-z) = Digamma z - Digamma (-z + 1)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2253
        by (subst (1 2) Digamma_plus1) simp_all
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2254
      with A z show "h (z + 1) = h z"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2255
        by (simp add: h_def sin_plus_pi cos_plus_pi ring_distribs cot_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2256
    qed (simp add: h_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2257
  qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2258
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2259
  have h2'_eq: "h2' (z - 1) = h2' z" if z: "Re z > 0" "Re z < 1" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2260
  proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2261
    have "((\<lambda>z. h (z - 1)) has_field_derivative h2' (z - 1)) (at z)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2262
      by (rule DERIV_cong, rule DERIV_chain'[OF _ A(1)])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2263
         (insert z, auto intro!: derivative_eq_intros)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2264
    hence "(h has_field_derivative h2' (z - 1)) (at z)" by (subst (asm) h.minus_1)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2265
    moreover from z have "(h has_field_derivative h2' z) (at z)" by (intro A) simp_all
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2266
    ultimately show "h2' (z - 1) = h2' z" by (rule DERIV_unique)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2267
  qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2268
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2269
  define h2'' where "h2'' z = h2' (z - of_int \<lfloor>Re z\<rfloor>)" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2270
  have deriv: "(h has_field_derivative h2'' z) (at z)" for z
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2271
  proof -
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2272
    fix z :: complex
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2273
    have B: "\<bar>Re z - real_of_int \<lfloor>Re z\<rfloor>\<bar> < 1" by linarith
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2274
    have "((\<lambda>t. h (t - of_int \<lfloor>Re z\<rfloor>)) has_field_derivative h2'' z) (at z)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2275
      unfolding h2''_def by (rule DERIV_cong, rule DERIV_chain'[OF _ A(1)])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2276
                            (insert B, auto intro!: derivative_intros)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2277
    thus "(h has_field_derivative h2'' z) (at z)" by (simp add: h.minus_of_int)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2278
  qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2279
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2280
  have cont: "continuous_on UNIV h2''"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2281
  proof (intro continuous_at_imp_continuous_on ballI)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2282
    fix z :: complex
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2283
    define r where "r = \<lfloor>Re z\<rfloor>"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2284
    define A where "A = {t. of_int r - 1 < Re t \<and> Re t < of_int r + 1}"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2285
    have "continuous_on A (\<lambda>t. h2' (t - of_int r))" unfolding A_def
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2286
      by (intro continuous_at_imp_continuous_on isCont_o2[OF _ A(2)] ballI continuous_intros)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2287
         (simp_all add: abs_real_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2288
    moreover have "h2'' t = h2' (t - of_int r)" if t: "t \<in> A" for t
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2289
    proof (cases "Re t \<ge> of_int r")
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2290
      case True
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2291
      from t have "of_int r - 1 < Re t" "Re t < of_int r + 1" by (simp_all add: A_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2292
      with True have "\<lfloor>Re t\<rfloor> = \<lfloor>Re z\<rfloor>" unfolding r_def by linarith
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2293
      thus ?thesis by (auto simp: r_def h2''_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2294
    next
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2295
      case False
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2296
      from t have t: "of_int r - 1 < Re t" "Re t < of_int r + 1" by (simp_all add: A_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2297
      with False have t': "\<lfloor>Re t\<rfloor> = \<lfloor>Re z\<rfloor> - 1" unfolding r_def by linarith
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2298
      moreover from t False have "h2' (t - of_int r + 1 - 1) = h2' (t - of_int r + 1)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2299
        by (intro h2'_eq) simp_all
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2300
      ultimately show ?thesis by (auto simp: r_def h2''_def algebra_simps t')
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2301
    qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2302
    ultimately have "continuous_on A h2''" by (subst continuous_on_cong[OF refl])
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2303
    moreover {
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2304
      have "open ({t. of_int r - 1 < Re t} \<inter> {t. of_int r + 1 > Re t})"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2305
        by (intro open_Int open_halfspace_Re_gt open_halfspace_Re_lt)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2306
      also have "{t. of_int r - 1 < Re t} \<inter> {t. of_int r + 1 > Re t} = A"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2307
        unfolding A_def by blast
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2308
      finally have "open A" .
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2309
    }
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2310
    ultimately have C: "isCont h2'' t" if "t \<in> A" for t using that
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2311
      by (subst (asm) continuous_on_eq_continuous_at) auto
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2312
    have "of_int r - 1 < Re z" "Re z  < of_int r + 1" unfolding r_def by linarith+
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2313
    thus "isCont h2'' z" by (intro C) (simp_all add: A_def)
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2314
  qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2315
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2316
  from that[OF cont deriv] show ?thesis .
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2317
qed
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2318
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2319
lemma Gamma_reflection_complex:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2320
  fixes z :: complex
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2321
  shows "Gamma z * Gamma (1 - z) = of_real pi / sin (of_real pi * z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2322
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2323
  let ?g = "\<lambda>z::complex. Gamma z * Gamma (1 - z) * sin (of_real pi * z)"
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
  2324
  define g where [abs_def]: "g z = (if z \<in> \<int> then of_real pi else ?g z)" for z :: complex
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2325
  let ?h = "\<lambda>z::complex. (of_real pi * cot (of_real pi*z) + Digamma z - Digamma (1 - z))"
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
  2326
  define h where [abs_def]: "h z = (if z \<in> \<int> then 0 else ?h z)" for z :: complex
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2327
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2328
  \<comment> \<open>@{term g} is periodic with period 1.\<close>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2329
  interpret g: periodic_fun_simple' g
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2330
  proof
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2331
    fix z :: complex
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2332
    show "g (z + 1) = g z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2333
    proof (cases "z \<in> \<int>")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2334
      case False
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2335
      hence "z * g z = z * Beta z (- z + 1) * sin (of_real pi * z)" by (simp add: g_def Beta_def)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2336
      also have "z * Beta z (- z + 1) = (z + 1 + -z) * Beta (z + 1) (- z + 1)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2337
        using False Ints_diff[of 1 "1 - z"] nonpos_Ints_subset_Ints
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2338
        by (subst Beta_plus1_left [symmetric]) auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2339
      also have "\<dots> * sin (of_real pi * z) = z * (Beta (z + 1) (-z) * sin (of_real pi * (z + 1)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2340
        using False Ints_diff[of "z+1" 1] Ints_minus[of "-z"] nonpos_Ints_subset_Ints
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2341
        by (subst Beta_plus1_right) (auto simp: ring_distribs sin_plus_pi)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2342
      also from False have "Beta (z + 1) (-z) * sin (of_real pi * (z + 1)) = g (z + 1)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2343
        using Ints_diff[of "z+1" 1] by (auto simp: g_def Beta_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2344
      finally show "g (z + 1) = g z" using False by (subst (asm) mult_left_cancel) auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2345
    qed (simp add: g_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2346
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2347
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2348
  \<comment> \<open>@{term g} is entire.\<close>
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2349
  have g_g': "(g has_field_derivative (h z * g z)) (at z)" for z :: complex
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2350
  proof (cases "z \<in> \<int>")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2351
    let ?h' = "\<lambda>z. Beta z (1 - z) * ((Digamma z - Digamma (1 - z)) * sin (z * of_real pi) +
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2352
                     of_real pi * cos (z * of_real pi))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2353
    case False
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2354
    from False have "eventually (\<lambda>t. t \<in> UNIV - \<int>) (nhds z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2355
      by (intro eventually_nhds_in_open) (auto simp: open_Diff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2356
    hence "eventually (\<lambda>t. g t = ?g t) (nhds z)" by eventually_elim (simp add: g_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2357
    moreover {
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2358
      from False Ints_diff[of 1 "1-z"] have "1 - z \<notin> \<int>" by auto
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2359
      hence "(?g has_field_derivative ?h' z) (at z)" using nonpos_Ints_subset_Ints
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2360
        by (auto intro!: derivative_eq_intros simp: algebra_simps Beta_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2361
      also from False have "sin (of_real pi * z) \<noteq> 0" by (subst sin_eq_0) auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2362
      hence "?h' z = h z * g z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2363
        using False unfolding g_def h_def cot_def by (simp add: field_simps Beta_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2364
      finally have "(?g has_field_derivative (h z * g z)) (at z)" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2365
    }
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2366
    ultimately show ?thesis by (subst DERIV_cong_ev[OF refl _ refl])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2367
  next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2368
    case True
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2369
    then obtain n where z: "z = of_int n" by (auto elim!: Ints_cases)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2370
    let ?t = "(\<lambda>z::complex. if z = 0 then 1 else sin z / z) \<circ> (\<lambda>z. of_real pi * z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2371
    have deriv_0: "(g has_field_derivative 0) (at 0)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2372
    proof (subst DERIV_cong_ev[OF refl _ refl])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2373
      show "eventually (\<lambda>z. g z = of_real pi * Gamma (1 + z) * Gamma (1 - z) * ?t z) (nhds 0)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2374
        using eventually_nhds_ball[OF zero_less_one, of "0::complex"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2375
      proof eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2376
        fix z :: complex assume z: "z \<in> ball 0 1"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2377
        show "g z = of_real pi * Gamma (1 + z) * Gamma (1 - z) * ?t z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2378
        proof (cases "z = 0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2379
          assume z': "z \<noteq> 0"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2380
          with z have z'': "z \<notin> \<int>\<^sub>\<le>\<^sub>0" "z \<notin> \<int>" by (auto elim!: Ints_cases)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2381
          from Gamma_plus1[OF this(1)] have "Gamma z = Gamma (z + 1) / z" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2382
          with z'' z' show ?thesis by (simp add: g_def ac_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2383
        qed (simp add: g_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2384
      qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2385
      have "(?t has_field_derivative (0 * of_real pi)) (at 0)"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2386
        using has_field_derivative_sin_z_over_z[of "UNIV :: complex set"]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2387
        by (intro DERIV_chain) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2388
      thus "((\<lambda>z. of_real pi * Gamma (1 + z) * Gamma (1 - z) * ?t z) has_field_derivative 0) (at 0)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2389
        by (auto intro!: derivative_eq_intros simp: o_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2390
    qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2391
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2392
    have "((g \<circ> (\<lambda>x. x - of_int n)) has_field_derivative 0 * 1) (at (of_int n))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2393
      using deriv_0 by (intro DERIV_chain) (auto intro!: derivative_eq_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2394
    also have "g \<circ> (\<lambda>x. x - of_int n) = g" by (intro ext) (simp add: g.minus_of_int)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2395
    finally show "(g has_field_derivative (h z * g z)) (at z)" by (simp add: z h_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2396
  qed
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  2397
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2398
  have g_eq: "g (z/2) * g ((z+1)/2) = Gamma (1/2)^2 * g z" if "Re z > -1" "Re z < 2" for z
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2399
  proof (cases "z \<in> \<int>")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2400
    case True
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2401
    with that have "z = 0 \<or> z = 1" by (force elim!: Ints_cases)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2402
    moreover have "g 0 * g (1/2) = Gamma (1/2)^2 * g 0"
82519
2886a76359f3 removed duplicate lemmas
Manuel Eberl <manuel@pruvisto.org>
parents: 82518
diff changeset
  2403
      using fraction_not_in_Ints[where 'a = complex, of 2 1] by (simp add: g_def power2_eq_square)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2404
    moreover have "g (1/2) * g 1 = Gamma (1/2)^2 * g 1"
82519
2886a76359f3 removed duplicate lemmas
Manuel Eberl <manuel@pruvisto.org>
parents: 82518
diff changeset
  2405
        using fraction_not_in_Ints[where 'a = complex, of 2 1]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2406
        by (simp add: g_def power2_eq_square Beta_def algebra_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2407
    ultimately show ?thesis by force
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2408
  next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2409
    case False
82518
da14e77a48b2 lots of lemmas for HOL, HOL-{Complex_}Analysis, HOL-Number_Theory
Manuel Eberl <manuel@pruvisto.org>
parents: 82459
diff changeset
  2410
    hence z: "z/2 \<notin> \<int> \<and> (z+1)/2 \<notin> \<int>"
da14e77a48b2 lots of lemmas for HOL, HOL-{Complex_}Analysis, HOL-Number_Theory
Manuel Eberl <manuel@pruvisto.org>
parents: 82459
diff changeset
  2411
      by (metis Ints_1 Ints_cases Ints_of_int add.commute
da14e77a48b2 lots of lemmas for HOL, HOL-{Complex_}Analysis, HOL-Number_Theory
Manuel Eberl <manuel@pruvisto.org>
parents: 82459
diff changeset
  2412
          add_in_Ints_iff_left divide_eq_eq_numeral1(1)
da14e77a48b2 lots of lemmas for HOL, HOL-{Complex_}Analysis, HOL-Number_Theory
Manuel Eberl <manuel@pruvisto.org>
parents: 82459
diff changeset
  2413
          of_int_mult one_add_one zero_neq_numeral)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2414
    hence z': "z/2 \<notin> \<int>\<^sub>\<le>\<^sub>0" "(z+1)/2 \<notin> \<int>\<^sub>\<le>\<^sub>0" by (auto elim!: nonpos_Ints_cases)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2415
    from z have "1-z/2 \<notin> \<int>" "1-((z+1)/2) \<notin> \<int>"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2416
      using Ints_diff[of 1 "1-z/2"] Ints_diff[of 1 "1-((z+1)/2)"] by auto
82518
da14e77a48b2 lots of lemmas for HOL, HOL-{Complex_}Analysis, HOL-Number_Theory
Manuel Eberl <manuel@pruvisto.org>
parents: 82459
diff changeset
  2417
    hence z'': "1-z/2 \<notin> \<int>\<^sub>\<le>\<^sub>0 \<and> 1-((z+1)/2) \<notin> \<int>\<^sub>\<le>\<^sub>0"
da14e77a48b2 lots of lemmas for HOL, HOL-{Complex_}Analysis, HOL-Number_Theory
Manuel Eberl <manuel@pruvisto.org>
parents: 82459
diff changeset
  2418
      by blast
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2419
    from z have "g (z/2) * g ((z+1)/2) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2420
      (Gamma (z/2) * Gamma ((z+1)/2)) * (Gamma (1-z/2) * Gamma (1-((z+1)/2))) *
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2421
      (sin (of_real pi * z/2) * sin (of_real pi * (z+1)/2))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2422
      by (simp add: g_def)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2423
    also from z' Gamma_legendre_duplication_aux[of "z/2"]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2424
      have "Gamma (z/2) * Gamma ((z+1)/2) = exp ((1-z) * of_real (ln 2)) * Gamma (1/2) * Gamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2425
      by (simp add: add_divide_distrib)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2426
    also from z'' Gamma_legendre_duplication_aux[of "1-(z+1)/2"]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2427
      have "Gamma (1-z/2) * Gamma (1-(z+1)/2) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2428
              Gamma (1-z) * Gamma (1/2) * exp (z * of_real (ln 2))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2429
      by (simp add: add_divide_distrib ac_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2430
    finally have "g (z/2) * g ((z+1)/2) = Gamma (1/2)^2 * (Gamma z * Gamma (1-z) *
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2431
                    (2 * (sin (of_real pi*z/2) * sin (of_real pi*(z+1)/2))))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2432
      by (simp add: add_ac power2_eq_square exp_add ring_distribs exp_diff exp_of_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2433
    also have "sin (of_real pi*(z+1)/2) = cos (of_real pi*z/2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2434
      using cos_sin_eq[of "- of_real pi * z/2", symmetric]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2435
      by (simp add: ring_distribs add_divide_distrib ac_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2436
    also have "2 * (sin (of_real pi*z/2) * cos (of_real pi*z/2)) = sin (of_real pi * z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2437
      by (subst sin_times_cos) (simp add: field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2438
    also have "Gamma z * Gamma (1 - z) * sin (complex_of_real pi * z) = g z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2439
      using \<open>z \<notin> \<int>\<close> by (simp add: g_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2440
    finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2441
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2442
  have g_eq: "g (z/2) * g ((z+1)/2) = Gamma (1/2)^2 * g z" for z
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2443
  proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
  2444
    define r where "r = \<lfloor>Re z / 2\<rfloor>"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2445
    have "Gamma (1/2)^2 * g z = Gamma (1/2)^2 * g (z - of_int (2*r))" by (simp only: g.minus_of_int)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2446
    also have "of_int (2*r) = 2 * of_int r" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2447
    also have "Re z - 2 * of_int r > -1" "Re z - 2 * of_int r < 2" unfolding r_def by linarith+
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2448
    hence "Gamma (1/2)^2 * g (z - 2 * of_int r) =
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2449
                   g ((z - 2 * of_int r)/2) * g ((z - 2 * of_int r + 1)/2)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2450
      unfolding r_def by (intro g_eq[symmetric]) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2451
    also have "(z - 2 * of_int r) / 2 = z/2 - of_int r" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2452
    also have "g \<dots> = g (z/2)" by (rule g.minus_of_int)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2453
    also have "(z - 2 * of_int r + 1) / 2 = (z + 1)/2 - of_int r" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2454
    also have "g \<dots> = g ((z+1)/2)" by (rule g.minus_of_int)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2455
    finally show ?thesis ..
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2456
  qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2457
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2458
  have g_nz [simp]: "g z \<noteq> 0" for z :: complex
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2459
  unfolding g_def using Ints_diff[of 1 "1 - z"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2460
    by (auto simp: Gamma_eq_zero_iff sin_eq_0 dest!: nonpos_Ints_Int)
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  2461
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2462
  have h_eq: "h z = (h (z/2) + h ((z+1)/2)) / 2" for z
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2463
  proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2464
    have "((\<lambda>t. g (t/2) * g ((t+1)/2)) has_field_derivative
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2465
                       (g (z/2) * g ((z+1)/2)) * ((h (z/2) + h ((z+1)/2)) / 2)) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2466
      by (auto intro!: derivative_eq_intros g_g'[THEN DERIV_chain2] simp: field_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2467
    hence "((\<lambda>t. Gamma (1/2)^2 * g t) has_field_derivative
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2468
              Gamma (1/2)^2 * g z * ((h (z/2) + h ((z+1)/2)) / 2)) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2469
      by (subst (1 2) g_eq[symmetric]) simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2470
    from DERIV_cmult[OF this, of "inverse ((Gamma (1/2))^2)"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2471
      have "(g has_field_derivative (g z * ((h (z/2) + h ((z+1)/2))/2))) (at z)"
82519
2886a76359f3 removed duplicate lemmas
Manuel Eberl <manuel@pruvisto.org>
parents: 82518
diff changeset
  2472
      using fraction_not_in_Ints[where 'a = complex, of 2 1]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2473
      by (simp add: divide_simps Gamma_eq_zero_iff not_in_Ints_imp_not_in_nonpos_Ints)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2474
    moreover have "(g has_field_derivative (g z * h z)) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2475
      using g_g'[of z] by (simp add: ac_simps)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2476
    ultimately have "g z * h z = g z * ((h (z/2) + h ((z+1)/2))/2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2477
      by (intro DERIV_unique)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2478
    thus "h z = (h (z/2) + h ((z+1)/2)) / 2" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2479
  qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2480
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2481
  obtain h' where h'_cont: "continuous_on UNIV h'" and
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2482
                  h_h': "\<And>z. (h has_field_derivative h' z) (at z)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2483
     unfolding h_def by (erule Gamma_reflection_aux)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2484
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2485
  have h'_eq: "h' z = (h' (z/2) + h' ((z+1)/2)) / 4" for z
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2486
  proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2487
    have "((\<lambda>t. (h (t/2) + h ((t+1)/2)) / 2) has_field_derivative
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2488
                       ((h' (z/2) + h' ((z+1)/2)) / 4)) (at z)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2489
      by (fastforce intro!: derivative_eq_intros h_h'[THEN DERIV_chain2])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2490
    hence "(h has_field_derivative ((h' (z/2) + h' ((z+1)/2))/4)) (at z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2491
      by (subst (asm) h_eq[symmetric])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2492
    from h_h' and this show "h' z = (h' (z/2) + h' ((z+1)/2)) / 4" by (rule DERIV_unique)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2493
  qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2494
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2495
  have h'_zero: "h' z = 0" for z
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2496
  proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
  2497
    define m where "m = max 1 \<bar>Re z\<bar>"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
  2498
    define B where "B = {t. abs (Re t) \<le> m \<and> abs (Im t) \<le> abs (Im z)}"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2499
    have "closed ({t. Re t \<ge> -m} \<inter> {t. Re t \<le> m} \<inter>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2500
                  {t. Im t \<ge> -\<bar>Im z\<bar>} \<inter> {t. Im t \<le> \<bar>Im z\<bar>})"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2501
      (is "closed ?B") by (intro closed_Int closed_halfspace_Re_ge closed_halfspace_Re_le
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2502
                                 closed_halfspace_Im_ge closed_halfspace_Im_le)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2503
    also have "?B = B" unfolding B_def by fastforce
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2504
    finally have "closed B" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2505
    moreover have "bounded B" unfolding bounded_iff
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2506
    proof (intro ballI exI)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2507
      fix t assume t: "t \<in> B"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2508
      have "norm t \<le> \<bar>Re t\<bar> + \<bar>Im t\<bar>" by (rule cmod_le)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2509
      also from t have "\<bar>Re t\<bar> \<le> m" unfolding B_def by blast
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2510
      also from t have "\<bar>Im t\<bar> \<le> \<bar>Im z\<bar>" unfolding B_def by blast
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2511
      finally show "norm t \<le> m + \<bar>Im z\<bar>" by - simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2512
    qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2513
    ultimately have compact: "compact B" by (subst compact_eq_bounded_closed) blast
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2514
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  2515
    define M where "M = (SUP z\<in>B. norm (h' z))"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2516
    have "compact (h' ` B)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2517
      by (intro compact_continuous_image continuous_on_subset[OF h'_cont] compact) blast+
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2518
    hence bdd: "bdd_above ((\<lambda>z. norm (h' z)) ` B)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2519
      using bdd_above_norm[of "h' ` B"] by (simp add: image_comp o_def compact_imp_bounded)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2520
    have "norm (h' z) \<le> M" unfolding M_def by (intro cSUP_upper bdd) (simp_all add: B_def m_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2521
    also have "M \<le> M/2"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2522
    proof (subst M_def, subst cSUP_le_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2523
      have "z \<in> B" unfolding B_def m_def by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2524
      thus "B \<noteq> {}" by auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2525
    next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2526
      show "\<forall>z\<in>B. norm (h' z) \<le> M/2"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2527
      proof
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2528
        fix t :: complex assume t: "t \<in> B"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2529
        from h'_eq[of t] t have "h' t = (h' (t/2) + h' ((t+1)/2)) / 4" by (simp)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2530
        also have "norm \<dots> = norm (h' (t/2) + h' ((t+1)/2)) / 4" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2531
        also have "norm (h' (t/2) + h' ((t+1)/2)) \<le> norm (h' (t/2)) + norm (h' ((t+1)/2))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2532
          by (rule norm_triangle_ineq)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2533
        also from t have "abs (Re ((t + 1)/2)) \<le> m" unfolding m_def B_def by auto
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2534
        with t have "t/2 \<in> B" "(t+1)/2 \<in> B" unfolding B_def by auto
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2535
        hence "norm (h' (t/2)) + norm (h' ((t+1)/2)) \<le> M + M" unfolding M_def
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2536
          by (intro add_mono cSUP_upper bdd) (auto simp: B_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2537
        also have "(M + M) / 4 = M / 2" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2538
        finally show "norm (h' t) \<le> M/2" by - simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2539
      qed
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2540
    qed (insert bdd, auto)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2541
    hence "M \<le> 0" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2542
    finally show "h' z = 0" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2543
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2544
  have h_h'_2: "(h has_field_derivative 0) (at z)" for z
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2545
    using h_h'[of z] h'_zero[of z] by simp
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2546
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2547
  have g_real: "g z \<in> \<real>" if "z \<in> \<real>" for z
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2548
    unfolding g_def using that by (auto intro!: Reals_mult Gamma_complex_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2549
  have h_real: "h z \<in> \<real>" if "z \<in> \<real>" for z
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2550
    unfolding h_def using that by (auto intro!: Reals_mult Reals_add Reals_diff Polygamma_Real)
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2551
  have g_nz: "g z \<noteq> 0" for z unfolding g_def using Ints_diff[of 1 "1-z"]
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2552
    by (auto simp: Gamma_eq_zero_iff sin_eq_0)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2553
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2554
  from h'_zero h_h'_2 have "\<exists>c. \<forall>z\<in>UNIV. h z = c"
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2555
    by (intro has_field_derivative_zero_constant) (simp_all add: dist_0_norm)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2556
  then obtain c where c: "\<And>z. h z = c" by auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2557
  have "\<exists>u. u \<in> closed_segment 0 1 \<and> Re (g 1) - Re (g 0) = Re (h u * g u * (1 - 0))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2558
    by (intro complex_mvt_line g_g')
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2559
  then obtain u where u: "u \<in> closed_segment 0 1" "Re (g 1) - Re (g 0) = Re (h u * g u)"
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2560
    by auto
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2561
  from u(1) have u': "u \<in> \<real>" unfolding closed_segment_def
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2562
    by (auto simp: scaleR_conv_of_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2563
  from u' g_real[of u] g_nz[of u] have "Re (g u) \<noteq> 0" by (auto elim!: Reals_cases)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2564
  with u(2) c[of u] g_real[of u] g_nz[of u] u'
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2565
    have "Re c = 0" by (simp add: complex_is_Real_iff g.of_1)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2566
  with h_real[of 0] c[of 0] have "c = 0" by (auto elim!: Reals_cases)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2567
  with c have A: "h z * g z = 0" for z by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2568
  hence "(g has_field_derivative 0) (at z)" for z using g_g'[of z] by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2569
  hence "\<exists>c'. \<forall>z\<in>UNIV. g z = c'" by (intro has_field_derivative_zero_constant) simp_all
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2570
  then obtain c' where c: "\<And>z. g z = c'" by (force)
63539
70d4d9e5707b tuned proofs -- avoid improper use of "this";
wenzelm
parents: 63417
diff changeset
  2571
  from this[of 0] have "c' = pi" unfolding g_def by simp
70d4d9e5707b tuned proofs -- avoid improper use of "this";
wenzelm
parents: 63417
diff changeset
  2572
  with c have "g z = pi" by simp
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2573
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2574
  show ?thesis
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2575
  proof (cases "z \<in> \<int>")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2576
    case False
71189
954ee5acaae0 Split off new HOL-Complex_Analysis session from HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 70817
diff changeset
  2577
    with \<open>g z = pi\<close> show ?thesis by (auto simp: g_def divide_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2578
  next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2579
    case True
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2580
    then obtain n where n: "z = of_int n" by (elim Ints_cases)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2581
    with sin_eq_0[of "of_real pi * z"] have "sin (of_real pi * z) = 0" by force
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2582
    moreover have "of_int (1 - n) \<in> \<int>\<^sub>\<le>\<^sub>0" if "n > 0" using that by (intro nonpos_Ints_of_int) simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2583
    ultimately show ?thesis using n
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2584
      by (cases "n \<le> 0") (auto simp: Gamma_eq_zero_iff nonpos_Ints_of_int)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2585
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2586
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2587
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2588
lemma rGamma_reflection_complex:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2589
  "rGamma z * rGamma (1 - z :: complex) = sin (of_real pi * z) / of_real pi"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2590
  using Gamma_reflection_complex[of z]
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  2591
    by (simp add: Gamma_def field_split_simps split: if_split_asm)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2592
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2593
lemma rGamma_reflection_complex':
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2594
  "rGamma z * rGamma (- z :: complex) = -z * sin (of_real pi * z) / of_real pi"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2595
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2596
  have "rGamma z * rGamma (-z) = -z * (rGamma z * rGamma (1 - z))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2597
    using rGamma_plus1[of "-z", symmetric] by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2598
  also have "rGamma z * rGamma (1 - z) = sin (of_real pi * z) / of_real pi"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2599
    by (rule rGamma_reflection_complex)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2600
  finally show ?thesis by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2601
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2602
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2603
lemma Gamma_reflection_complex':
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2604
  "Gamma z * Gamma (- z :: complex) = - of_real pi / (z * sin (of_real pi * z))"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2605
  using rGamma_reflection_complex'[of z] by (force simp add: Gamma_def field_split_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2606
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2607
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2608
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2609
lemma Gamma_one_half_real: "Gamma (1/2 :: real) = sqrt pi"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2610
proof -
82519
2886a76359f3 removed duplicate lemmas
Manuel Eberl <manuel@pruvisto.org>
parents: 82518
diff changeset
  2611
  from Gamma_reflection_complex[of "1/2"] fraction_not_in_Ints[where 'a = complex, of 2 1]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2612
    have "Gamma (1/2 :: complex)^2 = of_real pi" by (simp add: power2_eq_square)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2613
  hence "of_real pi = Gamma (complex_of_real (1/2))^2" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2614
  also have "\<dots> = of_real ((Gamma (1/2))^2)" by (subst Gamma_complex_of_real) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2615
  finally have "Gamma (1/2)^2 = pi" by (subst (asm) of_real_eq_iff) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2616
  moreover have "Gamma (1/2 :: real) \<ge> 0" using Gamma_real_pos[of "1/2"] by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2617
  ultimately show ?thesis by (rule real_sqrt_unique [symmetric])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2618
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2619
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2620
lemma Gamma_one_half_complex: "Gamma (1/2 :: complex) = of_real (sqrt pi)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2621
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2622
  have "Gamma (1/2 :: complex) = Gamma (of_real (1/2))" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2623
  also have "\<dots> = of_real (sqrt pi)" by (simp only: Gamma_complex_of_real Gamma_one_half_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2624
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2625
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2626
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  2627
theorem Gamma_legendre_duplication:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2628
  fixes z :: complex
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2629
  assumes "z \<notin> \<int>\<^sub>\<le>\<^sub>0" "z + 1/2 \<notin> \<int>\<^sub>\<le>\<^sub>0"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2630
  shows "Gamma z * Gamma (z + 1/2) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2631
             exp ((1 - 2*z) * of_real (ln 2)) * of_real (sqrt pi) * Gamma (2*z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2632
  using Gamma_legendre_duplication_aux[OF assms] by (simp add: Gamma_one_half_complex)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2633
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2634
end
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2635
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2636
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
  2637
subsection\<^marker>\<open>tag unimportant\<close> \<open>Limits and residues\<close>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2638
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2639
text \<open>
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2640
  The inverse of the Gamma function has simple zeros:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2641
\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2642
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2643
lemma rGamma_zeros:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2644
  "(\<lambda>z. rGamma z / (z + of_nat n)) \<midarrow> (- of_nat n) \<rightarrow> ((-1)^n * fact n :: 'a :: Gamma)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2645
proof (subst tendsto_cong)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2646
  let ?f = "\<lambda>z. pochhammer z n * rGamma (z + of_nat (Suc n)) :: 'a"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2647
  from eventually_at_ball'[OF zero_less_one, of "- of_nat n :: 'a" UNIV]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2648
    show "eventually (\<lambda>z. rGamma z / (z + of_nat n) = ?f z) (at (- of_nat n))"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2649
    by (subst pochhammer_rGamma[of _ "Suc n"])
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  2650
       (auto elim!: eventually_mono simp: field_split_simps pochhammer_rec' eq_neg_iff_add_eq_0)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2651
  have "isCont ?f (- of_nat n)" by (intro continuous_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2652
  thus "?f \<midarrow> (- of_nat n) \<rightarrow> (- 1) ^ n * fact n" unfolding isCont_def
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2653
    by (simp add: pochhammer_same)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2654
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2655
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2656
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2657
text \<open>
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2658
  The simple zeros of the inverse of the Gamma function correspond to simple poles of the Gamma function,
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2659
  and their residues can easily be computed from the limit we have just proven:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2660
\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2661
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2662
lemma Gamma_poles: "filterlim Gamma at_infinity (at (- of_nat n :: 'a :: Gamma))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2663
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2664
  from eventually_at_ball'[OF zero_less_one, of "- of_nat n :: 'a" UNIV]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2665
    have "eventually (\<lambda>z. rGamma z \<noteq> (0 :: 'a)) (at (- of_nat n))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2666
    by (auto elim!: eventually_mono nonpos_Ints_cases'
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2667
             simp: rGamma_eq_zero_iff dist_of_nat dist_minus)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2668
  with isCont_rGamma[of "- of_nat n :: 'a", OF continuous_ident]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2669
    have "filterlim (\<lambda>z. inverse (rGamma z) :: 'a) at_infinity (at (- of_nat n))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2670
    unfolding isCont_def by (intro filterlim_compose[OF filterlim_inverse_at_infinity])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2671
                            (simp_all add: filterlim_at)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2672
  moreover have "(\<lambda>z. inverse (rGamma z) :: 'a) = Gamma"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2673
    by (intro ext) (simp add: rGamma_inverse_Gamma)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2674
  ultimately show ?thesis by (simp only: )
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2675
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2676
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2677
lemma Gamma_residues:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2678
  "(\<lambda>z. Gamma z * (z + of_nat n)) \<midarrow> (- of_nat n) \<rightarrow> ((-1)^n / fact n :: 'a :: Gamma)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2679
proof (subst tendsto_cong)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2680
  let ?c = "(- 1) ^ n / fact n :: 'a"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2681
  from eventually_at_ball'[OF zero_less_one, of "- of_nat n :: 'a" UNIV]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2682
    show "eventually (\<lambda>z. Gamma z * (z + of_nat n) = inverse (rGamma z / (z + of_nat n)))
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2683
            (at (- of_nat n))"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  2684
    by (auto elim!: eventually_mono simp: field_split_simps rGamma_inverse_Gamma)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2685
  have "(\<lambda>z. inverse (rGamma z / (z + of_nat n))) \<midarrow> (- of_nat n) \<rightarrow>
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2686
          inverse ((- 1) ^ n * fact n :: 'a)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2687
    by (intro tendsto_intros rGamma_zeros) simp_all
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2688
  also have "inverse ((- 1) ^ n * fact n) = ?c"
68403
223172b97d0b reorient -> split; documented split
nipkow
parents: 68224
diff changeset
  2689
    by (simp_all add: field_simps flip: power_mult_distrib)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2690
  finally show "(\<lambda>z. inverse (rGamma z / (z + of_nat n))) \<midarrow> (- of_nat n) \<rightarrow> ?c" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2691
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2692
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2693
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2694
subsection \<open>Alternative definitions\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2695
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2696
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2697
subsubsection \<open>Variant of the Euler form\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2698
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2699
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2700
definition Gamma_series_euler' where
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2701
  "Gamma_series_euler' z n =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2702
     inverse z * (\<Prod>k=1..n. exp (z * of_real (ln (1 + inverse (of_nat k)))) / (1 + z / of_nat k))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2703
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2704
context
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2705
begin
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2706
private lemma Gamma_euler'_aux1:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2707
  fixes z :: "'a :: {real_normed_field,banach}"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2708
  assumes n: "n > 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2709
  shows "exp (z * of_real (ln (of_nat n + 1))) = (\<Prod>k=1..n. exp (z * of_real (ln (1 + 1 / of_nat k))))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2710
proof -
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2711
  have "(\<Prod>k=1..n. exp (z * of_real (ln (1 + 1 / of_nat k)))) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2712
          exp (z * of_real (\<Sum>k = 1..n. ln (1 + 1 / real_of_nat k)))"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
  2713
    by (subst exp_sum [symmetric]) (simp_all add: sum_distrib_left)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2714
  also have "(\<Sum>k=1..n. ln (1 + 1 / of_nat k) :: real) = ln (\<Prod>k=1..n. 1 + 1 / real_of_nat k)"
80521
5c691b178e08 Totalisation of ln and therefore log and powr
paulson <lp15@cam.ac.uk>
parents: 79857
diff changeset
  2715
    by (subst ln_prod [symmetric]) (auto simp: divide_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2716
  also have "(\<Prod>k=1..n. 1 + 1 / of_nat k :: real) = (\<Prod>k=1..n. (of_nat k + 1) / of_nat k)"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  2717
    by (intro prod.cong) (simp_all add: field_split_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2718
  also have "(\<Prod>k=1..n. (of_nat k + 1) / of_nat k :: real) = of_nat n + 1"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  2719
    by (induction n) (simp_all add: prod.nat_ivl_Suc' field_split_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2720
  finally show ?thesis ..
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2721
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2722
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  2723
theorem Gamma_series_euler':
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2724
  assumes z: "(z :: 'a :: Gamma) \<notin> \<int>\<^sub>\<le>\<^sub>0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2725
  shows "(\<lambda>n. Gamma_series_euler' z n) \<longlonglongrightarrow> Gamma z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2726
proof (rule Gamma_seriesI, rule Lim_transform_eventually)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2727
  let ?f = "\<lambda>n. fact n * exp (z * of_real (ln (of_nat n + 1))) / pochhammer z (n + 1)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2728
  let ?r = "\<lambda>n. ?f n / Gamma_series z n"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2729
  let ?r' = "\<lambda>n. exp (z * of_real (ln (of_nat (Suc n) / of_nat n)))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2730
  from z have z': "z \<noteq> 0" by auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2731
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  2732
  have "eventually (\<lambda>n. ?r' n = ?r n) sequentially"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2733
    using z by (auto simp: field_split_simps Gamma_series_def ring_distribs exp_diff ln_div
65578
e4997c181cce New material from PNT proof, as well as more default [simp] declarations. Also removed duplicate theorems about geometric series
paulson <lp15@cam.ac.uk>
parents: 64969
diff changeset
  2734
                     intro: eventually_mono eventually_gt_at_top[of "0::nat"] dest: pochhammer_eq_0_imp_nonpos_Int)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2735
  moreover have "?r' \<longlonglongrightarrow> exp (z * of_real (ln 1))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2736
    by (intro tendsto_intros LIMSEQ_Suc_n_over_n) simp_all
70532
fcf3b891ccb1 new material; rotated premises of Lim_transform_eventually
paulson <lp15@cam.ac.uk>
parents: 70196
diff changeset
  2737
  ultimately show "?r \<longlonglongrightarrow> 1" by (force intro: Lim_transform_eventually)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2738
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2739
  from eventually_gt_at_top[of "0::nat"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2740
    show "eventually (\<lambda>n. ?r n = Gamma_series_euler' z n / Gamma_series z n) sequentially"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2741
  proof eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2742
    fix n :: nat assume n: "n > 0"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2743
    from n z' have "Gamma_series_euler' z n =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2744
      exp (z * of_real (ln (of_nat n + 1))) / (z * (\<Prod>k=1..n. (1 + z / of_nat k)))"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2745
      by (subst Gamma_euler'_aux1)
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  2746
         (simp_all add: Gamma_series_euler'_def prod.distrib
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  2747
                        prod_inversef[symmetric] divide_inverse)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2748
    also have "(\<Prod>k=1..n. (1 + z / of_nat k)) = pochhammer (z + 1) n / fact n"
70113
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
  2749
    proof (cases n)
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
  2750
      case (Suc n')
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
  2751
      then show ?thesis
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
  2752
        unfolding pochhammer_prod fact_prod
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
  2753
        by (simp add:  atLeastLessThanSuc_atLeastAtMost field_simps prod_dividef 
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
  2754
                  prod.atLeast_Suc_atMost_Suc_shift del: prod.cl_ivl_Suc)
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
  2755
    qed auto
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2756
    also have "z * \<dots> = pochhammer z (Suc n) / fact n" by (simp add: pochhammer_rec)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2757
    finally show "?r n = Gamma_series_euler' z n / Gamma_series z n" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2758
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2759
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2760
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2761
end
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2762
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2763
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2764
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2765
subsubsection \<open>Weierstrass form\<close>
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2766
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2767
definition Gamma_series_Weierstrass :: "'a :: {banach,real_normed_field} \<Rightarrow> nat \<Rightarrow> 'a" where
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2768
  "Gamma_series_Weierstrass z n =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2769
     exp (-euler_mascheroni * z) / z * (\<Prod>k=1..n. exp (z / of_nat k) / (1 + z / of_nat k))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2770
70136
f03a01a18c6e modernized tags: default scope excludes proof;
wenzelm
parents: 70113
diff changeset
  2771
definition\<^marker>\<open>tag unimportant\<close>
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2772
  rGamma_series_Weierstrass :: "'a :: {banach,real_normed_field} \<Rightarrow> nat \<Rightarrow> 'a" where
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2773
  "rGamma_series_Weierstrass z n =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2774
     exp (euler_mascheroni * z) * z * (\<Prod>k=1..n. (1 + z / of_nat k) * exp (-z / of_nat k))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2775
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2776
lemma Gamma_series_Weierstrass_nonpos_Ints:
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2777
  "eventually (\<lambda>k. Gamma_series_Weierstrass (- of_nat n) k = 0) sequentially"
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2778
  using eventually_ge_at_top[of n] by eventually_elim (auto simp: Gamma_series_Weierstrass_def)
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2779
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2780
lemma rGamma_series_Weierstrass_nonpos_Ints:
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2781
  "eventually (\<lambda>k. rGamma_series_Weierstrass (- of_nat n) k = 0) sequentially"
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2782
  using eventually_ge_at_top[of n] by eventually_elim (auto simp: rGamma_series_Weierstrass_def)
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2783
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2784
theorem Gamma_Weierstrass_complex: "Gamma_series_Weierstrass z \<longlonglongrightarrow> Gamma (z :: complex)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2785
proof (cases "z \<in> \<int>\<^sub>\<le>\<^sub>0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2786
  case True
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2787
  then obtain n where "z = - of_nat n" by (elim nonpos_Ints_cases')
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2788
  also from True have "Gamma_series_Weierstrass \<dots> \<longlonglongrightarrow> Gamma z"
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2789
    by (simp add: tendsto_cong[OF Gamma_series_Weierstrass_nonpos_Ints] Gamma_nonpos_Int)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2790
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2791
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2792
  case False
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2793
  hence z: "z \<noteq> 0" by auto
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2794
  let ?f = "(\<lambda>x. \<Prod>x = Suc 0..x. exp (z / of_nat x) / (1 + z / of_nat x))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2795
  have A: "exp (ln (1 + z / of_nat n)) = (1 + z / of_nat n)" if "n \<ge> 1" for n :: nat
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2796
    using False that by (subst exp_Ln) (auto simp: field_simps dest!: plus_of_nat_eq_0_imp)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2797
  have "(\<lambda>n. \<Sum>k=1..n. z / of_nat k - ln (1 + z / of_nat k)) \<longlonglongrightarrow> ln_Gamma z + euler_mascheroni * z + ln z"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2798
    using ln_Gamma_series'_aux[OF False]
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2799
    by (simp only: atLeastLessThanSuc_atLeastAtMost [symmetric] One_nat_def
70113
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
  2800
                   sum.shift_bounds_Suc_ivl sums_def atLeast0LessThan)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2801
  from tendsto_exp[OF this] False z have "?f \<longlonglongrightarrow> z * exp (euler_mascheroni * z) * Gamma z"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63992
diff changeset
  2802
    by (simp add: exp_add exp_sum exp_diff mult_ac Gamma_complex_altdef A)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2803
  from tendsto_mult[OF tendsto_const[of "exp (-euler_mascheroni * z) / z"] this] z
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2804
    show "Gamma_series_Weierstrass z \<longlonglongrightarrow> Gamma z"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  2805
    by (simp add: exp_minus field_split_simps Gamma_series_Weierstrass_def [abs_def])
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2806
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2807
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2808
lemma tendsto_complex_of_real_iff: "((\<lambda>x. complex_of_real (f x)) \<longlongrightarrow> of_real c) F = (f \<longlongrightarrow> c) F"
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2809
  by (rule tendsto_of_real_iff)
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2810
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2811
lemma Gamma_Weierstrass_real: "Gamma_series_Weierstrass x \<longlonglongrightarrow> Gamma (x :: real)"
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2812
  using Gamma_Weierstrass_complex[of "of_real x"] unfolding Gamma_series_Weierstrass_def[abs_def]
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2813
  by (subst tendsto_complex_of_real_iff [symmetric])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2814
     (simp_all add: exp_of_real[symmetric] Gamma_complex_of_real)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2815
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2816
lemma rGamma_Weierstrass_complex: "rGamma_series_Weierstrass z \<longlonglongrightarrow> rGamma (z :: complex)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2817
proof (cases "z \<in> \<int>\<^sub>\<le>\<^sub>0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2818
  case True
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2819
  then obtain n where "z = - of_nat n" by (elim nonpos_Ints_cases')
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2820
  also from True have "rGamma_series_Weierstrass \<dots> \<longlonglongrightarrow> rGamma z"
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2821
    by (simp add: tendsto_cong[OF rGamma_series_Weierstrass_nonpos_Ints] rGamma_nonpos_Int)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2822
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2823
next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2824
  case False
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2825
  have "rGamma_series_Weierstrass z = (\<lambda>n. inverse (Gamma_series_Weierstrass z n))"
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2826
    by (simp add: rGamma_series_Weierstrass_def[abs_def] Gamma_series_Weierstrass_def
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  2827
                  exp_minus divide_inverse prod_inversef[symmetric] mult_ac)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2828
  also from False have "\<dots> \<longlonglongrightarrow> inverse (Gamma z)"
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  2829
    by (intro tendsto_intros Gamma_Weierstrass_complex) (simp add: Gamma_eq_zero_iff)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2830
  finally show ?thesis by (simp add: Gamma_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2831
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  2832
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2833
subsubsection \<open>Binomial coefficient form\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2834
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2835
lemma Gamma_gbinomial:
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2836
  "(\<lambda>n. ((z + of_nat n) gchoose n) * exp (-z * of_real (ln (of_nat n)))) \<longlonglongrightarrow> rGamma (z+1)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2837
proof (cases "z = 0")
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2838
  case False
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2839
  show ?thesis
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2840
  proof (rule Lim_transform_eventually)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2841
    let ?powr = "\<lambda>a b. exp (b * of_real (ln (of_nat a)))"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2842
    show "eventually (\<lambda>n. rGamma_series z n / z =
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2843
            ((z + of_nat n) gchoose n) * ?powr n (-z)) sequentially"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2844
    proof (intro always_eventually allI)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2845
      fix n :: nat
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2846
      from False have "((z + of_nat n) gchoose n) = pochhammer z (Suc n) / z / fact n"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2847
        by (simp add: gbinomial_pochhammer' pochhammer_rec)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2848
      also have "pochhammer z (Suc n) / z / fact n * ?powr n (-z) = rGamma_series z n / z"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  2849
        by (simp add: rGamma_series_def field_split_simps exp_minus)
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2850
      finally show "rGamma_series z n / z = ((z + of_nat n) gchoose n) * ?powr n (-z)" ..
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2851
    qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2852
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2853
    from False have "(\<lambda>n. rGamma_series z n / z) \<longlonglongrightarrow> rGamma z / z" by (intro tendsto_intros)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2854
    also from False have "rGamma z / z = rGamma (z + 1)" using rGamma_plus1[of z]
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2855
      by (simp add: field_simps)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2856
    finally show "(\<lambda>n. rGamma_series z n / z) \<longlonglongrightarrow> rGamma (z+1)" .
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2857
  qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2858
qed (simp_all add: binomial_gbinomial [symmetric])
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2859
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2860
lemma gbinomial_minus': "(a + of_nat b) gchoose b = (- 1) ^ b * (- (a + 1) gchoose b)"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2861
  by (subst gbinomial_minus) (simp add: power_mult_distrib [symmetric])
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2862
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2863
lemma gbinomial_asymptotic:
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2864
  fixes z :: "'a :: Gamma"
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
  2865
  shows "(\<lambda>n. (z gchoose n) / ((-1)^n / exp ((z+1) * of_real (ln (real n))))) \<longlonglongrightarrow>
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2866
           inverse (Gamma (- z))"
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
  2867
  unfolding rGamma_inverse_Gamma [symmetric] using Gamma_gbinomial[of "-z-1"]
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2868
  by (subst (asm) gbinomial_minus')
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2869
     (simp add: add_ac mult_ac divide_inverse power_inverse [symmetric])
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2870
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  2871
lemma fact_binomial_limit:
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2872
  "(\<lambda>n. of_nat ((k + n) choose n) / of_nat (n ^ k) :: 'a :: Gamma) \<longlonglongrightarrow> 1 / fact k"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2873
proof (rule Lim_transform_eventually)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2874
  have "(\<lambda>n. of_nat ((k + n) choose n) / of_real (exp (of_nat k * ln (real_of_nat n))))
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2875
            \<longlonglongrightarrow> 1 / Gamma (of_nat (Suc k) :: 'a)" (is "?f \<longlonglongrightarrow> _")
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2876
    using Gamma_gbinomial[of "of_nat k :: 'a"]
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2877
    by (simp add: binomial_gbinomial Gamma_def field_split_simps exp_of_real [symmetric] exp_minus)
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2878
  also have "Gamma (of_nat (Suc k)) = fact k" by (simp add: Gamma_fact)
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2879
  finally show "?f \<longlonglongrightarrow> 1 / fact k" .
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2880
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2881
  show "eventually (\<lambda>n. ?f n = of_nat ((k + n) choose n) / of_nat (n ^ k)) sequentially"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2882
    using eventually_gt_at_top[of "0::nat"]
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2883
  proof eventually_elim
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2884
    fix n :: nat assume n: "n > 0"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2885
    from n have "exp (real_of_nat k * ln (real_of_nat n)) = real_of_nat (n^k)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2886
      by (simp add: exp_of_nat_mult)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2887
    thus "?f n = of_nat ((k + n) choose n) / of_nat (n ^ k)" by simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2888
  qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2889
qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2890
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2891
lemma binomial_asymptotic':
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2892
  "(\<lambda>n. of_nat ((k + n) choose n) / (of_nat (n ^ k) / fact k) :: 'a :: Gamma) \<longlonglongrightarrow> 1"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2893
  using tendsto_mult[OF fact_binomial_limit[of k] tendsto_const[of "fact k :: 'a"]] by simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2894
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2895
lemma gbinomial_Beta:
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2896
  assumes "z + 1 \<notin> \<int>\<^sub>\<le>\<^sub>0"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2897
  shows   "((z::'a::Gamma) gchoose n) = inverse ((z + 1) * Beta (z - of_nat n + 1) (of_nat n + 1))"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2898
using assms
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2899
proof (induction n arbitrary: z)
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2900
  case 0
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2901
  hence "z + 2 \<notin> \<int>\<^sub>\<le>\<^sub>0"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2902
    using plus_one_in_nonpos_Ints_imp[of "z+1"] by (auto simp: add.commute)
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2903
  with 0 show ?case
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2904
    by (auto simp: Beta_def Gamma_eq_zero_iff Gamma_plus1 [symmetric] add.commute)
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2905
next
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2906
  case (Suc n z)
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2907
  show ?case
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2908
  proof (cases "z \<in> \<int>\<^sub>\<le>\<^sub>0")
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2909
    case True
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2910
    with Suc.prems have "z = 0"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2911
      by (auto elim!: nonpos_Ints_cases simp: algebra_simps one_plus_of_int_in_nonpos_Ints_iff)
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2912
    show ?thesis
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2913
    proof (cases "n = 0")
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2914
      case True
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2915
      with \<open>z = 0\<close> show ?thesis
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2916
        by (simp add: Beta_def Gamma_eq_zero_iff Gamma_plus1 [symmetric])
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2917
    next
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2918
      case False
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2919
      with \<open>z = 0\<close> show ?thesis
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2920
        by (simp_all add: Beta_pole1 one_minus_of_nat_in_nonpos_Ints_iff)
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2921
    qed
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2922
  next
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2923
    case False
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2924
    have "(z gchoose (Suc n)) = ((z - 1 + 1) gchoose (Suc n))" by simp
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2925
    also have "\<dots> = (z - 1 gchoose n) * ((z - 1) + 1) / of_nat (Suc n)"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2926
      by (subst gbinomial_factors) (simp add: field_simps)
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
  2927
    also from False have "\<dots> = inverse (of_nat (Suc n) * Beta (z - of_nat n) (of_nat (Suc n)))"
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2928
      (is "_ = inverse ?x") by (subst Suc.IH) (simp_all add: field_simps Beta_pole1)
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2929
    also have "of_nat (Suc n) \<notin> (\<int>\<^sub>\<le>\<^sub>0 :: 'a set)" by (subst of_nat_in_nonpos_Ints_iff) simp_all
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2930
    hence "?x = (z + 1) * Beta (z - of_nat (Suc n) + 1) (of_nat (Suc n) + 1)"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2931
      by (subst Beta_plus1_right [symmetric]) simp_all
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2932
    finally show ?thesis .
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2933
  qed
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2934
qed
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2935
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  2936
theorem gbinomial_Gamma:
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2937
  assumes "z + 1 \<notin> \<int>\<^sub>\<le>\<^sub>0"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2938
  shows   "(z gchoose n) = Gamma (z + 1) / (fact n * Gamma (z - of_nat n + 1))"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2939
proof -
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2940
  have "(z gchoose n) = Gamma (z + 2) / (z + 1) / (fact n * Gamma (z - of_nat n + 1))"
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2941
    by (subst gbinomial_Beta[OF assms]) (simp_all add: Beta_def Gamma_fact [symmetric] add_ac)
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2942
  also from assms have "Gamma (z + 2) / (z + 1) = Gamma (z + 1)"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  2943
    using Gamma_plus1[of "z+1"] by (auto simp add: field_split_simps)
63295
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2944
  finally show ?thesis .
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2945
qed
52792bb9126e Facts about HK integration, complex powers, Gamma function
eberlm
parents: 63040
diff changeset
  2946
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  2947
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  2948
subsubsection \<open>Integral form\<close>
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  2949
66526
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2950
lemma integrable_on_powr_from_0':
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2951
  assumes a: "a > (-1::real)" and c: "c \<ge> 0"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2952
  shows   "(\<lambda>x. x powr a) integrable_on {0<..c}"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2953
proof -
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2954
  from c have *: "{0<..c} - {0..c} = {}" "{0..c} - {0<..c} = {0}" by auto
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2955
  show ?thesis
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2956
  by (rule integrable_spike_set [OF integrable_on_powr_from_0[OF a c]]) (simp_all add: *)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2957
qed
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2958
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2959
lemma absolutely_integrable_Gamma_integral:
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2960
  assumes "Re z > 0" "a > 0"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2961
  shows   "(\<lambda>t. complex_of_real t powr (z - 1) / of_real (exp (a * t))) 
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2962
             absolutely_integrable_on {0<..}" (is "?f absolutely_integrable_on _")
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2963
proof -
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2964
  have "((\<lambda>x. (Re z - 1) * (ln x / x)) \<longlongrightarrow> (Re z - 1) * 0) at_top"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2965
    by (intro tendsto_intros ln_x_over_x_tendsto_0)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2966
  hence "((\<lambda>x. ((Re z - 1) * ln x) / x) \<longlongrightarrow> 0) at_top" by simp
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2967
  from order_tendstoD(2)[OF this, of "a/2"] and \<open>a > 0\<close>
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2968
    have "eventually (\<lambda>x. (Re z - 1) * ln x / x < a/2) at_top" by simp
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2969
  from eventually_conj[OF this eventually_gt_at_top[of 0]]
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2970
    obtain x0 where "\<forall>x\<ge>x0. (Re z - 1) * ln x / x < a/2 \<and> x > 0"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2971
      by (auto simp: eventually_at_top_linorder)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2972
  hence "x0 > 0" by simp
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2973
  have "x powr (Re z - 1) / exp (a * x) < exp (-(a/2) * x)" if "x \<ge> x0" for x
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2974
  proof -
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2975
    from that and \<open>\<forall>x\<ge>x0. _\<close> have x: "(Re z - 1) * ln x / x < a / 2" "x > 0" by auto
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2976
    have "x powr (Re z - 1) = exp ((Re z - 1) * ln x)"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2977
      using \<open>x > 0\<close> by (simp add: powr_def)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2978
    also from x have "(Re z - 1) * ln x < (a * x) / 2" by (simp add: field_simps)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2979
    finally show ?thesis by (simp add: field_simps exp_add [symmetric])
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2980
  qed
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2981
  note x0 = \<open>x0 > 0\<close> this
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2982
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2983
  have "?f absolutely_integrable_on ({0<..x0} \<union> {x0..})"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2984
  proof (rule set_integrable_Un)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2985
    show "?f absolutely_integrable_on {0<..x0}"
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  2986
      unfolding set_integrable_def
66526
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2987
    proof (rule Bochner_Integration.integrable_bound [OF _ _ AE_I2])
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  2988
      show "integrable lebesgue (\<lambda>x. indicat_real {0<..x0} x *\<^sub>R x powr (Re z - 1))"         
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  2989
        using x0(1) assms
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  2990
        by (intro nonnegative_absolutely_integrable_1 [unfolded set_integrable_def] integrable_on_powr_from_0') auto
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  2991
      show "(\<lambda>x. indicat_real {0<..x0} x *\<^sub>R (x powr (z - 1) / exp (a * x))) \<in> borel_measurable lebesgue"
66526
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2992
        by (intro measurable_completion)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2993
           (auto intro!: borel_measurable_continuous_on_indicator continuous_intros)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2994
      fix x :: real 
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2995
      have "x powr (Re z - 1) / exp (a * x) \<le> x powr (Re z - 1) / 1" if "x \<ge> 0"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2996
        using that assms by (intro divide_left_mono) auto
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2997
      thus "norm (indicator {0<..x0} x *\<^sub>R ?f x) \<le> 
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2998
               norm (indicator {0<..x0} x *\<^sub>R x powr (Re z - 1))"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  2999
        by (simp_all add: norm_divide norm_powr_real_powr indicator_def)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3000
    qed
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3001
  next
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3002
    show "?f absolutely_integrable_on {x0..}"
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3003
      unfolding set_integrable_def
66526
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3004
    proof (rule Bochner_Integration.integrable_bound [OF _ _ AE_I2])
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3005
      show "integrable lebesgue (\<lambda>x. indicat_real {x0..} x *\<^sub>R exp (- (a / 2) * x))" using assms
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3006
        by (intro nonnegative_absolutely_integrable_1 [unfolded set_integrable_def] integrable_on_exp_minus_to_infinity) auto
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3007
      show "(\<lambda>x. indicat_real {x0..} x *\<^sub>R (x powr (z - 1) / exp (a * x))) \<in> borel_measurable lebesgue" using x0(1)
66526
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3008
        by (intro measurable_completion)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3009
           (auto intro!: borel_measurable_continuous_on_indicator continuous_intros)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3010
      fix x :: real 
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3011
      show "norm (indicator {x0..} x *\<^sub>R ?f x) \<le> 
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3012
               norm (indicator {x0..} x *\<^sub>R exp (-(a/2) * x))" using x0
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3013
        by (auto simp: norm_divide norm_powr_real_powr indicator_def less_imp_le)
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3014
    qed
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3015
  qed auto
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3016
  also have "{0<..x0} \<union> {x0..} = {0<..}" using x0(1) by auto
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3017
  finally show ?thesis .
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3018
qed
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3019
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3020
lemma integrable_Gamma_integral_bound:
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3021
  fixes a c :: real
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3022
  assumes a: "a > -1" and c: "c \<ge> 0"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3023
  defines "f \<equiv> \<lambda>x. if x \<in> {0..c} then x powr a else exp (-x/2)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3024
  shows   "f integrable_on {0..}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3025
proof -
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3026
  have "f integrable_on {0..c}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3027
    by (rule integrable_spike_finite[of "{}", OF _ _ integrable_on_powr_from_0[of a c]])
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3028
       (insert a c, simp_all add: f_def)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3029
  moreover have A: "(\<lambda>x. exp (-x/2)) integrable_on {c..}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3030
    using integrable_on_exp_minus_to_infinity[of "1/2"] by simp
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3031
  have "f integrable_on {c..}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3032
    by (rule integrable_spike_finite[of "{c}", OF _ _ A]) (simp_all add: f_def)
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
  3033
  ultimately show "f integrable_on {0..}"
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  3034
    by (rule integrable_Un') (insert c, auto simp: max_def)
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
  3035
qed
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3036
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  3037
theorem Gamma_integral_complex:
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3038
  assumes z: "Re z > 0"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3039
  shows   "((\<lambda>t. of_real t powr (z - 1) / of_real (exp t)) has_integral Gamma z) {0..}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3040
proof -
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3041
  have A: "((\<lambda>t. (of_real t) powr (z - 1) * of_real ((1 - t) ^ n))
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3042
          has_integral (fact n / pochhammer z (n+1))) {0..1}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3043
    if "Re z > 0" for n z using that
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3044
  proof (induction n arbitrary: z)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3045
    case 0
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3046
    have "((\<lambda>t. complex_of_real t powr (z - 1)) has_integral
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3047
            (of_real 1 powr z / z - of_real 0 powr z / z)) {0..1}" using 0
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3048
      by (intro fundamental_theorem_of_calculus_interior)
70707
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70532
diff changeset
  3049
         (auto intro!: continuous_intros derivative_eq_intros has_vector_derivative_real_field)
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3050
    thus ?case by simp
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3051
  next
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3052
    case (Suc n)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3053
    let ?f = "\<lambda>t. complex_of_real t powr z / z"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3054
    let ?f' = "\<lambda>t. complex_of_real t powr (z - 1)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3055
    let ?g = "\<lambda>t. (1 - complex_of_real t) ^ Suc n"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3056
    let ?g' = "\<lambda>t. - ((1 - complex_of_real t) ^ n) * of_nat (Suc n)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3057
    have "((\<lambda>t. ?f' t * ?g t) has_integral
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3058
            (of_nat (Suc n)) * fact n / pochhammer z (n+2)) {0..1}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3059
      (is "(_ has_integral ?I) _")
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3060
    proof (rule integration_by_parts_interior[where f' = ?f' and g = ?g])
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3061
      from Suc.prems show "continuous_on {0..1} ?f" "continuous_on {0..1} ?g"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3062
        by (auto intro!: continuous_intros)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3063
    next
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3064
      fix t :: real assume t: "t \<in> {0<..<1}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3065
      show "(?f has_vector_derivative ?f' t) (at t)" using t Suc.prems
70707
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70532
diff changeset
  3066
        by (auto intro!: derivative_eq_intros has_vector_derivative_real_field)
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3067
      show "(?g has_vector_derivative ?g' t) (at t)"
70707
125705f5965f A little-known material, and some tidying up
paulson <lp15@cam.ac.uk>
parents: 70532
diff changeset
  3068
        by (rule has_vector_derivative_real_field derivative_eq_intros refl)+ simp_all
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3069
    next
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3070
      from Suc.prems have [simp]: "z \<noteq> 0" by auto
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3071
      from Suc.prems have A: "Re (z + of_nat n) > 0" for n by simp
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3072
      have [simp]: "z + of_nat n \<noteq> 0" "z + 1 + of_nat n \<noteq> 0" for n
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3073
        using A[of n] A[of "Suc n"] by (auto simp add: add.assoc simp del: plus_complex.sel)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3074
      have "((\<lambda>x. of_real x powr z * of_real ((1 - x) ^ n) * (- of_nat (Suc n) / z)) has_integral
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3075
              fact n / pochhammer (z+1) (n+1) * (- of_nat (Suc n) / z)) {0..1}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3076
        (is "(?A has_integral ?B) _")
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3077
        using Suc.IH[of "z+1"] Suc.prems by (intro has_integral_mult_left) (simp_all add: add_ac pochhammer_rec)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3078
      also have "?A = (\<lambda>t. ?f t * ?g' t)" by (intro ext) (simp_all add: field_simps)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3079
      also have "?B = - (of_nat (Suc n) * fact n / pochhammer z (n+2))"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  3080
        by (simp add: field_split_simps pochhammer_rec
70113
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
  3081
              prod.shift_bounds_cl_Suc_ivl del: of_nat_Suc)
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3082
      finally show "((\<lambda>t. ?f t * ?g' t) has_integral (?f 1 * ?g 1 - ?f 0 * ?g 0 - ?I)) {0..1}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3083
        by simp
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3084
    qed (simp_all add: bounded_bilinear_mult)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3085
    thus ?case by simp
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3086
  qed
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3087
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3088
  have B: "((\<lambda>t. if t \<in> {0..of_nat n} then
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3089
             of_real t powr (z - 1) * (1 - of_real t / of_nat n) ^ n else 0)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3090
           has_integral (of_nat n powr z * fact n / pochhammer z (n+1))) {0..}" for n
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3091
  proof (cases "n > 0")
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3092
    case [simp]: True
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3093
    hence [simp]: "n \<noteq> 0" by auto
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3094
    with has_integral_affinity01[OF A[OF z, of n], of "inverse (of_nat n)" 0]
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3095
      have "((\<lambda>x. (of_nat n - of_real x) ^ n * (of_real x / of_nat n) powr (z - 1) / of_nat n ^ n)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3096
              has_integral fact n * of_nat n / pochhammer z (n+1)) ((\<lambda>x. real n * x)`{0..1})"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3097
      (is "(?f has_integral ?I) ?ivl") by (simp add: field_simps scaleR_conv_of_real)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3098
    also from True have "((\<lambda>x. real n*x)`{0..1}) = {0..real n}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3099
      by (subst image_mult_atLeastAtMost) simp_all
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3100
    also have "?f = (\<lambda>x. (of_real x / of_nat n) powr (z - 1) * (1 - of_real x / of_nat n) ^ n)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3101
      using True by (intro ext) (simp add: field_simps)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3102
    finally have "((\<lambda>x. (of_real x / of_nat n) powr (z - 1) * (1 - of_real x / of_nat n) ^ n)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3103
                    has_integral ?I) {0..real n}" (is ?P) .
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3104
    also have "?P \<longleftrightarrow> ((\<lambda>x. exp ((z - 1) * of_real (ln (x / of_nat n))) * (1 - of_real x / of_nat n) ^ n)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3105
                        has_integral ?I) {0..real n}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3106
      by (intro has_integral_spike_finite_eq[of "{0}"]) (auto simp: powr_def Ln_of_real [symmetric])
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3107
    also have "\<dots> \<longleftrightarrow> ((\<lambda>x. exp ((z - 1) * of_real (ln x - ln (of_nat n))) * (1 - of_real x / of_nat n) ^ n)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3108
                        has_integral ?I) {0..real n}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3109
      by (intro has_integral_spike_finite_eq[of "{0}"]) (simp_all add: ln_div)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3110
    finally have \<dots> .
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3111
    note B = has_integral_mult_right[OF this, of "exp ((z - 1) * ln (of_nat n))"]
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3112
    have "((\<lambda>x. exp ((z - 1) * of_real (ln x)) * (1 - of_real x / of_nat n) ^ n)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3113
            has_integral (?I * exp ((z - 1) * ln (of_nat n)))) {0..real n}" (is ?P)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3114
      by (insert B, subst (asm) mult.assoc [symmetric], subst (asm) exp_add [symmetric])
66936
cf8d8fc23891 tuned some proofs and added some lemmas
haftmann
parents: 66526
diff changeset
  3115
         (simp add: algebra_simps)
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3116
    also have "?P \<longleftrightarrow> ((\<lambda>x. of_real x powr (z - 1) * (1 - of_real x / of_nat n) ^ n)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3117
            has_integral (?I * exp ((z - 1) * ln (of_nat n)))) {0..real n}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3118
      by (intro has_integral_spike_finite_eq[of "{0}"]) (simp_all add: powr_def Ln_of_real)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3119
    also have "fact n * of_nat n / pochhammer z (n+1) * exp ((z - 1) * Ln (of_nat n)) =
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3120
                 (of_nat n powr z * fact n / pochhammer z (n+1))"
65587
16a8991ab398 New material (and some tidying) purely in the Analysis directory
paulson <lp15@cam.ac.uk>
parents: 65578
diff changeset
  3121
      by (auto simp add: powr_def algebra_simps exp_diff exp_of_real)
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3122
    finally show ?thesis by (subst has_integral_restrict) simp_all
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3123
  next
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3124
    case False
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3125
    thus ?thesis by (subst has_integral_restrict) (simp_all add: has_integral_refl)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3126
  qed
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3127
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3128
  have "eventually (\<lambda>n. Gamma_series z n =
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3129
          of_nat n powr z * fact n / pochhammer z (n+1)) sequentially"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3130
    using eventually_gt_at_top[of "0::nat"]
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  3131
    by eventually_elim (simp add: powr_def algebra_simps Gamma_series_def)
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3132
  from this and Gamma_series_LIMSEQ[of z]
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3133
    have C: "(\<lambda>k. of_nat k powr z * fact k / pochhammer z (k+1)) \<longlonglongrightarrow> Gamma z"
70532
fcf3b891ccb1 new material; rotated premises of Lim_transform_eventually
paulson <lp15@cam.ac.uk>
parents: 70196
diff changeset
  3134
    by (blast intro: Lim_transform_eventually)
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3135
  {
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3136
    fix x :: real assume x: "x \<ge> 0"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3137
    have lim_exp: "(\<lambda>k. (1 - x / real k) ^ k) \<longlonglongrightarrow> exp (-x)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3138
      using tendsto_exp_limit_sequentially[of "-x"] by simp
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3139
    have "(\<lambda>k. of_real x powr (z - 1) * of_real ((1 - x / of_nat k) ^ k))
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3140
            \<longlonglongrightarrow> of_real x powr (z - 1) * of_real (exp (-x))" (is ?P)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3141
      by (intro tendsto_intros lim_exp)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3142
    also from eventually_gt_at_top[of "nat \<lceil>x\<rceil>"]
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3143
      have "eventually (\<lambda>k. of_nat k > x) sequentially" by eventually_elim linarith
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3144
    hence "?P \<longleftrightarrow> (\<lambda>k. if x \<le> of_nat k then
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3145
                 of_real x powr (z - 1) * of_real ((1 - x / of_nat k) ^ k) else 0)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3146
                   \<longlonglongrightarrow> of_real x powr (z - 1) * of_real (exp (-x))"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3147
      by (intro tendsto_cong) (auto elim!: eventually_mono)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3148
    finally have \<dots> .
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3149
  }
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3150
  hence D: "\<forall>x\<in>{0..}. (\<lambda>k. if x \<in> {0..real k} then
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3151
              of_real x powr (z - 1) * (1 - of_real x / of_nat k) ^ k else 0)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3152
             \<longlonglongrightarrow> of_real x powr (z - 1) / of_real (exp x)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3153
    by (simp add: exp_minus field_simps cong: if_cong)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3154
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3155
  have "((\<lambda>x. (Re z - 1) * (ln x / x)) \<longlongrightarrow> (Re z - 1) * 0) at_top"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3156
    by (intro tendsto_intros ln_x_over_x_tendsto_0)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3157
  hence "((\<lambda>x. ((Re z - 1) * ln x) / x) \<longlongrightarrow> 0) at_top" by simp
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3158
  from order_tendstoD(2)[OF this, of "1/2"]
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3159
    have "eventually (\<lambda>x. (Re z - 1) * ln x / x < 1/2) at_top" by simp
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3160
  from eventually_conj[OF this eventually_gt_at_top[of 0]]
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3161
    obtain x0 where "\<forall>x\<ge>x0. (Re z - 1) * ln x / x < 1/2 \<and> x > 0"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3162
    by (auto simp: eventually_at_top_linorder)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3163
  hence x0: "x0 > 0" "\<And>x. x \<ge> x0 \<Longrightarrow> (Re z - 1) * ln x < x / 2" by auto
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3164
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3165
  define h where "h = (\<lambda>x. if x \<in> {0..x0} then x powr (Re z - 1) else exp (-x/2))"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3166
  have le_h: "x powr (Re z - 1) * exp (-x) \<le> h x" if x: "x \<ge> 0" for x
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3167
  proof (cases "x > x0")
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3168
    case True
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3169
    from True x0(1) have "x powr (Re z - 1) * exp (-x) = exp ((Re z - 1) * ln x - x)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3170
      by (simp add: powr_def exp_diff exp_minus field_simps exp_add)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3171
    also from x0(2)[of x] True have "\<dots> < exp (-x/2)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3172
      by (simp add: field_simps)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3173
    finally show ?thesis using True by (auto simp add: h_def)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3174
  next
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3175
    case False
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3176
    from x have "x powr (Re z - 1) * exp (- x) \<le> x powr (Re z - 1) * 1"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3177
      by (intro mult_left_mono) simp_all
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3178
    with False show ?thesis by (auto simp add: h_def)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3179
  qed
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3180
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3181
  have E: "\<forall>x\<in>{0..}. cmod (if x \<in> {0..real k} then of_real x powr (z - 1) *
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3182
                   (1 - complex_of_real x / of_nat k) ^ k else 0) \<le> h x"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3183
    (is "\<forall>x\<in>_. ?f x \<le> _") for k
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3184
  proof safe
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3185
    fix x :: real assume x: "x \<ge> 0"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3186
    {
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3187
      fix x :: real and n :: nat assume x: "x \<le> of_nat n"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3188
      have "(1 - complex_of_real x / of_nat n) = complex_of_real ((1 - x / of_nat n))" by simp
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3189
      also have "norm \<dots> = \<bar>(1 - x / real n)\<bar>" by (subst norm_of_real) (rule refl)
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  3190
      also from x have "\<dots> = (1 - x / real n)" by (intro abs_of_nonneg) (simp_all add: field_split_simps)
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3191
      finally have "cmod (1 - complex_of_real x / of_nat n) = 1 - x / real n" .
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3192
    } note D = this
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3193
    from D[of x k] x
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3194
      have "?f x \<le> (if of_nat k \<ge> x \<and> k > 0 then x powr (Re z - 1) * (1 - x / real k) ^ k else 0)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3195
      by (auto simp: norm_mult norm_powr_real_powr norm_power intro!: mult_nonneg_nonneg)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3196
    also have "\<dots> \<le> x powr (Re z - 1) * exp  (-x)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3197
      by (auto intro!: mult_left_mono exp_ge_one_minus_x_over_n_power_n)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3198
    also from x have "\<dots> \<le> h x" by (rule le_h)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3199
    finally show "?f x \<le> h x" .
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3200
  qed
63594
bd218a9320b5 HOL-Multivariate_Analysis: rename theories for more descriptive names
hoelzl
parents: 63539
diff changeset
  3201
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3202
  have F: "h integrable_on {0..}" unfolding h_def
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3203
    by (rule integrable_Gamma_integral_bound) (insert assms x0(1), simp_all)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3204
  show ?thesis
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3205
    by (rule has_integral_dominated_convergence[OF B F E D C])
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3206
qed
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3207
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3208
lemma Gamma_integral_real:
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3209
  assumes x: "x > (0 :: real)"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3210
  shows   "((\<lambda>t. t powr (x - 1) / exp t) has_integral Gamma x) {0..}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3211
proof -
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3212
  have A: "((\<lambda>t. complex_of_real t powr (complex_of_real x - 1) /
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3213
          complex_of_real (exp t)) has_integral complex_of_real (Gamma x)) {0..}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3214
    using Gamma_integral_complex[of x] assms by (simp_all add: Gamma_complex_of_real powr_of_real)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3215
  have "((\<lambda>t. complex_of_real (t powr (x - 1) / exp t)) has_integral of_real (Gamma x)) {0..}"
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3216
    by (rule has_integral_eq[OF _ A]) (simp_all add: powr_of_real [symmetric])
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3217
  from has_integral_linear[OF this bounded_linear_Re] show ?thesis by (simp add: o_def)
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3218
qed
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3219
66526
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3220
lemma absolutely_integrable_Gamma_integral':
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3221
  assumes "Re z > 0"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3222
  shows   "(\<lambda>t. complex_of_real t powr (z - 1) / of_real (exp t)) absolutely_integrable_on {0<..}"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3223
  using absolutely_integrable_Gamma_integral [OF assms zero_less_one] by simp
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3224
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3225
lemma Gamma_integral_complex':
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3226
  assumes z: "Re z > 0"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3227
  shows   "((\<lambda>t. of_real t powr (z - 1) / of_real (exp t)) has_integral Gamma z) {0<..}"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3228
proof -
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3229
  have "((\<lambda>t. of_real t powr (z - 1) / of_real (exp t)) has_integral Gamma z) {0..}"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3230
    by (rule Gamma_integral_complex) fact+
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3231
  hence "((\<lambda>t. if t \<in> {0<..} then of_real t powr (z - 1) / of_real (exp t) else 0) 
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3232
           has_integral Gamma z) {0..}"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3233
    by (rule has_integral_spike [of "{0}", rotated 2]) auto
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3234
  also have "?this = ?thesis"
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3235
    by (subst has_integral_restrict) auto
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3236
  finally show ?thesis .
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3237
qed
322120e880c5 More material on infinite sums
eberlm <eberlm@in.tum.de>
parents: 66512
diff changeset
  3238
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3239
lemma Gamma_conv_nn_integral_real:
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3240
  assumes "s > (0::real)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3241
  shows   "Gamma s = nn_integral lborel (\<lambda>t. ennreal (indicator {0..} t * t powr (s - 1) / exp t))"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3242
  using nn_integral_has_integral_lebesgue[OF _ Gamma_integral_real[OF assms]] by simp
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3243
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3244
lemma integrable_Beta:
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3245
  assumes "a > 0" "b > (0::real)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3246
  shows   "set_integrable lborel {0..1} (\<lambda>t. t powr (a - 1) * (1 - t) powr (b - 1))"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3247
proof -
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3248
  define C where "C = max 1 ((1/2) powr (b - 1))"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3249
  define D where "D = max 1 ((1/2) powr (a - 1))"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3250
  have C: "(1 - x) powr (b - 1) \<le> C" if "x \<in> {0..1/2}" for x
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3251
  proof (cases "b < 1")
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3252
    case False
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3253
    with that have "(1 - x) powr (b - 1) \<le> (1 powr (b - 1))" by (intro powr_mono2) auto
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3254
    thus ?thesis by (auto simp: C_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3255
  qed (insert that, auto simp: max.coboundedI1 max.coboundedI2 powr_mono2' powr_mono2 C_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3256
  have D: "x powr (a - 1) \<le> D" if "x \<in> {1/2..1}" for x
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3257
  proof (cases "a < 1")
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3258
    case False
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3259
    with that have "x powr (a - 1) \<le> (1 powr (a - 1))" by (intro powr_mono2) auto
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3260
    thus ?thesis by (auto simp: D_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3261
  next
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3262
    case True
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3263
  qed (insert that, auto simp: max.coboundedI1 max.coboundedI2 powr_mono2' powr_mono2 D_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3264
  have [simp]: "C \<ge> 0" "D \<ge> 0" by (simp_all add: C_def D_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3265
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3266
  have I1: "set_integrable lborel {0..1/2} (\<lambda>t. t powr (a - 1) * (1 - t) powr (b - 1))"
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3267
    unfolding set_integrable_def
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3268
  proof (rule Bochner_Integration.integrable_bound[OF _ _ AE_I2])
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3269
    have "(\<lambda>t. t powr (a - 1)) integrable_on {0..1/2}"
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3270
      by (rule integrable_on_powr_from_0) (use assms in auto)
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3271
    hence "(\<lambda>t. t powr (a - 1)) absolutely_integrable_on {0..1/2}"
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3272
      by (subst absolutely_integrable_on_iff_nonneg) auto
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3273
    from integrable_mult_right[OF this [unfolded set_integrable_def], of C]
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3274
    show "integrable lborel (\<lambda>x. indicat_real {0..1/2} x *\<^sub>R (C * x powr (a - 1)))"
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3275
      by (subst (asm) integrable_completion) (auto simp: mult_ac)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3276
  next
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3277
    fix x :: real
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3278
    have "x powr (a - 1) * (1 - x) powr (b - 1) \<le> x powr (a - 1) * C" if "x \<in> {0..1/2}"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3279
      using that by (intro mult_left_mono powr_mono2 C) auto
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3280
    thus "norm (indicator {0..1/2} x *\<^sub>R (x powr (a - 1) * (1 - x) powr (b - 1))) \<le>
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3281
            norm (indicator {0..1/2} x *\<^sub>R (C * x powr (a - 1)))"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3282
      by (auto simp: indicator_def abs_mult mult_ac)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3283
  qed (auto intro!: AE_I2 simp: indicator_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3284
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3285
  have I2: "set_integrable lborel {1/2..1} (\<lambda>t. t powr (a - 1) * (1 - t) powr (b - 1))"
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3286
    unfolding set_integrable_def
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3287
  proof (rule Bochner_Integration.integrable_bound[OF _ _ AE_I2])
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3288
    have "(\<lambda>t. t powr (b - 1)) integrable_on {0..1/2}"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3289
      by (rule integrable_on_powr_from_0) (use assms in auto)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3290
    hence "(\<lambda>t. t powr (b - 1)) integrable_on (cbox 0 (1/2))" by simp
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3291
    from integrable_affinity[OF this, of "-1" 1]
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3292
      have "(\<lambda>t. (1 - t) powr (b - 1)) integrable_on {1/2..1}" by simp
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3293
    hence "(\<lambda>t. (1 - t) powr (b - 1)) absolutely_integrable_on {1/2..1}"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3294
      by (subst absolutely_integrable_on_iff_nonneg) auto
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3295
    from integrable_mult_right[OF this [unfolded set_integrable_def], of D]
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3296
    show "integrable lborel (\<lambda>x. indicat_real {1/2..1} x *\<^sub>R (D * (1 - x) powr (b - 1)))"
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3297
      by (subst (asm) integrable_completion) (auto simp: mult_ac)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3298
  next
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3299
    fix x :: real
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3300
    have "x powr (a - 1) * (1 - x) powr (b - 1) \<le> D * (1 - x) powr (b - 1)" if "x \<in> {1/2..1}"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3301
      using that by (intro mult_right_mono powr_mono2 D) auto
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3302
    thus "norm (indicator {1/2..1} x *\<^sub>R (x powr (a - 1) * (1 - x) powr (b - 1))) \<le>
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3303
            norm (indicator {1/2..1} x *\<^sub>R (D * (1 - x) powr (b - 1)))"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3304
      by (auto simp: indicator_def abs_mult mult_ac)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3305
  qed (auto intro!: AE_I2 simp: indicator_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3306
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3307
  have "set_integrable lborel ({0..1/2} \<union> {1/2..1}) (\<lambda>t. t powr (a - 1) * (1 - t) powr (b - 1))"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3308
    by (intro set_integrable_Un I1 I2) auto
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3309
  also have "{0..1/2} \<union> {1/2..1} = {0..(1::real)}" by auto
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3310
  finally show ?thesis .
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3311
qed
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3312
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3313
lemma integrable_Beta':
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3314
  assumes "a > 0" "b > (0::real)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3315
  shows   "(\<lambda>t. t powr (a - 1) * (1 - t) powr (b - 1)) integrable_on {0..1}"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3316
  using integrable_Beta[OF assms] by (rule set_borel_integral_eq_integral)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3317
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  3318
theorem has_integral_Beta_real:
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3319
  assumes a: "a > 0" and b: "b > (0 :: real)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3320
  shows "((\<lambda>t. t powr (a - 1) * (1 - t) powr (b - 1)) has_integral Beta a b) {0..1}"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3321
proof -
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3322
  define B where "B = integral {0..1} (\<lambda>x. x powr (a - 1) * (1 - x) powr (b - 1))"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3323
  have [simp]: "B \<ge> 0" unfolding B_def using a b
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3324
    by (intro integral_nonneg integrable_Beta') auto
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3325
  from a b have "ennreal (Gamma a * Gamma b) =
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3326
    (\<integral>\<^sup>+ t. ennreal (indicator {0..} t * t powr (a - 1) / exp t) \<partial>lborel) *
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3327
    (\<integral>\<^sup>+ t. ennreal (indicator {0..} t * t powr (b - 1) / exp t) \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3328
    by (subst ennreal_mult') (simp_all add: Gamma_conv_nn_integral_real)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3329
  also have "\<dots> = (\<integral>\<^sup>+t. \<integral>\<^sup>+u. ennreal (indicator {0..} t * t powr (a - 1) / exp t) *
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3330
                            ennreal (indicator {0..} u * u powr (b - 1) / exp u) \<partial>lborel \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3331
    by (simp add: nn_integral_cmult nn_integral_multc)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3332
  also have "\<dots> = (\<integral>\<^sup>+t. \<integral>\<^sup>+u. ennreal (indicator ({0..}\<times>{0..}) (t,u) * t powr (a - 1) * u powr (b - 1)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3333
                            / exp (t + u)) \<partial>lborel \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3334
    by (intro nn_integral_cong)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3335
       (auto simp: indicator_def divide_ennreal ennreal_mult' [symmetric] exp_add)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3336
  also have "\<dots> = (\<integral>\<^sup>+t. \<integral>\<^sup>+u. ennreal (indicator ({0..}\<times>{t..}) (t,u) * t powr (a - 1) * 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3337
                              (u - t) powr (b - 1) / exp u) \<partial>lborel \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3338
  proof (rule nn_integral_cong, goal_cases)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3339
    case (1 t)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3340
    have "(\<integral>\<^sup>+u. ennreal (indicator ({0..}\<times>{0..}) (t,u) * t powr (a - 1) * 
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 67278
diff changeset
  3341
                              u powr (b - 1) / exp (t + u)) \<partial>distr lborel borel ((+) (-t))) =
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3342
               (\<integral>\<^sup>+u. ennreal (indicator ({0..}\<times>{t..}) (t,u) * t powr (a - 1) * 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3343
                              (u - t) powr (b - 1) / exp u) \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3344
      by (subst nn_integral_distr) (auto intro!: nn_integral_cong simp: indicator_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3345
    thus ?case by (subst (asm) lborel_distr_plus)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3346
  qed
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3347
  also have "\<dots> = (\<integral>\<^sup>+u. \<integral>\<^sup>+t. ennreal (indicator ({0..}\<times>{t..}) (t,u) * t powr (a - 1) * 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3348
                              (u - t) powr (b - 1) / exp u) \<partial>lborel \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3349
    by (subst lborel_pair.Fubini')
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3350
       (auto simp: case_prod_unfold indicator_def cong: measurable_cong_sets)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3351
  also have "\<dots> = (\<integral>\<^sup>+u. \<integral>\<^sup>+t. ennreal (indicator {0..u} t * t powr (a - 1) * (u - t) powr (b - 1)) *
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3352
                              ennreal (indicator {0..} u / exp u) \<partial>lborel \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3353
    by (intro nn_integral_cong) (auto simp: indicator_def ennreal_mult' [symmetric])
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3354
  also have "\<dots> = (\<integral>\<^sup>+u. (\<integral>\<^sup>+t. ennreal (indicator {0..u} t * t powr (a - 1) * (u - t) powr (b - 1)) 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3355
                          \<partial>lborel) * ennreal (indicator {0..} u / exp u) \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3356
    by (subst nn_integral_multc [symmetric]) auto 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3357
  also have "\<dots> = (\<integral>\<^sup>+u. (\<integral>\<^sup>+t. ennreal (indicator {0..u} t * t powr (a - 1) * (u - t) powr (b - 1)) 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3358
                          \<partial>lborel) * ennreal (indicator {0<..} u / exp u) \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3359
    by (intro nn_integral_cong_AE eventually_mono[OF AE_lborel_singleton[of 0]]) 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3360
       (auto simp: indicator_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3361
  also have "\<dots> = (\<integral>\<^sup>+u. ennreal B * ennreal (indicator {0..} u / exp u * u powr (a + b - 1)) \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3362
  proof (intro nn_integral_cong, goal_cases)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3363
    case (1 u)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3364
    show ?case
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3365
    proof (cases "u > 0")
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3366
      case True
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3367
      have "(\<integral>\<^sup>+t. ennreal (indicator {0..u} t * t powr (a - 1) * (u - t) powr (b - 1)) \<partial>lborel) = 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3368
              (\<integral>\<^sup>+t. ennreal (indicator {0..1} t * (u * t) powr (a - 1) * (u - u * t) powr (b - 1)) 
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 68721
diff changeset
  3369
                \<partial>distr lborel borel ((*) (1 / u)))" (is "_ = nn_integral _ ?f")
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3370
        using True
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3371
        by (subst nn_integral_distr) (auto simp: indicator_def field_simps intro!: nn_integral_cong)
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 68721
diff changeset
  3372
      also have "distr lborel borel ((*) (1 / u)) = density lborel (\<lambda>_. u)"
67278
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3373
        using \<open>u > 0\<close> by (subst lborel_distr_mult) auto
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3374
      also have "nn_integral \<dots> ?f = (\<integral>\<^sup>+x. ennreal (indicator {0..1} x * (u * (u * x) powr (a - 1) *
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3375
                                              (u * (1 - x)) powr (b - 1))) \<partial>lborel)" using \<open>u > 0\<close>
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3376
        by (subst nn_integral_density) (auto simp: ennreal_mult' [symmetric] algebra_simps)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3377
      also have "\<dots> = (\<integral>\<^sup>+x. ennreal (u powr (a + b - 1)) * 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3378
                            ennreal (indicator {0..1} x * x powr (a - 1) *
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3379
                                       (1 - x) powr (b - 1)) \<partial>lborel)" using \<open>u > 0\<close> a b
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3380
        by (intro nn_integral_cong)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3381
           (auto simp: indicator_def powr_mult powr_add powr_diff mult_ac ennreal_mult' [symmetric])
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3382
      also have "\<dots> = ennreal (u powr (a + b - 1)) * 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3383
                        (\<integral>\<^sup>+x. ennreal (indicator {0..1} x * x powr (a - 1) *
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3384
                                         (1 - x) powr (b - 1)) \<partial>lborel)"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3385
        by (subst nn_integral_cmult) auto
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3386
      also have "((\<lambda>x. x powr (a - 1) * (1 - x) powr (b - 1)) has_integral 
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3387
                   integral {0..1} (\<lambda>x. x powr (a - 1) * (1 - x) powr (b - 1))) {0..1}"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3388
        using a b by (intro integrable_integral integrable_Beta')
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3389
      from nn_integral_has_integral_lebesgue[OF _ this] a b
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3390
        have "(\<integral>\<^sup>+x. ennreal (indicator {0..1} x * x powr (a - 1) *
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3391
                         (1 - x) powr (b - 1)) \<partial>lborel) = B" by (simp add: mult_ac B_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3392
      finally show ?thesis using \<open>u > 0\<close> by (simp add: ennreal_mult' [symmetric] mult_ac)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3393
    qed auto
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3394
  qed
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3395
  also have "\<dots> = ennreal B * ennreal (Gamma (a + b))"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3396
    using a b by (subst nn_integral_cmult) (auto simp: Gamma_conv_nn_integral_real)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3397
  also have "\<dots> = ennreal (B * Gamma (a + b))"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3398
    by (subst (1 2) mult.commute, intro ennreal_mult' [symmetric]) (use a b in auto)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3399
  finally have "B = Beta a b" using a b Gamma_real_pos[of "a + b"]
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3400
    by (subst (asm) ennreal_inj) (auto simp: field_simps Beta_def Gamma_eq_zero_iff)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3401
  moreover have "(\<lambda>t. t powr (a - 1) * (1 - t) powr (b - 1)) integrable_on {0..1}"
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3402
    by (intro integrable_Beta' a b)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3403
  ultimately show ?thesis by (simp add: has_integral_iff B_def)
c60e3d615b8c Removed Analysis/ex/Circle_Area; replaced by more general Analysis/Ball_Volume
eberlm <eberlm@in.tum.de>
parents: 66936
diff changeset
  3404
qed
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3405
83346
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3406
lemma Beta_real_mono:
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3407
  fixes a b c d :: real
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3408
  assumes "0 < c" "c \<le> a" "0 < d" "d \<le> b"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3409
  shows "Beta a b \<le> Beta c d"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3410
proof (rule has_integral_le)
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3411
  show "((\<lambda>x. x powr (a - 1) * (1 - x) powr (b - 1)) has_integral Beta a b) {0<..<1}"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3412
    using has_integral_Beta_real[of a b] assms by (simp add: has_integral_Icc_iff_Ioo)
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3413
  show "((\<lambda>x. x powr (c - 1) * (1 - x) powr (d - 1)) has_integral Beta c d) {0<..<1}"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3414
    using has_integral_Beta_real[of c d] assms by (simp add: has_integral_Icc_iff_Ioo)
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3415
  show "x powr (a - 1) * (1 - x) powr (b - 1) \<le> x powr (c - 1) * (1 - x) powr (d - 1)" 
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3416
    if "x \<in> {0<..<1}" for x :: real
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3417
    by (intro mult_mono powr_mono') (use assms that in auto)
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3418
qed
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3419
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3420
lemma Beta_complex_of_real: "Beta (of_real a) (of_real b) = complex_of_real (Beta a b)"
face91576082 Lots of new material from Manuel Eberl
paulson <lp15@cam.ac.uk>
parents: 82519
diff changeset
  3421
  unfolding Beta_def by (simp flip: Gamma_complex_of_real)
63296
3951a15a05d1 Integral form of Gamma function
eberlm
parents: 63295
diff changeset
  3422
72318
bc97bd4c0474 prefer old-fashioned {\ss} to prevent problems with encoding in lualatex;
wenzelm
parents: 71633
diff changeset
  3423
subsection \<open>The Weierstra{\ss} product formula for the sine\<close>
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  3424
68624
205d352ed727 Tagged Ball_Volume and Gamma_Function in HOL-Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 68403
diff changeset
  3425
theorem sin_product_formula_complex:
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3426
  fixes z :: complex
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3427
  shows "(\<lambda>n. of_real pi * z * (\<Prod>k=1..n. 1 - z^2 / of_nat k^2)) \<longlonglongrightarrow> sin (of_real pi * z)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3428
proof -
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  3429
  let ?f = "rGamma_series_Weierstrass"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3430
  have "(\<lambda>n. (- of_real pi * inverse z) * (?f z n * ?f (- z) n))
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3431
            \<longlonglongrightarrow> (- of_real pi * inverse z) * (rGamma z * rGamma (- z))"
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  3432
    by (intro tendsto_intros rGamma_Weierstrass_complex)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3433
  also have "(\<lambda>n. (- of_real pi * inverse z) * (?f z n * ?f (-z) n)) =
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3434
                    (\<lambda>n. of_real pi * z * (\<Prod>k=1..n. 1 - z^2 / of_nat k ^ 2))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3435
  proof
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3436
    fix n :: nat
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3437
    have "(- of_real pi * inverse z) * (?f z n * ?f (-z) n) =
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3438
              of_real pi * z * (\<Prod>k=1..n. (of_nat k - z) * (of_nat k + z) / of_nat k ^ 2)"
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  3439
      by (simp add: rGamma_series_Weierstrass_def mult_ac exp_minus
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  3440
                    divide_simps prod.distrib[symmetric] power2_eq_square)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3441
    also have "(\<Prod>k=1..n. (of_nat k - z) * (of_nat k + z) / of_nat k ^ 2) =
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3442
                 (\<Prod>k=1..n. 1 - z^2 / of_nat k ^ 2)"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  3443
      by (intro prod.cong) (simp_all add: power2_eq_square field_simps)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3444
    finally show "(- of_real pi * inverse z) * (?f z n * ?f (-z) n) = of_real pi * z * \<dots>"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  3445
      by (simp add: field_split_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3446
  qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3447
  also have "(- of_real pi * inverse z) * (rGamma z * rGamma (- z)) = sin (of_real pi * z)"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  3448
    by (subst rGamma_reflection_complex') (simp add: field_split_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3449
  finally show ?thesis .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3450
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3451
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3452
lemma sin_product_formula_real:
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3453
  "(\<lambda>n. pi * (x::real) * (\<Prod>k=1..n. 1 - x^2 / of_nat k^2)) \<longlonglongrightarrow> sin (pi * x)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3454
proof -
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3455
  from sin_product_formula_complex[of "of_real x"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3456
    have "(\<lambda>n. of_real pi * of_real x * (\<Prod>k=1..n. 1 - (of_real x)^2 / (of_nat k)^2))
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3457
              \<longlonglongrightarrow> sin (of_real pi * of_real x :: complex)" (is "?f \<longlonglongrightarrow> ?y") .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3458
  also have "?f = (\<lambda>n. of_real (pi * x * (\<Prod>k=1..n. 1 - x^2 / (of_nat k^2))))" by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3459
  also have "?y = of_real (sin (pi * x))" by (simp only: sin_of_real [symmetric] of_real_mult)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3460
  finally show ?thesis by (subst (asm) tendsto_of_real_iff)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3461
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3462
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3463
lemma sin_product_formula_real':
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3464
  assumes "x \<noteq> (0::real)"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3465
  shows   "(\<lambda>n. (\<Prod>k=1..n. 1 - x^2 / of_nat k^2)) \<longlonglongrightarrow> sin (pi * x) / (pi * x)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3466
  using tendsto_divide[OF sin_product_formula_real[of x] tendsto_const[of "pi * x"]] assms
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3467
  by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3468
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  3469
theorem wallis: "(\<lambda>n. \<Prod>k=1..n. (4*real k^2) / (4*real k^2 - 1)) \<longlonglongrightarrow> pi / 2"
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  3470
proof -
66512
89b6455b63b6 starting to unscramble bounded_variation_absolutely_integrable_interval
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
  3471
  from tendsto_inverse[OF tendsto_mult[OF
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  3472
         sin_product_formula_real[of "1/2"] tendsto_const[of "2/pi"]]]
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3473
    have "(\<lambda>n. (\<Prod>k=1..n. inverse (1 - (1/2)\<^sup>2 / (real k)\<^sup>2))) \<longlonglongrightarrow> pi/2"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  3474
    by (simp add: prod_inversef [symmetric])
67976
75b94eb58c3d Analysis builds using set_borel_measurable_def, etc.
paulson <lp15@cam.ac.uk>
parents: 67399
diff changeset
  3475
  also have "(\<lambda>n. (\<Prod>k=1..n. inverse (1 - (1/2)\<^sup>2 / (real k)\<^sup>2))) =
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  3476
               (\<lambda>n. (\<Prod>k=1..n. (4*real k^2)/(4*real k^2 - 1)))"
70817
dd675800469d dedicated fact collections for algebraic simplification rules potentially splitting goals
haftmann
parents: 70707
diff changeset
  3477
    by (intro ext prod.cong refl) (simp add: field_split_simps)
63721
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  3478
  finally show ?thesis .
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  3479
qed
492bb53c3420 More analysis lemmas
Manuel Eberl <eberlm@in.tum.de>
parents: 63627
diff changeset
  3480
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  3481
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  3482
subsection \<open>The Solution to the Basel problem\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 62072
diff changeset
  3483
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3484
theorem inverse_squares_sums: "(\<lambda>n. 1 / (n + 1)\<^sup>2) sums (pi\<^sup>2 / 6)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3485
proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
  3486
  define P where "P x n = (\<Prod>k=1..n. 1 - x^2 / of_nat k^2)" for x :: real and n
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
  3487
  define K where "K = (\<Sum>n. inverse (real_of_nat (Suc n))^2)"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
  3488
  define f where [abs_def]: "f x = (\<Sum>n. P x n / of_nat (Suc n)^2)" for x
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
  3489
  define g where [abs_def]: "g x = (1 - sin (pi * x) / (pi * x))" for x
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3490
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3491
  have sums: "(\<lambda>n. P x n / of_nat (Suc n)^2) sums (if x = 0 then K else g x / x^2)" for x
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3492
  proof (cases "x = 0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3493
    assume x: "x = 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3494
    have "summable (\<lambda>n. inverse ((real_of_nat (Suc n))\<^sup>2))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3495
      using inverse_power_summable[of 2] by (subst summable_Suc_iff) simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3496
    thus ?thesis by (simp add: x g_def P_def K_def inverse_eq_divide power_divide summable_sums)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3497
  next
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3498
    assume x: "x \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3499
    have "(\<lambda>n. P x n - P x (Suc n)) sums (P x 0 - sin (pi * x) / (pi * x))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3500
      unfolding P_def using x by (intro telescope_sums' sin_product_formula_real')
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3501
    also have "(\<lambda>n. P x n - P x (Suc n)) = (\<lambda>n. (x^2 / of_nat (Suc n)^2) * P x n)"
70113
c8deb8ba6d05 Fixing the main Homology theory; also moving a lot of sum/prod lemmas into their generic context
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
  3502
      unfolding P_def by (simp add: prod.nat_ivl_Suc' algebra_simps)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3503
    also have "P x 0 = 1" by (simp add: P_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3504
    finally have "(\<lambda>n. x\<^sup>2 / (of_nat (Suc n))\<^sup>2 * P x n) sums (1 - sin (pi * x) / (pi * x))" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3505
    from sums_divide[OF this, of "x^2"] x show ?thesis unfolding g_def by simp
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3506
  qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3507
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3508
  have "continuous_on (ball 0 1) f"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3509
  proof (rule uniform_limit_theorem; (intro always_eventually allI)?)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3510
    show "uniform_limit (ball 0 1) (\<lambda>n x. \<Sum>k<n. P x k / of_nat (Suc k)^2) f sequentially"
69529
4ab9657b3257 capitalize proper names in lemma names
nipkow
parents: 69260
diff changeset
  3511
    proof (unfold f_def, rule Weierstrass_m_test)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3512
      fix n :: nat and x :: real assume x: "x \<in> ball 0 1"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3513
      {
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3514
        fix k :: nat assume k: "k \<ge> 1"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  3515
        from x have "x^2 < 1" by (auto simp: abs_square_less_1)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3516
        also from k have "\<dots> \<le> of_nat k^2" by simp
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3517
        finally have "(1 - x^2 / of_nat k^2) \<in> {0..1}" using k
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3518
          by (simp_all add: field_simps del: of_nat_Suc)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3519
      }
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  3520
      hence "(\<Prod>k=1..n. abs (1 - x^2 / of_nat k^2)) \<le> (\<Prod>k=1..n. 1)" by (intro prod_mono) simp
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3521
      thus "norm (P x n / (of_nat (Suc n)^2)) \<le> 1 / of_nat (Suc n)^2"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
  3522
        unfolding P_def by (simp add: field_simps abs_prod del: of_nat_Suc)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3523
    qed (subst summable_Suc_iff, insert inverse_power_summable[of 2], simp add: inverse_eq_divide)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3524
  qed (auto simp: P_def intro!: continuous_intros)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3525
  hence "isCont f 0" by (subst (asm) continuous_on_eq_continuous_at) simp_all
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3526
  hence "(f \<midarrow> 0 \<rightarrow> f 0)" by (simp add: isCont_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3527
  also have "f 0 = K" unfolding f_def P_def K_def by (simp add: inverse_eq_divide power_divide)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3528
  finally have "f \<midarrow> 0 \<rightarrow> K" .
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3529
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3530
  moreover have "f \<midarrow> 0 \<rightarrow> pi^2 / 6"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3531
  proof (rule Lim_transform_eventually)
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62534
diff changeset
  3532
    define f' where [abs_def]: "f' x = (\<Sum>n. - sin_coeff (n+3) * pi ^ (n+2) * x^n)" for x
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3533
    have "eventually (\<lambda>x. x \<noteq> (0::real)) (at 0)"
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3534
      by (auto simp add: eventually_at intro!: exI[of _ 1])
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3535
    thus "eventually (\<lambda>x. f' x = f x) (at 0)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3536
    proof eventually_elim
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3537
      fix x :: real assume x: "x \<noteq> 0"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3538
      have "sin_coeff 1 = (1 :: real)" "sin_coeff 2 = (0::real)" by (simp_all add: sin_coeff_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3539
      with sums_split_initial_segment[OF sums_minus[OF sin_converges], of 3 "pi*x"]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3540
      have "(\<lambda>n. - (sin_coeff (n+3) * (pi*x)^(n+3))) sums (pi * x - sin (pi*x))"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3541
        by (simp add: eval_nat_numeral)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3542
      from sums_divide[OF this, of "x^3 * pi"] x
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3543
        have "(\<lambda>n. - (sin_coeff (n+3) * pi^(n+2) * x^n)) sums ((1 - sin (pi*x) / (pi*x)) / x^2)"
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  3544
        by (simp add: field_split_simps eval_nat_numeral)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3545
      with x have "(\<lambda>n. - (sin_coeff (n+3) * pi^(n+2) * x^n)) sums (g x / x^2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3546
        by (simp add: g_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3547
      hence "f' x = g x / x^2" by (simp add: sums_iff f'_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3548
      also have "\<dots> = f x" using sums[of x] x by (simp add: sums_iff g_def f_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3549
      finally show "f' x = f x" .
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3550
    qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3551
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3552
    have "isCont f' 0" unfolding f'_def
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3553
    proof (intro isCont_powser_converges_everywhere)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3554
      fix x :: real show "summable (\<lambda>n. -sin_coeff (n+3) * pi^(n+2) * x^n)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3555
      proof (cases "x = 0")
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3556
        assume x: "x \<noteq> 0"
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3557
        from summable_divide[OF sums_summable[OF sums_split_initial_segment[OF
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3558
               sin_converges[of "pi*x"]], of 3], of "-pi*x^3"] x
71633
07bec530f02e cleaned proofs
nipkow
parents: 71189
diff changeset
  3559
          show ?thesis by (simp add: field_split_simps eval_nat_numeral)
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3560
      qed (simp only: summable_0_powser)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3561
    qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3562
    hence "f' \<midarrow> 0 \<rightarrow> f' 0" by (simp add: isCont_def)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3563
    also have "f' 0 = pi * pi / fact 3" unfolding f'_def
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3564
      by (subst powser_zero) (simp add: sin_coeff_def)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3565
    finally show "f' \<midarrow> 0 \<rightarrow> pi^2 / 6" by (simp add: eval_nat_numeral)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3566
  qed
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3567
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3568
  ultimately have "K = pi^2 / 6" by (rule LIM_unique)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3569
  moreover from inverse_power_summable[of 2]
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3570
    have "summable (\<lambda>n. (inverse (real_of_nat (Suc n)))\<^sup>2)"
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3571
    by (subst summable_Suc_iff) (simp add: power_inverse)
62131
1baed43f453e nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
paulson
parents: 62085
diff changeset
  3572
  ultimately show ?thesis unfolding K_def
62049
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3573
    by (auto simp add: sums_iff power_divide inverse_eq_divide)
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3574
qed
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3575
b0f941e207cf Added lots of material on infinite sums, convergence radii, harmonic numbers, Gamma function
eberlm
parents:
diff changeset
  3576
end