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)) assert solution == 892371480