정의
오일러 피 함수(Euler phi function) φ(n)는 정수론에서 정의되는 함수 중의 하나로, 다음과 같다.
φ(n)≡∣{m:1≤m≤n,gcd(m,n)=1}∣(n∈N)
즉, φ(n)은 1보다 크거나 같고 n보다 작은 정수, 즉 n 이하 자연수들 중에서 n과 서로소인 수의 개수이다.
n의 값에 따른 φ(n)의 값을 일부 나타내면 다음과 같다.
n | φ(n) |
---|
1 | 1 |
2 | 1 |
3 | 2 |
4 | 2 |
5 | 4 |
10 | 4 |
20 | 8 |
50 | 20 |
성질
오일러 피 함수가 만족하는 성질은 다음과 같다.
- 자연수 a,b에 대해 gcd(a,b)=1이라면, φ(ab)=φ(a)φ(b).
- 임의의 자연수 k와 소수 p에 대해, φ(p)=p−1, φ(pk)=pk−1(p−1)
- 자연수 m,n에 대해 m∣n이면, φ(m)∣φ(n)도 성립한다.
오일러 곱 공식
여기에서 다음과 같은 오일러 곱 공식(Euler's product formula)를 유도 가능하다.
φ(n)=np∣n∏(1−p1)
여기서, ∏p∣n은 n을 나누어 떨어지게 만드는 소수 p에 대한 곱이다.
오일러 곱 공식 증명
자연수 n은 소수들로 소인수분해 가능하다. 즉, 다음과 같이 쓸 수 있다.
n=p1k1p2k2⋯piki
이를 오일러 피 함수에 대입하면 다음과 같다.
φ(n)=φ(p1k1p2k2⋯piki)=φ(p1k1)φ(p2k2)⋯φ(piki)=p1k1−1(p1−1)p2k2−1(p2−1)⋯piki−1(pi−1)=p1k1p2k2⋯piki(1−p11)(1−p21)⋯(1−pi1)=np∣n∏(1−p1)
증명이 완료되었다.
오일러 피 함수 구현
오일러 피 함수는 위의 성질들을 이용해 다음과 같이 c++ 코드로 구현 가능하다.
#include <bits/stdc++.h>
typedef long long ll;
ll phi(ll k) {
ll result = k;
for (ll i = 2; i*i <= k; i++) {
if (k % i == 0) {
result -= result / i;
while (k % i == 0) {
k /= i;
}
}
}
if (k > 1) {
result -= result / k;
}
return result;
}