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

欧拉函数

时间:2015-11-19 22:33:02      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

    欧拉函数φ(x)表示的是1~x之间有多少个数与n互质,公式为:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,但是,这个东西怎么证明咧?想了两个晚上终于想出来了,网上的证明用上了中国剩余定理,虽然牛逼,但相信很多初中生会表示不理解,一下是我自己想出来的证明:
     先考虑x只有一个质因数a的情况,按通式算的话是 φ(x)=x(1-1/a),这个很好理解,先构造一个集合P={1,2,3,4……x},这之中与x不互质的数必定是a的倍数,总共有x/a个,把他们删去,剩下x-x/a,把x提取出来,就是x(1-1/a)。
     若x有多个质因数,那每次删去的时候就必须考虑重复删除的问题,比如当前删至pi,设M=p1Xp2Xp3X…Xpi-1,那就是要删去1~x中是pi的倍数而与M互质的数(也就是不是p1,p2,p3…pi-1的倍数的数),设为ti,因为ti是pi的倍数,所以再设ki=ti/pi,ki就变成了1~n/pi 间与M互质的数。那这些数应该有多少个呢?可以证明这些数在[1..n/pi]、[n/pi+1..2n/pi]……中是均匀分布的,那符合ki的数的个数就是当前未被删除的数的总数除以pi,设r为当前未被删除的数的个数,那经过此次删除后剩下的数的个数就是r-r/pi=r(1-1/pi),又因为r=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pi-1),所以本次删除后剩余数的个数为x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pi),所以当把所有p1,p2,p3…pn,都进行删除后,剩下φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)。
     然后,如何证明上一段第三行中的数是均匀分布的呢?对于一个处于1~n/pi之间的数q,分为两种情况证明:
     ①若q已被删除,那它在其他区间对应的某一个数(也就是在1~n之间与q对于模n/pi同余的数) y=q+k(n/pi)(1≤k≤pi), 因为q已被删除,所以存在w≠1为q与M的最大公因数,设q=w*z1,w也必定是n/pi的因数,设n/pi=w*z2,则k(n/pi)=w*k*z2,y=w*z1+w*k*z2=w*(z1+k*z2),所以y是w的倍数,所以y已被删除。(这貌似是同余定理之一) 
     ②若q未被删除,那它在其他区间对应的某一个数y=q+k(n/pi)(1≤k≤pi),如果y已被删除,按①中的证明方法,q也应该已被删除,不合题设,所以y也未被删除。
     所以, 未被删除的数在[1..n/pi]、[n/pi+1..2n/pi]……中是均匀分布的。
     得证: φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)。
      以上证明如果有什么疏漏……233原谅我只是个SX
     最后提一下鄙人在集训时看到的一道题,简单地说就是:如何编程快速求出∑gcd(i,j)(1≤j<i≤n)?其中gcd(i,j)表示i和j的最小公因数。我们可以枚举gcd后的值s,然后就是要求满足gcd(i,j)=s的i和j的个数。因为gcd(i,j)=s,所以gcd(i/s,j/s)=1,又因为i/s≥j/s,那问题就变成了求1~i/s间与i/s互质的数的个数。程序如下(当年写的):

#include<cstdio>
#include<algorithm>
using namespace std;

int n;
int p[10001],ans=0;
int main(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++) p[i]=i;
    for (int i=2;i<=n;i++)
    if (p[i]==i)
    for (int j=i;j<=n;j+=i) p[j]=p[j]/i*(i-1);
    for (int i=1;i<=n;i++)
    for (int j=1;j<=n/i;j++) ans+=p[j]*i;
    for (int i=1;i<=n;i++) ans-=i;
    printf("%d\n",ans);
}

另外,可以预处理出∑φ(i),从而减少时间复杂度。

欧拉函数

标签:

原文地址:http://www.cnblogs.com/Enceladus/p/4979094.html

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