ここでは、「物理学者によるタイムパラドックス分析」の続編として、Computers with closed timelike curves can solve hard problems(意訳すると「タイムマシンコンピューターは難しい問題でも解いちゃうぜ」)を紹介しましょう。最初に言っておきますが、
半分冗談みたいな話なので、真面目に読んで怒ったりしないように
大丈夫だね? じゃあ話に入るよ。
著者のTodd A. Brunは、『量子コンピュータで速い計算ができる、ちゅーんやったら、なんかもっと新しい物理現象使ったらもっとすごいコンピュータできるんちゃうか』と考えて、この論文を書いたそうな。そのタイムマシンを使ったコンピュータ(Brun自身はCTC、つまり閉じた時間線を使ったコンピュータ、と書いているがまぁ同じことだ)では、timeRegisterなるレジスタがあって、そのレジスタの値はtimeset(t,p)なる関数を使って、未来からセットすることができる。tはセットされる時間(timesetが呼び出された時間よりも過去)であって、pがセットする値。この関数を使って次のようなプログラムを書く。
input(N); timeRegister = -1; t = clock(); p = timeRegister; if (p > 1) and (N mod p = 0) go to FINAL; p = 1; do p = p + 1; until (N mod p = 0) or (p > sqrt(N)); if (p > sqrt(N)) p = N; FINAL timeSet(t,p); output(p); end;
真ん中にはさまっているdo〜untilループは、しらみつぶし式でNの最小因数を求めるプログラム。とにかく2から順に、割ってみて割り切れるかどうか調べているだけ。Nの平方根より小さいところに因数がなければもうNそのものよりも小さい因数が見つかる見込みがないのでループを中止するようになっている。
最初にtimeRegisterに-1をセットして、tに時刻をセットした後でまたtimeRegisterの値をチェックしている。常識的に考えるとこの値は変わっているはずがない(まぁclockという関数の中で変えられたら別だが、これは単に時刻を返すだけの関数であるとしよう)のだが、なんせタイムマシン・コンピュータなので、timeRegisterの値は未来から(プログラム的に言うと最後から3行めのところだが)変えることができるわけなのである。で、もしその値がちゃんとNの因数になっていたら、よっしゃとばかりにFINALに飛ぶ。そして、その答えをtに保存しておいた時刻(もちろん過去)に送る(さっき受け取ったのはこの時送った答えだったというわけ)。そして答えを出力してプログラム終了。
プログラムが実行されたら何が起こるかというと、最初のチェックで、もしtimeRegisterがNの因数でなかったら、しらみつぶしループに進んで答えを出す。すると最後のtimesetでその答えが過去に送り返されるはずだ。ということは、さっきチェックした時には正しい答えが得られてなかった、ということと矛盾する。一方、もしチェックされた時にtimeRegisterがNの因子なら、万事OKだから計算なしに答えが出る。この場合は矛盾がない。ただし、計算は誰もしてないのに答えが出ちゃった、という気持ちの悪い結果になる。そして、前に「物理学者によるタイムパラドックス分析」の中でさんざん説明したように、『自己矛盾のない時間発展だけが起こるべきである』という原理が成立するならば、この気持ちが悪い方こそ起こるべきなのである。
なんかまるで「未来の自分が過去の自分にタイムマシンの原理を教えたので私はタイムマシン発明者になれました」って話みたいだね、と著者も書いている。この場合も「結局タイムマシン発明したんは誰やねん」ということになる。しかしこの場合なら「未来の自分がタイムマシンの原理を教えてくれなかったので、私はタイムマシン発明者になれませんでした」でも矛盾はない。つまり、どっちも矛盾がないから、タイムマシンが発明されない方が起こってもいい(っていうか多分そうなると思う)。ところがこのプログラムの場合、未来の自分から答えが来ないと矛盾が生じてしまうのだ。
つまり、しらみつぶしループは、『最初のチェックの時に答が出てなかったとしたら矛盾が起こるぞ』と言って宇宙を脅すために必要なのである。こうやって宇宙の喉元(どこや?)に匕首(どんな?)をつきつけてこそ、『わかった、私だって矛盾は起こしたくない』と宇宙が答えを教えてくれるわけだ。
2002年10月29日追記:よく考えたら上のプログラムだと宇宙に間違った答えをつかまされる可能性があるぞ。たとえばインプットとして100を与えられた場合、最小因数を求めろという問題なんだから答えは2であるはずだが、未来からやってくる答えが10だとしても、チェックを通るから矛盾のない解になってしまう。これはチェックが因数であることしか調べてないのが悪い。ちゃんと最小因数であることを調べればいいのだが、ちょっとだけだけど面倒。せっかくこういうコンピュータに計算させるなら、答えを求めるのはむつかしいけど検算は一瞬で終わるやつでないといかんな。たとえば、単に因数を見つけるんじゃなくて素因数分解にする。たとえば1001をインプットにあたえて、7と11と13を返すようなプログラムにする。これなら検算のコードはかなり簡単。あ、いやこれだと素数じゃない答をつかまされる可能性が(;_;)。人をこけにするのもたいがいにせんかい>宇宙。
この後論文にはこれに対する疑問として『宇宙の寿命(あるいはコンピュータの寿命)よりも長い計算時間がかかるような問題だと未来から返事が返ってこないからダメなんでは』という疑問に対して、アルゴリズムを工夫して、いろんな計算を分割して計算するようなことをすればいいというふうなことが書いてある。しかし実際には分割したそれぞれは(計算する前に答えを調べるともう出ているので)一回も計算しないわけね(;^^)。
わたしゃむしろ、このコンピュータがどの程度難しい問題になると答えが出なくなるかを測定すれば宇宙の寿命を調べることができるなぁ、なんて思っちゃったよ。でもよく考えたら、タイムマシンがあるんだから、宇宙の寿命知りたかったらいけばいいんだよな(;^^)。
ちなみに著者自身はこの論文の結論として、『おそらくこの結果から引き出すことができる最良の結論は、タイムマシンなんて存在しそうにもないなぁ、ということである』ということを述べている、ということを付け加えておこう。
結局そーゆーことかいっ。