神奇的线性筛法

原创 2016年06月01日 21:19:58

关于线筛

所谓线性筛法,顾名思义它是线性的筛素数的方法,所以是O(N)

神奇的东西

int getprime(int lim)
{
    int i,j,num=0;
    fo(i,2,lim) 
    {
        if (!bz[i])
        {
            prime[++num]=i;
            for(j=1;i*j<=lim;j++) bz[i*prime[j]]=1;
        }   
    }
}

这是普通筛法

int getprime(int lim)
{
    int i,j,num=0;
    fo(i,2,lim) 
    {
        if (!bz[i]) prime[++num]=i;
        for(j=1;i*prime[j]<=lim&&j<=num;j++)
        {
            bz[i*prime[j]]=1;
            if (!(i%prime[j])) break;
        } 
    }
}

这是线性筛法

实测

某神犇已经测过,我直接上结果

  • 筛 [0, 100000) 范围内的素数
    第一种素数筛法 0 毫秒
    第二种素数筛法 0 毫秒

  • 筛 [0, 200000) 范围内的素数
    第一种素数筛法 15 毫秒
    第二种素数筛法 0 毫秒

  • 筛 [0, 400000) 范围内的素数
    第一种素数筛法 16 毫秒
    第二种素数筛法 15 毫秒

  • 筛 [0, 800000) 范围内的素数
    第一种素数筛法 47 毫秒
    第二种素数筛法 16 毫秒

  • 筛 [0, 1600000) 范围内的素数
    第一种素数筛法 62 毫秒
    第二种素数筛法 63 毫秒

  • 筛 [0, 3200000) 范围内的素数
    第一种素数筛法 297 毫秒
    第二种素数筛法 109 毫秒

  • 筛 [0, 6400000) 范围内的素数
    第一种素数筛法 922 毫秒
    第二种素数筛法 266 毫秒

  • 筛 [0, 12800000) 范围内的素数
    第一种素数筛法 2187 毫秒
    第二种素数筛法 563 毫秒

  • 筛 [0, 25600000) 范围内的素数
    第一种素数筛法 4828 毫秒
    第二种素数筛法 1187 毫秒

为什么是线性的呢?

回到程序

可以发现,普通筛法将每个质数的倍数都筛掉,每个合数都被筛了它的质因子次
That’s too slow!!

我们再看线性筛法
筛的时候,把当前到的这一个数(不论质数合数)乘上筛出来的每个质数筛一遍

关键是这一句

if (!(i%prime[j])) break;

这样的情况,意思是prime[j]这一个质数在prime[j]×i中指数已经大于等于2了。

并且,这个合数的任何倍数以后一定会被prime[j]筛到
所以后面的都不必筛了。

这样,每个合数都只被它的最小的质因子筛过一遍,所以是线性的复杂度。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

数论 - 线性筛法与积性函数

首先以求1000000以内的素数为例来探讨筛法 Eratosthenes筛法(埃拉托斯特尼筛法)时间复杂度:O(N*loglogN) 空间复杂度:O(N)代码:#include #include ...

短小精悍的线性时间素数筛法

输入n,求n以内的所有素数 算法用两个数组存储数据: 一个是prime[],存储n以内所有的素数,其index为pi,初值为0 一个是is_prime[i],表示自然数i(i 算法如下: l...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

莫比乌斯反演套路1_线性筛法

线性筛法是O(n),不然它就不叫线性。

【线性筛法求解积性函数】Archer

计算sigma(a=1~n)sigma(b=1~n)lcm(a,b). oimaster的好题。 考虑a与b枚举是同域的,对于一个a只需统计比他小的的b,然后乘2即可, 则构造函数f[a]=-a...

利用线性筛法解决的数学函数或问题小汇(省选复习)

准备省选的过程中发现数学这一块的结论是学的快忘得也快,而因此就有了总结出一篇博客来深化记忆同时也方便 大家学习,我会在接着的几个博客中重点梳理数学相关的知识内容,有什么疏漏或不足之处还望指出。 ①...

51 nod 1188 最大公约数之和 V2(狄利克雷卷积+线性筛法)

六级算法题的不一样做法

线性筛法的应用

线性筛法最基础的功能就是求[1,n]中的素数,以此为基础,可以对他进行一些变形。变形后的线性 筛法可以实现许多其他的功能。(下文中的tot均指一定区间内的质数个数)          先看一道简单...

【转】短小精悍的线性时间素数筛法

输入n,求n以内的所有素数算法用两个数组存储数据:一个是prime[],存储n以内所有的素数,其index为pi,初值为0一个是is_prime[i],表示自然数i(i算法如下:linear_prim...

线性筛法

又重新统一了下线性筛法模版 void linear_prime(int wt)//线性筛法筛质数 {    for(int i = 2; i <= wt ; ++i)    {     ...

线性筛法求解 H数列问题

Description 有一组数列,1, 5, 9, 13, 17, 21,25...,(都模4余1),叫做H数列。 可以把H数列中的数分为三种 (1)H-素数:h是H-素数,把h是分解成两...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)