近似値ではなく正確な値として実数を扱う計算について、計算と位相の関係に ついて、それに、ドメインと呼ばれる近似によって生じる順序の概念を抽象化 した構造についての研究が、私のメインテーマです。 それについて、平易な説明を試みました。

1.計算とは

普通、計算といっているのは、(1)対象を文字列によって表現した上で、 (2)入力の文字列表現を出力の文字列表現に機械的な手順に従って変換する ことです。

たとえば、(1)数を表すのには、通常、10進法が用いられます。つまり、数 を表現するのに、0,...,9 の文字列を利用し、314 という数を"314" という3 文字の文字列で表現しています。そして、(2)掛け算という演算を計算する のに、小学校で筆算を習いますが、筆算というのは、2つの入力の数の10進法 表現をもとに、掛け算の結果の数を表す10進法表現の文字列を作成する手続き です。この手続きは、文字列の表現している数という意味のことを知らなくて もできる機械的な操作であることに注意してください。機械的な操作だから、 コンピュータのような機械で実現できるのです。実際、コンピュータが行って いる計算とは、対象を0,1という2種類の文字の文字列として表現し、その 文字列に対する操作を機械で実現しているにすぎません。

(1)の文字列で表現するというのは、言い換えれば、名前をつけることです。 名前は、同じ名前が2つ以上の対象についていては困ります。名前の文字列だ けで、どちらを指しているのか分からなくなるからです。人間の場合は同姓同 名がありますが、そのために、個人を同定する時に、住所とか他の情報も一緒 に提示を求められます。住所と名前のペアが名前として働いているといっても いいでしょう。住民票コードの11桁の数字の列は、日本国民に一意につけられ た一種の名前といえます。計算に名前を用いるには、名前のそれぞれの部分が、 何らかの部分的な情報を持っていることが期待されます。たとえば、"314" と いう名前の最初の3は、その数が300 以上 399 以下であるという情報に対応し ています。また、インターネットにつながったコンピュータにはIPアドレスと いう名前が振られていますが、たとえば、130.54.120.209 という名前の 130.54 という部分は、そのコンピュータが、京都大学のネットワークに存在 していることを意味しています。この点、住民票コードの番号は完全にランダ ムだそうです。

さて、計算の話に戻りましょう。実数の上にも、自然数などと同様に計算が定 義できるでしょうか。上に述べたように、計算を定義するには、まず、(1) 文字列によって名前をつけなくてはなりません。しかし、全ての実数に異なる 名前をつけるのは不可能なことが知られています。実数も名前となる文字列も 無限個ありますが、実数のほうがずっと無限の程度が高くて、全ての実数に異 なる名前をつけようとしても、名前が足りなくなるのです。(この話は、集合 の濃度のことを習うときに勉強してください。)

では、実際のコンピュータは、どうやって実数計算をしているのでしょう。コ ンピュータで地震の津波のシミュレーションをしているところとか、よくテレ ビで目にしますよね。このようなシミュレーションでは、実数を扱う計算を多 用しています。このような、実用の場面では、コンピュータは、実数そのもの の計算をあきらめて、その代わりに浮動小数点と呼ばれる近似値を用いた計算 を行っています。もう少し詳しく説明しましょう。浮動小数点では、数直線上 に、2の32乗個、(あるいは、2の64乗個)の点を選んで、それらに名前 がつけられています。実数という(名前も付けられないほどたくさんある数の 代わりに、これらの名前がつけられた数だけを対象として計算を行っている訳 です。もちろん、計算を行いたい数そのものは、名前をつけられた数ではない ので、それに近い名前をつけられた数で代用することになります。また、名前 がつけられた数同士の掛け算などの演算でも、結果が名前をつけられた数にな るとは限りません。その場合には、その演算結果と近い、名前がつけられた数 が演算結果になります。本当の値ではなくて近似値を用いて計算しているので すから、演算を行っているうちに、誤差がどんどん積み重なってきて、実際の 値から離れていきます。大抵の実用にはこれで十分ですが、この方式では、正 確な実数値を得ることは不可能ですし、計算結果がどれくらいの誤差を含む可 能性があるのか、常に見積もる必要があります。

2.実数の上の計算

この浮動小数点を用いた計算は、あくまでも離散な対象の上で計算をしている のに過ぎず、実数の計算と言えるものではありません。このような近似値の計 算ではなくて、実数そのものの計算というのは考えられないものでしょうか。 計算とは、表現とその上の機械的な操作だと話しましたが、機械的な操作とい うのは、筆算で掛け算を行ったように、機械を使わなくても、人間が地道にや ろうと思えばできることです。それをめちゃくちゃ早く実際にやってしまうの がコンピュータです。このコンピュータという高速化の手助けの元で、人間が どのように対象を認識できるか、それが計算だと言ってもいいでしょう。その 計算の仕組みの中に、対象の持つ構造、対象のもつ性質が見えてくるに違いな い、それが私の研究スタンスです。この研究の目標は、実用的な計算をしたと いうことではありません。計算という行為を通して、計算の対象となっている ものの仕組みについて知りたいということです。そのような深い理解を求めて いる中で、思いもかけず、実用的な応用が見えてくるかもしれない、科学とは そういうものだと考えています。

さて、実数の連続性が、どのように計算を通して見えてくるか、その話をこれ からしようと思います。

先に述べたように、実数は(有限)文字列で名前をつけることができません。 しかし、無限文字列を使えば、名前をつけることができます。πの値は、 3.14159... と無限に続くことをみなさんご存知でしょう。そして、違う実数 が同じ展開を持つことはないことも知ってますよね。ですから、この 0から9 までと . の11種類の文字の文字列として、実数に名前をつけることができ ます。ところで、1.00000... と 0.9999... は、両方とも 1 という同じ数を 意味していることは分かっていますか?一つの名前は1つの対象を特定する必 要があるといいましたが、計算を定義するためには、一般に、このように一つ のものが複数の名前を持っていることは構いません。ですが、ここでは話を簡 単にするために、1.00000... だけを 1 の名前として許して、0.9999... は名 前ではないことにします。

この名前づけは、名前の無限列を先頭から見ていって、途中で打ち切った時に できる有限文字列(これを、接頭辞といいます)が実数に関する近似の情報を 持っていることに注目してください。"3.1" という接頭辞は、その数が 3.1 以上 3.2 未満であるという情報を持っています。"3.14"という接頭辞は、そ の数が 3.14 以上 3.15 未満であるという情報を持っています。このように、 接頭辞の長さが長くなれば長くなるほど、よりよい近似情報を持っていること になります。

計算を定義するためには、さらに、無限文字列を無限文字列に変換する手続き が必要になります。どういう手続きを考えたらいいでしょうか。入力が無限文 字列なので、まず、入力をすべて読み込んでから何らかの計算を行って結果を 出力しようとしたのでは、読み込みだけで無限に時間がかかってしまい、計算 にも出力にもとりかかることができません。ですから、入力をすべて読み込む のではなく、一部を読み込んだ段階で計算を行い、そこまでで分かった結果の 実数に関する情報を出力し、それから続きを読み込んで、続きの計算を行 い・・・という形で計算をすすめる必要があります。これは、上に書いたよう に、接頭辞が実数の近似情報を持っていることから、引数の近似情報をもとに、 結果の近似情報を出力するということを繰り返して、結果の近似情報をどんど んよくしていくことに対応しています。

例として、実数を3で割る、割り算を考えて見ましょう。3.14159... とい う無限列で表現される実数を3で割ると、1.04719... となりますね。実際にやっ てみると、上の桁から順に読み込みながら、計算を行い上の桁から順に出力し ていけることが分かります。この手順は、無限に続けることができます。だか ら、時間さえあれば、いくらでも出力を続けることができるのです。このよう にして、無限文字列を入力として無限文字列を出力する計算が定義できます。

では、実数を3倍する計算はどうでしょうか。3.14159... を3倍すると、 9.4247... となりますね。これも、左から右へと計算が進んでいき、無限に続 けられるように思えます。しかし、割り算より少し難しいですね。最初の 9. の出力も、3. というのを見てすぐにできた訳ではなくて、その下の桁の1 を 見て、桁上がりがないことを確認してからしかできませんでした。もし、入力 が 3.3332... だったりすると、最初の 9 を出力するのは、2 を読むときまで またされます。もし入力が 3.3334... だったりすると、10. から出力を始め ないといけないからです。では、もし、入力が 3.333333... と無限に続いて いたらどうでしょうか。これは、つまり、入力が 10/3 ということです。この 場合には、掛け算の手続きは、10.00000... という無限列を出力しないといけ ません。しかし、最初の 1 を、入力の途中まで見た段階で出力することは不 可能です。つまり、有限の接頭辞から、最初文字が 1 であるという情報を得 ることができません。だから、3倍するという演算は、この方法では計算不可 能ということになります。

同様のことは、10進以外の展開、たとえば、2進展開を用いても生じます。 2進展開では、1/3 は0.0101... でそれを3倍した数の 1 は 1.00000 です。 0.0101... という入力が与えられたときに、1文字目に1をかけばいいか、0を かけばいいかは、有限の接頭辞からは決められません。

3.実数と無限文字列の違い

無限文字列として作られた実数の名前を入出力する手続きとして、実数の上の 計算を考えました。しかし、3倍するといった簡単な計算も実現できないので は、ここで考えた計算の定義方法は、落第点といっていいでしょう。何がいけ ないのでしょうか。この問題を、実数と無限文字列のもつ近似の構造の関係を 通してみていきましょう。

まず、上では、10進展開によってできる無限文字列を元にして計算を考えまし たが、実は、文字列表現というものすごく具体的な表現を用いずに、より抽象 的に、実数上の自然な計算を考えることができます。上の 3.14159... を3で 割ると 1.04719... となる計算は、入力となる数の存在する区間が [3,4], [3.1,3.2], [3.14,3.15] と狭まっていくことにより、計算結果の存在範囲が [1,2], [1,1.1], [1.04,1.05] と狭まっていくことでした。このように、入力 の数の存在する区間に関する情報がどんどん狭まっていけば、それに従い、結 果の数の存在する区間が計算により求まり、それがどんどん狭まっていくとい うのが、この無限列を用いた実数計算の本質だと見ることができます。このよ うな、引数の値を含む区間の縮小列で、幅がどんどん小さくなって、無限のか なたでは幅が 0 になるようなものが与えられたときに、それを順に読み込みな がら、結果の値を含む同じような縮小列を作るような計算を、本来の実数の計 算と考えることができます。

実は、10進展開でうまくいかなかった掛け算のほうも、そういう種類の計算で す。引数の存在する区間が、[3,4], [3.3, 3.4], [3.33, 3.34] と狭まるにし たがって、結果の存在する区間は、[9,12], [9.9, 10.2], [9.99, 10.02] と 狭まっていきます。ただ、この縮小列をもとに、最初の文字を決められないこ とが問題なのです。なぜ、そういうことが起きるのでしょうか。そのことを考 えるために、今度は、無限文字列の世界について、みていきましょう。

10進展開での無限文字列を用いて話をしてもいいですが、2進展開の方が説明 が面白いので、2進展開で話をすることにします。すなわち、0,1 という2文 字だけからなる文字列について話をすることにします。一方、0,1 の無限列全 体の集合は、カントール集合と呼ばれています。また、数の表現について話を するときに、実数すべてを扱ってもいいですが、小数点の扱いが面倒なので、 0 以上 1 以下の実数(この区間を[0,1]と書きます)だけを対象として、(1 は 0.11111 として、) 0.の部分は省略し、小数点以下の文字列だけを考えるこ とにします。これにより、[0,1] の実数が、0 と 1 の無限列(すなわち、カ ントール集合の要素)で表現できることになります。

さて、01001100... といった無限列が与えられたとき、我々は、前からこの文 字列を見ていきます。最初の文字を見て、これが 0 から始まる文字列の集ま りに属しているということを認識します。このように、カントール集合の要素 は、最初の文字が0であるか、1であるかで2つの集合に分けられます。これは、 どちらに属しているか曖昧で、どちらにも属してなかったり、あるいは両方に 属していたりする要素はなしに、完全に2つの集合に分けられます。次の文字 を見れば、さらに、それぞれの集合が、2つに分けられます。そして、この文 字列が、その4つの集合の中で、01 から始まる文字列の集合の中に入っている ことが分かります。こうやって、文字列を前から読んでいくと、2分法で、ど んどんこの無限列の存在する場所が特定されていきます。この、右か左かとい う 2 分法でものごとを考えていくというのは、まさに、デジタルな思考とい うことができるでしょう。

4.計算と位相

実数の上には、二つの実数が近いとか遠いとかいう近さの概念があります。実 数の計算として、計算をすすめればすすめるほど、よりよい近似が得られる様 な計算を考えているのですが、この近似というのは、まさに、この近さの概念 に関して近いということです。このような、近さの概念のことを、数学では位 相といいます。

無限文字列にも、近い遠いという概念、すなわち、位相があります。無限文字 列は前から見ていくので、二つの無限文字列が近いとは、前から長く同じ文字 列が続くということです。つまり、共通の長い接頭辞を持つということです。 計算の結果として無限文字列を前から出力していくというのは、どんどん長い 接頭辞を決めていくわけで、この位相に関して、存在範囲を狭めていくことに 他なりません。

さて、10進展開や2進展開というのは、実数に無限文字列を対応させているわ けで、実数の世界を無限文字列の世界の中に埋め込もうとしていることです。 しかし、どのように埋め込もうとしても、実数として近いものが、無限文字列 としては遠くなることが起きてしまいます。上に書いたように、無限文字列の 集まりは、最初が 0 のものと 1 のものに分断されます。実数を、赤組(0)と 白組(1)の2 つの組に分けようとしているわけです。すると、どう分けても、 もともとものすごく近かった2つの数が、別々の組に入ってしまうことが必ず 起きますよね。近いものは近くにいくように埋め込むのは不可能なのです。こ れを、数学の言葉を使って言うと、実数は連結で、カントール集合は完全不連 結なので、実数の集合からカントール集合への連続単射写像は存在しないとい うことになります。

さて、2進展開でつけられた名前を用いて実数の計算をするというのは、カン トール集合での近似の概念でもって埋め込まれた実数の上の計算をするという ことでした。しかし、それでは、普通の実数の上の近さの概念と全然違った近 さの概念を用いて計算をしていることになります。ですから、引数を3倍する といったどうみても計算可能でないと困るようなものまで、計算不可能になっ てしまったのです。

ここで話したことは、ただ単に2進展開ではうまくいかないというだけではな く、どのような名前付けをしても、個々の実数に一意に名前をつけていたので は、名前を通して実数の上の計算を行うことができないということを示してい ます。

では、どうすればいいのかということですが、ここでは、2つ方法をあげます。

まず、個々の実数に複数の名前を許すことにより、名前を通した実数の計算を 可能にするという方法が考えられます。実数の上の自然な計算の話を上でしま したが、そこでは、引数の実数の存在区間が縮小していくのにしたがって、結 果の存在区間が縮まっていくような計算を考えました。この計算をするための 情報として、存在区間というものが、文字列として計算機に与えられないとい けません。つまり、存在区間の縮小列というのは、それ自体が実数の名前なの です。そして、縮小列のとり方によって、同じ実数にたくさんの名前がつけら れることに注意してください。そして、この名前に関してなら、実数上の自然 な計算が実現できます。

もう一つは、無限文字列のアクセスの方法を拡張することです。無限文字列は、 前から1文字づつ見ていくと書きましたが、そうではなく、1文字とばした先の 文字を読んだり書いたりすることを許すことを考えます。この場合、1文字と ばしたままずっと永遠に文字列を読んだり書いたりする場合も出てくるので、 無限文字列の中に、1文字飛ばした無限文字列というのも考えることになりま す。すると、そのような拡張された無限文字列の上には、カントール集合とは 違った、より連続な位相構造を入れることができます。そして、その位相にあっ た入出力の方法を考えることによって、実数の入出力が可能になります。

これらについては、これからゆっくりと書いていきたいと思います。