gen_primes.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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**30)
  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. if last_cap < 1000:
  22. min_cap = last_cap * 2
  23. else:
  24. min_cap = last_cap * 1.5
  25. if all_primes[i] >= min_cap:
  26. caps.append(all_primes[i])
  27. index = i
  28. break
  29. else:
  30. break
  31. print('-'*20)
  32. print(caps)
  33. print('switch(cap) {')
  34. for i in range(len(caps)-1):
  35. print(f' case {caps[i]}:', f'return {caps[i+1]};')
  36. print(' default: c11__unreachable();')
  37. print('}')