Would someone mind elaborating the explanation in the manual?
Brian Hurt
bhurt at spnz.org
Mon Oct 27 10:40:13 CET 2003
On Mon, 27 Oct 2003, Kevin Ryde wrote:
> If you're only testing divisibility then for instance n%3==0 becomes
>
> (n * 0xAAAAAAAB) <= 0x55555555
>
> which is one multiply.
In 32-bit. In 64-bit, if n = 3, then n * 0xAAAAAAAB becomes 0x200000001,
and the test fails. Although you can make you life somewhat simpler by
only dealing with three cases: 1) 32-bit, where you test that (n *
0xAAAAAAAB) <= 0x5555555, 2) 64-bit, where you test that (n *
0xAAAAAAAAAAAAAAAB) <= 0x5555555555555555), and 3) everything else, where
you test that (n % 3) == 0.
I'd keep case 3.
You snipped too much here:
> > Which isn't always faster than a divide instruction.
>
> True, that should be checked, but almost everywhere one multiply is
> faster than a divide.
>
In every architecture I know of, multiply is at least as fast as divide,
and generally faster. I'm not sure it's true that a divide is slower than
2 multiplies, a shift, and a subtract (which is what I was comparing it
to).
Brian
More information about the gmp-discuss
mailing list