素数验证算法——直面大数据

素数的验证,可能会被作为所谓“循环练习”的题目。因为其算法实在太简单(不知道直接暴力循环能不能算一种算法)。经典的方法就是试除,用循环变量i从2开始到n-1,如果有取模为0的,就直接return false。到最后,还没有模出0,就return true。这个算法也可以优化n-1为sqrt(n)。原理是:设x为大于sqrt(n)的数,n=xy,则y一定小于sqrt(n),所以只要验证到sqrt(n),就能验证到y,相当于验证到了x。

以上这种暴力算法,如果有N个数要验证,则时间复杂度为O(sqrt(N)*N),面对类似于N=100000000的数据明显力不从心。所以,我们可以使用筛选法:依次剔除2、3、5、7等素数的倍数,最后就能得出一张素数表。建表后,查询素数只要O(1)的时间复杂度。但是对于以上数量级的N,仍然不能很快的求出一张素数表,消耗时间高达2.1s。所以,我们还要加以优化。

众所周知,除去2以外,所有的偶数均为合数。所以,素数表内可以除去偶数。即prime[0]代表3是否为素数,prime[1]代表5……而且,筛数也不必筛到N,只要筛到sqrt(N)即可。设key1(i)=i*2+3;key2(i)=(i-3)/2,这分别对应素数表内第i个位置表示的奇数与奇数i在素数表内的存储位置。原来筛的时候,i*(2,3,4…)简化为了i*(3,5,7…)。头一次筛掉的数为key2(key1(i*i)),简化后为(i*i)*8+3,之后每次累加的数为key2(key1(i+2))-key2(key1(i)),简化后为i*2+3,这样推导完成以后,程序就很容易写了。下面给出源代码:

#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;

const int N=100000001;
const int N1=(N-3)/2;
bool prime[N1+1];
int tmp;

int main(void){
    memset(prime,true,sizeof(prime));
    for (int i=0;i<(int(sqrt(N))-3)>>1;++i){
        if (prime[i]){
            tmp=((i*i)<<3)+3;
            while (tmp<N1){
                prime[tmp]=false;
                tmp+=(i<<1)+3;
            }
        }
    }
    printf("%d\t",2);
    for (int i=0;i<N1;++i)
        if (prime[i])   printf("%d\t",i*2+3);
    return 0;
}

附上各种方法的时间与内存占用统计表(测试环境:MinGw4.9.2,Intel Xeon E3 1230V2,去除IO输出时间):

  时间 内存
暴力试除法 N/A(太长了) 1Mb
朴素筛选法 2.1s 98Mb
优化后的筛选法 1.0s 50Mb
时间: 2024-10-15 14:16:02

素数验证算法——直面大数据的相关文章

Hadoop高级编程—构建与实现大数据解决方案pdf

下载地址:网盘下载 内容简介  · · · · · · 如果你已经准备好要充分实施大规模可扩展性数据分析工作,那么需要知道如何利用Hadoop技术.这本<Hadoop高级编程--构建与实现大数据解决方案>可以帮助你做到这一点!本书关注用于构建先进的.基于Hadoop的企业级应用的架构和方案,并为实现现实的解决方案提供深入的.代码级的讲解.本书还会带你领略数据设计以及数据设计如何影响实现.本书解释了MapReduce的工作原理,并展示了如何在MapReduce中重新定制特定的业务问题.在整本书中

素数的判断(大数据,大规模)

素数的判断其实谁都会,所以这篇跳过简单的素数判断,直接学习如何快速判断1到N的素数,以及判断大数据是否为素数. 现在我们先学习埃氏筛选法,此法实用与大规模判断素数,比如1到N的素数有那些啊,等等等等. 这个算法流弊哦,与辗转相除法一样古老哇. 首先,将2到n范围内的所有整数写下来.其中最小的数字2是素数,将表中2的倍数都划去.表中剩余的最小数字是3,不能被更小的数整除,是素数.如果表中最小的是m,m为素数,将m的倍数划去. 2 3 4 5 6 7 8 9 10 11 12 2 3 - 5 - 7

通过逆元实现大数据除法的取模

当题目中数据较大,而且计算中出现过除法的时候.往往取模会出错 当计算 (A/B) % c    等价于  (A*B1)% c 其中 B1 是 B 的逆元. 那么逆元如何求呢. 先给出逆元的定义 a*x ≡1 (mod n)  ,如果x是方程的解,则x称作 a 关于模 n 的逆. a的逆元存在是有条件的: 方程ax-ny==1 要有解 则 1必须是gcd(a,n)的倍数 ,因此,a和n必须素质, 即 gcd(a,n)==1 在这个前提下 ax≡1(mod n) 只有唯一解. 现在我们来证明上面的结

追本溯源 解析“大数据生态环境”发展现状(CSDN)

程学旗先生是中科院计算所副总工.研究员.博士生导师.网络科学与技术重点实验室主任.本次程学旗带来了中国大数据生态系统的基础问题方面的内容分享.大数据的发展越来越快,但是对于大数据的认知大都还停留在最初的阶段——大数据是一类资源.一类工具,其实“大数据”更多的体现的是一个认知和思维,是一种战略.认知和文化. 以下为分享实录全文: 一年多来,通过组织中国大数据技术大会.CCF大数据学术会议以及各类大大小小的应用峰会与学术论坛,结合我们科学院网络数据科学与技术重点实验室所承担的与大数据相关的重大基础课

大数据项目中的QA需要迎接新的挑战

大数据项目中的QA需要迎接新的挑战 根据IDC全球半年度大数据和分析支出指南的最新预测,到2022年全球大数据和业务分析解决方案的收入将达到2600亿美元.在大数据和业务分析解决方案上投资增长最快的行业包括银行(复合年增长率13.3%).医疗.保险.证券和投资服务.电信,每个行业复合年增长率都是12.8%.由此可见,大数据类项目在未来的地位将会越发重要,而作为QA,在大数据项目急速扩张的大背景下,也将迎来新的机遇和挑战. 一.大数据项目的数据特点 大数据项目与传统交付项目的不同之处在于其关注的重

从国考大数据看中国哪个省的人最爱当官

道路千万条,公务员之路最拥挤! 一个职位有成百上千人竞争的现象屡见不鲜 然而每年都有100多万勇士 敢于直面国考的惨烈 说起公考 全国那么多人 到底哪个省份的人最爱当官呢? 看数据分析就知道了 ▼ 先看下刚结束的2020年的国考大数据. 数据分析显示,2020年国考共招录24128人,有143.7万人通过资格审核,参考人数达96.5万人,竞争比高达40:1. 其中,2019年的这场国考,被称为"史上最难国考".经过2018年报考高峰后,2019年,国考突然大缩水,招考职位从2018年的

关于MATLAB处理大数据坐标文件2017620

暑假已至,接下来组内成员将会各回各家,各找各妈,这肯定是对本次大数据比赛是很不利的. 接下来我会把任务分配给组员,当然任务会比起初的时候轻一点,因为我认为本次比赛的目的并不是我要求组员做什么,而是我的组员要求自己做什么! 我们现在主要接触的两门语言: MATLAB语言在数据处理方面很牛,它的画图功能也是杠杠的,尤其是3D画图 Python语言是一门近几年很火的语言,学好它对自己肯定只有益处,它的出生很晚,但是短短十多年,它已经稳居计算机语言前三名.尤其是现在的大数据时代,它的代码不仅简单易懂,而

【IT十八掌大数据】学习笔记

hive简介: -------------------- 0.big data的特点:4 Volumn variety velocity value 1.介绍 数据仓库    //online analyze process,在线分析处理. 用来查询和管理位于分布式存储设备上的大型数据集. Hive提供了一种类SQL语言--HiveQL(HQL)进行查询分析. HiveQL可进行插件式扩展. 擅长处理结构化数据.非结构化的数据没办法创建对应的模式. 位于hadoop之上,重点在于对大数据进行分析

Pandas中如何处理大数据?

近期的工作和Hive SQL打交道比较多,偶尔遇到一些SQL不好解决的问题,会将文件下载下来用pandas来处理,由于数据量比较大,因此有一些相关的经验可以和大家分享,希望对大家学习pandas有所帮助吧. 大文本数据的读写 有时候我们会拿到一些很大的文本文件,完整读入内存,读入的过程会很慢,甚至可能无法读入内存,或者可以读入内存,但是没法进行进一步的计算,这个时候如果我们不是要进行很复杂的运算,可以使用read_csv提供的chunksize或者iterator参数,来部分读入文件,处理完之后