Created
December 11, 2024 15:15
-
-
Save johnmcfarlane/8cc9e0e5c5dba325f8883bdb79cbafa5 to your computer and use it in GitHub Desktop.
Prime number algorithms
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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