数论知识点3——欧拉函数
1.欧拉函数
指的是不超过n且与n互为素数的正整数的个数,并且如果n是一个素数,欧拉函数的值就等于n - 1,比如对于12来说,1, 5,7,11与它互质,GCD为1,所以φ(12) = 4;通式为φ(x) = x * (1 - 1 / p1) * (1 - 1/p2) * (1 - 1/p3)其中,p为x的素因子,例如对于12来说,素因子是2 3,所以φ(12) = 12 * (1/2) * (2/3) = 4,由此可以推出欧拉函数的普通求解法:
int phi(int x)
{
int ans = x;
for(int i = 2; i <= x; ++i)
{
if(x % i == 0)
{
ans = ans - ans / i; //φ(x) = x * (1 - 1 / p1) * (1 - 1/p2) * (1 - 1/p3)
// 把第一个x放入第一个括号中得 x - x / p1,再把这个结果放入第二个括号
while(x % i == 0)
x /= i;
}
}
return ans;
}
上面代码有一个致命问题就是 超时,时间复杂度是O(n),现在考虑到任何一个合数都有不超过sqrt(n)的素因子,所以这个算法可以写成:
int phi(int x)
{
int ans = x;
for(int i = 2; i * i <= x; ++i)
{
if(x % i == 0)
{
ans = ans - ans / i;
while(x % i == 0)
x /= i;
}
}
if(x > 1)
ans = ans - ans / x;
return ans;
}
这个代码