功能:求少于或等于n的数中与n互质的数的数目
Euler函数表达通式:euler(n)=n(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为n的所有素因数,n是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)
欧拉公式的延伸:一个数的所有质因子之和是:euler(n)*n/2
pk 的欧拉函数:φ(pk) = pk - pk -1
p * q 的欧拉函数:φ(p * q) = φ(p) * φ(q) , gcd(p, q) = 1
int euler(int n)
{
int m = (int)sqrt(n+0.5);
int ans = n;
for(int i = 2; i <= m; i++)
{
if(!(n%i))
ans = ans/i*(i-1);
while(!(n%i)) n /= i;
}
if(n > 1) ans = ans/n*(n-1);
return ans;
}
若需要求1~n中所有数的欧拉函数,则用筛法求
int phi[maxn];
void selEuler(int n, int* phi)
{
for(int i = 2; i <= n; i++)
phi[i] = 0;
phi[1] = 1;
for(int i = 2; i <= n; i++)
{
if(!phi[i])
{
for(int j = i; j <= n; j += i)
{
if(!phi[j]) phi[j] = j;
phi[j] = phi[j]/i*(i-1);
}
}
}
}