Feature #15166 » rational.c.patch
rational.c (working copy) | ||
---|---|---|
inline static long
|
||
i_gcd(long x, long y)
|
||
{
|
||
unsigned long u, v, t;
|
||
int shift;
|
||
unsigned long u, v, uz, vz, shift;
|
||
long diff;
|
||
if (x < 0)
|
||
x = -x;
|
||
x = -x;
|
||
if (y < 0)
|
||
y = -y;
|
||
y = -y;
|
||
if (x == 0)
|
||
return y;
|
||
if (y == 0)
|
||
return x;
|
||
return y;
|
||
if (y == 0 || x == y)
|
||
return x;
|
||
u = (unsigned long)x;
|
||
v = (unsigned long)y;
|
||
for (shift = 0; ((u | v) & 1) == 0; ++shift) {
|
||
u >>= 1;
|
||
v >>= 1;
|
||
}
|
||
while ((u & 1) == 0)
|
||
u >>= 1;
|
||
uz = ntz_intptr(u);
|
||
vz = ntz_intptr(v);
|
||
shift = uz > vz ? vz : uz;
|
||
u >>= uz;
|
||
do {
|
||
while ((v & 1) == 0)
|
||
v >>= 1;
|
||
v >>= vz;
|
||
diff = v - u;
|
||
if (diff == 0)
|
||
break;
|
||
vz = ntz_intptr(diff);
|
||
if (v < u)
|
||
u = v;
|
||
v = diff < 0 ? -diff : diff;
|
||
} while(true);
|
||
if (u > v) {
|
||
t = v;
|
||
v = u;
|
||
u = t;
|
||
}
|
||
v = v - u;
|
||
} while (v != 0);
|
||
return (long)(u << shift);
|
||
return u << shift;
|
||
}
|
||
inline static VALUE
|