Schönhage's algorithm for fast integer GCD
Niels Möller
nisse@lysator.liu.se
05 Jul 2003 21:54:32 +0200
Kevin Ryde <user42@zip.com.au> writes:
> > Here, hgcd_2 is the work horse for Lehmer steps,
>
> Is q=ah/bh the primary quotient step? Bear in mind that "/" is pretty
> woeful on a lot of chips.
The important thing for the lehmer step is to compute the one-limb
quotient of two two-limb numbers a and b, q = floor(a/b), a >= b.
What's the fastest way of doing that? I know I could do some special
casing for small quotients by subtracting a few times before trying a
proper division, but I don't know of any obvious way to speed up the
general case.
> mpn_neg can probably use mpn_com_n.
I looked for a function like that, but I couldn't fint it in the
manual. Anyway, the current code doesn't need that function anymore.
> If you find yourself with
>
> count_leading_zeros(shift, limb);
> if (shift)
> ...
>
> then you're probably better off doing
>
> if (limb & GMP_NUMB_HIGHBIT)
> {
> count_leading_zeros(shift, limb);
> ...
Do you mean
if (! (limb & GMP_NUMB_HIGHBIT))
{
count_leading_zeros(shift, limb);
...
?
Thanks for the hints,
/Niels