81 lines
1.8 KiB
Python
81 lines
1.8 KiB
Python
import concurrent.futures
|
|
from math import isqrt, gcd
|
|
|
|
|
|
def issqrt(n):
|
|
isq = isqrt(n)
|
|
return isq * isq == n
|
|
|
|
|
|
def have_same_ratio(a, b, c, d):
|
|
if b == 0 or d == 0:
|
|
raise ValueError("Denominators must be non-zero")
|
|
return a * d == b * c
|
|
|
|
|
|
def check_range(start, end):
|
|
local_sum = 0
|
|
for i in range(start, end):
|
|
if i % 10000 == 0:
|
|
print(i)
|
|
n = i * i
|
|
for d in range(1, i):
|
|
q = n // d
|
|
r = n % d
|
|
if r == 0:
|
|
continue
|
|
assert r < d and d < q
|
|
if have_same_ratio(d, r, q, d):
|
|
print(f"{n=} {i=} {r=} {d=} {q=}")
|
|
local_sum += n
|
|
break
|
|
return local_sum
|
|
|
|
|
|
def euler_141_brute_force():
|
|
s = 0
|
|
m = 1_000_000
|
|
range_size = 10_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
|
|
|
|
|
|
def euler_141():
|
|
r = 0
|
|
NMAX = 10**12
|
|
a = 1
|
|
while True:
|
|
if a**3 > NMAX:
|
|
break
|
|
for b in range(1, a):
|
|
if a**3 * b**2 > NMAX:
|
|
break
|
|
|
|
if gcd(a, b) != 1:
|
|
continue
|
|
|
|
c = 1
|
|
while True:
|
|
n = a**3 * b * c**2 + c * b**2
|
|
if n > NMAX:
|
|
break
|
|
if issqrt(n):
|
|
# print(n)
|
|
r += n
|
|
c += 1
|
|
a += 1
|
|
return r
|
|
|
|
|
|
if __name__ == "__main__":
|
|
solution = euler_141()
|
|
print("e141.py: " + str(solution))
|
|
assert solution == 878454337159
|