Solve problem 108 in Python
parent
2edbfffd46
commit
d666888994
|
@ -0,0 +1,36 @@
|
|||
from fractions import Fraction
|
||||
|
||||
|
||||
def get_distinct_solutions(n):
|
||||
""" Get the number of distinct solutions for 1/x + 1/y = 1/n. The idea is
|
||||
that 1/n*2 + 1/n*2 = 1/n is always a solution. So what we do is
|
||||
brute-force all 1/x for x in [2, n * 2]. We have a solution if the
|
||||
difference between 1/n and 1/x has a numerator of 1. """
|
||||
n_inv = Fraction(1, n)
|
||||
n_distinct = 0
|
||||
for x in range(2, n * 2 + 1):
|
||||
x_inv = Fraction(1, x)
|
||||
y_inv = n_inv - x_inv
|
||||
if y_inv.numerator == 1:
|
||||
n_distinct += 1
|
||||
return n_distinct
|
||||
|
||||
|
||||
def euler_108():
|
||||
d_max, n_prev = 0, 0
|
||||
# I arrived at the starting values empirically by observing the deltas.
|
||||
for n in range(1260, 1000000, 420):
|
||||
d = get_distinct_solutions(n)
|
||||
if d > d_max:
|
||||
# print("n={} d={} delta={}".format(n, d, n - n_prev))
|
||||
n_prev = n
|
||||
d_max = d
|
||||
if d > 1000:
|
||||
return n
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
solution = euler_108()
|
||||
print("e108.py: " + str(solution))
|
||||
assert(solution == 180180)
|
||||
|
Loading…
Reference in New Issue