Prime number testing

Paul Miller pwmiller1 at adelphia.net
Sun Jul 11 17:02:12 CEST 2004


codelykos at yahoo.com (Rahul) wrote in message news:<9d234d68.0407102202.47b5cb43 at posting.google.com>...
> HI.
> Python , with its support of arbit precision integers, can be great
> for number theory. So i tried writing a program for testing whether a
> number is prime or not. But then found my function painfully slow.Here
> is the function :
> 
> from math import sqrt
> def isPrime(x):
>     if x%2==0 or x%3==0:
>        return 0
>     i=5
>     sqrt=sqrt(x)
>     sqrt=sqrt(x)+1
>     while i<sqrt:
>        if x%i==0:
>           return 0
>        i=i+2
>        if x%i==0:
>           return 0
>        i=i+4
>     return 1
> 
> Try testing some number like 2**61-1.Its very slow.

Actually I find this function runs quite fast, although it terminates
with an UnboundLocalError. :P

What you probably meant was something like this:

import math

def isPrime (x):
	if x % 2 == 0: 
		return 0
	limit = int(math.sqrt (x))
	for i in xrange (3,limit+1,2):
		if x % i == 0:
			return 0
	return 1

I know your function attempted to sieve out multiples of 3 as well,
but that only improves performance in case x is composite.

Looking at this and assuming that 2**61 -1 is prime, you find that
this will do (2**61-1) or about 2**60 divisions.  If you assume you
can perform 10**9 divisions per sec, then this will take about 36
years. That's why your function is slow.

You could improve this a bit by dividing by only prime numbers. 
However, there are approximately 55997641048889848 +- 183279217216552
prime numbers <= 2**61-1, which means you'll now "only" be performing
about 2**55 divisions, a speedup of about 32 times, or approximately 1
year 2 months.  The catch is you need a lot of memory to store all
those primes. ;) [417214937 gigabytes, or so, provided you don't
introduce a compression scheme, which would slow you down a bit]

So, basically, trial division is hopeless for finding any but small
prime numbers.  (See http://www.utm.edu/research/primes/howmany.shtml
if you'd like to check my numbers.)

> In comparision
> Mathematica not only tests but finds factors in an instant by
> Divisors[x].

According to http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html,
Mathematica implements primality testing thusly:

"Mathematica versions 2.2 and later have implemented the multiple
Rabin-Miller test combined with a Lucas pseudoprime test as the
primality test used by the function PrimeQ[n]. As of 1997, this
procedure is known to be correct only for all , but no counterexamples
are known and if any exist, they are expected to occur with extremely
small probability (i.e., much less than the probability of a hardware
error on a computer performing the test)."

> Does anybody have a faster way to test for primality.(and not just
> pseudoprime).

Yes.  See above.



More information about the Python-list mailing list