私は符号付き整数の最大公約数の使用に大きく基づいたアルゴリズムを持っているので、それをより速く取得しようとしています。すでにパフォーマンスが50%向上しているので、このような最適化は不要だと言わないでください。最適化の可能性は残っていませんが、おそらく間違っています。
次のコードでは、b!=0であると断言されています。
Integer gcd(Integer a, Integer b)
{
if ( a == 0 )
{
return b;
}
if ( a == b )
{
return a;
}
const Integer mask_a = (a >> (sizeof(Integer) * 8 - 1));
a = (a + mask_a) ^ mask_a; // a = |a|
const Integer mask_b = (b >> (sizeof(Integer) * 8 - 1));
b = (b + mask_b) ^ mask_b; // b = |b|
if ( ~a & 1 )
{
if ( b & 1 )
{
// 2 divides a but not b
return gcd(a >> 1, b);
}
else
{
// both a and b are divisible by 2, thus gcd(a, b) == 2 * gcd( a / 2, b / 2)
return gcd(a >> 1, b >> 1) << 1;
}
}
if ( ~b & 1 )
{
// 2 divides b, but not a
return gcd(a, b >> 1);
}
if ( a > b )
{
// since both a and b are odd, a - b is divisible by 2
// gcd(a, b) == gcd( a - b, b)
return gcd((a - b) >> 1, b);
}
else
{
// since both a and b are odd, a - b is divisible by 2
// gcd(a, b) == gcd( a - b, b)
return gcd((b - a) >> 1, a);
}
}
補足として:整数は、、またはのいずれint
かlong
ですlong long
。それは上のどこかのtypedefです。
ご覧のとおり、aとbをそれぞれの絶対値にすることで最適化が行われ、私のマシンでは正常に機能します(必ずしもすべてのafaikで機能するとは限りません)。私はちょっと枝分かれした混乱が嫌いです。それを改善する方法はありますか?