analistica/notes/sections/2.md

319 lines
11 KiB
Markdown
Raw Normal View History

2020-03-06 02:24:32 +01:00
# Exercise 2
2020-05-08 23:07:37 +02:00
2020-03-06 02:24:32 +01:00
## Euler-Mascheroni constant
The Euler-Mascheroni constant is defined as the limiting difference between the
partial sums of the harmonic series and the natural logarithm:
$$
\gamma = \lim_{n \rightarrow +\infty} \left( \sum_{k=1}^{n} \frac{1}{k}
- \ln(n) \right)
$$ {#eq:gamma}
and represents the limiting blue area in @fig:gamma. The first 30 digits of
$\gamma$ are:
$$
\gamma = 0.57721\ 56649\ 01532\ 86060\ 65120\ 90082 \dots
$$ {#eq:exact}
In complex analysis, this constant is related to many functions and can be
evaluated through a variety of identities. In this work, five methods were
implemented and their results discussed. In fact, evaluating $\gamma$ with a
limited precision due to floating points number representation entails limited
precision on the estimation of $\gamma$ itself due to roundoff errors. All the
known methods involve sums, subtractions or products of very big or small
numbers, packed in series, partial sums or infinite products. Thus, the
efficiency of the methods lies on how quickly they converge to their limit.
![The area of the blue region converges to the EulerMascheroni
constant.](images/gamma-area.png){#fig:gamma width=7cm}
2020-05-08 23:07:37 +02:00
2020-03-06 02:24:32 +01:00
## Computing the constant
2020-05-08 23:07:37 +02:00
2020-03-06 02:24:32 +01:00
### Definition
2020-05-08 23:07:37 +02:00
First, in order to give a quantitative idea of how hard it is to reach a good
2020-03-06 02:24:32 +01:00
estimation of $\gamma$, it was naively computed using the definition given in
@eq:gamma. The difference was computed for increasing value of $n$, with
$n_{i+1} = 10 \cdot n_i$ and $n_1 = 20$, till the approximation starts getting
worse, namely:
$$
| \gamma(n_{i+1}) - \gamma | > | \gamma(n_i) - \gamma|
$$
and $\gamma (n_i)$ was selected as the result (see @tbl:1_results).
-----------------------------------------------
n sum $|\gamma(n)-\gamma|$
----------- ------------- ---------------------
\SI{2e1}{} \SI{2.48e-02}{}
\SI{2e2}{} \SI{2.50e-03}{}
\SI{2e3}{} \SI{2.50e-04}{}
\SI{2e4}{} \SI{2.50e-05}{}
\SI{2e5}{} \SI{2.50e-06}{}
\SI{2e6}{} \SI{2.50e-07}{}
\SI{2e7}{} \SI{2.50e-08}{}
\SI{2e8}{} \SI{2.50e-09}{}
\SI{2e9}{} \SI{2.55e-10}{}
\SI{2e10}{} \SI{2.42e-11}{}
\SI{2e11}{} \SI{1.44e-08}{}
-----------------------------------------------
Table: Partial results using the definition of $\gamma$ with double
precision. {#tbl:1_results}
2020-05-08 23:07:37 +02:00
The convergence is logarithmic: to fix the first $d$ decimal places, about
$10^d$ terms are needed. The double precision runs out at the
2020-03-06 02:24:32 +01:00
10\textsuperscript{th} place, $n=\SI{2e10}{}$.
Since all the number are given with double precision, there can be at best 15
correct digits but only 10 were correctly computed: this means that when the
terms of the series start being smaller than the smallest representable double,
2020-05-08 23:07:37 +02:00
the sum of all the remaining terms give a number $\propto 10^{-11}$.
Best result in @tbl:first.
2020-03-06 02:24:32 +01:00
--------- -----------------------
true: 0.57721\ 56649\ 01533
approx: 0.57721\ 56648\ 77325
diff: 0.00000\ 00000\ 24207
--------- -----------------------
2020-05-08 23:07:37 +02:00
Table: First method best result. From the top down: true value, best estimation
and difference between them. {#tbl:first}
2020-03-06 02:24:32 +01:00
### Alternative formula
As a first alternative, the constant was computed through the identity which
2020-05-08 23:07:37 +02:00
relates $\gamma$ to the $\Gamma$ function as follow [@davis59]:
2020-03-06 02:24:32 +01:00
$$
\gamma = \lim_{M \rightarrow + \infty} \sum_{k = 1}^{M}
\binom{M}{k} \frac{(-1)^k}{k} \ln(\Gamma(k + 1))
$$
Varying $M$ from 1 to 100, the best result was obtained for $M = 41$ (see
@tbl:second). It went sour: the convergence is worse than using the definition
2020-05-08 23:07:37 +02:00
itself. Only two places were correctly computed (#@tbl:second).
2020-03-06 02:24:32 +01:00
--------- -----------------------
true: 0.57721\ 56649\ 01533
approx: 0.57225\ 72410\ 34058
diff: 0.00495\ 84238\ 67473
--------- -----------------------
2020-05-11 23:28:23 +02:00
Table: Best estimation of $\gamma$ using
2020-05-08 23:07:37 +02:00
the alternative formula. {#tbl:second}
2020-03-06 02:24:32 +01:00
Here, the problem lies in the binomial term: computing the factorial of a
number greater than 18 goes over 15 places and so cannot be correctly
2020-05-08 23:07:37 +02:00
represented. Furthermore, the convergence is slowed down by the logarithmic
factor.
2020-03-06 02:24:32 +01:00
### Reciprocal $\Gamma$ function
A better result was found using the well known reciprocal $\Gamma$ function
2020-05-08 23:07:37 +02:00
formula [@bak91]:
2020-03-06 02:24:32 +01:00
$$
\frac{1}{\Gamma(z)} = z e^{yz} \prod_{k = 1}^{+ \infty}
\left( 1 + \frac{z}{k} \right) e^{-z/k}
$$
which gives:
$$
\gamma = - \frac{1}{z} \ln \left( z \Gamma(z)
\prod_{k = 1}^{+ \infty} \left( 1 + \frac{z}{k} \right) e^{-z/k} \right)
$$
The execution stops when there is no difference between two consecutive therms
2020-05-08 23:07:37 +02:00
of the infinite product (it happens for $k = 456565794 \sim \SI{4.6e8}{}$,
meaning that for this value of $k$ the term of the product is equal to 1 in
terms of floating points). Different values of $z$ were checked, with $z_{i+1}
= z_i + 0.01$ ranging from 0 to 20, and the best result was found for $z = 9$.
2020-03-06 02:24:32 +01:00
---------------------------------------------------------------
z $|\gamma(z) - \gamma |$ z $|\gamma(z) - \gamma |$
----- ------------------------ ------ ------------------------
1 \SI{9.712e-9}{} 8.95 \SI{9.770e-9}{}
3 \SI{9.320e-9}{} 8.96 \SI{9.833e-9}{}
5 \SI{9.239e-9}{} 8.97 \SI{9.622e-9}{}
7 \SI{9.391e-9}{} 8.98 \SI{9.300e-9}{}
9 \SI{8.482e-9}{} 8.99 \SI{9.059e-9}{}
11 \SI{9.185e-9}{} 9.00 \SI{8.482e-9}{}
13 \SI{9.758e-9}{} 9.01 \SI{9.564e-9}{}
15 \SI{9.747e-9}{} 9.02 \SI{9.260e-9}{}
17 \SI{9.971e-9}{} 9.03 \SI{9.264e-9}{}
19 \SI{10.084e-9}{} 9.04 \SI{9.419e-9}{}
---------------------------------------------------------------
2020-05-08 23:07:37 +02:00
Table: Differences between some obtained values of $\gamma$ and
the exact one found with the reciprocal $\Gamma$ function formula.
The values on the left are shown to give an idea of the $z$
large-scale behaviour; on the right, the values around the best
one ($z = 9.00$) are listed. {#tbl:3_results}
As can be seen in @tbl:3_results, the best value for $z$ is only by chance,
since all $|\gamma(z) - \gamma |$ are of the same order of magnitude. The best
one is compared with the exact value of $\gamma$ in @tbl:third.
2020-03-06 02:24:32 +01:00
--------- -----------------------
true: 0.57721\ 56649\ 01533
approx: 0.57721\ 56564\ 18607
diff: 0.00000\ 00084\ 82925
--------- -----------------------
Table: Third method results for z = 9.00. {#tbl:third}
This time, the convergence of the infinite product is fast enough to ensure the
$8^{th}$ place.
2020-05-08 23:07:37 +02:00
### Fastest convergence formula
2020-03-06 02:24:32 +01:00
2020-05-08 23:07:37 +02:00
The fastest known convergence belongs to the following formula [@yee19]:
2020-03-06 02:24:32 +01:00
$$
\gamma = \frac{A(N)}{B(N)} -\frac{C(N)}{B^2(N)} - \ln(N)
$$ {#eq:faster}
with:
\begin{align*}
&A(N) = \sum_{k=1}^{+ \infty} \frac{N^k}{k!} \cdot H(k)
\with H(k) = \sum_{j=1}^{k} \frac{1}{j} \\
&B(N) = \sum_{k=1}^{+ \infty} \frac{N^k}{k!} \\
&C(N) = \frac{1}{4N} \sum_{k=0}^{2N}
\frac{((2k)!)^3}{(k!)^4 \cdot (16k)^2k} \\
\end{align*}
2020-05-08 23:07:37 +02:00
The series $A$ and $B$ were computed till there is no difference between two
consecutive terms. The number of desired correct decimals $D$ was given in
input and $N$ was consequently computed through the formula:
$$
N = \text{floor} \left( 2 + \frac{1}{4} \cdot \ln(10) \cdot D \right)
$$
given in [@yee19], where floor returns the highest integer smaller than its
argument. Results are shown in @tbl:fourth.
2020-03-06 02:24:32 +01:00
--------- ------------------------------
true: 0.57721\ 56649\ 01532\ 75452
approx: 0.57721\ 56649\ 01532\ 86554
diff: 0.00000\ 00000\ 00000\ 11102
--------- ------------------------------
2020-05-08 23:07:37 +02:00
Table: $\gamma$ estimation with the fastest
known convergence formula (@eq:faster). {#tbl:fourth}
Due to roundoff errors, the best results was obtained for $N = 10$. Up to 15
places were correctly computed.
2020-03-06 02:24:32 +01:00
### Arbitrary precision
To overcome the issues related to the double representation, one can resort to a
representation with arbitrary precision. In the GMP library (which stands for
GNU Multiple Precision arithmetic), for example, real numbers can be
approximated by a ratio of two integers (fraction) with arbitrary precision:
this means a check is performed on every operation and in case of an integer
overflow, additional memory is requested and used to represent the larger result.
Additionally, the library automatically switches to the optimal algorithm
to compute an operation based on the size of the operands.
The terms in @eq:faster can therefore be computed with arbitrarily large
precision. Thus, a program that computes the Euler-Mascheroni constant within
2020-05-08 23:07:37 +02:00
a user controllable precision was implemented. Unlike the previously mentioned
programs, this one was more carefully optimized.
2020-03-06 02:24:32 +01:00
The $A$ and $B$ series are computed up to an arbitrary limit $k_{\text{max}}$.
Different values of $k_{\text{max}}$ were tested but, obviously, they all
eventually reach a point where the approximation cannot guarantee the
2020-05-08 23:07:37 +02:00
requested precision; the solution turned out to be to let $k_{\text{max}}$
depends on $N$. Consequently, $k_{\text{max}}$ was chosen to be $5N$, after it
was verified to produce the correct digits up to 500 decimal places.
2020-03-06 02:24:32 +01:00
The GMP library offers functions to perform some operations such as addition,
2020-05-08 23:07:37 +02:00
multiplication, division, etc. However, the logarithm function is not
2020-03-06 02:24:32 +01:00
implemented. Thus, most of the code carries out the $\ln(N)$ computation.
First, it should be noted that the logarithm of only some special numbers can
be computed with arbitrary precision, namely the ones of which a converging
series is known. This forces $N$ to be rewritten in the following way:
$$
N = N_0 \cdot b^e \thus \ln(N) = \ln(N_0) + e \cdot \ln(b)
$$
2020-05-08 23:07:37 +02:00
Since a fast converging series for $\ln(2)$ is known, $b = 2$ was chosen. As
2020-03-06 02:24:32 +01:00
well as for the scientific notation, in order to get the mantissa $1 \leqslant
N_0 < 2$, the number of binary digits of $N$ must be computed (conveniently, a
2020-05-08 23:07:37 +02:00
dedicated function `mpz_sizeinbase()` can be found in GMP). If the digits are
$n$:
2020-03-06 02:24:32 +01:00
$$
2020-05-08 23:07:37 +02:00
e = n - 1 \thus N_0 = \frac{N}{2^{n - 1}}
2020-03-06 02:24:32 +01:00
$$
Then, by defining:
$$
N_0 = \frac{1 + y}{1 - y} \thus y = \frac{N_0 - 1}{N_0 + 1} < 1
$$
2020-05-08 23:07:37 +02:00
the following series, which is convergent for $y < 1$, can therefore be used:
2020-03-06 02:24:32 +01:00
$$
\ln \left( \frac{1 + y}{1 - y} \right) =
2 \sum_{k = 0}^{+ \infty} \frac{y^{2k + 1}}{2k + 1}
$$
But when to stop computing the series?
Given a partial sum $S_k$ of the series, it is possible to know when a digit is
2020-05-08 23:07:37 +02:00
definitely correct. The key lies in the following concept. Letting $S$ the value
of the series [@riddle08]:
2020-03-06 02:24:32 +01:00
$$
2020-05-08 23:07:37 +02:00
S_k + a_k \frac{L}{1 -L} < S < S_k + \frac{a_{k+1}}{1 - \frac{a_{k+1}}{a_k}}
2020-03-06 02:24:32 +01:00
$$
where $L$ is the limiting ratio of the series terms, which must be $< 1$ in
order for it to converge (in this case, it is easy to prove that $L = y^2$).
The width $\Delta S$ of the interval containing $S$, for a given $S_k$, gives
the precision of the partial sum with respect to $S$. By imposing $\Delta S <
1/10^D$ where $D$ is the correct decimal place required, the desired precision
is obtained. This is achieved by trials, checking at every step whether $\Delta
S$ is less or greater than $1/10^D$.
The same holds for $\ln(2)$, which is given by the following series:
$$
\log(2) = \sum_{k=1}^{+ \infty} \frac{1}{k \cdot 2^k}
$$
2020-05-08 23:07:37 +02:00
In this case the ratio is $L = 1/2$.