반응형
오일러 피 함수 P(N)은 1~ N까지 N과 *서로소인 자연수의 개수를 반환함
*서로소 - 두 수의 최대 공약수가 1인 수 즉, 둘다 소수라는 뜻
- 오일러 피 함수 구현
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
long n;
cin >> n;
long result = n;
for (long p = 2; p <= sqrt(n); p++)
{
if (n % p == 0) {
result -= result / p;
while (n % p == 0)
n /= p;
}
}
if (n > 1)
result -= result / n;
cout << result << "\n";
}
오일러 피 함수 은 과 서로소인 부터 사이의 자연수의 개수를 반환함
소인수 분해와 오일러 피 함수의 성질을 이용하여 이 값을 계산할 수 있음
- 소인수 분해: 반복문에서 를 2부터 sqrt(까지 증가시키며 을 나눔, 만약 이 로 나누어진다면, 는 의 소인수
- 오일러 피 함수 값의 갱신: 이 로 나누어지면, 를 로 갱신, 만약 이 어떤 소수 로 나누어진다면, 과 서로소인 수 중 "의 배수가 되는 수"는 전체의 1/에 해당함 따라서, 이 수들을 제외한 나머지 수의 개수를 구하기 위해 에서 전체의 1/를 뺀 값을 취함
- 중복 소인수 제거: 이 여전히 로 나누어진다면, 에서 의 최고 거듭제곱을 제거, 이 과정은 을 p의 거듭제곱이 아닌 다른 소인수들로만 구성된 수로 만들기 위함임
- 남은 소인수 처리: 반복문이 끝난 후, 이라면 가장 큰 소인수, 이 경우, 과 서로소인 수 중 의 배수를 제외해야 하므로, 마찬가지로 에서 을 수행
반응형
LIST
'프로그래밍 > 자료구조와 알고리즘' 카테고리의 다른 글
트라이 (Trie) (0) | 2024.04.20 |
---|---|
유클리드 호제법 (0) | 2024.03.28 |
병합 정렬 (0) | 2023.03.10 |
선택정렬 (0) | 2023.02.15 |
우선순위 큐 (0) | 2023.02.15 |