gen_primes.py 919 B

123456789101112131415161718192021222324252627282930313233343536
  1. import numba
  2. from typing import List
  3. @numba.jit(nopython=True)
  4. def sieve_of_eratosthenes(n: int) -> List[int]:
  5. assert n >= 2
  6. is_prime = [True] * (n + 1)
  7. is_prime[0] = is_prime[1] = False # 0 和 1 不是素数
  8. for start in range(2, int(n**0.5) + 1):
  9. if is_prime[start]:
  10. for multiple in range(start*start, n + 1, start):
  11. is_prime[multiple] = False
  12. primes = [num for num, prime in enumerate(is_prime) if prime]
  13. return primes
  14. all_primes = sieve_of_eratosthenes(2**31)
  15. print(len(all_primes), all_primes[:10], all_primes[-10:])
  16. index = 3
  17. caps = [all_primes[index]]
  18. while True:
  19. for i in range(index+1, len(all_primes)):
  20. last_cap = caps[-1]
  21. min_cap = last_cap * 2
  22. if all_primes[i] >= min_cap:
  23. caps.append(all_primes[i])
  24. index = i
  25. break
  26. else:
  27. break
  28. print('-'*20)
  29. print(caps)