src/HOL/Analysis/ex/Approximations.thy
author paulson <lp15@cam.ac.uk>
Wed, 10 Apr 2019 23:12:16 +0100
changeset 70114 089c17514794
parent 70113 c8deb8ba6d05
child 70817 dd675800469d
permissions -rw-r--r--
prod/sum fixes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
     1
section \<open>Numeric approximations to Constants\<close>
59871
e1a49ac9c537 John Harrison's example: a 32-bit approximation to pi. SLOW
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     2
e1a49ac9c537 John Harrison's example: a 32-bit approximation to pi. SLOW
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     3
theory Approximations
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 64272
diff changeset
     4
imports "HOL-Analysis.Complex_Transcendental" "HOL-Analysis.Harmonic_Numbers"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
     5
begin
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
     6
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
     7
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
     8
  In this theory, we will approximate some standard mathematical constants with high precision,
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
     9
  using only Isabelle's simplifier. (no oracles, code generator, etc.)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    10
  
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    11
  The constants we will look at are: $\pi$, $e$, $\ln 2$, and $\gamma$ (the Euler--Mascheroni
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    12
  constant).
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    13
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    14
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    15
lemma eval_fact:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    16
  "fact 0 = 1"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    17
  "fact (Suc 0) = 1"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    18
  "fact (numeral n) = numeral n * fact (pred_numeral n)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    19
  by (simp, simp, simp_all only: numeral_eq_Suc fact_Suc,
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    20
      simp only: numeral_eq_Suc [symmetric] of_nat_numeral)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    21
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63918
diff changeset
    22
lemma sum_poly_horner_expand:
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    23
  "(\<Sum>k<(numeral n::nat). f k * x^k) = f 0 + (\<Sum>k<pred_numeral n. f (k+1) * x^k) * x"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    24
  "(\<Sum>k<Suc 0. f k * x^k) = (f 0 :: 'a :: semiring_1)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    25
  "(\<Sum>k<(0::nat). f k * x^k) = 0"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    26
proof -
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    27
  {
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    28
    fix m :: nat
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    29
    have "(\<Sum>k<Suc m. f k * x^k) = f 0 + (\<Sum>k=Suc 0..<Suc m. f k * x^k)"
70097
4005298550a6 The last big tranche of Homology material: invariance of domain; renamings to use generic sum/prod lemmas from their locale
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
    30
      by (subst atLeast0LessThan [symmetric], subst sum.atLeast_Suc_lessThan) simp_all
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    31
    also have "(\<Sum>k=Suc 0..<Suc m. f k * x^k) = (\<Sum>k<m. f (k+1) * x^k) * x"
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: 70097
diff changeset
    32
      by (subst sum.shift_bounds_Suc_ivl)
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63918
diff changeset
    33
         (simp add: sum_distrib_right algebra_simps atLeast0LessThan power_commutes)
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    34
    finally have "(\<Sum>k<Suc m. f k * x ^ k) = f 0 + (\<Sum>k<m. f (k + 1) * x ^ k) * x" .
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    35
  }
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    36
  from this[of "pred_numeral n"]
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    37
    show "(\<Sum>k<numeral n. f k * x^k) = f 0 + (\<Sum>k<pred_numeral n. f (k+1) * x^k) * x"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    38
    by (simp add: numeral_eq_Suc)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    39
qed simp_all
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    40
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    41
lemma power_less_one:
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    42
  assumes "n > 0" "x \<ge> 0" "x < 1"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    43
  shows   "x ^ n < (1::'a::linordered_semidom)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    44
proof -
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    45
  from assms consider "x > 0" | "x = 0" by force
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    46
  thus ?thesis
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    47
  proof cases
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    48
    assume "x > 0"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    49
    with assms show ?thesis
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    50
      by (cases n) (simp, hypsubst, rule power_Suc_less_one)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    51
  qed (insert assms, cases n, simp_all)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    52
qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    53
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    54
lemma combine_bounds:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    55
  "x \<in> {a1..b1} \<Longrightarrow> y \<in> {a2..b2} \<Longrightarrow> a3 = a1 + a2 \<Longrightarrow> b3 = b1 + b2 \<Longrightarrow> x + y \<in> {a3..(b3::real)}"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    56
  "x \<in> {a1..b1} \<Longrightarrow> y \<in> {a2..b2} \<Longrightarrow> a3 = a1 - b2 \<Longrightarrow> b3 = b1 - a2 \<Longrightarrow> x - y \<in> {a3..(b3::real)}"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    57
  "c \<ge> 0 \<Longrightarrow> x \<in> {a..b} \<Longrightarrow> c * x \<in> {c*a..c*b}"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    58
  by (auto simp: mult_left_mono)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    59
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    60
lemma approx_coarsen:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    61
  "\<bar>x - a1\<bar> \<le> eps1 \<Longrightarrow> \<bar>a1 - a2\<bar> \<le> eps2 - eps1 \<Longrightarrow> \<bar>x - a2\<bar> \<le> (eps2 :: real)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    62
  by simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    63
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    64
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    65
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    66
subsection \<open>Approximations of the exponential function\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    67
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    68
lemma two_power_fact_le_fact:
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    69
  assumes "n \<ge> 1"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    70
  shows   "2^k * fact n \<le> (fact (n + k) :: 'a :: {semiring_char_0,linordered_semidom})"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    71
proof (induction k)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    72
  case (Suc k)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    73
  have "2 ^ Suc k * fact n = 2 * (2 ^ k * fact n)" by (simp add: algebra_simps)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    74
  also note Suc.IH
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    75
  also from assms have "of_nat 1 + of_nat 1 \<le> of_nat n + (of_nat (Suc k) :: 'a)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    76
    by (intro add_mono) (unfold of_nat_le_iff, simp_all)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    77
  hence "2 * (fact (n + k) :: 'a) \<le> of_nat (n + Suc k) * fact (n + k)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    78
    by (intro mult_right_mono) (simp_all add: add_ac)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    79
  also have "\<dots> = fact (n + Suc k)" by simp
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    80
  finally show ?case by - (simp add: mult_left_mono)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    81
qed simp_all
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
    82
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    83
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    84
  We approximate the exponential function with inputs between $0$ and $2$ by its
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    85
  Taylor series expansion and bound the error term with $0$ from below and with a 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    86
  geometric series from above.
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    87
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    88
lemma exp_approx:
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    89
  assumes "n > 0" "0 \<le> x" "x < 2"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    90
  shows   "exp (x::real) - (\<Sum>k<n. x^k / fact k) \<in> {0..(2 * x^n / (2 - x)) / fact n}"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    91
proof (unfold atLeastAtMost_iff, safe)
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
    92
  define approx where "approx = (\<Sum>k<n. x^k / fact k)"
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    93
  have "(\<lambda>k. x^k / fact k) sums exp x"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    94
    using exp_converges[of x] by (simp add: field_simps)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    95
  from sums_split_initial_segment[OF this, of n]
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    96
    have sums: "(\<lambda>k. x^n * (x^k / fact (n+k))) sums (exp x - approx)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    97
    by (simp add: approx_def algebra_simps power_add)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    98
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
    99
  from assms show "(exp x - approx) \<ge> 0"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   100
    by (intro sums_le[OF _ sums_zero sums]) auto
59871
e1a49ac9c537 John Harrison's example: a 32-bit approximation to pi. SLOW
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   101
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   102
  have "\<forall>k. x^n * (x^k / fact (n+k)) \<le> (x^n / fact n) * (x / 2)^k"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   103
  proof
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   104
    fix k :: nat
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   105
    have "x^n * (x^k / fact (n + k)) = x^(n+k) / fact (n + k)" by (simp add: power_add)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   106
    also from assms have "\<dots> \<le> x^(n+k) / (2^k * fact n)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   107
      by (intro divide_left_mono two_power_fact_le_fact zero_le_power) simp_all
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   108
    also have "\<dots> = (x^n / fact n) * (x / 2) ^ k"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   109
      by (simp add: field_simps power_add)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   110
    finally show "x^n * (x^k / fact (n+k)) \<le> (x^n / fact n) * (x / 2)^k" .
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   111
  qed
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   112
  moreover note sums
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   113
  moreover {
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   114
    from assms have "(\<lambda>k. (x^n / fact n) * (x / 2)^k) sums ((x^n / fact n) * (1 / (1 - x / 2)))"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   115
      by (intro sums_mult geometric_sums) simp_all
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   116
    also from assms have "((x^n / fact n) * (1 / (1 - x / 2))) = (2 * x^n / (2 - x)) / fact n"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   117
      by (auto simp: divide_simps)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   118
    finally have "(\<lambda>k. (x^n / fact n) * (x / 2)^k) sums \<dots>" .
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   119
  }
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   120
  ultimately show "(exp x - approx) \<le> (2 * x^n / (2 - x)) / fact n"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   121
    by (rule sums_le)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   122
qed
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   123
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   124
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   125
  The following variant gives a simpler error estimate for inputs between $0$ and $1$:  
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   126
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   127
lemma exp_approx':
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   128
  assumes "n > 0" "0 \<le> x" "x \<le> 1"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   129
  shows   "\<bar>exp (x::real) - (\<Sum>k\<le>n. x^k / fact k)\<bar> \<le> x ^ n / fact n"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   130
proof -
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   131
  from assms have "x^n / (2 - x) \<le> x^n / 1" by (intro frac_le) simp_all 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   132
  hence "(2 * x^n / (2 - x)) / fact n \<le> 2 * x^n / fact n"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   133
    using assms by (simp add: divide_simps)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   134
  with exp_approx[of n x] assms
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   135
    have "exp (x::real) - (\<Sum>k<n. x^k / fact k) \<in> {0..2 * x^n / fact n}" by simp
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   136
  moreover have "(\<Sum>k\<le>n. x^k / fact k) = (\<Sum>k<n. x^k / fact k) + x ^ n / fact n"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   137
    by (simp add: lessThan_Suc_atMost [symmetric])
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   138
  ultimately show "\<bar>exp (x::real) - (\<Sum>k\<le>n. x^k / fact k)\<bar> \<le> x ^ n / fact n"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   139
    unfolding atLeastAtMost_iff by linarith
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   140
qed
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   141
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   142
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   143
  By adding $x^n / n!$ to the approximation (i.e. taking one more term from the
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   144
  Taylor series), one can get the error bound down to $x^n / n!$.
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   145
  
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   146
  This means that the number of accurate binary digits produced by the approximation is
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   147
  asymptotically equal to $(n \log n - n) / \log 2$ by Stirling's formula.
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   148
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   149
lemma exp_approx'':
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   150
  assumes "n > 0" "0 \<le> x" "x \<le> 1"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   151
  shows   "\<bar>exp (x::real) - (\<Sum>k\<le>n. x^k / fact k)\<bar> \<le> 1 / fact n"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   152
proof -
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   153
  from assms have "\<bar>exp x - (\<Sum>k\<le>n. x ^ k / fact k)\<bar> \<le> x ^ n / fact n"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   154
    by (rule exp_approx')
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   155
  also from assms have "\<dots> \<le> 1 / fact n" by (simp add: divide_simps power_le_one)
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   156
  finally show ?thesis .
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   157
qed
59871
e1a49ac9c537 John Harrison's example: a 32-bit approximation to pi. SLOW
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   158
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   159
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   160
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   161
  We now define an approximation function for Euler's constant $e$.  
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   162
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   163
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   164
definition euler_approx :: "nat \<Rightarrow> real" where
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   165
  "euler_approx n = (\<Sum>k\<le>n. inverse (fact k))"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   166
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   167
definition euler_approx_aux :: "nat \<Rightarrow> nat" where
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   168
  "euler_approx_aux n = (\<Sum>k\<le>n. \<Prod>{k + 1..n})"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   169
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   170
lemma exp_1_approx:
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   171
  "n > 0 \<Longrightarrow> \<bar>exp (1::real) - euler_approx n\<bar> \<le> 1 / fact n"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   172
  using exp_approx''[of n 1] by (simp add: euler_approx_def divide_simps)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   173
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   174
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   175
  The following allows us to compute the numerator and the denominator of the result
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   176
  separately, which greatly reduces the amount of rational number arithmetic that we
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   177
  have to do.
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   178
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   179
lemma euler_approx_altdef [code]:
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   180
  "euler_approx n = real (euler_approx_aux n) / real (fact n)"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   181
proof -
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   182
  have "real (\<Sum>k\<le>n. \<Prod>{k+1..n}) = (\<Sum>k\<le>n. \<Prod>i=k+1..n. real i)" by simp
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   183
  also have "\<dots> / fact n = (\<Sum>k\<le>n. 1 / (fact n / (\<Prod>i=k+1..n. real i)))"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63918
diff changeset
   184
    by (simp add: sum_divide_distrib)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   185
  also have "\<dots> = (\<Sum>k\<le>n. 1 / fact k)"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63918
diff changeset
   186
  proof (intro sum.cong refl)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   187
    fix k assume k: "k \<in> {..n}"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   188
    have "fact n = (\<Prod>i=1..n. real i)" by (simp add: fact_prod)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   189
    also from k have "{1..n} = {1..k} \<union> {k+1..n}" by auto
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   190
    also have "prod real \<dots> / (\<Prod>i=k+1..n. real i) = (\<Prod>i=1..k. real i)"
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   191
      by (subst nonzero_divide_eq_eq, simp, subst prod.union_disjoint [symmetric]) auto
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   192
    also have "\<dots> = fact k" by (simp add: fact_prod)
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   193
    finally show "1 / (fact n / prod real {k + 1..n}) = 1 / fact k" by simp
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   194
  qed
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   195
  also have "\<dots> = euler_approx n" by (simp add: euler_approx_def field_simps)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   196
  finally show ?thesis by (simp add: euler_approx_aux_def)
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   197
qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   198
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   199
lemma euler_approx_aux_Suc:
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   200
  "euler_approx_aux (Suc m) = 1 + Suc m * euler_approx_aux m"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   201
  unfolding euler_approx_aux_def
70114
089c17514794 prod/sum fixes
paulson <lp15@cam.ac.uk>
parents: 70113
diff changeset
   202
  by (subst sum_distrib_left) (simp add: atLeastAtMostSuc_conv mult.commute)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   203
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   204
lemma eval_euler_approx_aux:
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   205
  "euler_approx_aux 0 = 1"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   206
  "euler_approx_aux 1 = 2"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   207
  "euler_approx_aux (Suc 0) = 2"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   208
  "euler_approx_aux (numeral n) = 1 + numeral n * euler_approx_aux (pred_numeral n)" (is "?th")
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   209
proof -
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   210
  have A: "euler_approx_aux (Suc m) = 1 + Suc m * euler_approx_aux m" for m :: nat
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   211
    unfolding euler_approx_aux_def
70114
089c17514794 prod/sum fixes
paulson <lp15@cam.ac.uk>
parents: 70113
diff changeset
   212
    by (subst sum_distrib_left) (simp add: atLeastAtMostSuc_conv mult.commute)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   213
  show ?th by (subst numeral_eq_Suc, subst A, subst numeral_eq_Suc [symmetric]) simp
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   214
qed (simp_all add: euler_approx_aux_def)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   215
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   216
lemma euler_approx_aux_code [code]:
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   217
  "euler_approx_aux n = (if n = 0 then 1 else 1 + n * euler_approx_aux (n - 1))"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   218
  by (cases n) (simp_all add: eval_euler_approx_aux euler_approx_aux_Suc)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   219
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   220
lemmas eval_euler_approx = euler_approx_altdef eval_euler_approx_aux
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   221
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   222
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   223
text \<open>Approximations of $e$ to 60 decimals / 128 and 64 bits:\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   224
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   225
lemma euler_60_decimals:
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   226
  "\<bar>exp 1 - 2.718281828459045235360287471352662497757247093699959574966968\<bar> 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   227
      \<le> inverse (10^60::real)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   228
  by (rule approx_coarsen, rule exp_1_approx[of 48])
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   229
     (simp_all add: eval_euler_approx eval_fact)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   230
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   231
lemma euler_128:
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   232
  "\<bar>exp 1 - 924983374546220337150911035843336795079 / 2 ^ 128\<bar> \<le> inverse (2 ^ 128 :: real)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   233
  by (rule approx_coarsen[OF euler_60_decimals]) simp_all
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   234
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   235
lemma euler_64:
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   236
  "\<bar>exp 1 - 50143449209799256683 / 2 ^ 64\<bar> \<le> inverse (2 ^ 64 :: real)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   237
  by (rule approx_coarsen[OF euler_128]) simp_all
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   238
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   239
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   240
  An approximation of $e$ to 60 decimals. This is about as far as we can go with the 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   241
  simplifier with this kind of setup; the exported code of the code generator, on the other
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   242
  hand, can easily approximate $e$ to 1000 decimals and verify that approximation within
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   243
  fractions of a second.
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   244
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   245
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   246
(* (Uncommented because we don't want to use the code generator; 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   247
   don't forget to import Code\_Target\_Numeral)) *)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   248
(*
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   249
lemma "\<bar>exp 1 - 2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161403970198376793206832823764648042953118023287825098194558153017567173613320698112509961818815930416903515988885193458072738667385894228792284998920868058257492796104841984443634632449684875602336248270419786232090021609902353043699418491463140934317381436405462531520961836908887070167683964243781405927145635490613031072085103837505101157477041718986106873969655212671546889570350354021\<bar>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   250
  \<le> inverse (10^1000::real)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   251
  by (rule approx_coarsen, rule exp_1_approx[of 450], simp) eval
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   252
*)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   253
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   254
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   255
subsection \<open>Approximation of $\ln 2$\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   256
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   257
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   258
  The following three auxiliary constants allow us to force the simplifier to
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   259
  evaluate intermediate results, simulating call-by-value.
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   260
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   261
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   262
definition "ln_approx_aux3 x' e n y d \<longleftrightarrow> 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   263
  \<bar>(2 * y) * (\<Sum>k<n. inverse (real (2*k+1)) * (y^2)^k) + d - x'\<bar> \<le> e - d"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   264
definition "ln_approx_aux2 x' e n y \<longleftrightarrow> 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   265
  ln_approx_aux3 x' e n y (y^(2*n+1) / (1 - y^2) / real (2*n+1))" 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   266
definition "ln_approx_aux1 x' e n x \<longleftrightarrow> 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   267
  ln_approx_aux2 x' e n ((x - 1) / (x + 1))"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   268
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   269
lemma ln_approx_abs'':
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   270
  fixes x :: real and n :: nat
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   271
  defines "y \<equiv> (x-1)/(x+1)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   272
  defines "approx \<equiv> (\<Sum>k<n. 2*y^(2*k+1) / of_nat (2*k+1))"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   273
  defines "d \<equiv> y^(2*n+1) / (1 - y^2) / of_nat (2*n+1)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   274
  assumes x: "x > 1"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   275
  assumes A: "ln_approx_aux1 x' e n x"  
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   276
  shows   "\<bar>ln x - x'\<bar> \<le> e"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   277
proof (rule approx_coarsen[OF ln_approx_abs[OF x, of n]], goal_cases)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   278
  case 1
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   279
  from A have "\<bar>2 * y * (\<Sum>k<n. inverse (real (2 * k + 1)) * y\<^sup>2 ^ k) + d - x'\<bar> \<le> e - d"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   280
    by (simp only: ln_approx_aux3_def ln_approx_aux2_def ln_approx_aux1_def
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   281
                   y_def [symmetric] d_def [symmetric])
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   282
  also have "2 * y * (\<Sum>k<n. inverse (real (2 * k + 1)) * y\<^sup>2 ^ k) = 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   283
               (\<Sum>k<n. 2 * y^(2*k+1) / (real (2 * k + 1)))"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63918
diff changeset
   284
    by (subst sum_distrib_left, simp, subst power_mult) 
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   285
       (simp_all add: divide_simps mult_ac power_mult)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   286
  finally show ?case by (simp only: d_def y_def approx_def) 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   287
qed
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   288
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   289
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   290
  We unfold the above three constants successively and then compute the 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   291
  sum using a Horner scheme.
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   292
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   293
lemma ln_2_40_decimals: 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   294
  "\<bar>ln 2 - 0.6931471805599453094172321214581765680755\<bar> 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   295
      \<le> inverse (10^40 :: real)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   296
  apply (rule ln_approx_abs''[where n = 40], simp)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   297
  apply (simp, simp add: ln_approx_aux1_def)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   298
  apply (simp add: ln_approx_aux2_def power2_eq_square power_divide)
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   299
  apply (simp add: ln_approx_aux3_def power2_eq_square)
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63918
diff changeset
   300
  apply (simp add: sum_poly_horner_expand)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   301
  done
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   302
     
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   303
lemma ln_2_128: 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   304
  "\<bar>ln 2 - 235865763225513294137944142764154484399 / 2 ^ 128\<bar> \<le> inverse (2 ^ 128 :: real)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   305
  by (rule approx_coarsen[OF ln_2_40_decimals]) simp_all
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   306
     
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   307
lemma ln_2_64: 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   308
  "\<bar>ln 2 - 12786308645202655660 / 2 ^ 64\<bar> \<le> inverse (2 ^ 64 :: real)"
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   309
  by (rule approx_coarsen[OF ln_2_128]) simp_all  
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   310
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   311
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   312
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   313
subsection \<open>Approximation of the Euler--Mascheroni constant\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   314
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   315
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   316
  Unfortunatly, the best approximation we have formalised for the Euler--Mascheroni 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   317
  constant converges only quadratically. This is too slow to compute more than a 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   318
  few decimals, but we can get almost 4 decimals / 14 binary digits this way, 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   319
  which is not too bad. 
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   320
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   321
lemma euler_mascheroni_approx:
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   322
  defines "approx \<equiv> 0.577257 :: real" and "e \<equiv> 0.000063 :: real"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   323
  shows   "abs (euler_mascheroni - approx :: real) < e"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   324
  (is "abs (_ - ?approx) < ?e")
59871
e1a49ac9c537 John Harrison's example: a 32-bit approximation to pi. SLOW
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   325
proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   326
  define l :: real
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   327
    where "l = 47388813395531028639296492901910937/82101866951584879688289000000000000"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   328
  define u :: real
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   329
    where "u = 142196984054132045946501548559032969 / 246305600854754639064867000000000000"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   330
  have impI: "P \<longrightarrow> Q" if Q for P Q using that by blast
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   331
  have hsum_63: "harm 63 = (310559566510213034489743057 / 65681493561267903750631200 :: real)"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   332
    by (simp add: harm_expand)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   333
  from harm_Suc[of 63] have hsum_64: "harm 64 =
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   334
          623171679694215690971693339 / (131362987122535807501262400::real)"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   335
    by (subst (asm) hsum_63) simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   336
  have "ln (64::real) = real (6::nat) * ln 2" by (subst ln_realpow[symmetric]) simp_all
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   337
  hence "ln (real_of_nat (Suc 63)) \<in> {4.158883083293<..<4.158883083367}" using ln_2_64
62390
842917225d56 more canonical names
nipkow
parents: 62175
diff changeset
   338
    by (simp add: abs_real_def split: if_split_asm)
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   339
  from euler_mascheroni_bounds'[OF _ this]
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   340
    have "(euler_mascheroni :: real) \<in> {l<..<u}"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   341
    by (simp add: hsum_63 del: greaterThanLessThan_iff) (simp only: l_def u_def)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   342
  also have "\<dots> \<subseteq> {approx - e<..<approx + e}"
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   343
    by (subst greaterThanLessThan_subseteq_greaterThanLessThan, rule impI)
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   344
       (simp add: approx_def e_def u_def l_def)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   345
  finally show ?thesis by (simp add: abs_real_def)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   346
qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   347
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   348
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   349
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   350
subsection \<open>Approximation of pi\<close>
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   351
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   352
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   353
subsubsection \<open>Approximating the arctangent\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   354
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   355
text\<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   356
  The arctangent can be used to approximate pi. Fortunately, its Taylor series expansion
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   357
  converges exponentially for small values, so we can get $\Theta(n)$ digits of precision
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   358
  with $n$ summands of the expansion.
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   359
\<close>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   360
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   361
definition arctan_approx where
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   362
  "arctan_approx n x = x * (\<Sum>k<n. (-(x^2))^k / real (2*k+1))"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   363
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   364
lemma arctan_series':
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   365
  assumes "\<bar>x\<bar> \<le> 1"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   366
  shows "(\<lambda>k. (-1)^k * (1 / real (k*2+1) * x ^ (k*2+1))) sums arctan x"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   367
  using summable_arctan_series[OF assms] arctan_series[OF assms] by (simp add: sums_iff)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   368
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   369
lemma arctan_approx:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   370
  assumes x: "0 \<le> x" "x < 1" and n: "even n"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   371
  shows   "arctan x - arctan_approx n x \<in> {0..x^(2*n+1) / (1-x^4)}"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   372
proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   373
  define c where "c k = 1 / (1+(4*real k + 2*real n)) - x\<^sup>2 / (3+(4*real k + 2*real n))" for k
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   374
  from assms have "(\<lambda>k. (-1) ^ k * (1 / real (k * 2 + 1) * x^(k*2+1))) sums arctan x"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   375
    using arctan_series' by simp
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   376
  also have "(\<lambda>k. (-1) ^ k * (1 / real (k * 2 + 1) * x^(k*2+1))) =
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   377
                 (\<lambda>k. x * ((- (x^2))^k / real (2*k+1)))"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   378
    by (simp add: power2_eq_square power_mult power_mult_distrib mult_ac power_minus')
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   379
  finally have "(\<lambda>k. x * ((- x\<^sup>2) ^ k / real (2 * k + 1))) sums arctan x" .
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   380
  from sums_split_initial_segment[OF this, of n]
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   381
    have "(\<lambda>i. x * ((- x\<^sup>2) ^ (i + n) / real (2 * (i + n) + 1))) sums
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   382
            (arctan x - arctan_approx n x)"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63918
diff changeset
   383
    by (simp add: arctan_approx_def sum_distrib_left)
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   384
  from sums_group[OF this, of 2] assms
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   385
    have sums: "(\<lambda>k. x * (x\<^sup>2)^n * (x^4)^k * c k) sums (arctan x - arctan_approx n x)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   386
    by (simp add: algebra_simps power_add power_mult [symmetric] c_def)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   387
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   388
  from assms have "0 \<le> arctan x - arctan_approx n x"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   389
    by (intro sums_le[OF _ sums_zero sums] allI mult_nonneg_nonneg)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   390
       (auto intro!: frac_le power_le_one simp: c_def)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   391
  moreover {
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   392
    from assms have "c k \<le> 1 - 0" for k unfolding c_def
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   393
      by (intro diff_mono divide_nonneg_nonneg add_nonneg_nonneg) auto
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   394
    with assms have "x * x\<^sup>2 ^ n * (x ^ 4) ^ k * c k \<le> x * x\<^sup>2 ^ n * (x ^ 4) ^ k * 1" for k
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   395
      by (intro mult_left_mono mult_right_mono mult_nonneg_nonneg) simp_all
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   396
    with assms have "arctan x - arctan_approx n x \<le> x * (x\<^sup>2)^n * (1 / (1 - x^4))"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   397
      by (intro sums_le[OF _ sums sums_mult[OF geometric_sums]] allI mult_left_mono)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   398
         (auto simp: power_less_one)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   399
    also have "x * (x^2)^n = x^(2*n+1)" by (simp add: power_mult power_add)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   400
    finally have "arctan x - arctan_approx n x \<le> x^(2*n+1) / (1 - x^4)" by simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   401
  }
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   402
  ultimately show ?thesis by simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   403
qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   404
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   405
lemma arctan_approx_def': "arctan_approx n (1/x) =
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   406
  (\<Sum>k<n. inverse (real (2 * k + 1) * (- x\<^sup>2) ^ k)) / x"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   407
proof -
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   408
  have "(-1)^k / b = 1 / ((-1)^k * b)" for k :: nat and b :: real
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   409
    by (cases "even k") auto
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   410
  thus ?thesis by (simp add: arctan_approx_def  field_simps power_minus')
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   411
qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   412
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   413
lemma expand_arctan_approx:
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   414
  "(\<Sum>k<(numeral n::nat). inverse (f k) * inverse (x ^ k)) =
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   415
     inverse (f 0) + (\<Sum>k<pred_numeral n. inverse (f (k+1)) * inverse (x^k)) / x"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   416
  "(\<Sum>k<Suc 0. inverse (f k) * inverse (x^k)) = inverse (f 0 :: 'a :: field)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   417
  "(\<Sum>k<(0::nat). inverse (f k) * inverse (x^k)) = 0"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   418
proof -
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   419
  {
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   420
    fix m :: nat
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   421
    have "(\<Sum>k<Suc m. inverse (f k * x^k)) =
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   422
             inverse (f 0) + (\<Sum>k=Suc 0..<Suc m. inverse (f k * x^k))"
70097
4005298550a6 The last big tranche of Homology material: invariance of domain; renamings to use generic sum/prod lemmas from their locale
paulson <lp15@cam.ac.uk>
parents: 69597
diff changeset
   423
      by (subst atLeast0LessThan [symmetric], subst sum.atLeast_Suc_lessThan) simp_all
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   424
    also have "(\<Sum>k=Suc 0..<Suc m. inverse (f k * x^k)) = (\<Sum>k<m. inverse (f (k+1) * x^k)) / x"
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: 70097
diff changeset
   425
      by (subst sum.shift_bounds_Suc_ivl)
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63918
diff changeset
   426
         (simp add: sum_distrib_left divide_inverse algebra_simps
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   427
                    atLeast0LessThan power_commutes)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   428
    finally have "(\<Sum>k<Suc m. inverse (f k) * inverse (x ^ k)) =
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   429
                      inverse (f 0) + (\<Sum>k<m. inverse (f (k + 1)) * inverse (x ^ k)) / x" by simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   430
  }
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   431
  from this[of "pred_numeral n"]
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   432
    show "(\<Sum>k<numeral n. inverse (f k) * inverse (x^k)) =
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   433
            inverse (f 0) + (\<Sum>k<pred_numeral n. inverse (f (k+1)) * inverse (x^k)) / x"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   434
    by (simp add: numeral_eq_Suc)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   435
qed simp_all
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   436
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   437
lemma arctan_diff_small:
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   438
  assumes "\<bar>x*y::real\<bar> < 1"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   439
  shows   "arctan x - arctan y = arctan ((x - y) / (1 + x * y))"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   440
proof -
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   441
  have "arctan x - arctan y = arctan x + arctan (-y)" by (simp add: arctan_minus)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   442
  also from assms have "\<dots> = arctan ((x - y) / (1 + x * y))" by (subst arctan_add_small) simp_all
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   443
  finally show ?thesis .
59871
e1a49ac9c537 John Harrison's example: a 32-bit approximation to pi. SLOW
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   444
qed
e1a49ac9c537 John Harrison's example: a 32-bit approximation to pi. SLOW
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   445
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   446
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   447
subsubsection \<open>Machin-like formulae for pi\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   448
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   449
text \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67399
diff changeset
   450
  We first define a small proof method that can prove Machin-like formulae for \<^term>\<open>pi\<close>
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   451
  automatically. Unfortunately, this takes far too much time for larger formulae because
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   452
  the numbers involved become too large.
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   453
\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   454
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   455
definition "MACHIN_TAG a b \<equiv> a * (b::real)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   456
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   457
lemma numeral_horner_MACHIN_TAG:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   458
  "MACHIN_TAG Numeral1 x = x"
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   459
  "MACHIN_TAG (numeral (Num.Bit0 (Num.Bit0 n))) x =
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   460
     MACHIN_TAG 2 (MACHIN_TAG (numeral (Num.Bit0 n)) x)"
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   461
  "MACHIN_TAG (numeral (Num.Bit0 (Num.Bit1 n))) x =
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   462
     MACHIN_TAG 2 (MACHIN_TAG (numeral (Num.Bit1 n)) x)"
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   463
  "MACHIN_TAG (numeral (Num.Bit1 n)) x =
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   464
     MACHIN_TAG 2 (MACHIN_TAG (numeral n) x) + x"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   465
  unfolding numeral_Bit0 numeral_Bit1 ring_distribs one_add_one[symmetric] MACHIN_TAG_def
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   466
     by (simp_all add: algebra_simps)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   467
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   468
lemma tag_machin: "a * arctan b = MACHIN_TAG a (arctan b)" by (simp add: MACHIN_TAG_def)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   469
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   470
lemma arctan_double': "\<bar>a::real\<bar> < 1 \<Longrightarrow> MACHIN_TAG 2 (arctan a) = arctan (2 * a / (1 - a*a))"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   471
  unfolding MACHIN_TAG_def by (simp add: arctan_double power2_eq_square)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   472
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   473
ML \<open>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   474
  fun machin_term_conv ctxt ct =
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   475
    let
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   476
      val ctxt' = ctxt addsimps @{thms arctan_double' arctan_add_small}
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   477
    in
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   478
      case Thm.term_of ct of
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67399
diff changeset
   479
        Const (\<^const_name>\<open>MACHIN_TAG\<close>, _) $ _ $
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67399
diff changeset
   480
          (Const (\<^const_name>\<open>Transcendental.arctan\<close>, _) $ _) =>
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   481
          Simplifier.rewrite ctxt' ct
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   482
      |
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67399
diff changeset
   483
        Const (\<^const_name>\<open>MACHIN_TAG\<close>, _) $ _ $
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67399
diff changeset
   484
          (Const (\<^const_name>\<open>Groups.plus\<close>, _) $
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67399
diff changeset
   485
            (Const (\<^const_name>\<open>Transcendental.arctan\<close>, _) $ _) $
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67399
diff changeset
   486
            (Const (\<^const_name>\<open>Transcendental.arctan\<close>, _) $ _)) =>
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   487
          Simplifier.rewrite ctxt' ct
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   488
      | _ => raise CTERM ("machin_conv", [ct])
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   489
    end
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   490
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   491
  fun machin_tac ctxt =
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   492
    let val conv = Conv.top_conv (Conv.try_conv o machin_term_conv) ctxt
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   493
    in
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   494
      SELECT_GOAL (
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   495
        Local_Defs.unfold_tac ctxt
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   496
          @{thms tag_machin[THEN eq_reflection] numeral_horner_MACHIN_TAG[THEN eq_reflection]}
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   497
        THEN REPEAT (CHANGED (HEADGOAL (CONVERSION conv))))
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   498
      THEN' Simplifier.simp_tac (ctxt addsimps @{thms arctan_add_small arctan_diff_small})
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   499
    end
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   500
\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   501
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   502
method_setup machin = \<open>Scan.succeed (SIMPLE_METHOD' o machin_tac)\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   503
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   504
text \<open>
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   505
  We can now prove the ``standard'' Machin formula, which was already proven manually
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   506
  in Isabelle, automatically.
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   507
}\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   508
lemma "pi / 4 = (4::real) * arctan (1 / 5) - arctan (1 / 239)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   509
  by machin
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   510
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   511
text \<open>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   512
  We can also prove the following more complicated formula:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   513
\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   514
lemma machin': "pi/4 = (12::real) * arctan (1/18) + 8 * arctan (1/57) - 5 * arctan (1/239)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   515
  by machin
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   516
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   517
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   518
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   519
subsubsection \<open>Simple approximation of pi\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   520
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   521
text \<open>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   522
  We can use the simple Machin formula and the Taylor series expansion of the arctangent
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67399
diff changeset
   523
  to approximate pi. For a given even natural number $n$, we expand \<^term>\<open>arctan (1/5)\<close>
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67399
diff changeset
   524
  to $3n$ summands and \<^term>\<open>arctan (1/239)\<close> to $n$ summands. This gives us at least
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   525
  $13n-2$ bits of precision.
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   526
\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   527
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   528
definition "pi_approx n = 16 * arctan_approx (3*n) (1/5) - 4 * arctan_approx n (1/239)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   529
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   530
lemma pi_approx:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   531
  fixes n :: nat assumes n: "even n" and "n > 0"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   532
  shows   "\<bar>pi - pi_approx n\<bar> \<le> inverse (2^(13*n - 2))"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   533
proof -
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   534
  from n have n': "even (3*n)" by simp
62175
8ffc4d0e652d isabelle update_cartouches -c -t;
wenzelm
parents: 62089
diff changeset
   535
  \<comment> \<open>We apply the Machin formula\<close>
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   536
  from machin have "pi = 16 * arctan (1/5) - 4 * arctan (1/239::real)" by simp
62175
8ffc4d0e652d isabelle update_cartouches -c -t;
wenzelm
parents: 62089
diff changeset
   537
  \<comment> \<open>Taylor series expansion of the arctangent\<close>
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   538
  also from arctan_approx[OF _ _ n', of "1/5"] arctan_approx[OF _ _ n, of "1/239"]
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   539
    have "\<dots> - pi_approx n \<in> {-4*((1/239)^(2*n+1) / (1-(1/239)^4))..16*(1/5)^(6*n+1) / (1-(1/5)^4)}"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   540
    by (simp add: pi_approx_def)
62175
8ffc4d0e652d isabelle update_cartouches -c -t;
wenzelm
parents: 62089
diff changeset
   541
  \<comment> \<open>Coarsening the bounds to make them a bit nicer\<close>
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   542
  also have "-4*((1/239::real)^(2*n+1) / (1-(1/239)^4)) = -((13651919 / 815702160) / 57121^n)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   543
    by (simp add: power_mult power2_eq_square) (simp add: field_simps)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   544
  also have "16*(1/5)^(6*n+1) / (1-(1/5::real)^4) = (125/39) / 15625^n"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   545
    by (simp add: power_mult power2_eq_square) (simp add: field_simps)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   546
  also have "{-((13651919 / 815702160) / 57121^n) .. (125 / 39) / 15625^n} \<subseteq>
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   547
               {- (4 / 2^(13*n)) .. 4 / (2^(13*n)::real)}"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   548
    by (subst atLeastatMost_subset_iff, intro disjI2 conjI le_imp_neg_le)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   549
       (rule frac_le; simp add: power_mult power_mono)+
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   550
  finally have "abs (pi - pi_approx n) \<le> 4 / 2^(13*n)" by auto
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   551
  also from \<open>n > 0\<close> have "4 / 2^(13*n) = 1 / (2^(13*n - 2) :: real)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   552
    by (cases n) (simp_all add: power_add)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   553
  finally show ?thesis by (simp add: divide_inverse)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   554
qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   555
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   556
lemma pi_approx':
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   557
  fixes n :: nat assumes n: "even n" and "n > 0" and "k \<le> 13*n - 2"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   558
  shows   "\<bar>pi - pi_approx n\<bar> \<le> inverse (2^k)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   559
  using assms(3) by (intro order.trans[OF pi_approx[OF assms(1,2)]]) (simp_all add: field_simps)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   560
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   561
text \<open>We can now approximate pi to 22 decimals within a fraction of a second.\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   562
lemma pi_approx_75: "abs (pi - 3.1415926535897932384626 :: real) \<le> inverse (10^22)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   563
proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   564
  define a :: real
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   565
    where "a = 8295936325956147794769600190539918304 / 2626685325478320010006427764892578125"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   566
  define b :: real
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   567
    where "b = 8428294561696506782041394632 / 503593538783547230635598424135"
62175
8ffc4d0e652d isabelle update_cartouches -c -t;
wenzelm
parents: 62089
diff changeset
   568
  \<comment> \<open>The introduction of this constant prevents the simplifier from applying solvers that
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   569
      we don't want. We want it to simply evaluate the terms to rational constants.}\<close>
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66453
diff changeset
   570
  define eq :: "real \<Rightarrow> real \<Rightarrow> bool" where "eq = (=)"
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   571
62175
8ffc4d0e652d isabelle update_cartouches -c -t;
wenzelm
parents: 62089
diff changeset
   572
  \<comment> \<open>Splitting the computation into several steps has the advantage that simplification can
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   573
      be done in parallel\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   574
  have "abs (pi - pi_approx 6) \<le> inverse (2^76)" by (rule pi_approx') simp_all
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   575
  also have "pi_approx 6 = 16 * arctan_approx (3 * 6) (1 / 5) - 4 * arctan_approx 6 (1 / 239)"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   576
    unfolding pi_approx_def by simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   577
  also have [unfolded eq_def]: "eq (16 * arctan_approx (3 * 6) (1 / 5)) a"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   578
    by (simp add: arctan_approx_def' power2_eq_square,
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   579
        simp add: expand_arctan_approx, unfold a_def eq_def, rule refl)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   580
  also have [unfolded eq_def]: "eq (4 * arctan_approx 6 (1 / 239::real)) b"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   581
    by (simp add: arctan_approx_def' power2_eq_square,
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   582
        simp add: expand_arctan_approx, unfold b_def eq_def, rule refl)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   583
  also have [unfolded eq_def]:
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   584
    "eq (a - b) (171331331860120333586637094112743033554946184594977368554649608 /
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   585
                 54536456744112171868276045488779391002026386559009552001953125)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   586
    by (unfold a_def b_def, simp, unfold eq_def, rule refl)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   587
  finally show ?thesis by (rule approx_coarsen) simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   588
qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   589
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   590
text \<open>
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   591
  The previous estimate of pi in this file was based on approximating the root of the
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   592
  $\sin(\pi/6)$ in the interval $[0;4]$ using the Taylor series expansion of the sine to
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   593
  verify that it is between two given bounds.
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   594
  This was much slower and much less precise. We can easily recover this coarser estimate from
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   595
  the newer, precise estimate:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   596
\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   597
lemma pi_approx_32: "\<bar>pi - 13493037705/4294967296 :: real\<bar> \<le> inverse(2 ^ 32)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   598
  by (rule approx_coarsen[OF pi_approx_75]) simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   599
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   600
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   601
subsection \<open>A more complicated approximation of pi\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   602
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   603
text \<open>
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   604
  There are more complicated Machin-like formulae that have more terms with larger
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   605
  denominators. Although they have more terms, each term requires fewer summands of the
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   606
  Taylor series for the same precision, since it is evaluated closer to $0$.
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   607
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   608
  Using a good formula, one can therefore obtain the same precision with fewer operations.
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   609
  The big formulae used for computations of pi in practice are too complicated for us to
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   610
  prove here, but we can use the three-term Machin-like formula @{thm machin'}.
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   611
\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   612
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   613
definition "pi_approx2 n = 48 * arctan_approx (6*n) (1/18::real) +
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   614
                             32 * arctan_approx (4*n) (1/57) - 20 * arctan_approx (3*n) (1/239)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   615
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   616
lemma pi_approx2:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   617
  fixes n :: nat assumes n: "even n" and "n > 0"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   618
  shows   "\<bar>pi - pi_approx2 n\<bar> \<le> inverse (2^(46*n - 1))"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   619
proof -
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   620
  from n have n': "even (6*n)" "even (4*n)" "even (3*n)" by simp_all
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   621
  from machin' have "pi = 48 * arctan (1/18) + 32 * arctan (1/57) - 20 * arctan (1/239::real)"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   622
    by simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   623
  hence "pi - pi_approx2 n = 48 * (arctan (1/18) - arctan_approx (6*n) (1/18)) +
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   624
                                 32 * (arctan (1/57) - arctan_approx (4*n) (1/57)) -
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   625
                                 20 * (arctan (1/239) - arctan_approx (3*n) (1/239))"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   626
    by (simp add: pi_approx2_def)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   627
  also have "\<dots> \<in> {-((20/239/(1-(1/239)^4)) * (1/239)^(6*n))..
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   628
              (48/18 / (1-(1/18)^4))*(1/18)^(12*n) + (32/57/(1-(1/57)^4)) * (1/57)^(8*n)}"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   629
    (is "_ \<in> {-?l..?u1 + ?u2}")
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   630
    apply ((rule combine_bounds(1,2))+; (rule combine_bounds(3); (rule arctan_approx)?)?)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   631
    apply (simp_all add: n)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   632
    apply (simp_all add: divide_simps)?
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   633
    done
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   634
  also {
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   635
    have "?l \<le> (1/8) * (1/2)^(46*n)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   636
      unfolding power_mult by (intro mult_mono power_mono) (simp_all add: divide_simps)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   637
    also have "\<dots> \<le> (1/2) ^ (46 * n - 1)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   638
      by (cases n; simp_all add: power_add divide_simps)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   639
    finally have "?l \<le> (1/2) ^ (46 * n - 1)" .
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   640
    moreover {
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   641
      have "?u1 + ?u2 \<le> 4 * (1/2)^(48*n) + 1 * (1/2)^(46*n)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   642
        unfolding power_mult by (intro add_mono mult_mono power_mono) (simp_all add: divide_simps)
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   643
      also from \<open>n > 0\<close> have "4 * (1/2::real)^(48*n) \<le> (1/2)^(46*n)"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   644
        by (cases n) (simp_all add: field_simps power_add)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   645
      also from \<open>n > 0\<close> have "(1/2::real) ^ (46 * n) + 1 * (1 / 2) ^ (46 * n) = (1/2) ^ (46 * n - 1)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   646
        by (cases n; simp_all add: power_add power_divide)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   647
      finally have "?u1 + ?u2 \<le> (1/2) ^ (46 * n - 1)" by - simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   648
    }
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   649
    ultimately have "{-?l..?u1 + ?u2} \<subseteq> {-((1/2)^(46*n-1))..(1/2)^(46*n-1)}"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   650
      by (subst atLeastatMost_subset_iff) simp_all
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   651
  }
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   652
  finally have "\<bar>pi - pi_approx2 n\<bar> \<le> ((1/2) ^ (46 * n - 1))" by auto
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   653
  thus ?thesis by (simp add: divide_simps)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   654
qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   655
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   656
lemma pi_approx2':
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   657
  fixes n :: nat assumes n: "even n" and "n > 0" and "k \<le> 46*n - 1"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   658
  shows   "\<bar>pi - pi_approx2 n\<bar> \<le> inverse (2^k)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   659
  using assms(3) by (intro order.trans[OF pi_approx2[OF assms(1,2)]]) (simp_all add: field_simps)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   660
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   661
text \<open>
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   662
  We can now approximate pi to 54 decimals using this formula. The computations are much
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   663
  slower now; this is mostly because we use arbitrary-precision rational numbers, whose
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   664
  numerators and demoninators get very large. Using dyadic floating point numbers would be
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   665
  much more economical.
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   666
\<close>
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   667
lemma pi_approx_54_decimals:
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   668
  "abs (pi - 3.141592653589793238462643383279502884197169399375105821 :: real) \<le> inverse (10^54)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   669
  (is "abs (pi - ?pi') \<le> _")
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   670
proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   671
  define a :: real
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   672
    where "a = 2829469759662002867886529831139137601191652261996513014734415222704732791803 /
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   673
           1062141879292765061960538947347721564047051545995266466660439319087625011200"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   674
  define b :: real
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   675
    where "b = 13355545553549848714922837267299490903143206628621657811747118592 /
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   676
           23792006023392488526789546722992491355941103837356113731091180925"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   677
  define c :: real
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   678
    where "c = 28274063397213534906669125255762067746830085389618481175335056 /
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   679
           337877029279505250241149903214554249587517250716358486542628059"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   680
  let ?pi'' = "3882327391761098513316067116522233897127356523627918964967729040413954225768920394233198626889767468122598417405434625348404038165437924058179155035564590497837027530349 /
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   681
               1235783190199688165469648572769847552336447197542738425378629633275352407743112409829873464564018488572820294102599160968781449606552922108667790799771278860366957772800"
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66453
diff changeset
   682
  define eq :: "real \<Rightarrow> real \<Rightarrow> bool" where "eq = (=)"
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   683
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   684
  have "abs (pi - pi_approx2 4) \<le> inverse (2^183)" by (rule pi_approx2') simp_all
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   685
  also have "pi_approx2 4 = 48 * arctan_approx 24 (1 / 18) +
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   686
                            32 * arctan_approx 16 (1 / 57) -
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   687
                            20 * arctan_approx 12 (1 / 239)"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   688
    unfolding pi_approx2_def by simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   689
  also have [unfolded eq_def]: "eq (48 * arctan_approx 24 (1 / 18)) a"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   690
    by (simp add: arctan_approx_def' power2_eq_square,
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   691
        simp add: expand_arctan_approx, unfold a_def eq_def, rule refl)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   692
  also have [unfolded eq_def]: "eq (32 * arctan_approx 16 (1 / 57::real)) b"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   693
    by (simp add: arctan_approx_def' power2_eq_square,
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   694
        simp add: expand_arctan_approx, unfold b_def eq_def, rule refl)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   695
  also have [unfolded eq_def]: "eq (20 * arctan_approx 12 (1 / 239::real)) c"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   696
    by (simp add: arctan_approx_def' power2_eq_square,
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   697
        simp add: expand_arctan_approx, unfold c_def eq_def, rule refl)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   698
  also have [unfolded eq_def]:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   699
    "eq (a + b) (34326487387865555303797183505809267914709125998469664969258315922216638779011304447624792548723974104030355722677 /
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   700
                 10642967245546718617684989689985787964158885991018703366677373121531695267093031090059801733340658960857196134400)"
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   701
    by (unfold a_def b_def c_def, simp, unfold eq_def, rule refl)
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   702
  also have [unfolded eq_def]: "eq (\<dots> - c) ?pi''"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   703
    by (unfold a_def b_def c_def, simp, unfold eq_def, rule refl)
62175
8ffc4d0e652d isabelle update_cartouches -c -t;
wenzelm
parents: 62089
diff changeset
   704
  \<comment> \<open>This is incredibly slow because the numerators and denominators are huge.\<close>
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   705
  finally show ?thesis by (rule approx_coarsen) simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   706
qed
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   707
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   708
text \<open>A 128 bit approximation of pi:\<close>
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   709
lemma pi_approx_128:
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   710
  "abs (pi - 1069028584064966747859680373161870783301 / 2^128) \<le> inverse (2^128)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   711
  by (rule approx_coarsen[OF pi_approx_54_decimals]) simp
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   712
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   713
text \<open>A 64 bit approximation of pi:\<close>
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   714
lemma pi_approx_64:
62085
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   715
  "abs (pi - 57952155664616982739 / 2^64 :: real) \<le> inverse (2^64)"
5b7758af429e Tuned approximations in Multivariate_Analysis
Manuel Eberl <eberlm@in.tum.de>
parents: 61945
diff changeset
   716
  by (rule approx_coarsen[OF pi_approx_54_decimals]) simp
62089
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   717
  
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   718
text \<open>
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   719
  Again, going much farther with the simplifier takes a long time, but the code generator
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   720
  can handle even two thousand decimal digits in under 20 seconds.
4d38c04957fc Tuned constant approximations
eberlm
parents: 62085
diff changeset
   721
\<close>
59871
e1a49ac9c537 John Harrison's example: a 32-bit approximation to pi. SLOW
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   722
e1a49ac9c537 John Harrison's example: a 32-bit approximation to pi. SLOW
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   723
end