오일러피 함수
오일러피 함수
는 1부터 n까지의 정수 중에서 n과 서로소인 정수의 개수를 구하는 함수이다.
( ex: n = 9 일 때, 1부터 9 사이에서 9와 서로소인 정수는 1, 2, 4, 5, 7, 8로 총 6개이다. )$$ \phi(9) = 6 $$
n이 소수인 경우
$$ \phi(n) = n - 1 $$
n이 소수가 아닌 경우(일반적인 경우)
- 소인수(p1, p2, … , pk) 분해를 사용하여 계산 가능하다 !
$$
\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;
}
}