fork download
  1.  
  2. # Python translation of http:// primesieve.org/segmented_sieve.html
  3.  
  4. CACHE_SIZE = 32768
  5.  
  6.  
  7. def segmented_sieve(limit, segment_size=CACHE_SIZE):
  8. sqrt = int(limit ** 0.5)
  9. count = 0 if limit < 2 else 1
  10. s, n = 2, 3
  11. sieve = []
  12. is_prime = [True] * (sqrt + 1)
  13. # generate small primes <= sqrt
  14. i = 2
  15. while i * i <= sqrt:
  16. if is_prime[i]:
  17. j = i * i
  18. while j <= sqrt:
  19. is_prime[j] = 0
  20. j += i
  21. i += 1
  22. primes = []
  23. next = []
  24. yield 2
  25. low = 0
  26. while low <= limit:
  27. sieve = [1] * segment_size
  28. # current segment = interval [low, high]
  29. high = min(low + segment_size - 1, limit)
  30. # store small primes needed to cross off multiples
  31. while s * s <= high:
  32. if is_prime[s]:
  33. primes.append(s)
  34. next.append(s * s - low)
  35. s += 1
  36. # sieve the current segment
  37. i = 1
  38. while i < len(primes):
  39. j = next[i]
  40. k = primes[i] * 2
  41. while j < segment_size:
  42. sieve[j] = 0
  43. j += k
  44. next[i] = j - segment_size
  45. i += 1
  46. while n <= high:
  47. if sieve[n - low]: # n is a prime
  48. yield n
  49. count += 1
  50. n += 2
  51. low += segment_size
  52.  
  53.  
  54. print "primes found:", len(list(segmented_sieve(104729)))
  55.  
Success #stdin #stdout 0.03s 7840KB
stdin
Standard input is empty
stdout
primes found: 10000