2008-01-21 [長年日記]

無限桁の数・無限に数字が続く数 p-進数への足がかりとして [etc]

prima materia - diary : 無限集合の冪集合の部分集合としての自然数

からの流れです。
「自然数は有限の桁数で表現される」という──「自然数は無限に存在するが、それは桁数が無限な数が存在するということではない。ある自然数を取り出したとき、その桁数は必ず有限である」という──お話でした。


では、「左側に無限に数字が続く数」というものを考えてみましょう。
話が簡単になるように2進数でいきましょうか。
とはいえ、理解も浅い私が書いていることもあり、お世辞にも簡単とは言えませんが、ご容赦のほど。


まず「有限桁の数」

無限に続く桁がすべて0である数を考えてみましょう。\(\cdots0\) と書いておきましょう。直感は、日常的な数の0と同じであるような気がします。
とすると、ある桁から左が全部0な数、例えば\(\cdots01101\) なんてのは\(1101\) と表記してもよいでしょう。
誤解を生じさせる恐れはありますが、ある桁から左が全部0な数のことを「有限桁の数」と呼んで、左の0を書かないことにします。


加算

足し算を考えます。有限桁の数同士の足し算は、日常的な数と同じように振る舞う、としておきましょう。
というか、現時点の仮定の下では余計なルールを考えつきません。

無限桁の数と有限桁の数同士の数の場合も、だいたいは大丈夫です。
\(\cdots1010101010\) という左に無限に\(10\) が続くパターンを考えましょう。
これに\(100\) を足せば、\(\cdots1010101110\) となるだけです。

少し問題なのは、左に\(1\) が無限に続くパターン。
\(\cdots111111000+1111\) です。下3桁は\(1\) でいいでしょう。4桁目は筆算の考えでいけば \(1+1=10\) になって、4桁目は\(0\) で、次の桁に1つ繰り越しです。
が、その次の桁も\(1\) 。永遠に"同じ手順を続ける"ことになります。ということは、\(111\) の左は無限に\(0\) が並ぶことになります。
では。
"左に無限に0が続く"ものなら「有限桁の数」ということになります(前の段落をもう一度見てください)。
この足し算の答えは\(111\) でいいのでしょうか?

その問題について考えるのはちょっとおいておきます。

\(\cdots1111111+1\) を考えましょう。上記の考えからいけば、この答えは\(0\) になります。
……プログラマの人ならば、ここでピンとくるものがあるはずです。それは次で説明しましょう。


負数

引き算を考えます、といきたいところですが負の数について考えます。
同じものじゃないかって? まぁ、その通りなんですが。

日常的な数では、負の数というのはある正の数\(a\) に対して、
\(x~+~a~=~0\)
を満たす数\(x\) を負の数と定義し、\(-a\) と表記します。

おっと、ここまでで何も考察も定義もしていない「正の数」が出てきましたね。でもちょっとおいて、加算の項の最後に出てきた次式の形を見てください。
\(\cdots1111111+1=0\)
という式がでてきていました。
今考えている「左側に無限に数字が続く数」に、負数という考えを導入するとしたら、\(\cdots1111111\) という数が、\(1\) の負数──「日常的な」表現で書けば\((-1)\) ──という数になってしまいます。

さて、これは実はプログラマにとっては別に驚くべきことではありません。
プログラミング言語で、符合付き整数を表現するのに「2の補数」というものを使います。
-1という数は、2進数で1を羅列したデータで表現しているんです(その長さは表現したい符合付き整数の大きさ、言葉を変えれば扱いたい範囲から決まります)。

ということは……、
\(x~+~1~=~0\) を満たす数──日常的には\((-1)\) と表現する数──は、\(\cdots1111111\) でありしたがって、「負数という概念」「符号としてのマイナス記号」を導入する必要はない。
ということになります。


(ちょっと追記)
前の段落ででてきた式、\(\cdots111111000+1111\) についても、\(\cdots111111000+1111=111\) で問題ないと考えてよさそうです。
説明はしませんが、\(111-\cdots111111000=1111\) も、\(111-1111=\cdots111111000\) も妥当だと考えても大丈夫です。(\(a+b=c\) なら、\(c-a=b\) だし、\(c-b=a\) です)
「負数という概念を導入する必要がない」と先に書きました。
それでも減算を考えることはできます。なおかつ減算によって負数が出てくることがない、という性質を無限桁の数は持っているのです。


乗算

かけ算を考えます。
有限桁の数同士のかけ算はいいでしょう。
また、無限桁の数に\(1\) や\(0\) をかけた時の扱いもよしとします。恒等元と零元ですね。

無限桁のかけ算は?
まずは、\(\cdots101010\times10\) でしょうか。直感は、左に1つずれた\(\cdots1010100\) がその答えです。(これもプログラマなら[以下略])
今、このかけ算は感覚的には「元の数を倍にしている」と見なせます(2進数の\(10\) は10進数の\(2\) なので)。
では \(\cdots101010+\cdots101010\) を筆算の形に書いてみてください。
(右から)1桁目は0、2桁目は\(1+1=10\) で0が立ち左に1を繰り上げます。3桁目は\(0+0\) ですが1繰り上がってきているので1になります。4桁目以降は……、考えるまでもないですね。これが無限に繰り返されるわけで、出てくる形は\(\cdots1010100\) 。(jsMAth 環境では横線 \hline が出せないので不格好ですがご容赦を)

\(\begin{array}{rrrrrrrrrr}~\cdots&0&1&0&1&0&1&0&1&0\\~~~~~~~~~\cdots&0&1&0&1&0&1&0&1&0\\~-&-&-&-&-&-&-&-&-&-\\~\cdots&1&0&1&0&1&0&1&0&0\\~\end{array}\)

\(\cdots101010\times10=\cdots1010100\) はどうも正しそうです。


さて、無限桁同士のかけ算も、1つだけやっておきましょう。
\(\cdots1111111\times\cdots1111111\)
です。
\(\cdots1111111\) はこの世界での\(-1\) に相当しますから、この答えが\(1\) になってくれればいいですね。
筆算式を簡単に書いてみてください。
1桁目は、1。2桁目は\(1+1=10\) で0が立ち左に1を繰り上げます。
その次、3桁目は、\(1+1+1=11\) となり、右から繰り上がってきた1が足されて、0が立ちます。そうすると、左に\(10\) を繰り上げます。
その次、4桁目は、\(1+1+1+1=100\) となり、0が立ち、左に\(10\) を繰り上げます。
その次、5桁目は、\(1+1+1+1+1=101\) となるわけですが、3桁目から繰り上がってきた\(10\) の2桁目、4桁目から繰り上がってきた\(10\) の1桁目を考慮すると……0が立って、左に\(11\) を繰り上げます。
その次、6桁目は、\(1+1+1+1+1+1=110\) となるわけです。もう、あまり説明は入らないですね。4桁目から繰り上がってきた\(10\) の2桁目、5桁目から繰り上がってきた\(11\) の1桁目を考慮すると……0が立ちます。
こうやって、延々と0が立っていきます(というかいくはずです)。

\(\begin{array}{rrrrrrrrrr}~\cdots&1&1&1&1&1&1&1&1&1\\~~~~~~~~~\cdots&1&1&1&1&1&1&1&1&1\\~~-&-&-&-&-&-&-&-&-&-\\~~\cdots&1&1&1&1&1&1&1&1&1\\~~\cdots&1&1&1&1&1&1&1&1&\\~~\cdots&1&1&1&1&1&1&1&&\\~~\cdots&1&1&1&1&1&1&&&\\~\cdots&1&1&1&1&1&&&&\\~~-&-&-&-&-&-&-&-&-&-\\~\cdots&0&0&0&0&0&0&0&0&1\\~~\end{array}\)

こんな雰囲気です。本当は、下の横線の上に……のような表記を入れたいんですが、判りますかね?
つまり、筆算への考察から、感覚的には、
\(\cdots1111111\times\cdots1111111=1\)
は正しいらしいということになります。
これは日常の\(-1\times-1=1\) とちゃんと符合します。


除算

割り算は面倒ですね。
説明はしませんが、1つだけ例を出しておきます。
\(1\div11\) 。日常で扱っている数でいうなら、これは 1÷3 という意味なので分数か小数になります。

\(\cdots010101011\) という左に\(01\) が繰り返される数を与えます。これに、\(11\) をかけてみてください。
左にシフトして右に0を入れた\(\cdots0101010110\) との足し算でいいです。
\(\begin{array}{rrrrrrrrrr}~\cdots&0&1&0&1&0&1&0&1&1\\~~~~~~~~~\cdots&1&0&1&0&1&0&1&1&0\\~~-&-&-&-&-&-&-&-&-&-\\~~\cdots&0&0&0&0&0&0&0&0&1\\~~~~\end{array}\)
となるのが判りますか?


\(1\div11=\cdots010101011\) となります。分数や小数の出番はありませんでした。意外でしたか?*1


p-進数の世界へ

とまぁ、完全に直感的に、しかも2進法だけを取り扱って「左側に無限に数字が続く数」を見てきたわけですが、これは実はちゃんとした数学の成果です。

p進数 - Wikipedia

でちゃんと定式化した形が見られます。
(ところで、上記の記事にも書いてあることですが、素数を基数にしないと数が一意に表現できなかったりします。2進法が都合がよかったのはそういう理由です。何度も書いていますがプログラマには想像が容易ですし。)


自然数→整数→有理数→実数と、拡張していく(完備化と表現します)過程で、"数の順序"*2が失われていっています。
実数は間違いなく不可算な無限集合ですし、有理数もまた、ある有理数とある有理数の間に無限に有理数があるため、全ての数を大きさの順番で並べることはできません。
しかし"数の大小"は失われいません。2つの実数を持ってきた時に、その2つが同じであるか、どちらかが大きいと言うことができます(判定できるとは限りませんが)。


今見てきた様な「左側に無限に数字が続く数」「p-進数」もまた、整数からの完備化の過程でやはり"数の順序"が失われています。順番に数え上げられるのは、このエントリで「有限桁の数」と表現した数までです。
この「有限桁の数」は結局のところ「自然数の集合」に他なりません。「有限桁の数」ではあってもそれは無限にあるのでどこまでも終わりがありません。
つまり「『有限桁の数』ではない数」は順番の埒外です。
それが、このエントリが、

prima materia - diary : 無限集合の冪集合の部分集合としての自然数

の続きである理由でもあります。

閑話休題。
「p-進数」の世界で順番に数え上げられない理由は、実数や有理数の様に"ある数とある数の間に無限に数があるから"ではありません。
"数の大小"が失われているから──ある数とある数の大小を判定することができないからなのです。
\(\cdots1111111\) と\(1\) のどちらが大きいと、どうして言えるでしょうか? (追記:\(\cdots1010101\) と\(\cdots0101010\) の方がよかったかしら)
そこは数の正負の概念すらない世界ですから。


最後に

「左側に無限の桁を持つ数」は"空想"や"ありえないもの"ではなく、日常の数の感覚を超えた数学の世界への扉です。
それを知ったのは、日本評論社の雑誌「数学セミナー」の2006年9月号でした。
初めて非ユークリッド幾何学の話を聞いた時の様な、新鮮な気持ちを味わえました。
興味を持ったならば、図書館で探してみるなりしてはいかがでしょうか。


(追記)
実は今日まで気がついていなかったせいで、言及できませんでしたが id:ROYGB さんのエントリの、

しかし自然数を表記するのに無限の桁を使うことを認めると、実数と対応させることが出来てしまいます。
(大きく略)
無限の桁を使った自然数と実数は対応させることができるのに、自然数と実数を対応させることはできないのだから、無限の桁というのが間違いとなりそうです。
(略)
それは有限の桁だとすると、有限の桁で表記される自然数が無限に存在するということになるからです。

2008-01-14 - Log of ROYGB

と非常に深く関わってきます。

「無限の桁を使った自然数」というのはもちろん間違い(だから「実数は対応させることができる」も間違い)なのですが、「無限の桁を使った数」というのは考えることができますよ、ということを示しました。
ただし、それは自然数ではもちろんないし、私たちが日常違う整数とも有理数とも実数とも違う性質を帯びてきます。
その不思議さを表出できていれば、このエントリを書いた甲斐も少しはあったことになるんですが。
あ、もちろん、このエントリで考えている「左側に無限に数字が続く数」の系は、実数と1対1対応します(するはずです)。まさにROYGBさんの書かれた方法で、[0,1) 開区間と1対1対応させることができるからです。


追記 08/10/20
無限桁の数。p-進数について面白い文章を見つけた。

http://www.math.kyoto-u.ac.jp/~kato/Data/p-adic02.pdf

http://web.archive.org/*/http://www.math.kyoto-u.ac.jp/~kato/Data/p-adic02.pdf

これ、面白いのは、まず無限10進数から始めているのだ。
10は素数ではないので都合が悪い部分がある(それが何かは読み進めれば分かるのでここでは書かない)。その都合の悪さをあえて説明しているわけだ。
それに、日常的な筆算(に近い形)で書けることで分かりやすくもなっている。

これはよい。

*1 すべての割り算が小数なしで済むわけではありません。しかし、すべての割り算が有限の小数で表現できます。「右に無限に続く小数」が出てきません。

*2 ある数の「次の数」は何か? それは一定に定まるか? という意味です。