Posted at

0.999... = 1 から始める数学の話

More than 3 years have passed since last update.

数学を勉強していると「極限の概念が難しい」と感じることが多い。

自分は工学部の出身で、学生時代に材料力学やら流体力学やらで数式をガチャガチャと操作した記憶はあるものの、例えばε-δ論法や集合・位相といった純粋数学的な基礎はスッポリと抜け落ちたままだった。そのため自分は理系大学を出たものの結局が数学が分かっていないという飽き足らない思いがあり、つまみ食いのようにボチボチと数学の本を読んでは思うように理解が進まず頭を抱えるということを繰り返している。

特に極限概念の周辺は、分かっているつもりだったことが改めて考えると実は分かっていなかったと思い知らされることが多々あり、徐々に理解は進んできたと思うものの未だに苦手意識は払拭するに至っていない。そんなわけで到底自分は数学の専門家とは言えない立場ではあるが、自分用のメモを兼ねて分かってきたところをこの場に書き連ねていきたい。もし私と似たようなところで立ち止まっている方に多少の手助けとなれば嬉しい。また誤りがあれば遠慮なく(ただしお手柔らかに)ご指摘頂きたい。


0.999... = 1 について

さて、表題の式である。

0.999... = 1

きちんと数列の形式で書くとこういうことだ。

\begin{align}

a_1 &= 0.9 \\
a_2 &= 0.99 \\
a_3 &= 0.999 \\
... \\
a_n &= 0.999...9 \\
... \\
\end{align}

という数列に対して次式が成立する。

\lim_{n\to\infty} a_n = 1

つまり日本語で言えばこういうことだ。


0.999... と小数点以下に9が無限に並んだ無限小数は1に等しい。


…ちょっと待った!

今「9が無限に並んだ」と書いた。これは数学的な厳密さに欠ける表現だ。「無限に並べる」なんてことは数学の世界でも出来ないのである。無限に並んだ状態、つまり「無限に並べ終わった状態」を想像しようとして頭を捻っても極限概念は理解できない。そもそも「無限に並べ終わった」という表現がすでに矛盾を含んでいる。無限とはつまり、「終わらない」という意味なのだから。

まず、無限大 $ \infty $ は「数」ではない。整数でもないし実数でもない。

\infty \notin Z, \: \infty \notin R

(※ 無限大や無限小も「数」として扱う超実数とか超準解析とか呼ばれる分野もあるようだけれど、私は知らないので言及しない)

数ではないのだから、n に $\infty$ を「代入」して $a_\infty$ と書くことは(基本的には)出来ない。表記の簡略化のために便宜上そう書いている場合もあるが、しかしそれはあくまで略記に過ぎないのだ。

では無限大とは何なのか。それは例えば次のような「手続き」あるいは「操作」だ。


$a_n$ の n がどんなに大きな値でも、その次の $ a_{n+1} $ を考えることができる


例えるならこういうことだ。プログラミングでは簡単に無限ループを作り出すことができる。つまり「永遠に終わらない計算」を有限の長さのプログラムで表現することができる。同様に数学でも、無限大は「永遠に終わらない操作」として表現されるのである。

つまり $\lim_{n\to\infty} a_n = 1$ とはこういう意味だ。


n をどんどん大きくしていくことで幾らでも $a_n$ を1に近づけることが出来る。


「無限」という言葉がどこにも使われていないことに注意して欲しい。書かれていることは「n を増やすことで今よりもっと $a_n$ を 1 に近づけることが出来る」という操作である。

きちんと書けばこういうことだ。

(\forall\epsilon>0)(\exists N)\bigl(n > N \Rightarrow 1 - a_n < \epsilon\bigr)

以前はこういう論理式の解釈にも苦労した。プログラマである自分にとっては次のような捉え方が理解しやすい。

$\forall$ が付いているものを関数の「入力」、$\exists$ が付いているものを「出力」と考えるのである。今の場合は $\epsilon$ が入力、$N$ が出力である。つまりこの論理式は、どんな $\epsilon$ を「入力」されても、カッコ内の条件をみたすような $N$ を「出力」することが出来る、と読むことが出来る。

大雑把に言えばこの論理式の意味はこうだ。


どんな(小さな)値 $\epsilon$ を入力されても、$n$ を十分大きくすれば $a_n$ をどんどん 1 に近づけることができ、その差を $\epsilon$ より小さくすることが出来る。


このような条件が成立するとき、1 を $a_n$ の極限値と呼び、

\lim_{n\to\infty}a_n=1

と表現するのである。しかし、依然として次式は成立することに注意して欲しい。

\forall n(a_n < 1)

つまり、n をどんなに大きくしたところで $a_n$ は1より小さい。決して 1 に一致することはないのである。従って、0.999... という数字が「ほんの少しだけ1より小さい」と感じてしまう「素人の直観」はある意味正しいのではないか。「...」が極限として収束する先(極限値)を意味するという数学の文法を知らなければ、そう誤解するのはやむを得ないことではないだろうか。


区間の極限

では、次の区間はどうだろうか。

[0, 0.999...]

これは閉区間だ。そして 0.999... は「寸分違わず」1に等しい。だからこうだ。

[0, 0.999...] = [0, 1]

つまり、1 はこの区間に含まれている。

1 \in [0, 0.999...]

では次のような閉区間の列を考えることにしよう。

\begin{align}

A_1 &= [0, 0.9] \\
A_2 &= [0, 0.99] \\
A_3 &= [0, 0.999] \\
... \\
A_n &= [0, 0.999...9] = [0, a_n] \\
... \\
\end{align}

今から考えるのはこれら区間列の和集合(無限和!)である。

\bigcup_{n=1}^\infty A_n

これが有限和なら何も難しくない。この区間列は下記に示すように徐々に範囲が拡大していく列なのだから

A_1 \subset A_2 \subset A_3 \subset ... \subset A_n

有限和は次式になる。

\bigcup_{i=1}^n A_i = A_n = [0, 0.999...9]

見ての通りこれは閉区間だ。閉区間 $A_n$ の有限和はやはり閉区間だ。ところが、無限和になるととたんにおかしなことが起こる。

\bigcup_{n=1}^\infty A_n = \lim_{n\to\infty}\bigcup_{i=1}^n A_i = \lim_{n\to\infty}A_n = \bigl[0, 1\bigr)

[0, 1] ではない。[0, 1) なのだ。各区間 $A_n$ は閉区間なのに、極限を取ると半開区間に変化してしまう。最初はこれがとても不思議に感じられて、なかなか理解できなかった。

整理するとこういうことになる。

\begin{align}

[0, \lim_{n\to\infty}a_n] &= [0, 1] \\
\lim_{n\to\infty}[0, a_n] &= [0, 1) \\
\end{align}

どうしてこういう違いが生じるのだろうか。数列の極限と区間列の極限では扱いが異なるのだろうか。いやその前に、そもそもこの違いはそんなに重要な事なのだろうか。[0, 1] も [0, 1) もほとんど同じなのだから、どちらであろうと別に構わないのではないか。そんな重箱の隅を突くような話で立ち止まらないで先に進むほうが良いのではないか。

この疑問は私自身が感じていたことであり、「こんな細かい話が何の役に立つというのだ」などと思っていた。結果的にはこの態度が数学の理解を阻害している最大の要因であることを思い知らされることになった。どうやらここを理解しないと先の(純粋)数学には進めないようなのだ。ここを理解しないと「位相」という概念が理解できないのであり、位相を(ある程度は)理解しないとその先の数学書を読んでみてもちんぷんかんぷんなのである。もちろん一旦次の数学に進んでみてその先にある世界を垣間見てみることも良いと思うけれども、結局はここに戻ってくることになるのではないかと思う(私はその道を辿った)。

では $\lim A_n=[0, 1)$ となる理由について考えていこう。任意の n に対して次式が成り立つ。

\forall n(1 \notin [0, a_n])

つまり n をどんなに大きくしても 1 が $[0, a_n]$ に含まれることはありえない。この事実は極限をとっても変わることはないため

1 \notin \lim_{n\to\infty}[0, a_n]

うーん、確かにその通りなのだが、しかしこれだけではどうも納得しがたい。理解を補強するために、新たに次の区間列を考えることにしよう。

B_n = (a_n, 2], \: n = 1, 2, ...

これは$A_n$に隣接する区間であり、区間 [0, 2] を $A_n$ と $B_n$ で交わりなく二分している。そして $a_n < 1$ なのだから 1 は $B_n$ に含まれている。

\forall n(1 \in B_n)

であるから、$B_n$ の極限は次式となることが推論できる。

\lim_{n\to\infty}B_n = \lim_{n\to\infty}(a_n, 2] = [1, 2]

つまり $1\in\lim B_n $。一方、$\forall n(A_n\cap B_n=\emptyset)$ なのであるから、

\lim_{n\to\infty}A_n \cap \lim_{n\to\infty}B_n = \emptyset

でなくてはならず、結局 $1\notin\lim A_n$ が推論される。

どうだろうか、これで完全に納得できるだろうか。否、逆にここまでくると、一度は納得したはずの $\lim a_n=1$ が再び不安になってこないだろうか。

区間 $A_n$ の場合は $\forall n(1\notin A_n)$ であるから $1 \notin \lim A_n$ と結論づけた。数列 $a_n$ の場合も同様に考えれば、$\forall n(a_n < 1)$ であるから $\lim a_n < 1$ と結論付けるべきであるように思えてくる。にも関わらず数学は $\lim a_n = 1$ であると主張する。これは矛盾ではないのか。ダブルスタンダードではないのか。

これを認めると、なんだか「おかしなこと」が起こっていることになる。まず、すべてのnについて$a_n$は半開区間[0, 1)に含まれている。

\forall n(a_n\in[0, 1))

一方で、$\lim a_n = 1$ なのだからこれは [0, 1) の外にはみ出してしまっている。

\lim a_n \notin [0, 1)

数列の各項はすべて区間 [0, 1) に収まっているというのに、数列が並ぶ無限の彼方では [0, 1) からはみ出してしまうのである!

実はこれは「おかしなこと」ではなく、数学的に全く正しい事実である。この辺りを納得するには「完備(complete)」「完備化(completion)」という概念を理解しなくてはならない。


完備化

数学の用語というのは時として謎めいていて、蠱惑的で、甘美である(ここにきて駄洒落)。「完備」という言葉もそういう響きがあるように思う。一体何を「完全に備えて」いるのだろうか。一体何が "complete" されているのだろうか。

ここでいう完備化とは、有理数を「拡張」して実数を定義する操作を指している。これにより有理数が極限操作を「完全に備え」た実数へと拡張され、数として complete されるのである。これによって実数体は「無理数」を含むようになり、「連続体濃度」を持つようになる。

そんなわけで、完備化を理解するには無理数を考えたほうが良さそうだ。ここでは一旦 0.999... = 1 の問題から離れて、無理数 $\sqrt{2}$ について考えていくことにしよう。

\sqrt{2} = 1.41421365...

ここでひとつ注意しておくことがある。読者はおそらく $\sqrt{2}$ という「無理数」に既に馴染んでしまっていると思われる。「完備化」などというややこしい純粋数学を学ぶ前から我々は無理数について学んでいるし、$x^2=2$という方程式の解が$\sqrt{2}$という無理数になることも知っている。つまり実数がその名の通り「実」のあるものとして感じられる肌感覚のようなものを得てしまっているだろう。であるからこれから以下で説明することが、どうしてそんな回りくどいことをしなくてはならないのか理解に苦しむかもしれない。今、我々は「無理数」「実数」というものをまだ知らない、という想定に立たなくてはならない。「有理数」の知識だけを武器として数の概念を拡張し、新しく「無理数」「実数」を構成する、という立場に立たなくてはならない。

さて、$\sqrt{2}$は次の関数の根として考えることができる。

f(x) = x^2 - 2

つまり $f(r) = 0$ となる $r$ を求めたい。手持ちの武器は有理数だけという想定に立っているのだから、いきなり $r=\sqrt{2}$ と解を示す訳にはいかない。有理数の範囲だけで解を表現しなくてはならないのだ。

ここでは二分探索法によるアルゴリズムでこの解に迫ってみよう。$f(0) = -2 < 0$ かつ $f(2) = 2 > 0$ であるから、$r\in[0, 2]$であることは間違いない。この区間を出発点として、二分探索により区間を徐々に狭めていって解に迫ろうというわけである。このとき n 番目の区間の中点を $r_n$ と置こう。これは下記のような数列となる。

\begin{align}

I_0 = [0, 2],& \: r_0 = 1 \\
I_1 = [1, 2],& \: r_1 = 1.5 \\
I_2 = [1, 1.5],& \: r_2 = 1.25 \\
I_3 = [1.25, 1.5],& \: r_3 = 1.375 \\
I_4 = [1.375, 1.5],& \: r_4 = 1.4375 \\
...
\end{align}

このように、有理数の範囲で $x^2=2$ を解こうとすると解は数列として表現するしかないのである。しかし、数列として表現すると困ったことが起きる。$x^2=2$ の解に漸近する数列は無数に存在するのだ。上記の二分探索法においても出発点の区間を変えれば異なる数列が得られるし、ニュートン法など別のアルゴリズムを使っても異なる数列となる。同じ数を表現するための数列が無数に存在してしまうのでは扱いに困ってしまう。

この問題を解決するために、これらの数列に次の同値関係(~)を入れる。

(r_n)_{n\in N} \sim (r'_n)_{n\in N} \Leftrightarrow \lim_{n\to\infty} |r_n - r'_n| = 0

これにより、$x^2=2$ の解に漸近する数列はどのようなものであれ「同じもの」として束ねてしまうことができるようになり、問題は解決する。また、この方法により有理数の四則演算のルールがそのまま自然な形で導入できることも証明されている。こうして実数が定義される。

ここで大事なことは次の事実である。


$\sqrt{2}$ という数字は、実はその中に $\sqrt{2}$ に漸近する無数の数列を内包し、飲み込んでいる。


これを踏まえて、再び 0.999... = 1 の謎に戻ろう。賢明な読者はもうお分かりのことと思う。1 という実数は、その中に 1 に漸近する無数の数列を飲み込んでいるものとして定義されているのである。

次の3つの数列(有理数!)を見てみよう。

\begin{align}

(a_n)_{n\in N} &= 0.9,\, 0.99,\, 0.999,\, 0.9999,\, ... \\
(b_n)_{n\in N} &= 1.1,\, 1.01,\, 1.001,\, 1.0001,\, ... \\
(c_n)_{n\in N} &= 1,\, 1,\, 1,\, 1,\, ...
\end{align}

$a_n$は左から右へ向かって 1 に近づく数列、逆に $b_n$ は右から左へ向かって 1 に近づく数列、$c_n$ はただひたすら 1 の上で足踏みを繰り返す数列である。いずれにせよ、これらは皆 1 に向かって漸近する数列であり、

(a_n)_{n\in N} \sim (b_n)_{n\in N} \\

(b_n)_{n\in N} \sim (c_n)_{n\in N} \\
(c_n)_{n\in N} \sim (a_n)_{n\in N} \\

という同値関係で結ばれている。従ってすべて 1 という一つの実数の中に飲み込まれてしまうのである。