#!/usr/bin/env python3 from itertools import combinations from operator import mul from functools import reduce def factorize(n, primes): return [p for p in primes if not n%p] def totient(factors, n): r = 0 for i in range(1, len(factors)+1): for f in combinations(factors, i): r += (-1)**i * (n // reduce(mul, f)) return n + r def get_primes(n): sieve = [False] * n r = [] for p in range(2, n): if sieve[p]: continue r.append(p) for i in range(p**2, n, p): sieve[i] = True return r a, b = 15499, 94744 primes = get_primes(100) n = 1 for i, p in enumerate(primes): n *= p t = totient(primes[:i+1], n) if t*b < (n-1)*a: break else: print("Not found") quit() n //= primes[i] factors = primes[:i] for i in range(2, 100): t = totient(set(factors + factorize(i, primes)), n*i) if t*b < (n*i - 1) * a: print(n*i) quit() print("Not found")