speed of mpq_cmp vs mpq_sub
Torbjörn Granlund
tg at gmplib.org
Sun May 22 17:07:29 UTC 2016
tg at gmplib.org (Torbjörn Granlund) writes:
I suppose we could do something fancy in cmp with stripping high parts
of the numerators and denominators when they match (highpart(num1) =
highpart(num2), and highpart(den1) = highpart(den2)) before we
cross-multiply.
Optimising for a/b ~ c/d when high(b) = high(d).
Write b = shd * B^k + bl, and d = shd * B^k + dl. Here, shd is "shared
high denominator", B is the limb base.
We then form the cross-products:
t1 = a * (shd * B^k + dl)
t2 = c * (shd * B^k + bl)
And compute their difference:
x = t1 - t2 =
= a * (shd * B^k + dl) - c * (shd * B^k + bl) =
= a * shd * B^k + a * dl - c * shd * B^k - c * bl =
= (a - c) * shd * B^k + a * dl - c * bl
If we have a large shd, this will save close to 1/2 of the work. Not
too impressive in the light of the demonstrated performance issues. But
if the numerators similarly have a common high part ("shn") then a - c
will largely cancel and now we should reach or beat mpq_sub's
performance for all operands.
--
Torbjörn
Please encrypt, key id 0xC8601622
More information about the gmp-discuss
mailing list