import numpy as np def sieve_np(limit): if limit < 2: return [] # Create a boolean array "is_prime" and initialize all entries as True is_prime = np.ones(limit + 1, dtype=bool) is_prime[0:2] = False # 0 and 1 are not prime numbers for p in range(2, int(limit**0.5) + 1): if is_prime[p]: # Use array slicing to mark all multiples of p as not prime is_prime[p**2 : limit + 1 : p] = False # Create a list of prime numbers using NumPy's where function primes = np.where(is_prime)[0] return primes.tolist() def sieve(max_n): s = [True] * (max_n + 1) p = 2 while p**2 <= max_n: if s[p]: for i in range(p**2, max_n + 1, p): s[i] = False p += 1 primes = [p for p in range(2, max_n + 1) if s[p]] return primes def sieve_of_eratosthenes(limit): if limit < 2: return [] # Create a boolean array "prime[0..limit]" and initialize all entries as True prime = [True] * (limit + 1) prime[0] = prime[1] = False # 0 and 1 are not prime numbers p = 2 while p**2 <= limit: if prime[p]: # Update all multiples of p starting from p^2 prime[p**2 : limit + 1 : p] = [False] * len(prime[p**2 : limit + 1 : p]) p += 1 # Create a list of prime numbers primes = [p for p in range(2, limit + 1) if prime[p]] return primes class Primes: primes = sieve(25_000_000) @staticmethod def stream(): yield from Primes.primes