Fandom

巨大数研究 Wiki

コメント0

loader.c の解説

プログラムA

         c - r || (
            L ( u) || L ( r) - f ||
            (x /= 2) % 2 && ( u = S (4, d, 4, r ),
                   t = A (t, d) ),
            f / 2 & (x /= 2) % 2 && ( c = P ( d, c ),
                              t = S(4,13,-4, t ),
                              u = S(4,13,-4, u) )
             ),

プログラムB

         c && (x /= 2) % 2 && (
            t = P (
               ~u & 2 | (x /= 2) % 2 && (
                  u = 1 << P ( L ( c ), u) ),
               P ( L ( c ), t) ),
            c = r ),

プログラムC

         u / 2 & (x /= 2) % 2 && (
            c = P ( t, c ),
            u = S(4,13,-4, t ),
            t = 9 );

だいたいC→B→Aの順に機能する。Cで変数を導入(STAR もしくは BOX の値の u にもうすこし具体的な情報をもった値を設定)し、Bで力をため、Aで解放する。A の u = S (4, d, 4, r ) と t = A (t, d) がメインエンジンに当たり、a=P(P(t,P(u,P(x,c))),a) がタイヤに当たる。2進数のxの値を一桁目から調べて、0か1かである部分のプログラムが機能するかしないかが決まる、言い換えれば x の値自体がloader.cが読み取るプログラムとなっている。

プログラムCで文脈(cの値)にtを追加。その後ツリーとしての t の葉にあたる変数の名前を一つずつ後ろにずらしてその値を u に渡す。その後 t の値は最初の変数に直す。

S (v, y, c, t)
{
   int
      f = L ( t ),
      x = r;
   { return
         f - 2 ?
         f > 2 ?
         f - v ? t - (f > v) * c : y :
         P ( f, P ( S (v, y, c, L ( x) ),
                          S (v+2, t = S(4,13,-4, y ), c, Z (x) )))
         :
         A (S (v, y, c, L ( x) ),
                S (v, y, c, Z (x) ) );}
}
A (y, x)
   { return L ( y) - 1
      ? 5 << P ( y, x)
      : S (4, x, 4, Z (r) );}

大雑把にいって、S (v, y, c, t) のv,y,cは関数を補足する変数で t がメインの変数となる。y と t はツリーとして扱う。t の葉に当たる部分が v によって決まるある変数だった場合、そこからツリー y を生やす。それ以外の変数は c の値が -4 だった場合変数の名前を一つずつ後ろにずらし、4 だった場合は前にずらす。

エンコード

P(0,P(A,B)) PI 依存型?

P(1,P(A,B)) LABMDA λ式?

P(2,P(A,B)) APPLY 適用

P(3,0) STAR 型変数?

P(3,1) BOX 高階の型(カインド)の変数?

P(4n+1,0) n=0,1,2,... VAR(n) 変数?

cは文脈 tは項 uは型

解析

急増加関数で評価する。c 、t 、u 、それぞれに初期値、x にとりあえず 3 を設定して、a に関する関数 P(P(7,P(14,P(3,0))),a) を f_0(a) とする。ループの回数を司る x は最初の値から減っていくばかりなので、ループそのものの強化が問題となる。

(単調増加ではないだろうが)x が大きいほど数を大きくするループを繰り返す回数も増える。よって f_1(x) の強さはある。

a の値はループの最後の関数で再帰的に適用されるだけであり、x の値は2進数表記での第1ケタを読み取られるたびに1ケタずつ減っていくだけであり、両者とも数を大きくする仕組みとしては(値そのものに)さほど注目しなくてよい(x の値は loader.c が読み取るプログラムとしては注目しなければならない)。プログラムCも u の値が STAR もしくは BOX である時以外、つまり(再帰呼び出しで計算するD関数を除いて)変数が導入される前の最初の計算以外では通らずそれ以上の意味はない。

ざっくり簡略化し、while ループの中のプログラムを u=3^3^...3^D(x-1) (代入する前の u の値は 3^3^...^3 くらいとする。u = S (4, d, 4, r ) と t = A (t, d) に当たる)とする。引数 x の値が小さいうちはだいたい D(x)=3^^(x^2) 。xの値がもう少し大きくなると、再帰で 3^^(x^2) レベルの巨大数を呼び出せるようになり、D(x)=3^^(x^3) と近似されるようになる。こうして順調に成長していき 3^^x^^2 レベルの巨大数となる。この簡略化されたプログラムではこれ以上の成長は見込めない。

どうもテトレーションレベルを超える感じがしない。第一繰り返す回数を司る変数が減っていく一方ってことは for n times の形でも書けるわけで、せいぜい原始帰納関数レベルの強さしかないことになる。かといって x が大きくなっていくことも考えられるとすると、x を引数に取るD関数が再帰呼び出しされているため、x がある値よりも大きいと計算が終了しなくなってしまう。

広告ブロッカーが検出されました。


広告収入で運営されている無料サイトWikiaでは、このたび広告ブロッカーをご利用の方向けの変更が加わりました。

広告ブロッカーが改変されている場合、Wikiaにアクセスしていただくことができなくなっています。カスタム広告ブロッカーを解除してご利用ください。

Fandomでも見てみる

おまかせWikia