[Python-ideas] Add the imath module
Steven D'Aprano
steve at pearwood.info
Thu Jul 12 21:42:48 EDT 2018
On Thu, Jul 12, 2018 at 05:35:54PM -0500, Tim Peters wrote:
> [David Mertz]
>
> > Miller-Rabin or other pseudo-primality tests do not produce false
> > negatives IIUC.
> >
>
> That's true if they're properly implemented ;-) If they say False, the
> input is certainly composite (but there isn't a clue as to what a factor
> may be); if the say True, the input is "probably" a prime.
I'm sure Tim knows this, but that's only sometimes true. Since I had no
formal education on primality testing and had to pick this up in dribs
and drabs over many years, I was under the impression for the longest
time that Miller-Rabin was always probabilitistic, but that's not quite
right.
Without going into the gory details, it turns out that for any N, you
can do a brute-force primality test by checking against *every*
candidate up to some maximum value. (Which is how trial division works,
only Miller-Rabin tests are more expensive than a single division.) Such
an exhaustive check is not practical, hence the need to fall back on
randomly choosing candidates.
However, that's in the most general case. At least for small enough N,
there are rather small sets of candidates which give a completely
deterministic and conclusive result. For N <= 2**64, it never requires
more than 12 Miller-Rabin tests to give a conclusive answer, and for
some N, as few as a single test is enough.
To be clear, these are specially chosen tests, not random tests.
So in a good implementation, for N up to 2**64, there is never a need
for a "probably prime" result. It either is, or isn't prime, and there's
no question which.
In principle, there could be similar small sets of conclusive tests for
larger N too, but (as far as I know) nobody has discovered them yet.
Hence we fall back on choosing Miller-Rabin tests at random. The chances
of an arbitrary composite number passing k such tests is on average
1/4**k, so we can make the average probability of failure as small as we
like, by doing more tests. With a dozen or twenty tests, the probability
of a false positive (a composite number wrongly reported as prime) is of
the same order of magnitude as that of a passing cosmic ray flipping a
bit in memory and causing the wrong answer to appear.
--
Steve
More information about the Python-ideas
mailing list