定义
φ(N)表示N的欧拉函数。
φ(N)表示小于N且与N互质的数的个数(包含1)。
性质
(1) pk型欧拉函数:
若N是质数p(即N=pk,k=1), φ(n)= φ(p)=p-p(k-1)=p-1。
若N是质数p的k次幂(即N=pk),φ(n)=pk-p(k-1)=(p-1)p(k-1)。
(2) mn型欧拉函数
设n为正整数,以φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值。若m,n互质,φ(mn)=(m-1)(n-1)=φ(m)φ(n)。
(3) 特殊性质:
若n为奇数时,φ(2n)=φ(n)。
对于任何两个互质 的正整数a,n(n>2)有:aφ(n)=1 mod n (恒等于)此公式即 欧拉定理
当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有: a(p-1)=1 mod n (恒等于)此公式即 费马小定理
求法
对于一个正整数N的素数幂分解N=p1q1 * p2q2 … * pn qn.
φ(N)=N*(1-1/p1) * (1-1/2) …*(1-1/pn).
因为容斥原理,所以1~n中除去与n拥有相同质因子的数剩下的与n互质。
化简过程省略。
计算上面的式子,我们只需要分解质因数。
int eular(int n){
int ans=n;
for(int i=2;i*i<=n;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所有
void euler(int n) {
for(int i=2;i<=n;i++){
if(!E[i]) //确保是质因数
for(int j=i;j<=n;j+=i){ //处理其倍数
if(!E[j])E[j]=j;
E[j]=E[j]/i*(i-1);
}
}
}
还可与欧拉筛一起计算
void get_phi(int n){
int cnt=0;
memset(isprime,1,sizeof(isprime));
for(i=2;i<=n;i++){
if(isprime[i]==1){
prime[++cnt]=i;
phi[i]=i-1;
}
for(j=1;j<=cnt&&i*prime[j]<=n;j++){
isprime[i*prime[j]]=0;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}