hgcd1/2

Niels Möller nisse at lysator.liu.se
Thu Sep 5 14:32:38 UTC 2019


tg at gmplib.org (Torbjörn Granlund) writes:

> Can div2 be done sloppily, e.g., by extracting the top 64 bits of the
> dividend and the corresponding (up to) 64 bits of the divisor, and
> invoke DIV1 on these bits?

I think so. Result will be at most one off, except in the unlikely case
that q > d1, so one adjustment step should suffice on the likely code
path. I think I have code like that, but with a/b rather than div1
(a/b). I may even have posted it to the list.

And due to the stop condition of the double-limb loop in hgcd2, I don't
think any normalization shift is needed, just q = div1(ah, bh) should be
fine.

> OK, one needs to return a non-negative remainder, so a little bit of
> adjustment might be needed.  But does the remainder need to be
> principal?

I think remainder needs to be principal (could possibly allow equality
with the divisor), since we alternate between 

  a <-- a - q b

and
  
  b <-- b - q a

and code assumes that q >= 1 in each step and everything is
non-negative. Allowing an approximative (and too small) q is possible,
but then we need to add a conditional swap.

> Related to that: In hgcd2 you seem to handle a >= b just after a is set
> to a residue mod b.  If that residue is principal, then clearly a >= b
> cannot happen.  Perhaps I am reading the code wrong.

Maybe your confused by the code special casing q = 1? The iteration is
like

  a -= b;
  if (a is too small), exit
  if (a >= b)
    {
      q = a / b;
      a -= q * b;
      if (a too small)
        {
          a += q; q--;
          exit
        }
    }
  at this point, we should always have a < b.

With a good enough div1, we should perhaps call it immediately, and get
rid of that branch too.

Regards,
/Niels

-- 
Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677.
Internet email is subject to wholesale government surveillance.


More information about the gmp-devel mailing list