예제 #1
0
    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