Solve more problems road to 200.
This commit is contained in:
49
python/e146.py
Normal file
49
python/e146.py
Normal file
@@ -0,0 +1,49 @@
|
||||
from lib_prime import is_prime_rabin_miller
|
||||
import concurrent.futures
|
||||
|
||||
|
||||
def follows_prime_pattern(n):
|
||||
n2 = n * n
|
||||
prev_prime = None
|
||||
for i in [1, 3, 7, 9, 13, 27]:
|
||||
p = n2 + i
|
||||
if not is_prime_rabin_miller(p):
|
||||
return False
|
||||
if prev_prime is not None:
|
||||
for x in range(prev_prime + 2, p, 2):
|
||||
if is_prime_rabin_miller(x):
|
||||
return False
|
||||
prev_prime = p
|
||||
return True
|
||||
|
||||
|
||||
def check_range(n_min, n_max):
|
||||
s = 0
|
||||
for n in range(n_min - (n_min % 10), n_max, 10):
|
||||
if n % 3 == 0:
|
||||
continue
|
||||
if follows_prime_pattern(n):
|
||||
print(n)
|
||||
s += n
|
||||
return s
|
||||
|
||||
|
||||
def euler_146():
|
||||
s = 0
|
||||
m = 150_000_000
|
||||
range_size = 500_000
|
||||
|
||||
with concurrent.futures.ProcessPoolExecutor() as executor:
|
||||
futures = []
|
||||
for start in range(1, m, range_size):
|
||||
end = min(start + range_size, m)
|
||||
futures.append(executor.submit(check_range, start, end))
|
||||
for future in concurrent.futures.as_completed(futures):
|
||||
s += future.result()
|
||||
return s
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
solution = euler_146()
|
||||
print("e146.py: " + str(solution))
|
||||
assert solution == 676333270
|
||||
Reference in New Issue
Block a user