欧拉函数及定理

来源:互联网 发布:sql更新多个字段 编辑:程序博客网 时间:2024/04/28 14:11

ps:文章篇幅较长=_=(像我这种蒟蒻的证明当然又臭又长),请善用目录^_^

欧拉函数

定义

欧拉函数φ(n)表示1~n中所有与n互质的数。比如1~8中与8互质的数有1,3,5,7,所以φ(8)=4。

公式

ps:关于简系请移步剩余类、完系及简系。
公式1:如果p是素数,有φ(p)=p-1,这个很显然。
公式2(积性):如果(a,b)=1,有φ(a*b)=φ(a)*φ(b),证明如下:
设模a的一个简系为a1,a2,a3,,aφ(a),模b的一个简系为b1,b2,b3,,bφ(b)
现在我们要证明:所有aib+bja(共φ(a)*φ(b)个)组成了模a*b的一个简系(即φ(a*b)=φ(a)*φ(b))。判定简系需要证明下面三点:
1.(aib+bja,ab)=1
2.aib+bja≢akb+bta(mod ab)(i!=kj!=t)
3.对于任意k满足(k,a*b)=1,则一定有kaib+bja(mod ab)(即没有遗漏)。
证明1:
因为(a,ai)=1,(a,b)=1,所以(a,ai*b)=1,由辗转相除法可得(a,ai*b+bj*a)=(a,ai*b)=1,同理得(b,ai*b+bj*a)=1。
所以1得证。
证明2:
假设存在aib+bjaakb+bta(mod ab)(i!=kj!=t),那么也就是说:
a(bjbt)+b(aiak)0(mod ab),即:
ab|a(bjbt)+b(aiak)
所以a|a(bjbt)+b(aiak),b|a(bjbt)+b(aiak)
因为a|a(bjbt),所以a|b(aiak),同理得b|a(bjbt)
又因为(a,b)=1,ai-ak=a,同理得bj-bt=b
aiak(mod a),bjbt(mod b)
也就是说aiak是同一剩余类且bjbt是同一剩余类,这与i!=k或j!=t矛盾(i!=k说明aiak不是同一剩余类,j!=t说明bjbt不是同一剩余类,由于i!=k和j!=t至少有一个不成立,所以矛盾)。
所以2得证。
证明3:
kxb+ya(mod ab)k=xb+ya+tab(tZ)(这是个不定方程,可以变形为x*b+y*a=k-t*a*b,由于(a,b)=1且(k,a*b)=1,所以一定有解,即k一定可以表示为这种形式)。
因为(k,a*b)=1,根据辗转相除法,得:
(x*b+y*a,a*b)=(x*b+y*a+t*a*b,a*b)=(k,a*b)=1
所以(x*b+y*a,a)=1,(x*b+y*a,b)=1,
根据辗转相除法,得(x*b,a)=1,(y*a,b)=1
因为(a,b)=1,所以(x,a)=1,(y,b)=1
所以x是a简系中的数,y是b简系中的数,即一定有kaib+bja(mod ab)
所以3得证。
综上所述:所有aib+bja组成了模a*b的一个简系,即φ(a*b)=φ(a)*φ(b)。

所以φ(n)是积性函数(但不是完全积性,因为要满足(a,b)=1)。
有了这个公式,就可以推得欧拉函数的通项公式。

因为n=pk11pk22pk33pkrr(p为质数),又因任意两个p互质(没有共同质因子),所以:
φ(n)=φ(pk11)*φ(pk22)*φ(pk33)*…*φ(pkrr)

现在需要知道φ(pk)如何计算:
因为p是质数,所以除了p的倍数之外,1~pk之间所有数都与pk互质。而易得1~pk之间p的倍数的个数是pkp,所以:
公式3:φ(pk)=pk-pkp=pkpk1=pk(11p)

代回原式,得:
φ(n)=pk11pk22pk33pkrr(11p1)(11p2)(11pr)
而n=pk11pk22pk33pkrr,得:
φ(n)=n(11p1)(11p2)(11pr)
这就是欧拉函数的通项公式。

求法

1.唯一分解
如果只求φ(n),那么我们就直接将n唯一分解处理出每一个n的素数,然后用通项公式就行了。
效率:O(n)

int phi(int n){    int sq=sqrt(n),ans=n;    for (int i=2;i<=sq;i++)        if (n%i==0)        {            ans=ans/i*(i-1);            while (n%i==0) n/=i;        }    if (n>1) ans=ans/n*(n-1);    return ans;}

2.筛法
如果要求φ(1~n),用唯一分解就比较慢了,所以我们可以用筛法求出φ(1~n),原理和筛素数是一样的。这里给出普通筛法以及线性筛法,但是要注意普通筛法用到的是通项公式,而线性筛法用到公式1、积性和公式3:
效率:O(nlog22(n))

void make_phi(int n){    memset(phi,0,sizeof(phi));phi[1]=1;    for (int i=2;i<=n;i++) if (!phi[i])    for (int j=1;j<=n/i;j++)    {        if (!phi[i*j]) phi[i*j]=i*j;        phi[i*j]=phi[i*j]/i*(i-1);    }}

效率:O(n)

int make_phi(int n){    memset(vis,1,sizeof(vis));vis[0]=vis[1]=false;     phi[1]=1;    for (int i=2;i<=n;i++)    {        if (vis[i]) p[++p[0]]=i,phi[i]=i-1; //用公式1        for (int j=1;j<=p[0]&&p[j]*i<=n;j++)        {            vis[p[j]*i]=false;            if (i%p[j]) phi[p[j]*i]=phi[p[j]]*phi[i]; else            //i和p[j]互质,用积性            {phi[p[j]*i]=p[j]*phi[i];break;}            //i是p[j]倍数,用公式3        }    }}

拓展

1~n与n互质的所有数的和为:
n=1:n*φ(n)/2+1/2=1
n>1:n*φ(n)/2
其实很好求:如果(x,n)=1,那么(n-x,n)=1。也就是说与n互质的数是成对出现的,那么显然这些数的和为n*φ(n)/2(1比较特殊,需要特判)。

欧拉定理

内容

如果(a,p)=1,有aφ(p)1(mod p)
由于当p是素数时φ(p)=p-1,所以ap11(mod p),由此可见费马小定理是欧拉定理的特殊形式。

证明

设p的一个简系为r1,r2,r3,,rφ(p)
因为(a,p)=1,所以ar1,ar2,ar3,arφ(p)也是p的一个简系。
所以ar1ar2ar3arφ(p)r1r2r3rφ(p)(mod p)
aφ(p)r1r2r3rφ(p)r1r2r3rφ(p)(mod p)
所以p|(aφ(p)1)r1r2r3rφ(p)
因为(r1r2r3rφ(p),p)=1
所以p|(aφ(p)1)
所以aφ(p)10(mod p)aφ(p)1(mod p)
欧拉定理得证。