bdiv vs redc
Torbjorn Granlund
tg at gmplib.org
Tue Jul 17 12:18:53 CEST 2012
nisse at lysator.liu.se (Niels Möller) writes:
nisse at lysator.liu.se (Niels Möller) writes:
> Some other test cases fail, though: t-root, t-perfpow, t-divis, and
> t-cong. I'm not familiar with this code, I had a quick look at the root
> code but didn't see any obvious dependency on bdiv.
Found it, it's the divisibility check in perfpow.
With the old bdiv convention, we had that D divides U iff R == 0.
With the new convention, the divisibility test is the more complicated
cy == 0 && (R == D || R == 0)
where the R == 0 case can happen only if U == 0. So if it is known a
priori that U != 0, then the test can be simplified to just
R == D.
Ah. This makes some sense.
I also noted that there's some similarity between perfpow and remove,
maybe we should have an mpn_remove_1, and use that from perfpow? And
differences, remove.c uses mpn_bdiv_qr for divisibility tests (and keeps
the quotient in case the division is exact), while perfpow calls
mpn_divisible_p which in turn calls mpn_*_bdiv_qr.
Yes, I am aware of these similarities (or at least, I *was* aware of it
when we worked on the perfpow code).
An mpn_remove_1 makes sense.
We should also extract the Hensel nth root and nth square root from
mpn/generic/perfpow.c, and put them in their own files. (Some typing
cleanup might be asked for.)
--
Torbjörn
More information about the gmp-devel
mailing list