Ackermann関数(2)

265536を計算することを考える。
次々と2乗していけばいいのだが、
プログラムとしては2倍するほうがずっと簡単。
時間はかかるが、1を65536回2倍する。


function twice(x) {
var length = x.length;
var y = 0; // 繰り上がり
for(var i = 0; i < length; i++) {
var a = x[i];
a += a + y;
if(a >= 1000000000) {
a -= 1000000000;
y = 1;
}
else {
y = 0;
}
x[i] = a;
}

if(y == 1) {
x[length] = 1; // 最後繰り上がり
}
}

多倍長整数を配列で考え、9桁を1つの要素に割り当てる。
そして、下から要素ごとに自分を足していき、
繰り上がったら上の要素に1を加える。


結果、19729桁で、上と下を10桁表示すると、

2003529930 ... 5719156736

となった。
念のため対数で概算すると(以下、底は10)、

log265536 = 65536log2 = 19728.3017958347
100.3017958347 = 2.003529930