import time
import math
def funclog(func):
def wrapper(*args, **kwargs):
print(f"{func.__name__} start", *args)
start_time = time.perf_counter()
return_val = func(*args, **kwargs)
end_time = time.perf_counter()
print(f"{func.__name__} end (time={end_time-start_time:.4f})")
return return_val
return wrapper
def list_primes(limit):
primes = []
primes.append(2)
primes.append(3)
primes.append(5)
is_prime = [True] * (limit + 1)
is_prime[0] = False
is_prime[1] = False
inc = [6, 4, 2, 4, 2, 4, 6, 2]
p = 1
for i in range(0, limit + 1):
p += inc[i&7]
if p >= limit:
break
if is_prime[p]:
primes.append(p)
for i in range(p * p, limit + 1, p):
is_prime[i] = False
return primes
@funclog
def P_n_2(n):
limit = max(100, n * math.log(n) * 1.2 + 2)
while True:
primes = list_primes(int(limit))
if len(primes) > n:
return primes[n - 1]
limit *= 1.2
@funclog
def P_n(n):
primes = [2]
a = b = 3
while len(primes) < n:
for i in primes:
if a % i == 0:
b = a / i
break
if b == a:
primes.append(a)
a += 2
b = a
return primes[n - 1]
print(P_n(10), '\n')
print(P_n(100), '\n')
print(P_n(1000), '\n')
print(P_n(10000), '\n')
print(P_n_2(10), '\n')
print(P_n_2(100), '\n')
print(P_n_2(1000), '\n')
print(P_n_2(10000), '\n')
print(P_n_2(100000), '\n')
print(P_n_2(1000000), '\n')
aW1wb3J0IHRpbWUKaW1wb3J0IG1hdGgKIAogCmRlZiBmdW5jbG9nKGZ1bmMpOgogCiAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHByaW50KGYie2Z1bmMuX19uYW1lX199IHN0YXJ0IiwgKmFyZ3MpCiAgICAgICAgc3RhcnRfdGltZSA9IHRpbWUucGVyZl9jb3VudGVyKCkKICAgICAgICByZXR1cm5fdmFsID0gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZW5kX3RpbWUgPSB0aW1lLnBlcmZfY291bnRlcigpCiAgICAgICAgcHJpbnQoZiJ7ZnVuYy5fX25hbWVfX30gZW5kICh0aW1lPXtlbmRfdGltZS1zdGFydF90aW1lOi40Zn0pIikKICAgICAgICByZXR1cm4gcmV0dXJuX3ZhbAogCiAgICByZXR1cm4gd3JhcHBlcgogCiAKZGVmIGxpc3RfcHJpbWVzKGxpbWl0KToKICAgIHByaW1lcyA9IFtdCiAgICBwcmltZXMuYXBwZW5kKDIpCiAgICBwcmltZXMuYXBwZW5kKDMpCiAgICBwcmltZXMuYXBwZW5kKDUpCiAgICBpc19wcmltZSA9IFtUcnVlXSAqIChsaW1pdCArIDEpCiAgICBpc19wcmltZVswXSA9IEZhbHNlCiAgICBpc19wcmltZVsxXSA9IEZhbHNlCiAgICBpbmMgPSBbNiwgNCwgMiwgNCwgMiwgNCwgNiwgMl0KICAgIHAgPSAxCiAgICBmb3IgaSBpbiByYW5nZSgwLCBsaW1pdCArIDEpOgogICAgICAgIHAgKz0gaW5jW2kmN10KICAgICAgICBpZiBwID49IGxpbWl0OgogICAgICAgICAgICBicmVhawogICAgICAgIGlmIGlzX3ByaW1lW3BdOgogICAgICAgICAgICBwcmltZXMuYXBwZW5kKHApCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHAgKiBwLCBsaW1pdCArIDEsIHApOgogICAgICAgICAgICAgICAgaXNfcHJpbWVbaV0gPSBGYWxzZQogICAgcmV0dXJuIHByaW1lcwogCiAKQGZ1bmNsb2cKZGVmIFBfbl8yKG4pOgogICAgbGltaXQgPSBtYXgoMTAwLCBuICogbWF0aC5sb2cobikgKiAxLjIgKyAyKQogICAgd2hpbGUgVHJ1ZToKICAgICAgICBwcmltZXMgPSBsaXN0X3ByaW1lcyhpbnQobGltaXQpKQogICAgICAgIGlmIGxlbihwcmltZXMpID4gbjoKICAgICAgICAgICAgcmV0dXJuIHByaW1lc1tuIC0gMV0KICAgICAgICBsaW1pdCAqPSAxLjIKIAogCkBmdW5jbG9nCmRlZiBQX24obik6CiAgICBwcmltZXMgPSBbMl0KICAgIGEgPSBiID0gMwogICAgd2hpbGUgbGVuKHByaW1lcykgPCBuOgogICAgICAgIGZvciBpIGluIHByaW1lczoKICAgICAgICAgICAgaWYgYSAlIGkgPT0gMDoKICAgICAgICAgICAgICAgIGIgPSBhIC8gaQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBiID09IGE6CiAgICAgICAgICAgIHByaW1lcy5hcHBlbmQoYSkKICAgICAgICBhICs9IDIKICAgICAgICBiID0gYQogICAgcmV0dXJuIHByaW1lc1tuIC0gMV0KIAogCnByaW50KFBfbigxMCksICdcbicpCnByaW50KFBfbigxMDApLCAnXG4nKQpwcmludChQX24oMTAwMCksICdcbicpCnByaW50KFBfbigxMDAwMCksICdcbicpCiAKcHJpbnQoUF9uXzIoMTApLCAnXG4nKQpwcmludChQX25fMigxMDApLCAnXG4nKQpwcmludChQX25fMigxMDAwKSwgJ1xuJykKcHJpbnQoUF9uXzIoMTAwMDApLCAnXG4nKQpwcmludChQX25fMigxMDAwMDApLCAnXG4nKQpwcmludChQX25fMigxMDAwMDAwKSwgJ1xuJyk=