오일러피 함수

$$  \phi(9) = 6 $$

n이 소수인 경우

$$   \phi(n) = n - 1  $$

n이 소수가 아닌 경우(일반적인 경우)

$$

\phi(n) = n \times \left(1 - \frac{1}{p_1}\right) \times \left(1 - \frac{1}{p_2}\right) \times \dots \times \left(1 - \frac{1}{p_k}\right) $$

public class EulerTotientFunction {
    // 오일러 피 함수 구현
    public static int phi(int n) {
        int result = n; // 초기값은 n으로 설정
        for (int i = 2; i * i <= n; i++) {
            // n이 i로 나누어 떨어지면 i는 n의 소인수
            if (n % i == 0) {
                // 중복된 소인수를 제거
                while (n % i == 0) {
                    n /= i;
                }
                // 결과값을 소인수만큼 줄임
                result -= result / i; // = (n - n * 1/p)
            }
        }
        
        // 남은 소인수가 있을 경우
        if (n > 1) {
            result -= result / n;
        }
        return result;
    }
	 ...
}

알고리즘 문제: GCD(n, k) = 1

실패 코드

import java.util.*;
import java.io.*;

public class Main {
    
    public static void main(String[] args) throws Exception {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        System.out.print(eulerphi(n));
    }
    
    public static int eulerphi(int n) {
        int count = n;  // 최대 공약수가 한 개인 수들의 개수
        for (int i = 2; i <= Math.sqrt(n); ++i) {
            if (n % i == 0) {
                while (n % i == 0) {
                    n /= i;
                }
                count -= count / i;
            }
        }
        
        if (n > 1) {
            count -= count / n;
        }
        
        return count;
    }
}