文章目录
- 欧拉函数
- 求欧拉函数
一、欧拉函数
1.什么是欧拉函数?1~n中与n互质的数的个数=欧拉函数。互质就是两个数的公约数只能为1.
比如
2.欧拉函数的性质:若p是质数,则;若p是质数,则
; 积性函数:若gcd(m,n)=1,则
.
第一个结论是因为p是质数,所以他之前的所有数肯定都不能和他整除,所以p的欧拉函数为1~p的长度即p-1;第二个结论的理由如下:1...p...2p...3p......p^k中,p、2p、3p等不能和p^k互质,所以剩余的数都与p^k互质的,因此p^k的欧拉函数为l(1~p)+l(p~2p)+l(2p~3p)+l(3p~p^k)=(p-1)*p^k-1,如图,
第三个结论的证明可以去网上搜一下要用到映射,不过多说明。
3.欧拉函数的计算公式:

的计算公式的推导利用了欧拉函数的性质二和唯一分解定理
二、求欧拉函数
试除法
1.core idea:分解n的质因子+ϕ(n)的计算公式
2.代码如下:
int phi(int n){ //试除法求欧拉函数
int res = n;//res为ϕ(n)
for(int i=2; i*i<=n; i++){
if(n%i == 0){
res = res/i*(i-1);//res为ϕ(n) 此处为ϕ(n)的计算公式
while(n%i == 0) n /= i;//除掉n的所有i因子
}
}
if(n>1) res = res/n*(n-1);
return res;
}
举例说明一下,
根据欧拉函数的性质,去除一个 p 因子后,新的 res 应该是:新的res= p是一个质因子
时间复杂度为O()
筛法
1.core idea:若i是质数,phi[i] = i - 1。
在线性筛中,每个合数m都是被最小的质因子筛掉的。
设pj是m的最小质因子,则m通过m = pj × i筛掉。
(1) 若i能被pj整除,则i包含了m的所有质因子。
φ(m) = m × ∏(k=1到包含m的所有质因子) (pk^(-1)) = pj × i × ∏(k=1到不包含pj的所有质因子) (pk^(-1)) = pj × φ(i)
例,φ(12) = φ(2 × 6) = 2 × φ(6)
(2) 若i不能被pj整除,则i和pj是互质的。
φ(m) = φ(pj × i) = φ(pj) × φ(i) = (pj - 1) × φ(i)
例,φ(75) = φ(3 × 25) = (3 - 1) × φ(25)
分解n的质因数+欧拉函数第一个性质+线性筛法+ϕ(n)的计算公式
2.代码如下:
const int N = 100010;
int p[N], vis[N], cnt;
int phi[N];
void get_phi(int n){
phi[1] = 1;
for(int i=2; i<=n; i++){
if(!vis[i]){
p[cnt++] = i;
phi[i] = i-1;
}
for(int j=0; i*p[j]<=n; j++){
int m = i*p[j];
if(i%p[j]== 0){
phi[m] = p[j]*phi[i];
break;
}else{
phi[m] = (p[j]-1)*phi[i];
}
}
}
}
注意:
对于非常大的 n,试除法可能仍然不够高效,这时可能需要使用筛法。
线性筛法具体可看质数那一篇文章~

7798

被折叠的 条评论
为什么被折叠?



