t...@gmplib.org (Torbjörn Granlund) writes:

  I suppose a "naive" implementation scales the full dividend and the full
  divisor by a factor which fits in a limb.  One could in theory save some
  time by scaling just their O(log(Q)) most significant limb.

That paragraph was supposed to read:

I suppose a "naive" Svoboda implementation scales the full dividend and
the full divisor by a factor which fits in a limb.  One could in theory
save some time by scaling just their O(log(Q)) most significant limbs.

  How likely does Svoboda overesimate a quotient limb?

Well, one could of course adjust down it in O(1) time by involving
another set of high limbs.

Here is a somewhat less broken version of my algorithm:

udiv_qr_3by2 (qnext, n1, n0, np[0], np[-1], np[-2], d1, d0, dinv);
for (...)
  {
    // Apply q to most significant partial remainder limbs.
    // Think: Is size = 2 enough or do we need size = 3?
    // Optimisation: Results from last divappr should already have done most of
    // the computation here; we presumably need just one more mul+subtract.
    cy = submul_1 (np - 2, dp + dn - 2, qnext, 2);
    ASSERT (np[0] >= cy);       /* FIXME: Possibly handle spillage */
    np[0] -= cy;

    q = qnext;
    // Now, with the most significant few limbs of the next partial remainder
    // computed to some accuracy, compute q for the next iteration.  This will
    // overestimate q somewhat more often than with the old algorithms.
    udiv_qr_3by2 (qnext, n1, n0, np[0], np[-1], np[-2], d1, d0, dinv);

    // Apply q to all but the most significant partial remainder limbs.
    cy = submul_1 (np - dn, dp, q, dn - 2);

    if (UNLIKELY (cy > np[-2]))
      {
        np[-2] -= cy;
        mpn_sub_1 (np - 1, np - 1, 2, 1);
        // q was too large, qnext is really off.  Recompute it!
        // (We could perhaps recompute it more cleverly.)
        ASSERT_CARRY(mpn_add_n (np - dn, np - dn, dp, dn));
        udiv_qr_3by2 (qnext, n1, n0, np[0], np[-1], np[-2], d1, d0, dinv);
      }
    else
      np[-2] -= cy;

    np--;
  }


-- 
Torbjörn
Please encrypt, key id 0xC8601622
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to