1 はじめに

1.1 方針

「Excel を利用する」では、手作業でメモリを書いたとはいえ、メモリを書く位置の計算、つまり対数の計算は Excel を利用しました。電卓がなかった時代に利用されていた計算尺を作成するのにパソコンを使っていれば、明らかにおかしな話です。

そこで、今回は完全自作をしてみたいと思います。つまり、「Excel を利用する」では、電卓で計算していた対数を手計算で求めてみたいと思います。対数の計算は簡単ではありませんので、ここではその中で一番基本となる log 1, log 2, log 3, ⋯, log 10 を求めてみたいと思います。

なお、自然対数の底 e = 2.718281828 ⋯ を底とする対数を ln、 10 を底とする対数を log と表記します。

1.2 目標とする精度

10 インチの計算尺、つまり 25cm の計算尺を作成することを目標とします。また、定規では 1mm の\frac{1}{10}=0.1mm まで読み取ることができるので、対数の精度は\frac{0.1}{250} = 4 × 10^{−4} より正確でなければなりません。そこで、今回はそれより少し厳しく、誤差範囲が 1×10^{−4} に収まるまで求めたいと思います。

2 数学の定理

2.1 テイラー展開

関数 f(x) は、適当な範囲で次のように多項式展開することができる。

f(x) = ∑_{n=0}^{∞} \frac{f^{(n)}(0)}{n!}x^{n}

また、このことは n + 1 次以上の項のみからなる多項式 R_{n+1}(x) を用いて、次のように書くことができることを意味する。

f(x) = f(0) + \frac{f′(0)}{1!}x + \frac{f′′(0)}{2!}x^{2} + ⋯ + \frac{f^{(n)}(0)}{n!}x^{n} + R_{n+1}(x)

2.2 収束条件

無限数列 a_{n} の部分和 S_{n} = ∑_{k=1}^{n} a_{k} は、次の条件を満たせば収束する。

lim_{n→∞} |\frac{a_{n+1}}{a_{n}} | < 1

2.3 極限値の範囲

無限級数 ∑_{n=1}^{∞} a_{n} に対し、任意の n で a_{n} と a_{n+1} の正負が異なる場合、交代級数という。このとき、さらに |a_{n}| が単調減少かつ 0 に収束するとき、この級数は収束する。

無限数列 a_{n} の部分和 S_{n} = ∑_{k=1}^{n} a_{k} が収束するとする。さらに、 n ≥ N の任意の n で a_{n+1}a_{n} < 0 かつ |a_{n}| > |a_{n+1}| が成立するとき、すなわち正負が交互に現れ絶対値が減

少するとき、 S_{∞} = ∑_{k=1}^{∞} a_{k} は S_{n} = ∑_{k=1}^{n} a_{k} と S_{n+1} = ∑_{k=1}^{n+1} a_{k} とのあいだにある。

3 ln(1 + x) の展開

f(x) = ln(1 + x) とおく。すると、 f^{(n)}(x) は次のようになる。

f^{(n)}(x) = (−1)^{n−1}(n − 1)!(1 + x)^{−n}

これに x = 0 を代入すると、

f^{(n)}(0) = (−1)^{n−1}(n − 1)!

となる。これをテイラー展開の公式に代入すると、

ln(1 + x) = ∑_{k=1}^{n} \frac{(−1)^{k−1}(k − 1)!}{k!}x^{k} + R_{n+1}(x)

= ∑_{k=1}^{n} \frac{(−1)^{k−1}}{k} x^{k} + R_{n+1}(x)

となる。

ここで、 a_{n} = \frac{(−1)^{n−1}}{n} x^{n} とおくと、

lim_{n→∞} |\frac{a_{n+1}}{a_{n}} | = lim_{n→∞} | \frac{\frac{(−1)^{n}}{n+1} x^{n+1}}{\frac{(−1)^{n−1}}{n} x^{n}} |

= lim_{n→∞} |\frac{−n}{n + 1}x|

= |x|

これより、 −1 < x < 1 の範囲なら、収束することが分かる。次に、誤差の範囲を求める。

|R_{n+1}(x)| = |ln(1 + x) − ∑_{k=1}^{n} \frac{(−1)^{k−1}}{k} x^{k}|

= | ∑_{k=n+1}^{∞} \frac{(−1)^{k−1}}{k} x^{k}|

≤ ∑_{k=n+1}^{∞} \frac{|x^{k}|}{k}

≤ \frac{1}{n + 1} ∑_{k=n+1}^{∞} |x^{k}|

= \frac{1}{n + 1} · \frac{|x|^{n+1}}{1 − |x|}

となる。ここで計算した計算式を用いて対数の計算を行うが、誤差の範囲の式を見ると、 x の値

の絶対値が小さいほど収束がよいことが分かる。

4 ln \frac{1 + x}{1 − x} の展開

次に、 ln \frac{1 + x}{1 − x} の展開を求める。

ln(1 + x) = ∑_{k=1}^{n} \frac{(−1)^{k−1}}{k} x^{k} + R_{n+1}(x)
ln(1 − x) = ∑_{k=1}^{n} \frac{(−1)^{k−1}}{k} (−x)^{k} + T_{n+1}(x)

= ∑_{k=1}^{n} \frac{−1}{k}x^{k} + T_{n+1}(x)

これより、

ln \frac{1 + x}{1 − x} = ln(1 + x) − ln(1 − x)

= (∑_{k=1}^{n} \frac{(−1)^{k−1}}{k} x^{k} + R_{n+1}(x)) − (∑_{k=1}^{n} \frac{−1}{k}x^{k} + T_{n+1}(x))

= 2 ∑_{k=1}^{n′} \frac{1}{2k − 1}x^{2k−1} + R_{n+1}(x) − T_{n+1}(x)

新たに n′ を n と書くことにすると、

ln \frac{1 + x}{1 − x} = 2 ∑_{k=1}^{n} \frac{1}{2k − 1}x^{2k−1} + U_{2n+1}(x)

ここで、 b_{n} = \frac{1}{2n − 1}x^{2n−1} とおくと、

lim_{n→∞} |\frac{b_{n+1}}{b_{n}} | = lim_{n→∞} | \frac{\frac{1}{2n+1}x^{2n+1}}{\frac{1}{2n−1}x^{2n−1}} |

= lim_{n→∞} |\frac{2n − 1}{2n + 1}x^{2}|

= |x|^{2}

これより、 −1 < x < 1 の範囲なら、収束することが分かる。次に、誤差の範囲を求める。

|U_{2n+1}(x)| = |ln \frac{1 + x}{1 − x} − 2 ∑_{k=1}^{n} \frac{1}{2k − 1}x^{2k−1}|

= 2 | ∑_{k=n+1}^{∞} \frac{1}{2k − 1}x^{2k−1}|

≤ \frac{2}{2n + 1} ∑_{k=n+1}^{∞} |x^{2k−1}|

= \frac{2}{2n + 1} · \frac{|x|^{2n+1}}{1 − x^{2}}

となる。誤差の範囲の式を見ると、やはり x の値の絶対値が小さいほど収束がよいことが分かる。

5 計算の準備

前々章・前章で述べたように、 x の値の絶対値が小さいほど収束がよい。逆に、 x の値の絶対値が\frac{1}{2} よりも大きい (明確な境目があるわけではない) と、収束は緩やかで、手計算には向かないことが分かる。

ln \frac{1 + x}{1 − x} の展開式において、 −\frac{1}{2} < x < \frac{1}{2} とすると、\frac{1}{3} < \frac{1 + x}{1 − x} < 3 となるから、こ

の範囲でのみ有効な式であるということになる。そこで、 log 1, log 2, log 3, ⋯, log 10 を変形する。

log 1 = 0
log 2 = \frac{10}{10} log 2

= \frac{1}{10} log 1024

= \frac{1}{10} log 1000 (1 + \frac{24}{1000})

= \frac{1}{10} (log 1000 + log (1 + \frac{24}{1000}))

= \frac{1}{10} (3 + \frac{ln (1 + \frac{24}{1000})}{ln 10})

log 3 = \frac{2}{2} log 3

= \frac{1}{2} log 9

= \frac{1}{2} log 10 (1 − \frac{1}{10})

= \frac{1}{2} (log 10 + log (1 − \frac{1}{10}))

= \frac{1}{2} (1 + \frac{ln (1 − \frac{1}{10})}{ln 10})

log 4 = 2 log 2
log 5 = 1 − log 2
log 6 = log 2 + log 3
log 7 = \frac{2}{2} log 7

= \frac{1}{2} log 49

= \frac{1}{2} log 50 (1 − \frac{1}{50})

= \frac{1}{2} (log 50 + log (1 − \frac{1}{50}))

= \frac{1}{2} (log 2 + 2 log 5 + log (1 − \frac{1}{50}))

= \frac{1}{2} (2 − log 2 + \frac{ln (1 − \frac{1}{50})}{ln 10})

log 8 = 3 log 2
log 9 = 2 log 3
log 10 = 1

以上より、次のものを求めればよい。

ln (1 + \frac{24}{1000}) , ln (1 − \frac{1}{10}) , ln (1 − \frac{1}{50}) , ln 10

そこで、 ln 10 を求めることを考える。

ln 10 = \frac{3}{3} ln 10

= \frac{1}{3} ln 1000

= \frac{1}{3} ln 1024 (1 − \frac{24}{1024})

= \frac{1}{3} (ln 1024 + ln \frac{1000}{1024})

= \frac{1}{3} (10 ln 2 − ln \frac{1024}{1000})

= \frac{1}{3} (10 ln 2 − ln (1 + \frac{24}{1000}))

ここで、 ln (1 + \frac{24}{1000}) は上で求めるから、 ln 2 を求めればよい。このように変形すれば、 ln (1 + \frac{24}{1000}) , ln (1 − \frac{1}{10}) , ln (1 − \frac{1}{50}) は ln(1 + x) の展

開で、 ln 2 は ln \frac{1 + x}{1 − x} の展開で求めることができる。

6 ln (1 + \frac{24}{1000}) の計算

6.1 誤差

ln(1 + x) の誤差の式に、 x = \frac{24}{1000} を代入する。

|R_{n+1}(x)| = \frac{1}{n + 1} · \frac{|x|^{n+1}}{1 − |x|}

= \frac{1}{n + 1} · \frac{|0.024|^{n+1}}{1 − |0.024|}

n = 2 とすると、

|R_{n+1}(x)| = \frac{1}{2 + 1} · \frac{|0.024|^{2+1}}{1 − |0.024|}

= \frac{1}{3} · \frac{0.024^{3}}{1 − 0.024}

= \frac{1}{3} · \frac{1.3824 × 10^{−5}}{0.976}

= 4.72 × 10^{−6} < 0.0000048

6.2 計算

n = 2 まで展開する。

ln (1 + \frac{24}{1000}) = \frac{24}{1000} − \frac{1}{2} (\frac{24}{1000})^{2}

= 0.024 − \frac{5.76 × 10^{−4}}{2}

= 0.023712

6.3 値の範囲

この展開式は交代級数で、かつ各項の絶対値が単調に減少し 0 に収束する。また第三項 (n = 3) では正の値だから、 n = 2 までで切り捨てることによる誤差は正である。つまり、この計算での誤差の範囲 δ は 0 ≤ δ ≤ 0.0000048 となる。したがって、次のようになる。

0.0237120 ≤ ln (1 + \frac{24}{1000}) ≤ 0.0237168

7 ln (1 − \frac{1}{10}) の計算

7.1 誤差

ln(1 + x) の誤差の式に、 x = −\frac{1}{10} を代入する。

|R_{n+1}(x)| = \frac{1}{n + 1} · \frac{|x|^{n+1}}{1 − |x|}

= \frac{1}{n + 1} · \frac{|−0.1|^{n+1}}{1 − |−0.1|}

n = 3 とすると、

|R_{n+1}(x)| = \frac{1}{3 + 1} · \frac{|−0.1|^{3+1}}{1 − |−0.1|}

= \frac{1}{4} · \frac{0.1^{4}}{1 − 0.1}

= \frac{1}{4} · \frac{1 × 10^{−4}}{0.9}

= \frac{25}{9} × 10^{−5}

7.2 計算

n = 3 まで展開する。

ln (1 − \frac{1}{10}) = −\frac{1}{10} − \frac{1}{2} (\frac{1}{10})^{2} − \frac{1}{3} (\frac{1}{10})^{3}

= −0.1 − 0.005 − \frac{0.001}{3}

= −0.105 − \frac{0.001}{3}

7.3 値の範囲

この級数の全ての項は負の値だから、 n = 3 までで切り捨てることによる誤差は負である。つまり、この計算での誤差の範囲 δ は −\frac{25}{9} × 10^{−5} ≤ δ ≤ 0 となる。したがって、次のようになる。

−0.105362 ≤ ln (1 − \frac{1}{10}) ≤ −0.105333

8 ln (1 − \frac{1}{50}) の計算

8.1 誤差

ln(1 + x) の誤差の式に、 x = −\frac{1}{50} を代入する。

|R_{n+1}(x)| = \frac{1}{n + 1} · \frac{|x|^{n+1}}{1 − |x|}

= \frac{1}{n + 1} · \frac{|−0.02|^{n+1}}{1 − |−0.02|}

n = 2 とすると、

|R_{n+1}(x)| = \frac{1}{2 + 1} · \frac{|−0.02|^{2+1}}{1 − |−0.02|}

= \frac{1}{3} · \frac{0.02^{3}}{1 − 0.02}

= \frac{1}{367500}

= 2.72 × 10^{−6} < 0.0000028

8.2 計算

n = 2 まで展開する。

ln (1 − \frac{1}{50}) = −\frac{1}{50} − \frac{1}{2} (\frac{1}{50})^{2}
= −0.02 − 0.0002
= −0.0202

8.3 値の範囲

この級数の全ての項は負の値だから、 n = 2 までで切り捨てることによる誤差は負である。つまり、この計算での誤差の範囲 δ は −0.0000028 ≤ δ ≤ 0 となる。したがって、次のようになる。

−0.0202028 ≤ ln (1 − \frac{1}{50}) ≤ −0.0202000

9 ln 2 の計算

9.1 誤差

\frac{1 + x}{1 − x} = 2 を解くと、 x = \frac{1}{3} となる。 ln \frac{1 + x}{1 − x} の誤差の式に、 x = \frac{1}{3} を代入する。

|U_{n+1}(x)| = \frac{2}{2n + 1} · \frac{|x|^{2n+1}}{1 − x^{2}}

= \frac{2}{2n + 1} · \frac{|\frac{1}{3} |^{2n+1}}{1 − (\frac{1}{3})^{2}}

n = 4 とすると、

|U_{n+1}(x)| = \frac{2}{2 · 4 + 1} · \frac{|\frac{1}{3} |^{2·4+1}}{1 − (\frac{1}{3})^{2}}

= \frac{2}{9} · \begin{matrix}(\frac{1}{3}) & 9 \\ ( & \frac{8}{9} & ) \end{matrix}

= \frac{1}{78732}

= 1.27 × 10^{−5} < 0.000013

9.2 計算

n = 4 まで展開する。

ln 2 = 2 (\frac{1}{1} · \frac{1}{3} + \frac{1}{3} (\frac{1}{3})^{3} + \frac{1}{5} (\frac{1}{3})^{5} + \frac{1}{7} (\frac{1}{3})^{7})

= \frac{53056}{76545}

= 0.693134 ⋯

9.3 値の範囲

この級数の全ての項は正の値だから、 n = 4 までで切り捨てることによる誤差は正である。つまり、この計算での誤差の範囲 δ は 0 ≤ δ ≤ 0.000013 となる。したがって、次のようになる。

0.693134 ≤ ln 2 ≤ 0.693148

10 ln 10

3 ln 10 = 10 ln 2 − ln (1 + \frac{24}{1000})

= 10[0.693134, 0.693148] + [−0.0237168, −0.0237120] = [6.9076280, 6.9077632]

ln 10 = [2.3025426, 2.3025878]

= [2.30254, 2.30259]

これで、 ln 10 が求まった。

11 log 2

log 2 = \frac{1}{10} (3 + \frac{ln (1 + \frac{24}{1000})}{ln 10})

= 0.3 + \frac{[0.0237120, 0.0237168]}{10[2.30254, 2.30259]}

= [0.3 + \frac{0.0237120}{23.0259}, 0.3 + \frac{0.0237168}{23.0254}]

= [0.3010297, 0.3010301]

これで、 log 2 が求まった。

12 log 3

log 3 = \frac{1}{2} (1 + \frac{ln (1 − \frac{1}{10})}{ln 10})

= 0.5 + \frac{[−0.105362, −0.105333]}{2[2.30254, 2.30259]}

= [0.5 − \frac{0.105362}{2 × 2.30254}, 0.5 − \frac{0.105333}{2 × 2.30259}]

= [0.477120, 0.477128] これで、 log 3 が求まった。

13 log 7

log 7 = \frac{1}{2} (2 − log 2 + \frac{ln (1 − \frac{1}{50})}{ln 10})

= 1 − \frac{1}{2} log 2 + \frac{[−0.0202028, −0.0202000]}{2[2.30254, 2.30259]}

= 1 − \frac{1}{2} log 2 − [\frac{0.0202000}{2 × 2.30259}, \frac{0.0202028}{2 × 2.30254}]

= 1 − \frac{1}{2}[0.3010297, 0.3010301] − [0.0043863, 0.0043871]

= [1 − \frac{0.3010301}{2} − 0.0043870, 1 − \frac{0.3010297}{2} − 0.0043864]

= [0.84509785, 0.84509885]

= [0.8450978, 0.8450989]

これで、 log 3 が求まった。

14 対数の値のまとめ

以上より、対数は次のように求めることができる。

log 1 = 0  誤差範囲= 0
log 2 = [0.3010297, 0.3010301]  誤差範囲= 4 × 10^{−7}
log 3 = [0.477120, 0.477128]  誤差範囲= 8 × 10^{−6}
log 4 = [0.6020594, 0.6020602]  誤差範囲= 8 × 10^{−7}
log 5 = [0.6989699, 0.6989703]  誤差範囲= 4 × 10^{−7}
log 6 = [0.778149, 0.778159]  誤差範囲= 1 × 10^{−5}
log 7 = [0.8450978, 0.8450989]  誤差範囲= 1.1 × 10^{−6}
log 8 = [0.9030891, 0.9030903]  誤差範囲= 1.2 × 10^{−6}
log 9 = [0.954240, 0.954256]  誤差範囲= 1.6 × 10^{−5}
log 10 = 1  誤差範囲= 0

15 考察

上記の計算は実際に手計算を行ったが、約 3,4 時間で完了することができた。電子文書化する段階で電卓を用いて計算が正しいことを確認をした。

ln 2 の計算は n = 4 まで展開しなければ十分な精度を得ることができなかったが、もう少し効率のいい展開方法があったかもしれない。 ln 2 の精度が [0, 1.3 × 10^{−5}] と比較的大きかったにもかかわらず、最終的な計算結果で精度がよいのは、それぞれの展開式が、近い値からの差を求める形で表されているからである。例えば、 log 2 では、 0.3 からの差を求めている。

当初予定していた精度は 1 × 10^{−4} であったが、予定以上の精度で求めることができた。これは、 log 2, log 7 の計算の際、収束が速かったからだと言える。すなわち、切り捨てた項による影響が小さいからである。

さらに精度を上げるには、切り捨てる n を大きくしてやればよいが、今回では特に log 3 の展開式の n を上げるべきであろう。