搞懂欧拉函数

来源:互联网 发布:村上春树跑步语录知乎 编辑:程序博客网 时间:2024/06/08 03:54

定义

在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。此函数以其首名研究者欧拉命名(Euler’so totient function),它又称为Euler’s totient function、φ函数、欧拉商数等。(百度一波 B.B)

证明

引入:已知正整数 n,求小于 n 与 n 互素的整数的个数,已给出 n 的唯一分解式 n=pa11pa22pa33...pakk
分析:首先考虑容斥定理。先从总数 n 中分别减去是 p1,p2,,pk 的倍数的个数(有点拗口0.0),由于是容斥,先是 ans=nnp1np2npk , 然后加上“同时是两个素因子的倍数”的个数 即:ans+=np1p2+np1p3++npk1pk,然后呢,再减去“同时是三个素因子的倍数”的个数,然后再加上“同时是四个素因子的倍数”的个数,然后就没有然后了,最后变成了一个尴尬的数学问题,通式为:

ans=S{p1,p2,,pk}(1)|s|npiSpi (有点难敲呀,凑活看吧^_^)

这里呢把ans记做 ϕ(n) 这里的ϕ(n) 就是所谓的欧拉函数,经过大佬的简化变形如下:

ϕ(n) =n(11p1)(11p2)(11pk)
ϕ(n)=n(1p1(p11))(1p2(p21))(1pk(pk1))

下面的求ϕ(n) 的代码

int euler_phi(int n){    int m = (int)sqrt(n + 0.5);    int ans = n;    for (int i = 2;i <= m;i++){        if (n%i == 0){       //如果存在素因子            ans = ans/i*(i-1);             while (n%i == 0) n/=i;        }    }    if(n > 1) ans = ans/n*(n-1); //考虑n本身    return ans;}

知道Eratosthenes筛法的都知道 <–这个算法的时间复杂度是O(nlogn),已经优化的不少了,我们可以利用Eratosthenes筛法这个算法的思想,很快的得出“欧拉表”,即phi[maxn] 数组,时间复杂度为O(nlogn2),关键是怎么做呢,我们一步一步的来,先是i2枚举到intn+0.5,(和筛素数似的),然后利用刚枚举的 i,再次枚举in中所有包含i因子的数,记为j,这两个数之间存在一个递推式为:phi[j]=phi[j]/i(i+1),利用这个就可以求出欧拉表了。
(xjb说了一大推还不如举个例子
我们先让所有的   phi[i]=i;i{1,2n}
因为phi[1]=1,所以直接先从2开始枚举即可,先是i=2,再枚举j=i,根据递推式,可知phi[2]=2,然后   j=4可知 phi[4]=4/2(21)=2;然后再是j=6推知phi[6]=6/2(21)=3.......;然后i=3,j3phi[3]=2,j=6phi[6]=phi[6]/i(i1)=3/3(31)=2;(phi[6]i=2时已经处理过,故这里应是36)....后面的同理就行下面还是看代码吧

    void phi_table(int n,int *phi){        for (int i = 1;i <= n;i++) phi[i] = i;        for(int i = 2;i <= n;i++){            if(phi[i] == i){   //类似于Eratosthenes筛法这里                for(int j = i;j <= n;j+=i){                    phi[j] = phi[j]/i*(i-1);                }            }        }           }

性质

1.p,φ(p)=p1p,q;φpq=pq1
2.函数的积性即:若m,n互质,则φ(mn)=φ(m)φ(n).
3.N=2,φ(N).
4.N,φ(d)=N(d|N).
5.npkpn
6.当n为奇数时φ(2n)=φ(n)
7.对于一个正整数N的素数幂分为:

N=P1q1P2q2...Pnqn.

φ(N)=N(11/P1)(11/P2)...(11/Pn).

8.[1,x]xPhi(x)x2
简单证明:
gcd(x,i)=gcd(x,xi) 那么就是成对出现的,不会出现相同的结果, 即i=xi 假设这个成立那么有x=2i,gcd(x,i)=i,与已知矛盾,所以不成立, 那么显然gcd(x,i)=1 的个数为Phi(x)gcd(x,i)=1 的与 gcd(x,xi)=1 的合并就有:   x 互素的和就是Phi(x)x2