浅谈—线性筛选素数

这是一个很有趣的专题,花了一个上午理解了。

很明显,就是用来筛选素数的,时间复杂度为O(n)


具体思路:

      1.线性筛素数

          (1)先for一遍

                (2)判断有没有被否认过是一个素数,若没有,添加一个素数

                (3)无论是不是,都for一遍,把下面的合数都筛一遍

                (4)遇到是我现在判断的这个数的因子的话,就break

                    原因:(1)例如 27=3*3*3 如果再扫下去的话,还不如直接 27=9*3

                                   (2)要用每一个数的最小因数去筛选。

                                   (3)避免重复,说好的线性。

2.线性筛欧拉函数(拓展)

 (1)加多一个数组pri[i]表示比i小的互质的个数

               (2)简单点说就是:

     (1)从12=2^2*3,之后pri的个数为 12=12*(1-1/2)*(1-1/3) 可知

                                           n=n*(1-1/p1)*(1-1/p2)*......*(1-1/pn)

                                           p是n的公因数

                                   (2)当素数n时,pri[n]=n-1

                                    ( 3)当E(ab)  前提是ab互质 E(ab)=E(a)*E(b) 假设ab是质数,其实不是素数也一样,方便写而已,只要互质即可

                                                                                     =a*(1-1/p1)*b*(1-1/p2)

                                                                                     =(a*b) * (1-1/p1) *(1-1/p2)

                                                                                     =E(ab)

                                   (4)当E(ab) 前提是ab不互质 E(ab)=E(a)*b 因为a是b的倍数

                                            假如说E(12*3)=12*3*(1-1/2)(1-1/3)

                                            因为12已经包括了3的因子了,所以就不用再算多一次了

                  (3)复杂点说看别人证明:

                              

欧拉函数的几个性质:E(x)表示比x小的且与x互质的正整数的个数。

    1、*若p是素数,E(p)=p-1。// 这个没意见!

2、*E(p^k)=p^k - p^(k-1)=(p-1)*p^(k-1)

证:令n=p^k,小于等于n的正整数数中,所有p的倍数共有p^(k-1)个。//同意?

1~n出去p的倍数,所以E(n)= n -  p^(k-1)  =p^k - p^(k-1) =  (p-1)*P^(k-1).得证。

想通以上证明很重要,因为是看懂下来证明的基础。
3、*若ab互质,则E(a*b)=E(a)*E(b),欧拉函数是积性函数.
*对任意数n都可以唯一分解成n=p1^a1*p2^a2*p3^a3*...*pn^an(pi为素数).
则E(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)// 这个没意见!可以理解

=(p1^a1*p2^a2*p3^a3*...*pn^an)*[(p1-1)*(p2-1)*(p3-1)*...*(pn-1)]/(p1*p2*p3*...*pn)      

        =(p1-1)*p1^(a1-1)*(p2-1)*p2^(a2-1)*...*(pn-1)*pn^(an-1)
=E(p1^a1)*E(p2^a2)*E(p3^a3)*...*E(pn^an)     //由此证明了互质的可以用各自的欧拉函数直接乘

所以当ab互质的时候E(a*b)=E(a)*E(b)
不互质的时候怎么办呢?

b是质数,a%b==0,那么由上面的证明,b并到其中一个b^x里面,所以E(a*b)=E(a)*b   

接下来就是题目了:

Algorithm: Prime and Euler   
pku2407 Relatives 简单的欧拉函数,利用E(p^k)=(p-1)(p^(k-1))即可 10min 1
pku1284 Primitive Roots 费马小定理可知,E(n-1)的解 10min 1
pku2478 Farey Sequence 欧拉+累加 10min 1
bzoj2190 [SDOI2008]仪仗队 去一下下面的一行和最左边的一行再欧拉函数累加,等价思维自己想 20min 2
hdu2098 分拆质数和 用线性筛选素数扫一遍 10min 1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值