码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉函数

时间:2020-01-08 22:52:29      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:break   正整数   csdn   整数   com   lis   data-   mem   ant   

什么是欧拉函数

欧拉函数是小于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

欧拉函数

标签:break   正整数   csdn   整数   com   lis   data-   mem   ant   

原文地址:https://www.cnblogs.com/nonames/p/12168777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!