Schönhage's algorithm for fast integer GCD

Kevin Ryde user42@zip.com.au
Sat, 05 Jul 2003 10:53:50 +1000


nisse@lysator.liu.se (Niels Möller) 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 quotient is usually small (per Knuth), so going bitwise is usually
more efficient.  It's been on the tasks list for quite a while to have
mpn_gcdext use the bitwise Lehmer outlined in Knuth (and elsewhere?).

> http://www.lysator.liu.se/~nisse/misc/gcd-0.3.tar.gz

mpn_neg can probably use mpn_com_n.

The reason SHIFT_LEFT doesn't work on count==0 is the right shift by
BITS_PER_MP_LIMB won't give zero, on most cpus.  In fact ia64 is the
only one I know of which does.

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);
	    ...

since count_leading_zeros is often slow.