欧拉函数

转载:https://blog.csdn.net/liuzibujian/article/details/81086324

欧拉函数φ(n)是1~n-1的与n互质的数的个数

通式:φ(x) = x * (1 - 1/p1) * (1 - 1/p2) * ......; (pi 为x所有质因子);欧拉函数的几个性质

1.对于质数p,φ(p)=p−1φ(p)=p-1φ(p)=p−1。
2.若p为质数,n=pkn=p^kn=p
k
,则φ(n)φ(n)φ(n)=pkp^kp
k
-pk−1p^{k-1}p
k−1

3.欧拉函数是积性函数,但不是完全积性函数。若m,n互质,则φ(m∗n)=φ(m)∗φ(n)φ(m*n)=φ(m)*φ(n)φ(m∗n)=φ(m)∗φ(n)。特殊的,当m=2,n为奇数时,φ(2*n)=φ(n)。
4.当n>2时,φ(n)是偶数。
5.小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)。
6.n=∑d∣nφ(d)n=sum_{d|n}{φ(d)}n=∑
d∣n

φ(d),即n的因数(包括1和它自己)的欧拉函数之和等于n。

埃拉托斯特尼筛求欧拉函数

 1 void solve(int n)
 2 {
 3 
 4       for(int i = 1; i <= n; i++) p[i] = i;
 5       for(int i = 2; i <= n; i++)
 6       if(p[i] == i){
 7         for(int j = i; j <= n; j+= i)
 8          p[j] = p[j] / i * (i-1);
 9       }
10 }

欧拉筛求欧拉函数

 1 void euler(int n)
 2 {
 3     phi[1]=1;//1要特判 
 4     for (int i=2;i<=n;i++)
 5     {
 6         if (flag[i]==0)//这代表i是质数 
 7         {
 8             prime[++num]=i;
 9             phi[i]=i-1;
10         }
11         for (int j=1;j<=num&&prime[j]*i<=n;j++)//经典的欧拉筛写法 
12         {
13             flag[i*prime[j]]=1;//先把这个合数标记掉 
14             if (i%prime[j]==0)
15             {
16                 phi[i*prime[j]]=phi[i]*prime[j];//若prime[j]是i的质因子,则根据计算公式,i已经包括i*prime[j]的所有质因子 
17                 break;//经典欧拉筛的核心语句,这样能保证每个数只会被自己最小的因子筛掉一次 
18             }
19             else phi[i*prime[j]]=phi[i]*phi[prime[j]];//利用了欧拉函数是个积性函数的性质 
20         }
21     }
22 }
原文地址:https://www.cnblogs.com/jrjxt/p/12245755.html