l = [0] * n for i in range(1, n + 1): if not l[i - 1]: coprimes = [] for j in range(2, i): if gcd(i, j) == 1: coprimes.append(j) l[i - 1] = 1 + len(coprimes) for c in coprimes: if i * c > n: break l[(i * c) - 1] = l[i - 1] * l[c - 1] return l s = Sieve(10 ** 7) ps = s.list() def phi(n): if n < 2: return 1 if s.is_prime(n): return n - 1 if (n & 1) == 0: m = n >> 1 return phi(m) if m & 1 else phi(m) << 1 for p in ps: if p > n: break