Advertisement
aristotle029

Iterative_prime_generation

Mar 29th, 2024
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.88 KB | None | 0 0
  1. from pyspark import SparkContext
  2. from math import isqrt, sqrt
  3.  
  4. def generate_initial_sieve(limit):
  5.     """Generate a sieve up to `limit`."""
  6.     sieve = [True] * (limit + 1)
  7.     primes = []
  8.     for p in range(2, len(sieve)):
  9.         if sieve[p]:
  10.             primes.append(p)
  11.             for i in range(p*p, len(sieve), p):
  12.                 sieve[i] = False
  13.     return primes
  14.  
  15. def generate_primes_in_range(start, end, broadcast_sieve):
  16.     """Generate primes in the range [start, end) using the sieve broadcasted."""
  17.     sieve = broadcast_sieve.value
  18.     return [num for num in range(start, end) if all(num % p != 0 for p in sieve if p*p <= num)]
  19.  
  20. def iterative_prime_generation(max_num, manageable_limit):
  21.     sc = SparkContext.getOrCreate()
  22.     small_sieve_limit = manageable_limit
  23.     while small_sieve_limit**2 < max_num:
  24.         small_sieve_limit = small_sieve_limit**2
  25.    
  26.     # Generate initial sieve
  27.     initial_primes = generate_initial_sieve(isqrt(small_sieve_limit))
  28.     broadcast_sieve = sc.broadcast(initial_primes)
  29.    
  30.     current_limit = manageable_limit
  31.     all_primes = initial_primes.copy()  # Start with initial primes
  32.  
  33.     while current_limit < max_num:
  34.         next_limit = min(current_limit**2, max_num)
  35.         # Create RDD to distribute the generation of primes in the current range
  36.         range_rdd = sc.parallelize(range(current_limit+1, next_limit+1), numSlices=1000)
  37.         primes_rdd = range_rdd.filter(lambda x: generate_primes_in_range(x, x+1, broadcast_sieve)).flatMap(lambda x: x)
  38.         current_primes = primes_rdd.collect()
  39.         all_primes.extend(current_primes)
  40.         current_limit = next_limit
  41.    
  42.     return all_primes
  43.  
  44. # Example usage
  45. max_num = 100 * 10**12  # 100 trillion
  46. manageable_limit = 10**7  # 10 million
  47. primes = iterative_prime_generation(max_num, manageable_limit)
  48. print(f"Generated {len(primes)} primes up to {max_num}.")
  49.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement