Solve problem 142 and make 141 brute force work again.
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import concurrent.futures
|
||||||
from math import isqrt, gcd
|
from math import isqrt, gcd
|
||||||
|
|
||||||
|
|
||||||
@@ -6,14 +7,12 @@ def issqrt(n):
|
|||||||
return isq * isq == n
|
return isq * isq == n
|
||||||
|
|
||||||
|
|
||||||
def euler_141_brute_force():
|
|
||||||
import concurrent.futures
|
|
||||||
|
|
||||||
def have_same_ratio(a, b, c, d):
|
def have_same_ratio(a, b, c, d):
|
||||||
if b == 0 or d == 0:
|
if b == 0 or d == 0:
|
||||||
raise ValueError("Denominators must be non-zero")
|
raise ValueError("Denominators must be non-zero")
|
||||||
return a * d == b * c
|
return a * d == b * c
|
||||||
|
|
||||||
|
|
||||||
def check_range(start, end):
|
def check_range(start, end):
|
||||||
local_sum = 0
|
local_sum = 0
|
||||||
for i in range(start, end):
|
for i in range(start, end):
|
||||||
@@ -32,6 +31,8 @@ def euler_141_brute_force():
|
|||||||
break
|
break
|
||||||
return local_sum
|
return local_sum
|
||||||
|
|
||||||
|
|
||||||
|
def euler_141_brute_force():
|
||||||
s = 0
|
s = 0
|
||||||
m = 1_000_000
|
m = 1_000_000
|
||||||
range_size = 10_000
|
range_size = 10_000
|
||||||
@@ -41,10 +42,8 @@ def euler_141_brute_force():
|
|||||||
for start in range(1, m, range_size):
|
for start in range(1, m, range_size):
|
||||||
end = min(start + range_size, m)
|
end = min(start + range_size, m)
|
||||||
futures.append(executor.submit(check_range, start, end))
|
futures.append(executor.submit(check_range, start, end))
|
||||||
|
|
||||||
for future in concurrent.futures.as_completed(futures):
|
for future in concurrent.futures.as_completed(futures):
|
||||||
s += future.result()
|
s += future.result()
|
||||||
|
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
38
python/e142.py
Normal file
38
python/e142.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
from math import isqrt
|
||||||
|
|
||||||
|
|
||||||
|
def iq(n):
|
||||||
|
isq = isqrt(n)
|
||||||
|
return isq * isq == n
|
||||||
|
|
||||||
|
|
||||||
|
def euler_142():
|
||||||
|
# x + y x - y x + z x - z y + z y - z
|
||||||
|
NMAX = 1_000_000
|
||||||
|
squares = [n * n for n in range(1, NMAX)]
|
||||||
|
for x in range(1, NMAX):
|
||||||
|
for s1 in squares:
|
||||||
|
y = x - s1 # s1 = x - y
|
||||||
|
if y <= 0:
|
||||||
|
break
|
||||||
|
if not iq(x + y): # s2 = x + y
|
||||||
|
continue
|
||||||
|
for s3 in squares:
|
||||||
|
z = y - s3 # s3 = y - z
|
||||||
|
if x - z <= 0:
|
||||||
|
continue
|
||||||
|
if z <= 0:
|
||||||
|
break
|
||||||
|
if not iq(y + z): # s4 = y + z
|
||||||
|
continue
|
||||||
|
if iq(x + z) and iq(x - z):
|
||||||
|
print(x, y, z, x + y + z)
|
||||||
|
return x + y + z
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
solution = euler_142()
|
||||||
|
print("e142.py: " + str(solution))
|
||||||
|
assert solution == 1006193
|
||||||
|
|
||||||
Reference in New Issue
Block a user