多倍長整数の計算(2)

タイトル変えた。
1は前日の記事ということで。

2乗していったほうが速いだろうということでその関数を作ってみた。
今度は4桁で区切って計算している。


var NFIGURE = 4;
var INT_MAX = Math.round(Math.pow(10, NFIGURE));

function multiple(x, y) {
var z = [ ]; // 返り値
for(var i = 0; i < x.length + y.length; i++)
z[i] = 0;

for(var k = 0; k < x.length; k++) {
for(var l = 0; l < y.length; l++) {
z[k+l] += x[k] * y[l];
var m = k + l;
while(true) {
var mod = z[m] % INT_MAX;
var div = (z[m] - mod) / INT_MAX;
z[m] = mod;
if(div == 0)
break;
z[m+1] += div;
m++;
}
}
}

if(z[z.length-1] == 0)
z.length--;

return z;
}

2から始めて、16回自乗を繰り返す。
そうすると、103秒が70秒となった。
意外と速くなっていない。
もっとも上のはほとんど効率を考えていない。