\[e \simeq \sum_{k=0}^n\frac{1}{k!}\]

という近似がどれくらいいい近似かを考えてみました.

主張と証明

主張: $n$を0以上の整数とします. このとき $$ e - \sum_{k=0}^n \frac{1}{k!} \le \frac{e - 1}{(n + 1)!} $$ が成り立ちます.
証明: $$ \begin{align} e &= \sum_{k=0}^\infty \frac{1}{k!} \\ &= \sum_{k=0}^n \frac{1}{k!} + \sum_{k=n+1}^\infty \frac{1}{k!} \\ &= \sum_{k=0}^n \frac{1}{k!} + \frac{1}{(n + 1)!} + \frac{1}{(n+2)!} + \frac{1}{(n+3)!} + \cdots \\ &\le \sum_{k=0}^n \frac{1}{k!} + \frac{1}{(n+1)!}((\frac{1}{0!} + \frac{1}{1!} + \frac{1}{2!} + \frac{1}{3!} + \cdots) - 1) \\ &\le \sum_{k=0}^n \frac{1}{k!} + \frac{e - 1}{(n+1)!}. \end{align} $$ 以上によって $$ e - \sum_{k=0}^n \frac{1}{k!} \le \frac{e - 1}{(n+1)!} $$ が分かりました.

検証の結果

もちろん

\[e - \sum_{k=0}^n \frac{1}{k!} \le \frac{e - 1}{(n+1)!} < \frac{2}{(n+1)!}\]

です.

そこで, $0 \le n \le 10$のとき実際の誤差, $(e - 1) / (n + 1)!$, $2/(n + 1)!$のそれぞれの値を実際に計算させてみました.

n real bound bound2
0 1.718281828 1.718281828 2.000000000
1 0.7182818285 0.8591409142 1.000000000
2 0.2182818285 0.2863803047 0.3333333333
3 0.05161516179 0.07159507619 0.08333333333
4 0.009948495126 0.01431901524 0.01666666667
5 0.001615161792 0.002386502540 0.002777777778
6 0.0002262729035 0.0003409289342 0.0003968253968
7 2.786020508e-5 4.261611678e-5 4.960317460e-5
8 3.058617775e-6 4.735124086e-6 5.511463845e-6
9 3.028858530e-7 4.735124086e-7 5.511463845e-7
10 2.731266076e-8 4.304658260e-8 5.010421677e-8

検証のソースコード

実行にはsympyが必要です.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from math import factorial

import sympy

PRECISION_DIGITS = 10


def get_real_error(n: int) -> float:
    s = sympy.Rational(0)
    for k in range(0, n + 1):
        s += sympy.Rational(1, factorial(k))
    return (sympy.E - s).evalf(PRECISION_DIGITS)


def get_bound_error(n: int) -> float:
    f = sympy.Rational(1, factorial(n + 1)) * (sympy.E - 1)
    return f.evalf(PRECISION_DIGITS)


def get_bound_error2(n: int) -> float:
    f = 2 * sympy.Rational(1, factorial(n + 1))
    return f.evalf(PRECISION_DIGITS)


if __name__ == '__main__':
    print('n', 'real', 'bound', 'bound2')
    for i in range(0, 10 + 1):
        print(i, get_real_error(i), get_bound_error(i), get_bound_error2(i))