AtkinsSJ

Euler 3

May 23rd, 2011
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.78 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # http://projecteuler.net/index.php?section=problems&id=3
  3. # Find the largest prime factor of 600851475143
  4.  
  5. # Disappointingly, it's quicker without a sieve.
  6. # 14 seconds, as opposed to several minutes and still no sieve.
  7.  
  8. import time
  9. import math
  10.  
  11. # I admit this algorithm came from the question 7 PDF.
  12. def CHEATisPrime(n):
  13.     if (n == 1):
  14.         return False
  15.     elif (n < 4):
  16.         return True
  17.     elif (n % 2) == 0:
  18.         return False
  19.     elif (n < 9):
  20.         return True
  21.     elif (n % 3) == 0:
  22.         return False
  23.     else:
  24.         r = math.floor( math.sqrt(n) )
  25.         f = 5
  26.         while f <= r:
  27.             if (n % f) == 0:
  28.                 return False
  29.             elif (n % (f+2) ) == 0:
  30.                 return False
  31.             f += 6
  32.     return True
  33.    
  34. def primeSieve(n):
  35.     """Generates and returns a list of primes, up to n"""
  36.     a = range(1, n+1)
  37.     a.remove(1)
  38.     position = 0
  39.    
  40.     rootn = math.sqrt(n)
  41.    
  42.     while a[position] <= rootn:
  43.         multiples = range(a[position]*2, n+1, a[position])
  44.         for i in range(len(multiples)):
  45.             try:
  46.                 a.remove(multiples[i])
  47.             except:
  48.                 pass
  49.         position += 1
  50.        
  51.     print 'Sieve complete'
  52.     return a
  53.  
  54. # This one, however, is mine. :D
  55. def isPrime(n):
  56.     """Returns whether the number is prime"""
  57.     for i in range(len(primes)):
  58.         if (n % primes[i] == 0):
  59.             return False
  60.     return True
  61.  
  62.  
  63. start = time.time()
  64.  
  65. # Insert python code here
  66. bignumber = 600851475143
  67. root = math.sqrt(bignumber)
  68. #primes = []primeSieve(root)
  69. done = False
  70. factor = 0
  71.  
  72. # Iterate through the prime numbers until we reach sqrt(number),
  73. # saving the largest factor so far
  74. for i in range(math.sqrt(bignumber), 0, -1):
  75.     if CHEATisPrime(i):
  76.         if (bignumber % i) == 0:
  77.             factor = i
  78.             break
  79.  
  80. print 'The largest prime factor of ' + `bignumber` + ' is ' + `factor`
  81.  
  82. end = time.time()
  83. print 'This took ' + `end-start` + ' seconds to calculate.'
Advertisement
Add Comment
Please, Sign In to add comment