欧拉函数浅谈

前言

欧拉函数听起来很高大上,但其实非常简单,也是NOIP里的一个基础知识,希望大家看完我的博客能有所理解。

什么是欧拉函数

欧拉函数是小于x的正整数中与x互质的数的个数,一般用φ(x)表示。特殊的,φ(1)=1。

如何计算欧拉函数

通式: φ(x)=x∏ni=1(1−1pi)∏i=1n(1−1pi) (∏总乘积)
φ(1)=1
其中p1p1, p2p2……pnpn为x的所有质因数,x是正整数。
那么,怎么理解这个公式呢?对于x的一个质因数pipi,因为x以内pipi的倍数是均匀分布的,所以x以内有1pi1pi的数是pipi的倍数,那么有1-1pi1pi的数不是pipi的倍数。再对于pjpj,同理,有1-1pj1pj的数不是pjpj的倍数,所以有(1-1pi1pi)*(1-1pj1pj)的数既不是pipi的倍数,又不是pjpj的倍数。最后就有∏ni=1(1−1pi)∏i=1n(1−1pi)的数与x互质,个数自然就是x∏ni=1(1−1pi)∏i=1n(1−1pi)。
还不理解?没关系,举个例子。比如x=12,12以内有1212的数是2的倍数,那么有1-1212的数不是2的倍数(1,3,5,7,9,11),这6个数里又有1313的数是3的倍数,只剩下(1-1212)* (1-1313)的数既不是2的倍数,也不是3的倍数(1,5,7,11)。这样剩下的 12*(1-1212)*(1-1313),即4个数与12互质,所以φ(12)=4。

欧拉函数的几个性质

1.对于质数p,φ(p)=p-1。
2.若p为质数,n=pkpk,则φ(n)=pkpk-pk−1pk−1。
3.欧拉函数是积性函数,但不是完全积性函数。若m,n互质,则φ(m*n)=φ(m)*φ(n)。特殊的,当m=2,n为奇数时,φ(2*n)=φ(n)。
4.当n>2时,φ(n)是偶数。
5.小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)。

欧拉函数性质的粗略证明

1.因为p是质数,所以1到n-1都与n互质。
2.n只有一个质因数p,根据公式φ(x)=x∏ni=1(1−1pi)∏i=1n(1−1pi) =x*(1-1p1p)=pkpk*(1-1p1p)=pkpk-pk−1pk−1。
3.因为m与n互质,所以它们没有公共的质因数。设m有amam个质因数,n有anan个质因数。φ(m)* φ(n)=m*n * ∏ami=1(1−1pi)∏i=1am(1−1pi)* ∏ani=1(1−1pi)∏i=1an(1−1pi)=m*n * ∏am+ani=1(1−1pi)∏i=1am+an(1−1pi)=φ(m*n)。
4.前几个都可以利用公式证明,这个却不行。首先有一个基本事实(我不想证明),若gcd(n,m)=1,则gcd(n,n-m)=1(设n>m)。当m=n-m时,n=2*m,那么n>2时gcd(n,m)<>2,与前提相悖,故m<>n-m。换句话说,n>2时,与n互质的数是成对出现的,所以φ(n)必为偶数。
5.证明这个也要用到上面所说的基本事实。与n互质的数一个是m,那么还存在另一个数n-m也与n互质。所以与n互质的数的平均数是n/2,而个数又是φ(n),可以得到这些数的和就是φ(n)*n/2。

C++求欧拉函数

扫描二维码关注公众号,回复: 2300050 查看本文章

观察欧拉函数的公式,φ(x)=x∏ni=1(1−1pi)∏i=1n(1−1pi) = x∏ni=1pi−1pi∏i=1npi−1pi 。我们用phi[x]表示φ(x)。可以一开始把phi[x]赋值为x,然后每次找到它的质因数就phi[x]=phi[x]/pipi*(pipi-1)(先除再乘,避免溢出)。当然,若只要求一个数的欧拉函数,可以从1到sqrt(n)扫一遍,若gcd(i,n)=1就更新phi[n]。复杂度为O(logn)(代码就不给了)。那要求1~n所有数的欧拉函数呢?可以用欧拉筛的思想,每次找到一个质数,就把它的倍数更新掉。这个复杂度虽然不是O(n),但还是挺快的(复杂度应该在O(n)~O(nlogn)之间,具体是多少我也不知道)。
代码如下:

void euler(int n)
{
    for (int i=1;i<=n;i++) phi[i]=i;
    for (int i=2;i<=n;i++)
    {
        if (phi[i]==i)//这代表i是质数
        {
            for (int j=i;j<=n;j+=i)
            {
                phi[j]=phi[j]/i*(i-1);//把i的倍数更新掉
            }
        }
    }
}//时间复杂度O(nloglogn)

总结

有关欧拉函数的性质,只需做个了解,而求欧拉函数的代码,却是一定要会写的。这只是走进数论世界的第一步。

注:转载我儿lzj之博客
我儿lzj之博客

猜你喜欢

转载自blog.csdn.net/beautiful_cxw/article/details/81104472