JScript高速化(13)

2次と4次の多項式の掛け算は次のようになる。


f(x) = a0 + a1x + ... + a6x6
g(x) = b0 + b1x + ... + b2x2
h(x) = c0 + c1x + ... + c4x4
f(x) = g(x)h(x)

とすると、


a0 = b0c0
a1 = b0c1 + b1c0
--------------------
a2 = b0c2 + b1c1 + b2c0
a3 = b0c3 + b1c2 + b2c1
a4 = b0c4 + b1c3 + b2c2
--------------------
a5 = b1c4 + b2c3
a6 = b2c4

このように3つのパートに分けて処理すると、
プロパティの参照が(2nm+n+m-1)回に減らせる。
(前回は、(3mn+m)回だった)
こうすると、テンポラリで足し算を行い、
あとでプロパティに代入できるのが大きい。


// 2998ms
function poly_add(p) {
var r = [ ];
var length = this.length;
if(typeof p == "number") {
r[0] = this[0] + p;
for(var i = 1; i < length; i++)
r[i] = this[i];
}
else if(p instanceof poly) {
var p_length = p.length;
if(length > p_length) {
var i;
for(i = 0; i < p_length; i++)
r[i] = this[i] + p[i];
for( ; i < length; i++)
r[i] = this[i];
}
else if(length < p_length) {
var i;
for(i = 0; i < length; i++)
r[i] = this[i] + p[i];
for( ; i < p_length; i++)
r[i] = p[i];
}
else {
for(var i = 0; i < p_length; i++)
r[i] = this[i] + p[i];
if(r[length-1] == 0)
r.normalize();
}
}
else
throw("unsupported argument in poly::add");

return r;
}