# Sieve of Eratosthenes prime number generation. (3.00)
def isprime(n):
for i in range(2, n):
if n % i == 0:
return False
return n > 1
def prime_expect(n):
return [i for i in range(n+1) if isprime(i)]
def sieve_1(n):
n = max(1, n)
a = [1] * (n-1)
i = 2
while i*i <= n:
if a[i-2] != 0:
a[i*i-2::i] = [0] * (n//i-i+1)
i += 1
return [i for i, v in enumerate(a, 2) if v]
def sieve_2(n):
n = max(1, n)
a = [1] * (n-1)
u = 101
i = 2
while i*i <= n:
# Unguarded.
a[i*i-2::i] = [0] * (n//i-i+1)
# Generate integer sequence (repeating decimal).
# 101/825 = 0.1224..24
d, u = divmod(u * 10, 825)
i += d
return [i for i, v in enumerate(a, 2) if v]
def sieve_3(n):
n = max(1, n)
# Optimize for size (use bytearray).
a = bytearray(b'\1' * (n-1))
u = 101
i = 2
while i*i <= n:
# Unguarded.
a[i*i-2::i] = b'\0' * (n//i-i+1)
# Generate integer sequence (repeating decimal).
# 101/825 = 0.1224..24
d, u = divmod(u * 10, 825)
i += d
return [i for i, v in enumerate(a, 2) if v]
def sieve_4(n):
if n < 2:
return []
# Optimize for size (implicit twos; use bytearray).
m = (n-1)//2
a = bytearray(b'\1' * m)
u = 37
i = 3
while i*i <= n:
# Unguarded.
a[i*i//2-1::i] = b'\0' * ((m-i*i//2) // i+1)
# Generate integer sequence (repeating decimal).
# 37/165 = 0.224..24
d, u = divmod(u * 10, 165)
i += d
return [2] + [2*i+1 for i, v in enumerate(a, 1) if v]
# Test.
from time import process_time
def _test(n, f):
print(f.__name__)
for i in range(258):
assert f(i) == prime_expect(i)
t = process_time()
for i in range(n):
f(2**i-1)
t = process_time() - t
print(f'Elapsed: {t:.9f}s')
n = 43
print(prime_expect(n))
n = 20
_test(n, sieve_1)
_test(n, sieve_2)
_test(n, sieve_3)
_test(n, sieve_4)
IyBTaWV2ZSBvZiBFcmF0b3N0aGVuZXMgcHJpbWUgbnVtYmVyIGdlbmVyYXRpb24uICgzLjAwKQoKZGVmIGlzcHJpbWUobik6CiAgICBmb3IgaSBpbiByYW5nZSgyLCBuKToKICAgICAgICBpZiBuICUgaSA9PSAwOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBuID4gMQoKZGVmIHByaW1lX2V4cGVjdChuKToKICAgIHJldHVybiBbaSBmb3IgaSBpbiByYW5nZShuKzEpIGlmIGlzcHJpbWUoaSldCgpkZWYgc2lldmVfMShuKToKICAgIG4gPSBtYXgoMSwgbikKICAgIGEgPSBbMV0gKiAobi0xKQogICAgaSA9IDIKICAgIHdoaWxlIGkqaSA8PSBuOgogICAgICAgIGlmIGFbaS0yXSAhPSAwOgogICAgICAgICAgICBhW2kqaS0yOjppXSA9IFswXSAqIChuLy9pLWkrMSkKICAgICAgICBpICs9IDEKICAgIHJldHVybiBbaSBmb3IgaSwgdiBpbiBlbnVtZXJhdGUoYSwgMikgaWYgdl0KCmRlZiBzaWV2ZV8yKG4pOgogICAgbiA9IG1heCgxLCBuKQogICAgYSA9IFsxXSAqIChuLTEpCiAgICB1ID0gMTAxCiAgICBpID0gMgogICAgd2hpbGUgaSppIDw9IG46CiAgICAgICAgIyBVbmd1YXJkZWQuCiAgICAgICAgYVtpKmktMjo6aV0gPSBbMF0gKiAobi8vaS1pKzEpCiAgICAgICAgIyBHZW5lcmF0ZSBpbnRlZ2VyIHNlcXVlbmNlIChyZXBlYXRpbmcgZGVjaW1hbCkuCiAgICAgICAgIyAxMDEvODI1ID0gMC4xMjI0Li4yNAogICAgICAgIGQsIHUgPSBkaXZtb2QodSAqIDEwLCA4MjUpCiAgICAgICAgaSArPSBkCiAgICByZXR1cm4gW2kgZm9yIGksIHYgaW4gZW51bWVyYXRlKGEsIDIpIGlmIHZdCgpkZWYgc2lldmVfMyhuKToKICAgIG4gPSBtYXgoMSwgbikKICAgICMgT3B0aW1pemUgZm9yIHNpemUgKHVzZSBieXRlYXJyYXkpLgogICAgYSA9IGJ5dGVhcnJheShiJ1wxJyAqIChuLTEpKQogICAgdSA9IDEwMQogICAgaSA9IDIKICAgIHdoaWxlIGkqaSA8PSBuOgogICAgICAgICMgVW5ndWFyZGVkLgogICAgICAgIGFbaSppLTI6OmldID0gYidcMCcgKiAobi8vaS1pKzEpCiAgICAgICAgIyBHZW5lcmF0ZSBpbnRlZ2VyIHNlcXVlbmNlIChyZXBlYXRpbmcgZGVjaW1hbCkuCiAgICAgICAgIyAxMDEvODI1ID0gMC4xMjI0Li4yNAogICAgICAgIGQsIHUgPSBkaXZtb2QodSAqIDEwLCA4MjUpCiAgICAgICAgaSArPSBkCiAgICByZXR1cm4gW2kgZm9yIGksIHYgaW4gZW51bWVyYXRlKGEsIDIpIGlmIHZdCgpkZWYgc2lldmVfNChuKToKICAgIGlmIG4gPCAyOgogICAgICAgIHJldHVybiBbXQogICAgIyBPcHRpbWl6ZSBmb3Igc2l6ZSAoaW1wbGljaXQgdHdvczsgdXNlIGJ5dGVhcnJheSkuCiAgICBtID0gKG4tMSkvLzIKICAgIGEgPSBieXRlYXJyYXkoYidcMScgKiBtKQogICAgdSA9IDM3CiAgICBpID0gMwogICAgd2hpbGUgaSppIDw9IG46CiAgICAgICAgIyBVbmd1YXJkZWQuCiAgICAgICAgYVtpKmkvLzItMTo6aV0gPSBiJ1wwJyAqICgobS1pKmkvLzIpIC8vIGkrMSkKICAgICAgICAjIEdlbmVyYXRlIGludGVnZXIgc2VxdWVuY2UgKHJlcGVhdGluZyBkZWNpbWFsKS4KICAgICAgICAjIDM3LzE2NSA9IDAuMjI0Li4yNAogICAgICAgIGQsIHUgPSBkaXZtb2QodSAqIDEwLCAxNjUpCiAgICAgICAgaSArPSBkCiAgICByZXR1cm4gWzJdICsgWzIqaSsxIGZvciBpLCB2IGluIGVudW1lcmF0ZShhLCAxKSBpZiB2XQoKIyBUZXN0LgoKZnJvbSB0aW1lIGltcG9ydCBwcm9jZXNzX3RpbWUKCmRlZiBfdGVzdChuLCBmKToKICAgIHByaW50KGYuX19uYW1lX18pCiAgICBmb3IgaSBpbiByYW5nZSgyNTgpOgogICAgICAgIGFzc2VydCBmKGkpID09IHByaW1lX2V4cGVjdChpKQogICAgdCA9IHByb2Nlc3NfdGltZSgpCiAgICBmb3IgaSBpbiByYW5nZShuKToKICAgICAgICBmKDIqKmktMSkKICAgIHQgPSBwcm9jZXNzX3RpbWUoKSAtIHQKICAgIHByaW50KGYnRWxhcHNlZDoge3Q6LjlmfXMnKQoKbiA9IDQzCnByaW50KHByaW1lX2V4cGVjdChuKSkKCm4gPSAyMApfdGVzdChuLCBzaWV2ZV8xKQpfdGVzdChuLCBzaWV2ZV8yKQpfdGVzdChuLCBzaWV2ZV8zKQpfdGVzdChuLCBzaWV2ZV80KQ==
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43]
sieve_1
Elapsed: 0.098275157s
sieve_2
Elapsed: 0.097672450s
sieve_3
Elapsed: 0.092358420s
sieve_4
Elapsed: 0.058782549s