第二話 クヌースの矢印表記とコンウェイのチェーン表記とCG関数
「hyper演算子の漸化式の定義を見て下さい。これってわかりやすいですか?」
①ハイパー演算子の漸化式の定義
x=hyper_n(a、b)について、次のように定義する。
n>1の時
b >1の時
hyper_n+1(a、b)=hyper_n(a、f_n+1(a、b−1))
b=1の時
hyper_n+1(a、1)=a
n=1の時
b>1の時
hyper_1(a、b)=hyper_1(a、b−1)+ 1
b=0の時
hyper_1(a、0)= a
随分とごちゃごちゃしていてややこしい。
「すごくわかりにくい」
「ええ。特に漸化式を使っていると視覚的に理解しにくく、関数の強さがわかりにくいです。それに文字数も多く、関数をさらに強化した際にステータスウィンドウが簡単に埋まってしまいます。ハイパー演算子も美しいですが、より美しい関数を求めることが重要です」
ベルナイドが関数の美しさの素晴らしさについて力説してくる。
「それで、そのより美しい表記方法ってのは?」
「『矢印表記』です。掛け算と足し算以外のハイパー演算子で表現される巨大数を表現できます」
hyper_n(a、b)= a ↑↑….↑↑b *矢印の数はn-2個
「このような表記法ですね」
「ぱっと見だとハイパー演算子と何か違うようには思えねーな」
「そうですね。ですが真価はその美しい定義を見ればわかると思います。ここでは、n本の↑があることを、↑(n)と表すことにしますね」
②矢印表記の定義
n>1の時
a ↑(n) b= a ↑(n-1) a ↑(n-1) a↑(n-1)……….a (*aはb個存在し、常に右側から順に計算する)
n=1の時
a↑b=aのb乗
b=0の時も定義する必要があるが、巨大数ついて考えるときにbに0が入ることはないので無視している。
「確かに定義自体は簡単になったけど、ごちゃごちゃ具合じゃあんま変わらないような気がする」
「ですが、これは場合分けがないので計算する際に非常にわかりやすく美しくできます。試しに3↑↑5を計算しましょう」
「↑が二つってことは超冪か」
3↑↑5
=3↑3↑3↑3↑3
=3↑3↑3↑27
=3↑3↑7625597484987
=3の3の7625597484987乗乗
「超冪の計算はわかりにくかったけど、矢印表記を使えばある程度簡単に計算できるね」
「ええ、しかも矢印表記はhyper_5であるヘキセーションも同じ要領で比較的簡単な計算が可能です。それに、hyper_nにおいてnがある程度大きい数であっても視覚的に理解することが可能です。例えばこんな感じに」
2↑↑↑↑3
=2↑↑↑2↑↑↑2
=2↑↑↑4
=2↑↑2↑↑2↑↑2
「hyper_6が超冪だけで表現できるのか」
「ただ、これは変数が十分に小さい場合の話ですけどね。10↑↑↑↑10とかになると超冪を使ってさえ表現するのが不可能になります。それでも、ある程度は数について想像する手助けになると思います。では、次が本当に矢印表記とhyper関数に関する次の関係式が成り立つのか計算してみましょう」
hyper_n(a、b)= a ↑↑….↑↑b *矢印の数はn-2個
「まずは矢印の数が一つの場合成り立つかどうかだな」
a↑b
=aのb乗
=hyper_3(a、b)
「次にbが最小の自然数である1の時だ」
a↑(n+1)1
=a
「これは簡単に求まりましたね。しかし、問題はn>3やb>1の時です。これはどう処理しますか?」
「これも数学的帰納法を使えばいいんだろ?」
↑(n)のnを↑の本数とする。
b=pについて
a↑(n) b = hyper_n+2(a、b)
が成り立つと仮定する。
a↑(n+1) (p+1)
=a↑(n) a↑(n)a↑(n)…….a (aはp+1個存在する)
=a↑(n) a↑(n+1)p *矢印の計算は右側からしなければいけない
=a↑(n) hyper_n+3(a、p)
=hyper_n+2(a、hyper_n+3(a、p)
「hyper_n+2の中にhyper_n+3が入っちゃったけどもしかして失敗?」
「ハイパー演算子の定義を思い出してください」
①ハイパー演算子の漸化式の定義
x=hyper_n(a、b)について、次のように定義する。
n>1の時
b >1の時
hyper_n+1(a、b)=hyper_n(a、hyper_n+1(a、b−1))
「そうだった。まだ計算続けられる」
hyper_n+2(a、hyper_n+3(a、p)
=hyper_n+3(a、b+1)
「これでハイパー演算子と矢印表記に関する次の命題が成り立ったって言えるかな?」
hyper_n(a、b)= a ↑↑….↑↑b *矢印の数はn-2個
「b=1、矢印が一つの時、そしてb>1で矢印が二つ以上の時、全ての場合について証明できたので問題ありませんね」
「やったぜ」
「では、矢印表記をもう一回見てください。a、b、矢印の数、どれを増やしたらより巨大な数を表せると思いますか?」
「aとbが1や2じゃないんだったら、矢印の数だな。hyper演算子が超冪とかより強いのは矢印の数を増やせるからだし」
「そうですね。じゃあ、次の数はどちらの方が大きいと思いますか?」
3↑↑↑↑↑3
3↑↑↑↑9999無量大数
「上の方だろうな。一応展開して確かめておくけど」
3↑↑↑↑↑3
=3↑↑↑↑3↑↑↑↑3
>3↑↑↑↑9999無量大数
「3↑↑↑↑3は明らかに9999無量大数よりも大きいので正解ですね。ではこれはどうでしょう?」
3↑↑↑↑↑3
9999無量大数↑↑↑↑9999無量大数
「やべーな、これは迷う」
「こういう時は近似すればいいのです」
「近似?」
「例えばこうやって」
9999無量大数↑↑↑↑9999無量大数
≒ 3↑↑↑↑3
「え、こんなのしてもいいの!?」
「問題ありません。では試しに実際に計算してみましょう」
9999無量大数↑↑↑↑9999無量大数
≒ 10↑72↑↑↑↑10↑72
「この数字は、明らかに↑が5つ続く場合よりも小さいですね。このように爆発している関数に表される巨大数で、その巨大数の大きさを決める最重要な変数が違う場合、それ以外の要素をどれだけ変えても僅差になることが多いです。ハイパー演算子や矢印表記の世界では、1兆桁程度はわずかな誤差に過ぎないのです」
「ここでこれまで出てきた関数を強さ順に並べてみましょう。すると、乗算<冪乗<超冪<ハイパー演算子=矢印表記、となってますね」
「現実的に書ける数ならどんなに大きい数を変数に入れても、弱い関数が強い関数に勝つことはできないんだな」
「ええ。では、最後に我々が現在持っている最も強力で美しい巨大数の表記方法である『チェーン表記』を教えましょう」
③チェーン表記の定義
長さnのチェーンについて次のように定義する
チェーンの長さが3以下の場合
a→b→c = a↑(c)b = hyper_c+2(a、b)
チェーンの長さが4以上の場合、チェーンの後ろの二つをb、c、それよりも前をXとする
X→b→c
=X→(X→b-1→c)→c-1 *Xはb個、(c-1)はb−1個
X→1=X
X→1→b=X
「X→1=Xを使えばチェーンの長さの2が冪乗計算であることや、チェーンの長さ1がただの整数になることがわかります」
10→5→2
=10↑10↑10↑10↑10
>グーゴルプレックスプレックス(10の10の10の100乗乗乗)
「長さが3の時点で矢印表記と同じ強さだからめっちゃ強くなるの感じる。とりあえずとりあえずチェーンの長さが4つの時について計算してみるよ」
3→3→2→2
=3→3→(3→3→1→2)
=3→3→(3→3)
=3→3→27
=3↑(27)3
「なんかもう大爆発起きてるんですけど」
「こんなの序の口ですよ」
3→3→3→2
=3→3→(3→3→2→2)
=3→3→(3↑(27)3)
=3↑(3↑(27)3)3
「たった一文字一つ増やしただけで絶望的に数が大きくなったな」
「でも計算ができるだけまだマシです」
3→3→4→2
=3→3→(3→3→3→2)
=3→3→(3↑(3↑(27)3)3)
=3↑(3↑(3↑(27)3)3)3
「あ、これ既視感がある!というか、さっき見たばかりだ!」
3→3→1→2
=3→3
=27
3→3→2→2
=3→3→(3→3→1→2)
=3→3→(3→3)
=3→3→27
=3↑(27)3
3→3→3→2
=3→3→(3→3→2→2)
=3→3→(3↑(27)3)
=3↑(3↑(27)3)3
3→3→4→2
=3→3→(3→3→2→3)
=3→3→(3↑(3↑(27)3)3)
=3↑(3↑(3↑(27)3)3)3
「この構造、ハイパー演算子を求める時に見たものと同じだ!中に全く同じものが入ってる!」
「その通りです。この性質を使えば長さ4のチェーン表記で表される数字が必ず収束することも証明できますよ。やってみてください」
収束することが証明されれば、チェーン表記が無限大になることはない。レベル表記は有限の定数でないといけないので、チェーン表記で表される数は有限である必要がある。
チェーン表記で表される巨大数 a→b→c→d+1と、全ての自然数pに対してa→b→p→dが収束すると仮定する。
この時、a→b→c+1→d+1について考える。
d=0の場合
a→b→c→1
=a↑(c)b
より、全ての自然数cについて収束する。
d>0の場合
c=0の場合
a→b→1→d
=a→b
=a↑b
より、収束する
c>0の場合
a→b→c+1→d+1
=a→b→(a→b→c→d+1)→d
より、a→b→c→d+1が収束し、a→b→p→dが収束する時、a→b→c+1→d+1 は収束する。
以上をもって全ての自然数についてa→b→c→dが収束することが証明された。
「さらに、チェーン表記は次のように展開できます」
a→b→c→d
=a→b→(下の巨大数)→d-1
a→b→(下の巨大数)→d-1
a→b→(下の巨大数)→d-1
:
a→b
「高さは合計c階層ありますね」
「頭がこんがらがってきた」
「これからもっとこんがらがるので覚悟してください。dに定数を入れて無理やり矢印表記にしてしまいますよ。美しくはありませんが、チェーン表記の構造を知るためには重要です」
「正気かよそれ」
a→b→c→1
=a↑(c) b
a→b→c→2
=a→b→(下の巨大数)
a→b→(下の巨大数)
:(c−2段同じものが続く)
a↑b
=a→b→(下の巨大数)
a→b→(下の巨大数)
:(c−1段同じものが続く)
a→b→(a↑b)
=a↑↑…(下の巨大数の本数)...↑↑b
a↑↑…(下の巨大数の本数)...↑↑b
a↑↑…(下の巨大数の本数)...↑↑b
:(合計c階層)
a↑b
「d=2の時点で気持ち悪いぐらい爆発してるね。d=3となったらどうなることやら」
a→b→c→3
=a→b→(下の巨大数)→2
a→b→(下の巨大数)→2
:(合計c階層)
a↑b
=a↑↑…(下の巨大数の本数)...↑↑b
a↑↑…(下の巨大数の本数)...↑↑b
a↑↑…(下の巨大数の本数)...↑↑b
:(合計3行下の巨大数の階層)
a↑b
a↑↑…(下の巨大数の本数)...↑↑b
a↑↑…(下の巨大数の本数)...↑↑b
a↑↑…(下の巨大数の本数)...↑↑b
:(合計3行下の巨大数の階層)
a↑b
:
(合計c個のブロックが存在する)
:
a↑↑…(下の巨大数の本数)...↑↑b
a↑↑…(下の巨大数の本数)...↑↑b
a↑↑…(下の巨大数の本数)...↑↑b
:
a↑b
「矢印表記でさえまともに書き表せないとかやばすぎだろ。しかもこれまだd=3だぜ?4とか5になったら収まりきれんわ」
「ええ、ですがこのdの役割も理解できたでしょう?」
「ああ、a→b→c→d+1は、a→b→p+dを、c階層もっているんだな。ということはdがこのチェーン表記で表せる巨大数の大きさを決める決定因子ですか?」
「惜しいですが、違います。チェーン表記で表される巨大数を大きくするには、あるものを大きくしたほうがいいです。それと比べればdさえも誤差になります」
「あるもの?あ、もしかして」
俺はチェーンの長さごとのチェーン表記が持つ性質について書き出した。
a→1→1=a (整数)a→b →1=a↑b (冪乗)a→b→c=a↑(b) c (矢印表記)
「つまり、チェーン表記ってのは整数、冪乗、矢印表記を一般化したもの。その一般化を使って長さ4にまで拡張したのがさっきまでやってきたこと。ということは、長さをもっと長くすればさらに演算の強さが強くなるはずだ」
③チェーン表記の定義
長さnのチェーンについて次のように定義する
チェーンの長さが3の場合
a→b→c = a↑(c)b = hyper_c+2(a、b)
チェーンの長さが4以上の場合、チェーンの後ろの二つをb、c、それよりも前をXとする
X→b→c
=X→(X→b-1→c)→c-1 *Xはb個、(c-1)はb−1個
X→1=X
X→1→b=X
「そうですね。チェーン表記は4以上の長さにも対応できるように定義されています。試しにa→b→c→d→eを計算してみましょう」
a→b→c→d→e
=a→b→c→(下の巨大数)→e-1
a→b→c→(下の巨大数)→e−1
:(合計d階層存在する)
a→b→c
「チェーンを一つ伸ばすだけで、dに巨大数を入れることができるってことか」
「ええ。これを利用して作ったのが現在『巨大数』が知り得る最強の関数である『CG関数』です」
④ CG関数の定義
cg(n)=n→n→…→n (n個存在する)
「このnをいじるだけで想像すらできない巨大数を使っても想像すらできない巨大数が出来上がるんだな」
「そうです。現在、このチェーン表記をさらに改良してより巨大な数を表記しようと試みているのですが、どの関数も残念ながら表記が美しいといえません。定義が煩雑だったり、表記がごちゃごちゃしていたりしているのです。なのでぜひ新しい関数の案があるのならばいって欲しいのです」
「そうはいってもすぐに思いつくもんじゃないしな」
そこでやっとアーリャが起きたらしい。眠い目をこすりながらソファーから立ち上がる。
「はっ、私はどのぐらい寝ていた?」
「心配しないでください、一時間も経ってません」
「そうか、それなら良かった。レオン、見苦しいものを見せてすまなかった。謝罪する。ところで、私をソファまで運んでくれたのはレオンか?」
「ああ、そうだ」
「気遣い感謝する。どっかの誰かよりは3→3→3→3倍ぐらい気がきくようだ」
「私のcg(64)倍ぐらいは見苦しい姿を見せていた人が言いますかね、それ。まあ、とにかくチェーン表記まで一通りの説明をしましたよ」
「それならレオン、明日の夕食の時までに何か巨大数を作ってみてくれ」
「え、明日までに!?」
「レオンならいけると思いますよ」
「それはちょっと期待が重すぎるぜ。頑張るけどさ」