数学 —— 数论 —— 欧拉函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011815404/article/details/88696752

【定义】

对正整数 n,欧拉函数是小于等于 n 的数中与 n 互质的数的个数,记作:\phi (n)

例如:\phi (8)=4,因为 1、3、5、7 均与 8 互质。

【性质】

1)若 n 为一素数 p,则:\phi (p) =p-1

2)若 n 为一素数 p 的幂次 p^a,则:\phi (p^a) =(p-1)*p^{a-1}

例如:要求 \phi (16),由于 16=2*2*2*2,故 \phi (16)=(2-1)*2^3=8

3)若 n 为任意两个互质的数 a、b 的积,则:\phi (a*b) =\phi(a)*\phi(b)

例如:要求 \phi (40),由于 40=5*8,且 5、8 互质,所以 \phi (40)=\phi(5)*\phi(8)=4*4=16

4)设 n=p_1^{a_1}*p_2^{a_2}*...*p_k^{a_k} 为 正整数 n 的素数幂乘积表达式,则:\phi (n) =n*(1-1/p_1)*(1-1/p_2)*...*(1-1/p_k)

5)若 i \:mod\:p=0,则:\phi(i*p)=p*\phi(i)

6)若 i \:mod\:p\neq 0,则:\phi(i*p)=(p-1)*\phi(i)

7)前 n 个数的欧拉函数的和为:\frac{n}{2}\phi(n)

【求法】

1.一般方法

求一个数 x 的欧拉函数

int Euler(int x)
{
    int res=x;
    for(int i=2;i<(int)sqrt(x*1.0)+1;i++)
    {
        if(x%i==0)
        {
            res=res/i*(i-1);
            while(x%i==0)/// 保证i一定是素数
                x/=i;
        }
    }
    if(x>1)
        res=res/x*(x-1);
    return res;
}

2.递推求法

打表取 1 到 N 的所有欧拉函数并存在数组 phi 中

int phi[N];
void Euler()
{
    for(int i=1;i<=N;i++)
        phi[i]=i;
        
    for(int i=2;i<=N;i+= 2)
        phi[i]/=2;
        
    for(int i=3;i<=N;i+= 2)
    {
        if(phi[i]==i)
        {
            for(int j=i;j<=N;j+=i)
                phi[j]=phi[j]/i*(i-1);
        }
    }
}

3.欧拉函数线性筛法

该算法可在线性时间内筛素数的同时求出所有数的欧拉函数。

如要求一个数的欧拉函数,可以用欧拉函数性质直接求出,但是如果要求前 n 个数的欧拉函数,可采用线性时间的方法筛选欧拉函数值,完成打表。

int phi[N],prime[N];  
bool mark[N];  
void Euler(int n)  
{  
    int cnt=0;
    phi[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!mark[i])  
        {
            prime[++cnt]=i;//筛素数的时先判断i是否是素数  
            phi[i]=i-1;//当i是素数时phi[i]=i-1  
        }
        for(j=1;j<=cnt;j++)
        {
            if(i*prime[j]>N)
                break;
            mark[i*prime[j]]=1;//确定i*prime[j]不是素数
            if(i%prime[j]==0)//看prime[j]是否是i的约数  
            {  
                phi[i*prime[j]]=phi[i]*prime[j];
                break;  
            } 
            else  
                phi[i*prime[j]]=phi[i]*(prime[j]-1);//其prime[j]-1就是phi[prime[j]],利用了欧拉函数的积性  
       }  
   }  
}

猜你喜欢

转载自blog.csdn.net/u011815404/article/details/88696752