**欧拉函数定义
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。例如euler(8)=4,因为1,3,5,7均和8互质。
Euler函数表达通式:
其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。
欧拉公式的延伸:
一个数的所有质因子之和是Euler(n)*n/2。
欧拉函数的相关性质:
3. 欧拉函数性质
(1)欧拉函数为积性函数。(对于数论函数f(n)不恒等于0,当(m,n)=1时,满足f(mn)=f(m)f(n),则称f(n)为积性函数)φ(mn)=φ(m)φ(n),(m,n)=1(2)若(m,n)=d,则φ(mn)=dφ(m)φ(n)/φ(d)(3)若m、n满足m∣n,则φ(mn)=mφ(n)(4)若m、n满足m∣n,则φ(m)∣φ(n)(5)对于质数p,其欧拉函数公式为φ(p)=p−1(6)对于质数p,pk的欧拉函数公式为φ(pk)=(p−1)pk−1(7)小于等于n且整除n的所有正整数的欧拉函数值之和等于n,即n=Σd∣nφ(d)(8)欧拉定理:若(a,m)=1,则aφ(m)≡1(modm)。(9)扩展欧拉定理ax≡axmodφ(m)(modm),(a,m)=1或ax≡ax(modm),(a,m)=1且x<φ(m)或ax≡axmodφ(m)+φ(m)(modm),(a,m)=1且x≥φ(m)
求欧拉函数的值:
int getphi(int x)
{
int tmp=x;
for(int i=2;i*i<=x;i++){
if(x%i==0){
while(x%i==0) x/=i;
tmp/=i;tmp*=(i-1);
}
}
if(x>1) tmp/=x,tmp*=(x-1);
return tmp;
}
typedef long long ll;
bool ok[maxn];
int prime[maxn],phi[maxn],cnt;
void sieve()
{
phi[1]=1;
for(ll i=2;i<maxn;++i)
{
if(!ok[i])
{
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;j<cnt;++j)
{
if(i*prime[j]>=maxn)break;
ok[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
解释: