pocketpy/scripts/gen_primes.py
2024-11-23 14:56:47 +08:00

37 lines
919 B
Python

import numba
from typing import List
@numba.jit(nopython=True)
def sieve_of_eratosthenes(n: int) -> List[int]:
assert n >= 2
is_prime = [True] * (n + 1)
is_prime[0] = is_prime[1] = False # 0 和 1 不是素数
for start in range(2, int(n**0.5) + 1):
if is_prime[start]:
for multiple in range(start*start, n + 1, start):
is_prime[multiple] = False
primes = [num for num, prime in enumerate(is_prime) if prime]
return primes
all_primes = sieve_of_eratosthenes(2**31)
print(len(all_primes), all_primes[:10], all_primes[-10:])
index = 3
caps = [all_primes[index]]
while True:
for i in range(index+1, len(all_primes)):
last_cap = caps[-1]
min_cap = last_cap * 2
if all_primes[i] >= min_cap:
caps.append(all_primes[i])
index = i
break
else:
break
print('-'*20)
print(caps)