杜の都のSF研日記(アーカイブ)

旧「杜の都のSF研日記」http://d.hatena.ne.jp/sftonnpei/ 内容を保管しております

「90億の神の御名」の数学 〜冗談ではない!クラーク先生〜

前回の2日後。全部雨で落ちるとは…

 部のとある人間が、宇宙創成のためにかの世界最大級のつり橋一本分に相当するという研究施設を目指し日本を南下したことは記憶に新しい。彼は研究室でさまざまな仕事に尽力したそうだが、そのためもあってか宇宙を創世するにはいたらなかったようである
 では、それとは違うアプローチのほうが簡単なのではないかととある人間が考えた。いや、正確には考えた人間が複数存在し、そういった試みがかつて行われたというべきか。その名を「シャングリラ計画」というその試みは現在ひとつの短編に記録されるのみである。それがかのアーサー・C・クラーク「90億の神の御名」(『天の向こう側』収録)である。
 チベットの山奥の僧達は昔から「真の神の名」を求めて9文字の文字列を書き続けている。その組み合わせの中のどれかに本当の神の名が存在すると考えられるからだ。しかし技術の進歩が彼らを追い越す時代が来た。コンピューターは僧侶たちが1万年と2000年たっても終えられない作業をたった100日で終えてしまうのだ!

天の向こう側 (ハヤカワ文庫SF)

天の向こう側 (ハヤカワ文庫SF)

この作業が神の課した人類への試練という解釈がある一方で、これが人類の○○○○であり以下略という、かの数学パズル「○○○の塔」的解釈が一部非主流派に存在する。それをやってみようというのが今回の行動の目的である
 ちなみにJavascriptによるものがこちら
http://www.aoakley.com/articles/2008-03-19.php
>Andrew Oakley, Gloucestershire UK:The Nine Billion Names of God in Javascript-
http://ryouchi.seesaa.net/article/90358538.html
>りょーちの駄文と書評:アーサー・C・クラークの「90億の神の御名」をJavascriptで?
ここで紹介されていた。しかし、後述する理由によりなかなか困ったことになるので自己責任で実行するように。
 ちなみにこのようなことをするのはあくまで

クラークの第二法則
「可能性の限界を測る唯一の方法は、不可能であるとされることまでやってみることである」

に順ずるものであり、それ以上の意味はないことを付記しておこう。そりゃこちらもこんなことで○○が○○てはまだやってないこと・読んでない本があって困るので。
 用は総当りで9文字の列を作り、それが「神の名」であればファイルに出力するという作業を繰り返せばよい。あまり賢くないが判定も除外条件となる連続が存在しないことを等式で判定するシンプルなものを採用している。これだけならプログラムを作るのには1時間もかからない。
 ちなみに注意したいのがこの連続の数。翻訳ではこうなっている

たとえば、どの文字も、三つ以上続けて並んではなりません。

上に紹介したイギリス人のプログラムだと普通に3連続が出力されるのだが何故だ?この場合3字の連続は含まれるのか?なんだかちょっと自信がなくなってきたので、原文を当たってみた

For example, no letter must occur more than three times in succession.

"more than"は一般に「それ以上」ではなく「それより多い」をあらわすという。つまりmore than threeというと3は含まれない。ということは3文字までの連続が許される・・・という解釈ができる。でもそのあと「2つじゃなくて?」って聞きかえされているのでなんとなく通常の「以上」という感覚でいいのかもしれない*1。2つ連続してはいけない、というルールはよくあるので。今回はとりあえず3字の連続を認める場合でやってみることにする。
 最初の数個がこんな感じ

abaaabaaa bbaaabaaa cbaaabaaa dbaaabaaa ebaaabaaa fbaaabaaa gbaaabaaa
hbaaabaaa ibaaabaaa jbaaabaaa kbaaabaaa lbaaabaaa mbaaabaaa nbaaabaaa
obaaabaaa pbaaabaaa qbaaabaaa rbaaabaaa sbaaabaaa tbaaabaaa ubaaabaaa
vbaaabaaa wbaaabaaa xbaaabaaa …

9字ということは中には種々の宗教の神の名が内包されるのみならず、クラーク作品でおなじみOVERLORDやOVERMIND、STARCHILD*2のほか、日本から「MATAYOSHI」のような絶対神、はたまた俺が「GUNDAM」だ、なんてものも内包される。しかも○○○GUNDAMだけで実に17576種類。お、よく考えると余裕でGODMANも入るな(ぇー
 しかし重大な問題を忘れていた。

「もっとも、わたしどもは、自分たちの特別なアルファベットを使用するのですがね」

英字でやっては意味がないのだった。そこでチベット文字に関して調べてみたが、表音文字に近いだけでなく、組み合わせて別の字になったりして分かりにくいことこの上ない。これでさらに神の名として有効な文字列なんて分からないぞ!
 とりあえずチベット文字の問題はいったん脇において理論的に考えてみよう。大学受験の前から、担任には「お前は『算数』が苦手やからなぁ」と詰られながらも理系に入った自分ではあるが、無い知恵いろいろ絞って考えてみることにする。
 こちらが自分が作ったプログラムの主要アルゴリズム。godname配列が名前を格納、NUMBERがその文字の全体の数(アルファベットならn=26)である。

/*主ループ*/
 while(1)
 {
  for(j=0;j<=5;j++)
  {
   if(godname[j]==godname[j+1])
   {
    if(godname[j]==godname[j+2])
    {
     if(godname[j]==godname[j+3]) goto label /*除外対象*/
    }
   }
  }
  /*候補を1加える*/
  m=m+1;
label:
  /*一文字シフトする*/
  godname[0]++;
  for (j=0;j<=7;j++)
  {
   if (godname[j]>=NUMBER){
   godname[j]=0;
   godname[j+1]++;
   }
  }
  if(godname[8]==NUMBER) break;
 }
 printf ("god name : %f \n",m);

出力ファイルをテキストデータとすれば文字+改行コードもしくはスペースで合計10文字。一文字一バイトとして単純に計算して10×約90億= 83.8190317 ギガバイト。手持ちの環境ではとてもじゃないがHDDをまっさらにしないと足りない。実際プログラムが完成して何も考えずに実行したときは3GBを突破したところで空きに気をつけていなかったので警告が多発。あえなく中断するハメになった。
 とりあえず正確な数を考えてみよう。用は「n字の集合で4字以上の連続がない9字の文字列を作った場合の組み合わせの数」である。神の名前なのでG(n)としよう。n字の集合で9字の文字列を造るのだから、G(n)=n^9-(4文字以上連続する場合)を計算すればよい


・9文字連続する場合
これは単純。n種類しかない


・8文字連続する場合
こちらは8文字の連続+1つ違う文字となる。これはn(n-1)。また前後からの二種類があるので合計2n(n-1)種類ある。


・7文字連続する場合
7文字の連続+2字となる。ただし今度は2字(連続する場合も含む)+7字連続もしくは1字+7字+1字がありうる。「連続でない」とは、「それまでが連続(同じ文字)であった次に来る一字がそれまでのものと異なる」ということ。ここでは一律(n-1)と表せる。これを利用して7字連続+(n-1種類)+(n種類)、(n-1種類)+7字連続+(n-1種類)と表せるので前者が2n(n-1)^2、後者がn(n-1)^2である。


・6文字連続する場合
同様に考えると6+1+2、1+6+1+1がありうる。前者は2n^3(n-1)、後者が2n^2(n-1)^2


・5文字連続する場合
5+1+3、1+5+1+2、1+1+5+1+1がそれぞれあり、それぞれ2n^4(n-1)2n^3(n-1)^2n^3(n-1)^2となる
最後を二倍しないのは左右対称分をうまく処理できるため。


・4文字連続する場合
まずは4+5だが、先ほどの「5連続+4字」に一部(5連続+4連続)を含んでいるのでそれを除外。また、形としては4+1+4になるが、この場合連続が二つある場合があるためこれをいったん除外する。その場合はn(n-1)^2個。先の場合をまとめて考えて2n^2(n-1)(n^3-1)+n(n-1)^2
残りは1+4+1+3と1+1+4+1+2の場合で、前者の場合後ろが4連続になる場合を除いて2n(n-1)^2(n^3-1)、後者が2n^4(n-1)^2となる。


しめて合計すると「n字の集合における神の名の(正確には候補の)数」は
G(n)=n^9-n-2n(n-1)-3n(n-1)^2-2n^3(n-1)-2n^2(n-1)^2-2n^4(n-1)-2n^3(n-1)^2-n^3(n-1)^2-2n(n-1)(n^4-n)-2n(n-1)^2(n^3-1)-2n^4(n-1)^2
長いったりゃありゃしない。さて、90億となるのは果たして?
(一応上式+Cのプログラムで追試してます)

 2文字            298種
 3文字         16,572種
 4文字       242,820種
 5文字      1,875,280種
 6文字      9,837,150種
 7文字     39,732,588種
 8文字    132,809,992種
 9文字    384,528,960種
10文字    994,502,610種
11文字  2,348,127,100種
12文字  5,143,113,228種
90億種  9,000,000,000種 *
13文字 10,577,400,912種

なんと、ぴったりなんて都合がいいものはないと思っていたがうまいこと90億台と呼べるものがない。
でもまさか追試せずにやってるとは思わないので自分の計算ミスの可能性のほうが高いのではないかと思っているのだが・・・一方でこれほどデカい数なので、クラークも概算しか出さなかったとか?いやいや、彼は「木星第五衛星」のとき軌道計算をなんども確かめなおしている*3。まさか手は抜かないと思うのだが。
 ちなみに英語のアルファベット26文字でやるとG(26)=5,427,709,641,250種類。上に紹介したプログラムをずっと走らせようと頑張っても半日も立たずに固まることだろう。
 印刷する方を考えてみると、1MB分を印刷するのに必要なA4紙はギリギリ読めるかという一文字1.2mmサイズで66枚少々。一枚辺り1万5000名。この調子で完成する経典は「最低」60万ページ。現在最速のオフィス向けレーザープリンタが分速約30枚*4なので2万分=333時間=10時間労働として約一ヶ月。追悼用に印刷して作れないかと思ってたけど個人では無理っぽい。でもかなり現実に近い数字になった気がする。あとはマシンパワーの問題か。どちらにしても人間を超える計算力で生じるシンギュラリティ(?)をアサッテの方面で発生させるという点で本短編の洞察の深さと馬鹿らしさ(もちろん褒め言葉)が引き立つというものである。


結論:とりあえずできなくはない。というか今の技術をもってすれば非常に簡単になった。ただしもうちょっと潤沢な装備が必要。


 まだ不完全なところはあるとおもうのでツッコミ歓迎です。というか補完していただけたり、実際に宇宙に干渉してみた報告などあればぜひぜひ。まぁ、成功しちゃった暁にはそもそも結果を書くことなどできはしませんが。そのへん自己責任でお願いします。


追記:
フォン・ノイマンとの関連を考察したサイト。そういえば本短編が世に出たのは1967年。そのころの性能だとホントに100日でできるのか??
http://thehouseai.wordpress.com/tag/names-of-god/


あと、2連続までを認める場合のプログラムの出力結果はこちら。(3文字連続で含む場合の組み合わせの数はちょっと諦めた)

 2文字            110種
 3文字         10,032種
 4文字       178,524種
 5文字      1,521,920種
 6文字      8,456,250種
 7文字     35,426,160種
 8文字    121,375,352種
 9文字    357,617,664種
10文字    936,845,190種
11文字  2,235,550,000種
12文字  4,929,039,060種
90億種  9,000,000,000種 *
13文字 10,197,487,872種

あらら?


(ちゃあしう)

*1:英語圏の人間もたいていはmore thanを「以上」のニュアンスで使うそうだ

*2:HAL9000=HALNINEKは反則か?

*3:さらに十数年後コンピューターで再計算しているほどの念の入れよう

*4:山の上まで持っていくのだから輪転機のような大きなモノは持っていけないと思うので