zoukankan      html  css  js  c++  java
  • 线性筛求欧拉函数的证明

    在线性筛求欧拉函数中,我们用到了以下公式:

    若$i$为质数,则$varphi(i)=i-1$;

    若$p_jmid i$,则$varphi(i imes p_j)=varphi(i) imes p_j$;

    若$p_i mid i$,则$varphi(i imes p_j)=varphi(i) imes varphi(j)=varphi(i) imes (p_j-1)$。

    其中$p_j$表示一个质数。

    后两个公式是由欧拉函数的计算公式导出的。下面给出欧拉函数的计算公式:

    设$n$有$k$个质因数$p_1,p_2,p_3,dots ,p_k$,则

    $$varphi(n)=nprodlimits_{i=1}^k (1-dfrac{1}{p_i})$$

    我们来分析一下这个公式,它的前半部分是$n$,表示原数,后半部分是一个连乘,可以发现每一个重复的因式都是$dfrac{p_i-1}{p_i}$,表示$n$的每种质因数对$varphi(n)$的贡献。

    现在来证明第二个公式:

    若$pmid n$,则$varphi(n imes p)=varphi(n) imes p$

    因为$pmid n$,且$p$是一个质数,所以$p$是$n$的一个质因数,自然也是$n imes p$的一个质因数,所以从$n$到$n imes p$,质因数种类没有发生变化,欧拉函数计算公式里的连乘部分也就没有发生变化,只需要在最前面多乘上一个$p$表示原数的变化。

    接下来证明第三个公式:

    若$p mid n$,则$varphi(n imes p)=varphi(n) imes (p-1)$

    发现从$n$到$n imes p$,新增了一个质因数种类$p$,所以除了公式的前半部分要乘上$p$,还要在后半部分乘上$(1-dfrac{1}{p})$,也即从$n$到$n imes p$,欧拉函数增长了$p(1-dfrac{1}{p})=p-1$倍。

    代码:

        int k,lis[M+3];
        bool prm[M+3];
        int phi[M+3];
        
    IL void getphi(){
        phi[1]=1;
        for(RI i=2;i<=m;i++){
            if(!prm[i]){
                lis[++k]=i;
                phi[i]=i-1;
                
            }
            
            for(RI j=1;j<=k&&i*lis[j]<=m;j++){
                prm[i*lis[j]]=true;
                
                if(i%lis[j]==0)
                    phi[i*lis[j]]=phi[i]*lis[j];
                else 
                    phi[i*lis[j]]=phi[i]*(lis[j]-1);
                
            }
            
        }
        
    }
    View Code

    其中$M$表示最大值域,$m$表示实际值域。

  • 相关阅读:
    Masscan入门手册
    Deepin安装Python3
    docker 配置 kafka+zookeeper,golang操作kafka
    VMware安装Centos7超详细过程(图文)
    国家代码查询
    thinkphp5 关于跨域的一些坑,附上解决办法(比较全面了)
    网络协议分析与抓包 TCP/IP UDP等
    一维数组分组成二维数组
    Fiddler在抓取https数据包时如何解决Tunnel to 443的问题?
    十条nmap常用的扫描命令
  • 原文地址:https://www.cnblogs.com/Hansue/p/12978192.html
Copyright © 2011-2022 走看看