zoukankan      html  css  js  c++  java
  • 【学习笔记】线性筛欧拉函数

    Bases

    这里给出的筛法是以线性筛素数的方法为基础的。

    利用了欧拉函数是积性函数的性质:对于任意互质的数(a),(b),有(f(a*b)=f(a)*f(b))

    筛法

    类比于线性筛素数。

    (i)以下的欧拉函数已经被筛出,我们利用(i)(prim)往后更新。

    如果(i)是素数,那么(varphi(i)=i-1)


    如果(i\%prim[j]!=0) ,那么((i,prim[j])==1), 则有(varphi(i*prim[j])=varphi(i)*varphi(prim[j])=varphi(i)*(prim[j]-1))


    如果(i\%prim[j]==0),则(varphi(i*prim[j])=varphi(i)*prim[j])(先甩结论)

    有两个证法:

    1.

    (i\%prim[j]==0)不能直接算的原因是它两个不互质,那我们把它写成互质的样子。

    (i*prim[j]=A*prim[j]^{m-1}*prim[j]=A*prim[j]^m)


    有个结论:如果(p)是质数,那么(varphi(p^k)=p^k-p^{k-1}=p^{k-1}*(p-1))

    比较显然,(p^k)是数的总数,而(p^k)只有(p)这一个质因子,所以它的因数都是(p)的倍数,即(1*p,2*p,3*p,...,p^{k-1}*p)(p^k)的包含自己在内的因数个数有(p^{k-1})个。

    用总数(p^k)减去因数个数(p^{k-1})就是 (varphi (p^k))。(这里总数和因数个数都算了自己本身,一减就把自己减掉了,所以没有影响)

    (varphi(p^k)=p^{k-1}*(p-1))

    (varphi(p^{k-1})=p^{k-2}*(p-1))

    联立以上二式可得:(varphi(p^k)=varphi(p^{k-1})*p)


    以下将(prim[j])简写成(p)

    (varphi(i*p)=varphi(A)*varphi(p^{m})=varphi(A)*varphi(p^{m-1})*p)

    (A*p^{m-1}=i),则(varphi(A)*varphi(p^{m-1})=varphi(i))

    那么(varphi(i*p)=varphi(A)*varphi(p^{m-1})*p=varphi(i)*p)

    (Q.E.D.)

    2.

    欧拉函数有个通式:(先甩式子再证明)
    (varphi(n)=n*(1-frac{1}{p_1})*(1-frac{1}{p_2})*...*(1-frac{1}{p_n}))(p_i)是质因数

    那么

    (varphi(i)=i*(1-frac{1}{p_1})*(1-frac{1}{p_2})*...*(1-frac{1}{prim[j]}))

    (varphi(i*prim[j])\=(i*prim[j])*(1-frac{1}{p_1})*(1-frac{1}{p_2})*...*(1-frac{1}{prim[j]})\=i*(1-frac{1}{p_1})*(1-frac{1}{p_2})*...*(1-frac{1}{prim[j]})*prim[j]\=varphi(i)*prim[j])

    然后来说一下那个什么通式怎么来的:

    这里也给出两个证法:

    1.容斥原理

    (n)的其中一个质因子是(p)([1,n])(p)的倍数有(p,2p,3p,...frac n p*p)一共(frac n p)个数,([1,n])中不含因子(p)的数就一共有(n-frac n p)

    (n)的另外一个质因子是(q),同理可得([1,n])中不含因子(q)的数就一共有(n-frac n q)个,根据容斥原理,([1,n])中两个质因子均不含的数的个数为(n-frac n p-frac n q+frac n {pq}=frac {n(pq-q-p+1)} {pq}=frac{n(p-1)(q-1)}{pq}=n*frac{p-1}p*frac{q-1}q=n*(1-frac 1 p)*(1-frac 1 q))

    推广到(n)的每一个质因子(变形时用到了分组分解因式的方法),可得([1,n])中所有(n)的质因子均不含的数的个数为(n*prod_{i=1}^k(1-frac 1 {p_i})),其中,(p_i)(n)的质因子。

    (varphi(n)=n*prod_{i=1}^k(1-frac 1 {p_i}))

    2.利用积性函数的性质

    (n=0)时,(varphi(n)=0) 成立

    (n=1)时,(varphi(n)=1) 成立

    (n)为质数时,(varphi(n)=n-1) 成立

    (n)为一个质数的正整数次幂,即(n=p^k)时,(varphi(p^k)=p^k-p^{k-1}=p^{k}*(1-frac1 p)=n*(1-frac1 p)) 成立

    (n)为任意正整数时,根据算术基本定理可得(n=p_1^{k_1}p_2^{k_2}p_3^{k_3}...p_m^{k_m}),其中(p_i)为质因数

    根据积性函数的性质(varphi(n)\=varphi(p_1)varphi(p_2)...varphi(p_m)\=p_1^{k_1}(1-frac 1{p_1})p_2^{k_2}(1-frac 1{p_2})p_3^{k_3}(1-frac 1{p_3})...p_m^{k_m}(1-frac 1{p_m})\=n*(1-frac 1{p_1})(1-frac 1{p_2})...(1-frac 1{p_m}))

    $Q.E.D . $

    (怎么觉得证明通式比证明这个结论本身还要复杂

    Code View

    void Phi()
    {
    	for(int i=2;i<=n;i++)
    	{
    		if(!vis[i]) prim[++pn]=i,phi[i]=i-1;
    		for(int j=1;j<=pn&&i*prim[j]<=n;j++)
    		{
    			vis[i*prim[j]]=1;
    			if(i%prim[j]==0)
    			{
    				phi[i*prim[j]]=phi[i]*prim[j];
    				break;
    			}
    			else phi[i*prim[j]]=phi[i]*(prim[j]-1);
    		}
    	}
    } 
    
  • 相关阅读:
    Biba模型简介
    Fragment 与 Activity 通信
    小米2S 连接Ubuntu Android Studio
    【转】Android 实现“再按一次退出程序”
    取消 EditText 自动聚焦弹出输入法界面
    为Android Studio 项目手动下载gradle
    【转】Java读取文件方法大全
    sudo: /etc/sudoers 的模式为 0551,应为 0440
    Win7 下硬盘安装Linux Mint 17
    Linux Versus Windows, Ubuntu/Mint V XP/Vista/7
  • 原文地址:https://www.cnblogs.com/lyttt/p/13452906.html
Copyright © 2011-2022 走看看