Skip to content

Instantly share code, notes, and snippets.

@johnmcfarlane
Created December 11, 2024 15:15
Show Gist options
  • Save johnmcfarlane/8cc9e0e5c5dba325f8883bdb79cbafa5 to your computer and use it in GitHub Desktop.
Save johnmcfarlane/8cc9e0e5c5dba325f8883bdb79cbafa5 to your computer and use it in GitHub Desktop.
Prime number algorithms
from time import time
def primes(maximum: int):
assert(maximum > 0)
yield 2
non_primes = 0
non_prime_bit = 2
for non_prime_index in range(1, maximum>>1):
if not non_primes & non_prime_bit:
number = (non_prime_index << 1) + 1
for non_prime in range(number*3, maximum, number*2):
non_primes |= (1 << ((non_prime - 1) >> 1))
yield number
non_prime_bit <<= 1
assert(3 in primes(4))
def is_prime(number: int):
return number == 2 or (number & 1) != 0 and number != 1 and not any(True for n in range(3, number>>1, 2) if (number%n) == 0)
for max in range(0, 100):
for n in range(1, max):
if ((n in primes(max)) != is_prime(n)):
print(max, n, n in primes(max), is_prime(n))
assert(False)
minimum = 90000
maximum = 100000
start = time()
# print(', '.join([str(n) for n in primes(maximum) if n > minimum]))
print(len([str(n) for n in primes(maximum) if n > minimum]))
middle = time()
# print(', '.join([str(n) for n in range(minimum, maximum) if is_prime(n)]))
print(len([str(n) for n in range(minimum, maximum) if is_prime(n)]))
end = time()
print(middle - start)
print(end - middle)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment