线性筛法

原创 2016年05月31日 12:38:35

当求质数时,我们用普通筛法,O(n log n)解决,但n很大时,就会爆掉,这时就需要这一种很强大的筛法——线性筛法来解决,所谓线性,就是O(n)咯。

当我们用普通筛法时,要筛掉一个数n,可能会被筛很多次,这就造成了累赘,比如36:
3 * 12时被筛掉一次,18 * 2时被筛掉一次,这样就会有累赘,那么我们想想:我们在枚举j去筛掉i*j ,如果j|i,(显然j是一个质数)的话,就break掉,就可以变成O(n)了,这样显然是可行的:当筛12 * 2后,2|12,break掉,那这样就不会筛12 * 3,当筛18 * 2的时候,才会真正筛掉36,然后break掉。那么我们就得出了线性筛法的框架:

  1. 假如i没被筛,加入质数表
  2. 不管i有没有被筛,从小到大枚举质数j,筛掉i*j,然后如果j|i,break。

Codes:

procedure GetPrimes;
    var i,j:longint;
begin
    for i:=2 to top do //要求2~top的质数
    begin
        if not bz[i] then  //加入质数表
        begin
            inc(top);
            pr[top]:=i;
        end;
        for j:=1 to top do  //筛掉后面的
        begin
            if pr[j]*i>top then break;
            bz[pr[j]*i]:=true;
            if i mod pr[j]=0 then break;  //剪掉不必要的
        end;
    end;
end;

注:x|y表示y mod x=0。

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

求素数: 一般线性筛法 + 快速线性筛法

From: http://blog.csdn.net/dinosoft/article/details/5829550 素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功。 基本原则...
  • JoeBlackzqq
  • JoeBlackzqq
  • 2015年03月11日 14:53
  • 1142

几种线性筛法

几种线性筛法 本文出自blog.csdn.net/svitter 写在之前 maker 关于线性筛素数 之前一直没有正视线性筛素数的问题。今天特意来写一个伪证明。 如果当前的i不是素数,那么...
  • svitter
  • svitter
  • 2014年08月05日 15:46
  • 1115

{算法}乱谈线性筛法

指在线性时间O(n)用筛选的方法求一些东西的算法。 伪目录 1. 求质数表 2. 筛出欧拉函数φ As we all know.........
  • FarmerJohnOfZS
  • FarmerJohnOfZS
  • 2016年06月17日 20:31
  • 2474

浅析线性筛法

今天晚上,在家里自学了一下线性筛法,还是比较容易理解的,并没有想象的那么难。 所谓线性就是O(n)的效率咯,线性筛法较快的一个本质就是他不会干重复的事,例如12——普通的筛法在素数2时候筛一...
  • John_pascal
  • John_pascal
  • 2016年08月05日 22:00
  • 238

2016.08.11【初中部 NOIP提高组 】模拟赛C题解

​T1 这题感觉是这套题中最坑的一题了。比赛时用了01背包,时间超限得了50分。后来听说是转换多重背包,转完后还是50分(oAo) 正解: 因为虽然N,M范围很大,但仔细一看Ti和Vi都是≤10的,所...
  • gmh77
  • gmh77
  • 2016年08月11日 20:55
  • 165

线性筛法

贾志鹏写的线性筛
  • czysjr
  • czysjr
  • 2014年11月02日 08:58
  • 220

快速线性筛法的原理和值得借鉴的方法【解析算法】

快速线性筛法的特点就是不会重复筛除一个数,
  • nuanxin_520
  • nuanxin_520
  • 2014年11月17日 12:13
  • 1081

线性筛法筛素数

// // main.cpp // Richard // // Created by 邵金杰 on 16/8/1. // Copyright © 2016年 邵金杰. All rights r...
  • qq_33901573
  • qq_33901573
  • 2016年08月01日 09:57
  • 152

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

首先以求1000000以内的素数为例来探讨筛法 Eratosthenes筛法(埃拉托斯特尼筛法)时间复杂度:O(N*loglogN) 空间复杂度:O(N)代码:#include #include ...
  • u014355480
  • u014355480
  • 2015年08月07日 22:01
  • 1121

线性筛法求素数

普通筛法 先讲一下普通的筛法。筛法,顾名思义,就是筛掉合数,剩下的就是素数了。 我们知道,合数一定可以分解为两个或以上的素数,所以我们只需要对于每一个素数ii,枚举一个大于22的数jj,将i...
  • XianHaoMing
  • XianHaoMing
  • 2016年03月22日 12:35
  • 2321
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线性筛法
举报原因:
原因补充:

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