<   2015年 10月 ( 12 )   > この月の画像一覧

Angelina Jordan

ノルウェーの8歳のジャズシンガー













[PR]
by tnomura9 | 2015-10-31 19:39 | ボーカロイド | Comments(0)

納得できる実数と自然数の濃度差のイメージ

0以上1未満の実数と自然数の濃度がどれくらい違うのかということについてどういうイメージを持つことができるだろうか。それには2つのアプローチが考えられる。

1つは0以上1未満を n 等分して、それぞれの区分に自然数を対応させるやり方だ。n 等分した区分には n 個の自然数を割り当てることができる。ただし、そのそれぞれの区分の中を覗いてみると無限の実数が含まれている。

n の数を大きくしていくと、区分の数に割り当てられる自然数の数はどんどん大きくなっていき、また区分の区間の幅もどんどん小さくなっていく。相変わらず区間に含まれる実数の数は無限であるが、それらの差はどんどん小さくなっていき、その無限の実数の中の代表元を一つ取り出しても他の元との差がほとんど見つからなくなる。小数点下10万桁が違う実数が無限に集まっていても、ほとんどそれぞれとの区別がつかないだろう。このような状態ではこの区間には実質的に一つの実数しか含まれないと考えてもいいかもしれない。

このようなアプローチでは、自然数と実数は n を無限に大きくすることで全単射に非常に近い状態にあるとして取り扱うことができる。そのため、自然数としてデジタイズした実数は、デジタルコンピュータで自由に加工できるようになる。

2つ目のアプローチは、実数を有限小数を無限に拡張した数であると考える考え方だ。0以上1未満の数を小数点下 n 桁の2進数で表すことにする。もちろん0以上1未満の数を全て有限小数で表すことができないし、有限小数で表すことができるのは、有理数の一部だけである。しかし、この n 桁の有限小数全体の集合を考えてみる。例えば、小数点下3桁の有限小数の数は次の8個である。

0.000
0.001
0.010
0.011
0.100
0.101
0.110
0.111

このうちの3個を取り出して自然数 1, 2, 3 と対応させてみる。

1 -> 0.010
2 -> 0.011
3 -> 0.101

するとこの3つの数列のから対角線論法によって 1 から 3 までの自然数に対応しない数 0.100 を作ることができる。8個のうちのどのような数3つを取り出しても、その3つに一致しない数を対角線論法によって作ることができる。つまり、n 桁の有限小数については、2^n 個の数があり、そのうちの n 個を 1 から n までの数に対応させると、対角線論法でその n 個の数に含まれない数を見つけることができる。この場合、有限小数と自然数の個数の差は 2^n - n であるということができる。

ところで、この n をどんどん大きくしていったらどうなるだろうか。有限小数と自然数の個数の差は相変わらず 2^n - n 個であるが、有限小数の値はどんどん無限小数を含む実数に近づいていく。そうして n が無限大になればこの関係は0以上1未満のすべての実数と全ての自然数の濃度の関係になる。つまり、実数と自然数の濃度差は途方もなく大きいものと考えることができる。

これらの考え方はあくまでも実数と自然数の濃度差のイメージを作るための議論で数学的に正しいかどうはは保証できない。また、二つの議論とも実数そのものを扱うのではなく、その近似値について述べて、n を増大させることによって実数に近づけるという方法を取っている。しかし、対角線論法の時は、自然数に対応しない実数がどれくらいになるのか、また、実数と自然数は全単射していてもいいのではないかという直感的な疑問について光を当ててくれる。

[PR]
by tnomura9 | 2015-10-24 05:16 | 考えるということ | Comments(0)

対角線論法の仕組み

カントールの対角線論法によれば0以上1未満の実数と自然数の全単射を作ることができない。無限小数で表記された実数と自然数の全単射があると仮定した時、自然数 n に対応する実数の小数点下 n 桁目の数と異なる数を小数点下 n 桁の数とする実数を考えると、これは自然数に対応したどの実数とも異なる実数であるから自然数とは対応していない。

この論法では自然数との全単射を考えた時に対応づけられない実数が少なくとも1つ存在することを示すが、自然数との1対1対応で余ってしまう実数が一体どのくらいあるのかを示してはくれない。そこで、対角線論法の中身を整理してみる。

まず、0以上1未満の実数を無限小数で表記するのに2進数を使うことにする。以下の議論では10進数表記でも同様に議論できるが、2進数の方が説明が簡単になる。任意の実数は a = 0.00101... のように表記される。

このように2進数表記で実数を記述するとき、小数点下 n+1 桁目以下は全て0である有限小数を考えると、このような有限小数は全て列挙でき、その数は 2 の n 乗個になる。例えば、小数点下3桁で終わる有限小数は、次の 8 個だ。

0.000
0.001
0.010
0.011
0.100
0.101
0.110
0.111

対角線論法では実数列の対角線を考えるため、8つの有限小数のうち 3 個についてだけ考えることになる。例えば、0.101, 0.010, 0.001 3つを 1, 2, 3 に対応付けると次のようになる。

1 -> 0.101
2 -> 0.010
3 -> 0.100

この数列から、対角線論法によって有限小数を作ると 0.001 だがこれは確かに上の3つの有限小数には含まれない 1 から 3 までの自然数には対応づけられない数である。このように n 桁までの有限小数は 2 の n 乗個あり、対角線論法ではそのうちの n 個について自然数との1対1対応を考えることになる。したがってこの議論を n が無限大になるまで続ければ自然数と実数(の部分集合)との1対1対応とその対応に含まれない実数について論じることができる。この場合自然数に対応づけられない実数の数は 2 の 無限大乗 - 無限大 という膨大な数になる。

ただし、この議論で自然数に対応づけられる数は実際は常に有限小数である。カントールは実無限の立場から無限小数が1点として存在すると考えて実数の n 桁の比較が無限大まで続けることができると考えて議論を進めているように見えるが、可能無限の立場からは、無限小数の最後の桁の数を求めるのは不可能である。可能無限で表現できる実数とは常にある範囲の実数を示す有限小数でしかない。例えば、上の例では有限小数 0.010 は 0.010 以上 0.011 未満の実数の集合である。無限小数で無理数が表記されていても、可能無限の立場からはそれは常にある一定の範囲の数の集合でしかない。

このように無限小数表記の無理数が、実際には有限小数で表される無理数の存在範囲の集合であると考えると、これは自然数と1対1対応させることが可能である。つまり、カントールの対角線論法では上の例の8つの数のうち3つだけしか自然数との対応を作ってはいないが、有限集合が点ではなく数の範囲を表していると考えると、8つを8つとも自然数と対応させることができる。

可能無限の立場をとったとしても、すべての実数を自然数に対応付けることは不可能だが、すべての実数を含むことができる実数の存在範囲を示す有限集合に対しては全単射を作ることができる。有限集合が表す実数の存在領域はどれだけでも小さくすることができるから、ある意味この全単射は自然数と実数との全単射とも考えることができる。これは連続数のデジタイズが確率論的に連続数全体をカバーできることを示している。

可能無限の立場をとったとしても、自然数と実数の一点との全単射はできない。しかし、対角線論法では、あまりに小数の実数しか自然数との全単射に用いられていないのがわかる。自然数と実数の間の全単射を考えるときは常に問題意識として、実数の世界をもれなく自然数で表現できるかどうかという問いがある。自然数で実数を表現できれば、実数で起こる現象を自然数の世界で論じることができるからだ。「神は自然数を造り賜うた、後の数は全て人間が作ったものである。」というクロネッカーの言葉は全ての数が自然数に基礎づけられることを言っているのだろう。実数の世界をある間隔で細切れにしてそれを有限小数(によって代表される実数の集合)として表現し、集合としての実数と自然数との全単射を考える可能無限の立場は、対角線論法よりも有効に実数と自然数との関係を示してくれる。

...と、これでうまくいくと思ったらそうは行かなかった。0以上1未満の数を区間で小分けすると総数は有限になるので、こんどは自然数のほうが余ってしまう。無限の自然数と対応させるためには、小分けの仕方を無限小にして区分の総数を無限大にしなければならない。実数より自然数のほうが余ってしまう。

小分けの区間が小さいほど区分の数は増える。区間を0に近づけると区分の数は無限に大きくなり、有限小数が表す実数の範囲も狭くなる。区間を極限まで小さくした時、有限小数は限りなく無限小数に近づき、対応する自然数の数も限りなく大きくなる。このとき、極限の有限小数で表す実数と自然数は全単射となるように思われるが、区間を0にすることはできないので、実数と自然数のあいだの全単射に限りなく近づくといえるかもしれない。荒っぽい言い方をすると、自然数と実数の濃度は同じに近いのではないかということになる。区間を0にすれば一つの区間が実数の一点を表すかもしれないが、区間を0にすることはできない。区間の幅を狭める方法で実数を捉えようとする方法では実数の一点を捕まえることはできず、どんなに区間を縮めてもその区間の中には無限の数が含まれる。

実数の一点と自然数の一点との対応という切り口では実数の数のほうが自然数より無限に多いが、区間を狭めていくと無限の点もあまり変わらない値しか取らなくなる。実数の濃度と自然数の濃度をイメージとして捉えようとする時、実数と自然数との全単射ならあるのではないかと考えたくなるのはそのためだ。

実数の存在形態についてはイメージを作るためにあれこれ考えられるので面白い。

[PR]
by tnomura9 | 2015-10-23 07:31 | 考えるということ | Comments(0)

実数の濃度

0から1までの有限小数は小数点下の数列を反転させれば、自然数と全単射で対応できる。これは、小数点下の桁数がどんなに増加しても成立する。ただし、この方法では無限小数の場合、対応する自然数も無限になるので、実数と自然数との全単射を作ることはできない。しかし、どれだけでも小数点下の桁数を増やすことはできるので、実数に限りなく近い有限小数については自然数との全単射を作ることができる。しかし、その場合でも無限小数はその中には含まれないので、自然数に対応づけられない実数は無限に存在することになる。

しかしながら、よく考えると無限小数の無限桁目の数値は決して知ることができないわけで、実数が一点として存在するとしてもその一点を求めることは不可能である。円周率などの無限小数はある範囲内にあることを知ることができるが、一点としては決して求めることができない。実数の一点とは常にある範囲の数の集合と考えなければならないことがわかる。実数をそのような集合と考えると、実数と自然数の全単射は可能であることがわかる。ただし、自然数の一点と実数の一点との全単射ではなく、自然数の一点と有限小数で表される実数の存在範囲の集合との全単射である。

実無限では実数は一点であるが、可能無限の立場からは実数の一点とは実数の存在範囲である。実数の一点を求めるアルゴリズムがない状態で実数の「一点」と自然数の一点との対応関係を考えることはできない。

しかし、実数の一点とはこのように点として考えることができないとすると、実数の関数を考えることができないのではないだろうか。だが、これは実無限の考え方のように実数の一点を仮定することによって解決出来る。実数の一点というものはないが、実数の一点を仮定することで関数の引数にすることができる。実際の計算では関数の引数として実数を表す有限小数を使わないといけないので、関数の値はある範囲の値となるが、その範囲は有限小数の桁数を大きくすることでどれだけでも小さくすることができる。

無限は本質的に到達できないものである。無限小数では一点を表すことができずそれが示すのはある範囲でしかないが、仮想的に一点を仮定すると色々と上手くいく。実際に取り扱うことのできる無限は可能無限のみであり、実無限は運用の便利な仮想的な概念なのではないだろうか。

[PR]
by tnomura9 | 2015-10-23 00:14 | 考えるということ | Comments(0)

0と1の間 (対角線論法の秘密)

0と1の間の実数を表現するには、結局無限小数を利用するのが一番だ。0.1415... という無限小数は一つの実数を表すと考えることが自然だし、この表記では0から1までの全ての実数を表現できる。

ところで、無限小数による実数の表記は何も10進表記でなくとも良い。0.100101.... のような2進表記でも構わない。2進数表記の実数の中には、1桁で終わるものもある。例えば0は0で1は1だ。その他は小数点下1桁で終わるものもある。0.0, 0.1, などだ。小数点下2桁で終わるものには、0.01, 0.10, 0.10, 0.11, 3桁で終わるものは0.000, 0.001, 0.010, 0.011, 0.100, 0.101, 0.110, 0.111, ... (省略)がある。ところが、これらの数の小数点下をひっくり返すと、これらは2進表記の自然数になる。0.1 なら 1 で、0.01 なら 10 すなわち 2 である。

上のような小数点下の数とそれをひっくり返してできる2進数は自然に1対1対応の関係になる。したがって、小数点下の桁数を無限に広げていけば、自然数と実数の1対1対応ができるのではないだろうか。確かに n 桁までの小数には実数は含まれていない。しかし、n 桁を無限に大きくしていけば、その中には無限小数が含まれているのではないだろうか。しかし、残念ながら円周率の小数部分のような無限小数に対応する自然数は無限大になってしまう。

しかし、この考え方にも利点がある。小数点下の桁数 n を十分大きく取ることによって。実数の無限小数に限りなく近い有限小数を見つけることができ、それについては、自然数と1対1対応していると言うことができるのだ。n が大きければ、十分に精度の高い実数値を得ることができ、それを自然数と1対1対応させることができる。また、どんなに n が大きくなっても、実数の近似値に対応する自然数を見つけることができる。これは、実質的に実数と自然数の全単射関係があると考えることはできないだろうか。

それでは、カントールの対角線論法の意味はなんだろうか。それは、小数点下の桁数 n の数が 2^n 個あるときに、対角線論法では n 個の数に対応するものしか取り上げないからではないだろうか。カントールの議論では小数点下第 n 桁の数値と異なる数値を取る数を作ることになっているが、そのやり方では 2^n 個ある小数点下 n 桁までの数のうち n 個の数と自然数との対応しか考えていない。

例えば小数点下3桁までの数を考えてみよう。それは次のように8個の数値になる。そうしてこれらは左右を反転させることによって右の自然数との自然な1対1対応を作ることができる。

0.000 ---> 0
0.001 ---> 4
0.010 ---> 2
0.011 ---> 6
0.100 ---> 1
0.101 ---> 5
0.110 ---> 3
0.111 ---> 7

ここで、これらの任意の3つをとって自然数 1, 2, 3 と対応させてみる。

1---> 0.011
2 ---> 0.100
3 ---> 0.111

これから対角線論法でいう自然数に対応しない数 0.110 を見つけることができる。これは確かに自然数 1, 2, 3 に対応づけられていない数である。しかし、この数の内在的に対応する自然数は 3 である。内在的に自然数に対応している8つの数の3つだけを取り上げて、自然数1, 2, 3 に対応している数以外に対応していない数があると主張するのが桁数 3 についての対角線論法なのである。このようなやり方なら、小数点下 n をどんなに大きくしても 1 から n までの数に対応づけることのできない数が存在することになる。対角線論法では、内在的に自然数に対応している数ですら、自然数に対応しないことにすることができるのだ。

このようにカントールの方法は小数点下 n 桁について考察するたびに生じる現象であり、その現象を n が無限大になるまで拡張した議論であることを示している。対角線論法を行う限りどんな n についても 2^n 個の数のうちの n 個だけを自然数に対応付けするので自然数に対応づけられない数が発生するのは当然だ。この切り口からの議論は n が無限大になっても同じなので、結局自然数に対応づけられない無限小数があるという結論になる。

カントールの対角線論法の議論についてもう一度見てみると、対角線論法で作られた自然数に対応しない実数は、しかしながら、元の対応関係の先頭に挿入すれば、自然数1と対応づけることができる。しかし、この場合もこの対応関係では対応づけることのできない新しい実数を求めることができるから全単射にはならない。最初の仮定では自然数と実数の対応関係は、少なくとも自然数については完了していたはずである。それにも関わらず新しい実数を含めた対応関係が構築できるというところが、無限に関する議論の怪しいところだ。

対角線論法の実数と自然数の全単射を作ることができないという結論は覆せないが、実数と自然数の差はどれくらいなのか1つなのか無数なのかと言う問いが生まれる。それに対する答えは、限りなく全単射に近いところまでは追い詰めていけるが、常に、逃げ水のように捕まえることのできない実数が無限に見つかると言う訳のわからないものになってしまう。

無限集合間の要素の全単射は、静的なものというよりは、常に変化し続ける運動のようなものという捉え方が必要なのではないかという気がする。無限そのものは捕まえることができないので、そのため、局所的な性質が無限大になっても変化しないという仮定で無限の要素について推論しなければならないが、それゆえに、全単射の対応づけの方法によっては、自然数がそれ自身と全単射なのに、別の対応づけを使うと自然数がその部分集合である偶数と全単射の関係にあるというちょっと疑わしい結論をも導き出すことができる。

[PR]
by tnomura9 | 2015-10-20 22:15 | 考えるということ | Comments(0)

0 と 1 の間の有理数

0 と 1 の間の有理数は無限に存在する。なぜなら有理数を小さい順に整列させた時、隣り合う有理数 a, b の間にはかならず有理数 (a+b)/2 が存在するからだ。したがって、0 から 1 の間であっても有理数を小さい順に並べ尽くすということはできない。このため 0 から 1 までの有理数と自然数の全単射を作ると言っても、有理数を小さい順に並べ尽くしてそれと自然数を対応させていくということはできない。このあたりの事情は有理数も実数も同じだ。

このことは、0 から 1 までの有理数を線分で表現した時、線分上の任意の点には、有理数か、その点に無限に近い有理数を選び出すことができることを示している。これは実用的には十分で、コンピュータの浮動小数点でほぼ全部の自然現象が計算できることになる。

それでは有理数と自然数の全単射はどうやってつくればいいのだろうか。それは、小さい順では有理数を整列させることができなかったが、特定の法則で有理数を整列させてやればいいのだ。全ての有理数をその法則で整列できれば、自然数との全単射を作ることができる。

ところで有理数は全て整数の既約分数で表現できる。0 から 1 までの有理数は既約分数 m / n のうち m < n のもので尽くすことができる。そこで、0 -> 0, 1 -> 1/1, 2 -> 1/2, 3 -> 1/3, 4 -> 1/4, 5 -> 2/3, 6 -> 1/5, 7 -> 2/5, ... と並べていく 0, 1, を除いて 2 は分子と分母の和が 3 のもの、3 は分子と分母の和が 4 のもの、4 と 5 は分子の和が 5 のものというように分子と分母の和が次第に大きくなるように並べていく。このようなルールで並べていく時にすでに並べたものの順序の変更はないので、このルールに従う限り有理数は一列に並べていくことができる。また、任意の有理数 m / n がこの列の何番目にくるのかも、このルールによって求めることができる。

但し、この数列を 0 から 1 までの有理数を表す線分にプロットしていくと、小さい方から順々に大きくなっていくというのではなく、線分の間を気ままに移動しているように見える。

しかし、とにもかくにもこのようなルールによって 0 から 1 までの線分の中の有理数を全て自然数に全単射で対応付けることができるので、この線分のなかの全ての有理数の要素には番号が割り振られていると考えることができる。有理数を整列するという操作は無限に続くので、これを完了させる事はできないが、0 から 1 までのどの有理数を取り上げても自然数の番号が振られているため、無限の有理数を 0 から 1 までの線分の中の有理数として、いわば、有限の範囲の中に閉じ込めた無限として扱うことができる。

上で述べたように有理数は小さい順に全て並べていくということはできない、隣り合う有理数が異なる有理数であれば必ずその間に別の有理数が存在するからだ。どんな、顕微鏡をもってしても有理数1個づつが隣り合っているという像を映し出すことはできない。一個の有理数を考えることができると言っても、それを大きさの順に並べることは不可能なのだ。したがって、自然数の1個と有理数の1個の意味合いがかなり違うと考えたほうが良いことがわかる。

それにもかかわらず、有理数を自然数と全単射で対応させることができるのは、有理数が自然数の既約分数 m / n であらわすことができるからだ。すなわち、有理数は自然数の2変数関数であると考えることができるからだ。有理数を小さい順に並べていくことは不可能だったが、有理数に対応する関数の引数である二組の自然数は取り出し方を工夫することによって列挙していくことができる。

有理数を自然数の2変数関数と考えれば、それを整列できることが分かったが、実数の場合はどうだろうか。実数は無限小数で表現すると、0から9までの自然数の無限個の変数の関数になってしまう。このような無限個の変数を持つ関数を引数を選ぶことによって整列させることができるのだろうか。

一見このような実数は、小数点下の桁数の数で分類できるような気がする。しかし、そのようにして取り出した数は全て有理数になってしまう。そのなかには無理数はどうしても含むことができない。その他の方法を考える抽象的な並べ方を考えたとしても、そのような整列は存在しないのを示したのが対角線論法だ。

0 から 1 までの線分の中には隣り合う有理数が見つけられないくらい隙間なく有理数が並んでいる。その隙間なく並んだ有理数の隙間をつくように無理数が存在するわけだが、無理数で有理数の隙間を埋めるということが、自然数の発想で隣の数との間を埋めるというイメージでは捕まえきれないのが分かる。

[PR]
by tnomura9 | 2015-10-18 07:47 | 考えるということ | Comments(0)

有理数の濃度

前回の実数と自然数の濃度の議論では、自然数 n と実数を対応づけるたびにソートしていけば、自然数と実数との対応づけが終わったと同時に、自然数に対応づけられた実数のソートされた列が出来上がるので、その列の間隙には対応づけられなかった実数が残ると主張したが。これは誤りだった。

同じ議論で自然数と有理数を対応づけると同時にソートされた有理数の列が出来上がるので、対応づけが完成した時に隣り合う有理数が異なっていればその間隙の有理数は自然数に対応づけられなかった有理数になってしまう。しかし、よく知られているように自然数と有理数は全単射で対応づけることができる。

どこがいけなかったのだろうか。それは、自然数と実数や有理数との対応づけが終わったと考える条件がはっきりしていなかったからだ。それはソートされた実数や有理数の列を見る限り、対応づけは無限に行われ続けるということを意味している。対角線論法では自然数と実数を対応づけた数値の表は、自然数 n までの部分はそれ以降の対応づけが行われても変化しない。しかし、ソートされた数値の列については、自然数 n と実数の対応が新たに作られるたびに、数値の列が変化する。このため、どの部分までが確定していると指摘することができないのだ。

対角線論法の秀逸なところはこの確定している部分だけを使って議論を組み立てているところだ。残念ながらソートした数列を調べるというやり方では、自然数に対応づけられない実数がどのくらいあるのかを知ることはできない。

しかし、前回の議論がまんざら無駄だったわけではないのではないだろうか。それは、自然数と有理数を対応づけたものをソートした数列の隣り合う数値はどんどん距離が縮まっていき無限に小さくなることが想定されるからだ。しかし、その場合も有理数と自然数との全単射は崩れない。つまり、0から1までの間を、自然数と対応づけられた有理数はどこまでも満たしていくことができるということがわかるからだ。それと同時に、隣り合う数値の間隙もどんどん狭くなっていくが0になることはない。0から1までの間は無限に埋められていくが、その間隙も無限に存在する。

自然数と実数との対応もこの有理数との対応と同じ現象が発生する。しかし、有理数は、自然数との全単射があるが、実数と自然数との全単射はできない。この理由がはっきりすれば、有理数と実数との要素の性質の違いがわかるのではないだろうか。それは、ひいては加算な集合と非加算な集合の根本的な違いを示すことにはならないだろうか。

無理数は有理数で表すことのできない数だ。しかし、有理数によってどれだけでも近似することのできる数でもある。このことと対角線論法との関係はどうなっているのだろうかと考えると面白い。

[PR]
by tnomura9 | 2015-10-17 17:23 | 考えるということ | Comments(0)

実数と自然数の濃度差 その2

前の記事で自然数に対応づけることのできない実数は無限にあるといったが、それは自然数に実数を対応づけるたびに、挿入ソートで実数を並べ替えるという方法だった。この方法だと自然数 n にまで対応づけたとき、対応づけられた n 個の実数がソートされており、その n 個の実数の間にはまだ対応づけられていない実数が少なくとも n - 1 個はあるはずだという議論だった。しかしこの議論では対応づけられていない実数は n が大きくなれば対応づけられるはずの実数かもしれないという可能性がある。

そこで、実無限の考え方で、この問題にアプローチしてみよう。上で述べた挿入ソートによる整列のやり方は、自然数 n に実数を対応づけるたびに実行できる。したがって、無限の自然数が実数に対応づけられたと同時にソートされた実数の列ができあがるはずだ。

そこで改めて自然数に対応づけられた実数の列をソートした列を眺めてみる。すると、それらの隣同士の実数は別の実数であるはずである。そうでなければ、異なる自然数に同じ実数が対応づけられているということになる。隣同士の実数が別の実数であるなら、実数の性質からその間に必ずそれらと異なる実数が存在するはずである。すなわち、自然数に対応づけられた実数の列の間には、それこそ、無限の実数が存在することになる。

これは、実数にはどんなに極限値に収束したとしても自然数に見られるような一点というものはなく、常にある一定の範囲に存在するとしか言うことができないからである。実数には一点というものが存在しないので、自然数との全単射はありえない。それが自然数と実数の濃度差の理由だ。

カントールの対角線論法は一見巧妙な議論に見えるが、本質的に実数を挿入ソートする上の論法との違いはない。そのうえ、対角線論法を使ったために自然数と実数との本質的な違いを見えにくくしてしまっている。対角線論法に対するもうひとつしっくりしない感じはそこからくるのではないだろうか。

追記

上の議論でソートされた実数列の隣会う実数は必ず異なっていると議論したが、ソートされた実数が稠密に並んでいるつまり連続的に変化している可能性はないだろうか。ソートされた実数が連続に変化していれば、隣り合う実数の間の自然数に対応していない実数を考える必要がなくなる。

しかし、それは否定的に解決される。ソートされた実数は自然数と全単射で対応していなければならないから、実数の原像である自然数は必ず異なっているので、その像である実数も異なっていなければならない。自然数と実数の全単射を考える限り、ソートされた実数の隣同士は異なる実数でなければならない。

このことは、自然数との全単射を考えることによって、ある点からある点への切れ目のない変化があるという実数の連続性が失われてしまうことを意味している。

ソートされた実数列については、さらに面白いことが分かる。隣り合う実数の間の自然数に対応づけられていない実数を集めて元の実数に加えると、新しい自然数に対応付けられた実数の集合が造られる。しかし、その場合でもやはり、ソートされた実数には間隙があり、その間隙の中の実数は自然数と対応付けられてはいない。

これは対角線論法で自然数に対応付けられることができなかった実数を、元の実数列の先頭に挿入することができるが、そうやって作った新しい対応付けの場合も対角線論法で新しい実数が対応付けられなくなるのと同じだ。

また、ソートされた実数の列は、自然数との対応が変更される度に隣会う実数と実数の距離が縮まっていく。しかし、どんなに縮まっても隣り合う実数の距離が0になることはない。このあたりの議論はゼノンのアキレスと亀の議論にも似ている。

議論が飛躍するかもしれないが、自然数と実数の濃度の違いというのは、自然数の離散性と実数の連続性の違いを示しているに過ぎないのではないか。つまり、自然数の集合にしても、有理数の集合にしても加算なものはその要素を1個2個と数え上げることができるが、実数は1個2個と数え上げることができないということだ。つまり実数の連続性とは、実数の点が並んで出来上がっているわけではないということだ。実数の世界には点としてその他の点からはっきりと区別することができるものはなく、それは無限に小さなある範囲の中に存在するとしか言えないということだ。

[PR]
by tnomura9 | 2015-10-14 02:43 | 考えるということ | Comments(0)

無限集合と真のクラス

自然数の集合という無限集合と「自分自身を要素として含まない集合の集合」というラッセルの真のクラスはどちらも無限の要素を持っている。それなのになぜ前者は集合と考えることができ、後者を集合と考えるとパラドックスが生じてしまうのだろうか。この二つの無限要素を持つ集まりの決定的な違いはなんだろうか。

この問いに対しては、自然数の集合の性質に注目するとよい。自然数の集合という無限集合の特徴は「その任意の部分集合を取ってもその集合を定義する内包的定義の述語 P(x) を充足しない。」ということだ。自然数の集合のどの部分集合をとっても、集合は数ではないので、「0は自然数である、x が自然数であるとき、x の後者は自然数である」という自然数を定義する述語を充足することはない。したがって、自然数の集合のどの部分集合も自然数を定義する述語 P(x) を充足することはないので、部分集合がどんなに大きくてもその要素は自然集合という枠内に収まっているということが言える。

しかし、「自分自身を要素として含まない集合の集合」については、その要素のどの部分集合をとっても、その部分集合自身が、「自分自身を要素として含まない集合」という述語を充足する。したがって、ラッセルのクラスの全ての要素を集めた集合があったとしても、その集合自身がラッセルのクラスの述語を充足してしまうので、その集合はラッセルのクラスの述語を充足する要素全てを集めたということはできなくなる。

自然数の集合と「自分自身を要素として含まない集合の集合」は両極端の場合だが、そのどちらでもない場合は、その集まりから無限集合を全て除いてしまうと、集合ではない集まりすなわち真のクラスの集まりが残ってしまうだろう。したがって、真のクラスの要素と無限集合の要素の和は真のクラスとなる。

無限集合も真のクラスも無限の要素の集まりだが、上のように考えるとその違いを示すことができる。

[PR]
by tnomura9 | 2015-10-10 00:44 | 考えるということ | Comments(2)

型クラス制約 Type Class Constraint

前回紹介したヒストグラムを作るためのモジュール Histogram.hs は [Int] 型のリストを扱うものだが、[Double] 型のリストを使って実数も扱えるようにしてみた。ヒストグラムの計算など [Int] 型のリストと [Double] 型のリストに共通する操作を histogram と histogramR のように別々の関数にせず、同じ histogram という関数にしたかったので色々と調べてみたが、結局、型クラス制約 (type class constraint) を使うのが良いというのがわかった。

型クラス制約とは何かということを説明するより、実際のソースをみた方が分かりやすいので、実数の計算ができるようになった Histogram.hs を次に示す。

module Histogram where

toint :: [String] -> [Int]
toint = map (read :: String->Int) . (filter (/=""))

toreal :: [String] -> [Double]
toreal = map (read :: String->Double) . (filter (/=""))

fromFile :: String -> IO [Int]
fromFile fname = readFile fname >>= return . toint . lines

fromFileR :: String -> IO [Double]
fromFileR fname = readFile fname >>= return . toreal . lines

toFile :: (Num a, Show a) => String -> [a] -> IO ()
toFile fname = (writeFile fname) . unlines . (map show)

histogramM :: (Num a, Ord a) => [a] -> [a] -> IO [Int]
histogramM bin = return . (histogram bin)

count :: (Num a,Ord a) => (a, a) -> [a] -> Int
count (lo, hi) = length . filter (\x -> (lo<=x) && (x<hi))

bins :: (Num a) => [a] -> [(a, a)]
bins lst = zip lst (tail lst)

histogram :: (Num a, Ord a) => [a] -> [a] -> [Int]
histogram bin lst = map ((flip count) lst) $ bins bin

このプログラムは ghci から load して使う。

Prelude> :l Histogram.hs
[1 of 1] Compiling Histogram ( Histogram.hs, interpreted )
Ok, modules loaded: Histogram.
*Histogram>

ヒストグラムの作り方はたとえば、data.txt というファイルのデータを [Int] 型のリストとして読み込んで、[1..6] の範囲のヒストグラムを作るには次のようにする。

*Histogram> fromFile "data.txt"
[1,2,3,4,5]
*Histogram> fromFile "data.txt" >>= histogramM [1..6]
[1,1,1,1,1]

さらに、改訂版の Histogram モジュールではファイルのデータを実数型のリストとして読み込み、実数のリストでヒストグラムを作ることができる。

*Histogram> fromFileR "data.txt"
[1.0,2.0,3.0,4.0,5.0]
*Histogram> fromFileR "data.txt" >>= histogramM [0.5,1..5.5]
[0,1,0,1,0,1,0,1,0,1]

また、計算結果をファイルに書き出すには toFile 関数を使う。

*Histogram> fromFileR "data.txt" >>= histogramM [0.5,1..5.5] >>= toFile "out.txt"
*Histogram> fromFile "out.txt"
[0,1,0,1,0,1,0,1,0,1]

toFile 関数は [Int] 型のリストの書き出しだけでなく、[Double] 型の実数のリストも書き出せる。

*Histogram> fromFile "data.txt" >>= toFile "out.txt"
*Histogram> fromFileR "out.txt"
[1.0,2.0,3.0,4.0,5.0]

ところで、上のソースのどの部分が型クラス制約なのかというと、たとえば bins 関数の型シグネチャーの

bins :: (Num a) => [a] -> [(a, a)]

がそれだ、(Num a) => は型変数 a が Num クラスのインスタンスであることを指定している。しかし、このような型の指定の仕方をすると、Num クラスのインスタンスの Int 型や Double 型のデータのどちらにも bin 関数が使える。

*Histogram> bins [1..5]
[(1,2),(2,3),(3,4),(4,5)]
*Histogram> bins [1,1.5..3]
[(1.0,1.5),(1.5,2.0),(2.0,2.5),(2.5,3.0)]

(Num a) => というのは何か暗号的で理解できにくく見えるが、使ってみるとこんな便利なものはないことがわかった。ポイントは自分の定義したい関数にどんなデータ型を使いたいか、またそれらのクラスのどんな関数を使いたいかということだ。たとえば上のソースの count という関数の型シグネチャーは次のようになる。

count :: (Num a,Ord a) => (a, a) -> [a] -> Int
count (lo, hi) = length . filter (\x -> (lo<=x) && (x<hi))

count は数値型 (Num 型) のデータを扱いたいので Num a という型クラス制約を利用する。また <= や < という比較演算子を使うためには Ord a という型クラス制約が必要だ。使ってみると、簡単な理屈だ。しかし、このおかげで整数型でも実数型でも同じ count という関数で処理することができる。

型クラス制約 type class constraint はおすすめだ。

[PR]
by tnomura9 | 2015-10-08 23:03 | Haskell | Comments(0)