• 欧拉函数


        欧拉函数φ(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
    ",ans);
    }

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

  • 相关阅读:
    解决JAVA调用C++ DLL文件Unable to load library的问题
    java调用C或者C++动态库dll
    C# 实现 ICMP PING 功能
    利用Ngnix代理基于Baget搭建私有Nuget服务
    自动驾驶常见术语的缩写和释义 微信公众号
    单细胞公共数据挖掘
    TCP标志信息
    [Javascript] Extending debounce with a maxWait Option
    [Javascript] Build lodash.merge from Scratch
    [Typescript] When to use generic type?
  • 原文地址:https://www.cnblogs.com/Enceladus/p/4979094.html
Copyright © 2020-2023  润新知