GIMPS Complexity Problem

advertisement
Lucas Lehmer Complexity Problem
GIMPS recently discovered a prime number containing more than 10 million digits with
a prize of $100,000. See:
http://www.sciencenews.org/view/generic/id/36625/title/Math_Trek__Largest_known_prime_number_found
The number found was 243,112,609-1. How many decimal digits is that? Solve 10d =
243,112,609. Take logs to the base 10 to get d = 43112609 log102 = 12978188, almost 13
million digits. Numbers of the special form 2n – 1 are easier to test for primeness than for
general numbers, by using the Lucas Lehmer algorithm.
LucasLehmer(n):
s  4
for i  0,…,n-2 do
s  ( s2 - 2 ) mod 2n – 1
if s = 0
output prime
else
output not prime
Example: for n = 7 the values of s are 4, 14, 67, 42, 111, 0, so 27-1 = 127 is prime.
What is the time complexity of this algorithm, as a function of n? The loop is run n-1
times, which we’ll approximate by n. How long do the math operations take? There is
one multiplication, a subtraction of 2, and a modulo 2n – 1. Subtraction of 2 will be
almost constant – most of the time you only need to consider a few bits at the end. The
modulo can be done by shifting and adding instead of division. (Consider the analogous:
38724198 mod 9999 = 3872+4198 = 8070.) The complexity of adding is linear, so the
majority of time is done on multiplication. How fast can multiplication be done? The
standard method is O(n2) and the faster recursive Karatsuba method is about O(n1.6).
What is the fastest practical algorithm? Research shows that it is the Schonage-Strassen
method with complexity O(n log n log log n), which means O( n  log(n)  log(log(n)) ).
Therefore the complexity of the Lucas Lehmer algorithm is O(n2 log n log log n).
(Wikipedia’s Primality Test indicates that algorithms for general numbers of n bits have a
much greater complexity of O(n6).) Let’s use that information to solve the following
problem.
If it takes 12 days for a powerful desktop computer to perform a Lucas Lehmer test on a
10 million digit number, how long will it take for 100 million digits, and for 1 billion
digits?
Do we need to use the number of decimal digits, or the number of binary digits – bits? If
you review the calculation of decimal digits you see that it is about 3.32 times the number
of bits – a constant factor. Also, does it matter if we use logs to base 2, or to base 10?
Well, log10x = log2x / log210 so the logs are related by multiplying by a constant factor.
The O(.) notation ignores constant multiples, so we can simplify our calculations by
using decimal digits and logs to the base 10.
From the algorithm complexity we know that
T(n) = c n2 log n log log n
where c is some constant. So we have three equations:
T(107) = c (107)2 log (107) log log (107) = 12 days
T(108) = c (108)2 log (108) log log (108) = x days
T(109) = c (109)2 log (109) log log (109) = y days
The constant c can be eliminated by division to get
x = 12 [ (108)2 log (108) log log (108) ] / [ (107)2 log (107) log log (107) ]
= 12 [ 1016  8  0.903 ] / [ 1014  7  0.845 ] = 1465 days = about 4 years
Similarly, y = 500 years. So, it takes about 4 years to test a 100 million digit number and
about 500 years to test a 1 billion digit number. The corresponding prizes are $150,000
and $250,000.
Download