定义

在数论,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目(φ(1)=1),例如φ(8)=4,因为1,3,5,7均和8互质。

通式

 其中是累积的意思(对比是累加),p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1。

注意:每种质因数只一个。 比如12=2*2*3那么φ12=12*1-1/2*(1-1/3)=4

此通式还可以化简为       

                                                 

特殊性质

1.n为奇数时, 

2.若n为质数,则 

3.m,n互质, 

4.若n是质数p的k次幂,  ,因为除了p的倍数外,其他数都跟n互质。

代码实现

1.用公式直接求一个数的欧拉函数值

int Phi(int x){  //求x的欧拉函数值
    if (x<=3) return x-1;
    int ret=x;
    for (int i=2; i*i<=x; i++) if (x%i==0){
        while (x%i==0) x/=i;//这是要去掉x中i的倍数,这些i的倍数都不是质数
        ret=ret/i*(i-1);//利用公式计算
    }
    if (x>1) ret=ret/x*(x-1);//若x>1,则说明此时的x是初始x的质因数,因此还需要在使用一次公式
    return ret;
}

2.利用筛法求大范围内的所有数的欧拉函数值(打表)

/*
特性 :
1.若a为质数,phi[a]=a-1;
2.若a为质数,b mod a=0,phi[a*b]=phi[b]*a
3.若a,b互质,phi[a*b]=phi[a]*phi[b](当a为质数时,if b mod a!=0 ,phi[a*b]=phi[a]*phi[b])
*/
int m[n],phi[n],p[n],nump;
//m[i]标记i是否为素数,0为素数,1不为素数;p是存放素数的数组;nump是当前素数个数;phi[i]为欧拉函数
int make()
{
        phi[1]=1;
    for (int i=2;i<=n;i++)
    {
        if (!m[i])//i为素数
        {
            p[++nump]=i;//将i加入素数数组p中
            phi[i]=i-1;//因为i是素数,由特性1得知    
        }    
        for (int j=1;j<=nump&&p[j]*i<n;j++)  //用当前已的到的素数数组p筛,筛去p[j]*i
        {
            m[p[j]*i]=1;//可以确定i*p[j]不是素数 
            if (i%p[j]==0) //看p[j]是否是i的约数,因为素数p[j],等于判断i和p[j]是否互质 
            {
                phi[p[j]*i]=phi[i]*p[j]; //特性2
                break;
            }
            else phi[p[j]*i]=phi[i]*(p[j]-1); //互质,特性3其,p[j]-1就是phi[p[j]]   
        }
    }
}

提示

欧拉函数属于积性函数 
积性函数: 对于正整数n的一个算术函数f(n),f(a)=1,且当a,b互质时f(a*b)=f(a)*f(b),在在数论上就称它为积性函数。 
完全积性函数: 对于一个积性函数f(n),若即使a,b不互质(对于任意的a,b)也有f(a*b)=f(a)*f(b)则称它为完全积性函数。 
对于这种奇性函数,一般都可以用这种筛法来打表。