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)
现在我们要证明:所有 ai∗b+bj∗a (共φ(a)*φ(b)个)组成了模a*b的一个简系(即φ(a*b)=φ(a)*φ(b))。判定简系需要证明下面三点:
1. (ai∗b+bj∗a,a∗b)=1 。
2. ai∗b+bj∗a≢ak∗b+bt∗a(mod a∗b)(i!=k或j!=t)
3.对于任意k满足(k,a*b)=1,则一定有 k≡ai∗b+bj∗a(mod a∗b) (即没有遗漏)。
证明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:
假设存在 ai∗b+bj∗a≡ak∗b+bt∗a(mod a∗b)(i!=k或j!=t) ,那么也就是说:
a∗(bj−bt)+b∗(ai−ak)≡0(mod a∗b) ,即:
a∗b|a∗(bj−bt)+b∗(ai−ak)
所以 a|a∗(bj−bt)+b∗(ai−ak),b|a∗(bj−bt)+b∗(ai−ak)
因为 a|a∗(bj−bt) ,所以 a|b∗(ai−ak) ,同理得 b|a∗(bj−bt)
又因为(a,b)=1, ai - ak =a,同理得 bj - bt =b
即 ai≡ak(mod a) , bj≡bt(mod b)
也就是说 ai 和 ak 是同一剩余类且 bj 和 bt 是同一剩余类,这与i!=k或j!=t矛盾(i!=k说明 ai 和 ak 不是同一剩余类,j!=t说明 bj 和 bt 不是同一剩余类,由于i!=k和j!=t至少有一个不成立,所以矛盾)。
所以2得证。
证明3:
设 k≡x∗b+y∗a(mod a∗b) 即 k=x∗b+y∗a+t∗a∗b(t∈Z) (这是个不定方程,可以变形为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简系中的数,即一定有 k≡ai∗b+bj∗a(mod a∗b) 。
所以3得证。
综上所述:所有 ai∗b+bj∗a 组成了模a*b的一个简系,即φ(a*b)=φ(a)*φ(b)。
所以φ(n)是积性函数(但不是完全积性,因为要满足(a,b)=1)。
有了这个公式,就可以推得欧拉函数的通项公式。
因为 n=pk11∗pk22∗pk33∗…∗pkrr (p为质数),又因任意两个p互质(没有共同质因子),所以:
φ(n)=φ( pk11 )*φ( pk22 )*φ( pk33 )*…*φ( pkrr )
现在需要知道φ( pk )如何计算:
因为p是质数,所以除了p的倍数之外,1~ pk 之间所有数都与 pk 互质。而易得1~ pk 之间p的倍数的个数是 pkp ,所以:
公式3:φ( pk )= pk - pkp = pk−pk−1 = pk(1−1p)
代回原式,得:
φ(n)= pk11∗pk22∗pk33∗…∗pkrr∗(1−1p1)∗(1−1p2)∗……∗(1−1pr)
而n= pk11∗pk22∗pk33∗…∗pkrr ,得:
φ(n)= n∗(1−1p1)∗(1−1p2)∗……∗(1−1pr)
这就是欧拉函数的通项公式。
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(nlog2n)
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,所以 ap−1≡1(mod p) ,由此可见费马小定理是欧拉定理的特殊形式。
设p的一个简系为 r1,r2,r3,…,rφ(p) 。
因为(a,p)=1,所以 ar1,ar2,ar3…,arφ(p) 也是p的一个简系。
所以 ar1∗ar2∗ar3∗…∗arφ(p)≡r1∗r2∗r3∗…∗rφ(p)(mod p)
即 aφ(p)∗r1∗r2∗r3∗…∗rφ(p)≡r1∗r2∗r3∗…∗rφ(p)(mod p)
所以 p|(aφ(p)−1)∗r1∗r2∗r3∗…∗rφ(p)
因为( r1∗r2∗r3∗…∗rφ(p) ,p)=1
所以 p|(aφ(p)−1)
所以 aφ(p)−1≡0(mod p) 即 aφ(p)≡1(mod p)
欧拉定理得证。