hgcd1/2
Torbjörn Granlund
tg at gmplib.org
Sat Sep 7 13:54:26 UTC 2019
There was a bug in the "euclides 2-choice binary" function. Now, with
the intended algorithm, we get almost 4 bits per iteration.
Algorithm Iterations Iter/Bit Bit/Iter Max iter
plain binary : 378420598 0.697 1.435 58
binary+- : 329732327 0.607 1.647 55
binary+- alternating : 419867135 0.773 1.293 70
binary tab4 : 332015652 0.611 1.635 56
binary tab16 : 239589147 0.441 2.266 42
binary tab64 : 217666974 0.401 2.495 40
binary tab256 : 206886403 0.381 2.625 40
binary tab1024 : 197076246 0.363 2.755 35
binary tab4096 : 193746095 0.357 2.803 36
plain euclides : 313383405 0.577 1.733 61
euclides binary : 197579996 0.364 2.748 40
euclides 2-choice binary : 139135737 0.256 3.903 26
Here is the corrected version:
static mp_limb_t
gcd_euclidespm (mp_limb_t a, mp_limb_t b)
{
int cnt;
mp_limb_t r, r2;
r = a % b;
while (r != 0)
{
a = b;
r2 = b - r;
count_trailing_zeros (cnt, r);
r >>= cnt;
count_trailing_zeros (cnt, r2);
r2 >>= cnt;
if (r > r2)
b = r2;
else
b = r;
r = a % b;
}
return b;
}
I tried this for gcd_11 on some arm64 CPUs. They get close to the
current pure binary implementations, but they don't beat them.
--
Torbjörn
Please encrypt, key id 0xC8601622
More information about the gmp-devel
mailing list