mirror of
				https://github.com/pocketpy/pocketpy
				synced 2025-10-30 08:20:16 +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('}') |