2024-04-06 16:17:05 +02:00
|
|
|
from math import gcd
|
|
|
|
from fractions import Fraction
|
|
|
|
|
|
|
|
|
|
|
|
def product(xs):
|
|
|
|
r = 1
|
|
|
|
for x in xs:
|
|
|
|
r *= x
|
|
|
|
return r
|
|
|
|
|
|
|
|
|
|
|
|
def ratio(d):
|
|
|
|
r = 0
|
|
|
|
for i in range(1, d):
|
|
|
|
if gcd(i, d) == 1:
|
|
|
|
r += 1
|
|
|
|
return Fraction(r, (d - 1))
|
|
|
|
|
|
|
|
|
|
|
|
def euler_243():
|
|
|
|
target = Fraction(15499, 94744) # 0.1635881955585578
|
|
|
|
|
|
|
|
# The more prime factors, the lower the initial fraction gets. We figure
|
|
|
|
# out empirically that using primes up to 23 yields results close to the
|
|
|
|
# target fraction. We then iterate over the multiples to find the
|
|
|
|
# solution.
|
|
|
|
factors = [2, 3, 5, 7, 11, 13, 17, 19, 23]
|
|
|
|
|
|
|
|
for mul in range(1, 10):
|
|
|
|
d = mul * product(factors)
|
|
|
|
r = ratio(d)
|
|
|
|
if r < target:
|
|
|
|
return d
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
solution = euler_243()
|
|
|
|
print("e243.py: " + str(solution))
|
2024-06-23 18:27:16 +02:00
|
|
|
assert solution == 892371480
|