mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-19 19:10:17 +00:00
45 lines
1.1 KiB
Python
45 lines
1.1 KiB
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**30)
|
|
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]
|
|
if last_cap < 1000:
|
|
min_cap = last_cap * 2
|
|
else:
|
|
min_cap = last_cap * 1.5
|
|
if all_primes[i] >= min_cap:
|
|
caps.append(all_primes[i])
|
|
index = i
|
|
break
|
|
else:
|
|
break
|
|
|
|
print('-'*20)
|
|
print(caps)
|
|
|
|
print('switch(cap) {')
|
|
for i in range(len(caps)-1):
|
|
print(f' case {caps[i]}:', f'return {caps[i+1]};')
|
|
print(' default: c11__unreachable();')
|
|
print('}') |