欧拉函数

Posted nonames

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉函数相关的知识,希望对你有一定的参考价值。

什么是欧拉函数

欧拉函数是小于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 ; // 跟据欧拉函数的通项公式展开一步一步算
            while(n % i == 0)//确保i为n的质因数
            {
                n /= i ;
            }
        }
    }
    if(n > 1) ans -= ans/n ;//最后可能还剩下一个质因数没有除,例如10的欧拉函数
    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 * (i-1) ;//将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]互质可以根据欧拉函数的积性函数性质求
            }
        }
    }
}

 

参考博客https://blog.csdn.net/liuzibujian/article/details/81086324

以上是关于欧拉函数的主要内容,如果未能解决你的问题,请参考以下文章

欧拉Euler函数

HDU 2588 GCD(欧拉函数)

蓝桥杯必备算法一:欧拉函数

数论之旅4---欧拉函数的证明及代码实现(我会证明都是骗人的╮( ̄▽ ̄)╭)

欧拉函数性质与求法 [数论][欧拉函数]

欧拉筛欧拉函数