JScript高速化(17)

あとちょっとだけ。


約分のところを改善できる。


function fraction_normalize() {
// ユークリッドの互除法
var a = this.a;
var b = this.b;
var a2, f;
while(true) {
if((a2 = a % b) == 0) {
f = b;
break;
}
if((b %= a) == 0) {
f = a;
break;
}
a = a2;
}
this.a /= f;
this.b /= f;
if(this.b < 0) {
this.a = -this.a;
this.b = -this.b;
}
}

最後の割り算のところは、
だいたい既約のことが多いので、
そういう場合は割る必要がない。
あと、分母を正にするところもちょっとムダ。


if(f != 1 && f != -1) {
if(f * this.b > 0) {
this.a /= f;
this.b /= f;
}
else {
this.a /= -f;
this.b /= -f;
}
}

これで、3%くらい速くなる。


あと、
本当は、たとえば、a/bとcの掛け算だと、
a/bは既約なので、
c/bで約分してあとでaを掛けるほうが、
ユークリッドの互除法が速くなるはずである。
しかし、実際にやってみると速くなることが確認できなかった。