欧拉函数

╄→гoц情女王★ 提交于 2020-01-08 21:22:23

什么是欧拉函数

欧拉函数是小于x的整数中与x互质的数的个数,特殊的 φ(1) = 1.

如何计算欧拉函数

 

其中p1,p2,.....pn为x的所有质因数,x是正整数。

 

欧拉函数的几个性质

1、对于质数p φ(p)=p-1.

2、若p为质数,n = pk,则 φ(n) = pk - pk-1

3、欧拉函数是积性函数,但不是完全积性函数(不互质也满足等式)。若m,n互质,则φ(m*n)=φ(m)*φ(n).

4、当n>2时,φ(n)* n / 2 (n > 1).

5、小于n且与n互质的数的总和为:φ(n)* n / 2 (n > 1).

6.n =  dn φ(d),即n的因数(包括1和它自己)的欧拉函数之和等于n

 

求欧拉函数

 1、求单个欧拉函数

int euler(int n)
{
    int ans = n ;
    for(int i = 2 ; i * i <= n ; i++)
    {
        if(n % i == 0)
        {
            ans -= ans / i ; // 保证6不被2、3筛掉两次
            while(n % i == 0)//确保i为n的质因数
            {
                n /= i ;
            }
        }
    }
    if(n > 1) ans -= ans/n ;//最后可能还剩下一个质因数没有除
    return ans ;
}

 

2、埃拉托斯特尼筛求欧拉函数

 

void euler(int n)//求1-n的欧拉函数
{
    for(int i = 2 ; i <= n ; i++) phi[i] = i ;
    for(int i = 2 ; i*i <= n ; i++)
    {
        if(phi[i] == i) // 表示i为质数
        {
            for(int j = i ; j <= n ; j += i)
            {
                phi[j] = phi[j] / (i-1) * i ;//将i的倍数更新
            }
        }
    }
}

 

   欧拉筛求欧拉函数

 

 

 

void euler(int n)//求1-n的欧拉函数
{
    memset(vis , true , sizeof(vis));
    int cnt = 0 ;
    for(int i = 2 ; i <= n ; i++)
    {
        if(vis[i])
        {
            prime[cnt++] = i ;
            phi[i] = i - 1 ;
        }
        for(int j = 0 ; j < cnt && prime[j] * i <= n ; j++)
        {
            vis[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] * phi[prime[j]];//i与prime[j]互质可以根据欧拉函数的积性函数性质求
            }
        }
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!