-
2013-05-16 16:11:26目前已知的一种最快速的求素数的算法就是 Sieve of Atkin 算法!
更多相关内容 -
最快素数算法(绝非线性筛选)1.6秒算出1亿内所有素数
2008-10-16 22:23:35革命性素数算法:计算1亿内素数只要1.6秒 算法基本跟之前发的C#版相同(http://download.csdn.net/source/690005内有算法描述),由我的朋友杨力2年前设计,时间复杂O(n)。我对其进行了革命性的数据结构改进,空间... -
最快求素数的算法,求100000000以下素数0.3秒
2018-08-05 11:58:39最快求素数的算法,求100000000以下所有素数0.3秒 , 在10000000以下的数中找到664579个素数,耗时53毫秒 -
素数的高效算法
2019-04-20 13:30:34素数最简单的判断方法是采用枚举,复杂度为O(n)。(这里不作解释) 这里将介绍下列几点: 1)素数判断,复杂度为O(√n)的原理及代码。 2)素数表的获取。 3)更为高效判断素数的"筛选法"。 (一)素数判断 ...素数最简单的判断方法是采用枚举,复杂度为O(n)。(这里不作解释)
这里将介绍下列几点:
1)素数判断,复杂度为O(√n)的原理及代码。
2)素数表的获取。
3)更为高效判断素数的"筛选法"。(一)素数判断
这里介绍复杂度为O(√n)的原理:
例:2~n-1中存在n的约数,不妨设为k,即n%k==0,那么由k*(n/k)==0,n/k也是n的一个约数,因此得到了k与n/k中一定满足:一个数小于√n,一个数大于√n。
这里稍作解释:√n*√n=n,而k*n/k=n,因此一个约数小于√n,一个约数大于√n。
启示:只需判断n能否被2,3...,|_√n_|中的一个整除即可(其中|_√n_|表示向下取整)。在此注意sqrt()函数的用法:
1)传入的参数应为浮点型。
2)返回的类型也为浮点型。因此:请严格按照标准来书写代码。
bool isPrime(int n){ if(n<=1) return false; int sqr=(int)sqrt(1.0*n); for(int i=2;i<=sqr;i++){ if(n%i==0) return false; } return true; }
可能你还有看到其他更为简单的写法如:
bool isPrime(int n){ if(n<=1) return false; for(int i=2;i*i<=n;i++){ if(n%i==0) return false; } return true; }
建议新手不要使用此简单的写法,原因:在n接近int类型范围上界时,i*i极有可能越界溢出。(当然n在10^9以内是绝对安全的)
不过这也是有解决办法的:将i定义为long long类型即可。(二)获取表
方法:从1~n枚举,判断每个数是否为素数。
时间复杂度:一部分O(n),另一部分O(n√n),因此获取表的复杂度为O(n*n√n)。#include <stdio.h> #include <math.h> //求100以内素数表 bool isPrime(int ); int prime[101],Num=0; void Find_Prime(){ for(int i=1;i<101;i++){ if(isPrime(i)==true){ prime[Num++]=i; } } } //判断n是否为素数 bool isPrime(int n){ if(n<=1) return false; int sqr=(int)sqrt(1.0*n); for(int i=2;i<=sqr;i++){ if(n%i==0) return false; } return true; } int main(){ Find_Prime(); for(int i=0;i<Num;i++) { printf("%d ",prime[i]); } return 0; }
(三)筛选法求素数
原理:把2到n中所有的数都列出来,然后从2开始,先划掉n内所有2的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其n内的所有倍数。最后剩下的数,就都是素数。具体过程:自己百度。
int prime[101],Num=0; bool p[101]={0};//如何为素数则为false void Find_Prime(){ for(int i=2;i<101;i++){ if(p[i]==false){ prime[Num++]=i; for(int j=i+i;j<101;j=j+i){ p[j]=true; } } } }
时间复杂度为O(nloglogn)
-
素数最优算法
2013-08-04 11:35:35最简单的算法求素数~ 免去了繁杂的运算,节约时间 -
快速素数判断算法
2019-02-16 15:51:44快速素数判断算法素数的一些性质吧C++代码实现与解析 最近在复习之前做的编程练习题,素数判断一直没有掌握,今天看到了一种新的方法,感觉特别好,记下来。(第一次写博客,很开心呀) 思想来源,看不懂我的,欢迎...欢迎访问最新博客地址
快速素数判断算法
最近在复习之前做的编程练习题,素数判断一直没有掌握,今天看到了一种新的方法,感觉特别好,记下来。(第一次写博客,很开心呀)
思想来源,看不懂我的,欢迎看原作素数的一些性质吧
- 素数的分布规律
大于5的素数一定于6的倍数相邻,例如5和7,11和13,17和19等等。 - 证明
令 x ≥ 1,则大于5的自然数可以表示如下:
…6x-1, 6x, 6x+1, 6x+2, 6x+3, 6x+4, 6x+5,6(x+1)-1…
可以看到,不在6的倍数的两侧的6x+2, 6x+3, 6x+4,由于上式可表示为2(3x+1), 2(2x+3), 2(3x+2),So 他们一定不是素数,在除去6x本身,显然素数只能出现在6的倍数的两侧,但这只是素数的必要条件可不是充分必要条件,所以在6的倍数的两侧的数也不一定素数。 - 孪生素数
题外话,放个题拿走练练
C++代码实现与解析
明确目的: 找到可以整除的数(这很重要)
实现:- 首先对两个较小的素数进行处理
- 接下来判断这个数是否在6的倍数的两侧,不是的话直接返回0,是的话接着处理
- 由于一个数N如果可以被另一个数m整除,那m一定小于N的开方,没啥问题。所以我们就取判断的上界为N的开方。为了更快呢,直接取 i 的每次递增6,原因是,假如要判断的数为N,那N一定可以表示为6x-1或6x+1,对于循环中的 i 也可以表示为6的倍数加上或减去个数字,即6m-1,6m,6m+1,6m+2,6m+3,6m+4,如果N能被6m,6m+2,6m+4,整除那N至少是一个偶数,显然第二步已经把偶数排除了,所以不可能成立,而对于6m+3如果成立则N至少是3的倍数,但6x是3的倍数,显然6x+1,6x-1可能被3整除,所以N也不可能被6m+3整除,那现在就只剩下了6m-1,6m+1了,只需判断它俩能否把N整除,如果可以那就存在了一个数可以把N整除,就返回0。反之就不存在了,那就走到了最后就返回1,哈哈大功告成。
bool isPrime(int num) { // 两个较小的数另外处理 if(num == 2 || num == 3) { return 1; } // 不在6的倍数的两侧的一定不是素数 if(num % 6 != 1 && num % 6 != 5) { return 0; } int tem = (int)sqrt(num); //在6的倍数的两侧的也不一定是素数 for(int i = 5;i <= tem;i += 6) { if(num % i == 0 || num % (i + 2) == 0) { return 0; } } // 排除所有剩余的是素数 return 1; }
人生第一篇博客,如有错误欢迎指正讨论。谢谢我自己,也谢谢大家
- 素数的分布规律
-
判断素数最快的方法
2021-05-25 09:36:53判断素数最快的方法 1、普通方法 bool is_prime(int n) { if (n < 2) return false; int i; for (i = 2; i < n; i++) { if (n % i == 0) { return false; } } return true; } 原理是对每个数进行...判断素数最快的方法
1、普通方法
bool is_prime(int n) { if (n < 2) return false; int i; for (i = 2; i < n; i++) { if (n % i == 0) { return false; } } return true; }
原理是对每个数进行开方,模运算。
我们来统计0~100000之间有多少素数,并计算程序运行的时间。int main() { clock_t start, finish; double totaltime; start = clock(); int n = 0; for (int i = 0; i < 100000; i++) { if (is_prime(i)) { n++; } } cout << "n = " << n << endl; finish = clock(); totaltime = (double)(finish - start) / CLOCKS_PER_SEC; cout << "\n此程序的运行时间为" << totaltime << "秒!" << endl; return 0; }
运行结果如下:
n = 9592 此程序的运行时间为1.244秒!
平时需求不太大,勉勉强强能接受这个速度吧。
但是范围增加到0~1000000,for (int i = 0; i < 1000000; i++)
n = 78498 此程序的运行时间为102.255秒!
这个时间太长了。如果数据量再大一点,那我岂不是要等到天荒地老?
2、目前我发现的最快的方法
n>3时,对一个数字进行模6运算,如果结果是0,2,3,4,那么这个数肯定不是素数。
这样就节省了2/3的工作量。
接下来和第一种方法类似,不过是从5开始,步长为6,
除数i和i+2都是奇数并且都是质数,这又减少了特别多的工作量。bool is_prime(int num) { if (num <= 3) return num > 1; if (num % 6 != 1 && num % 6 != 5) return false; int s = sqrt(num); for (int i = 5; i <= s; i += 6) if (num % i == 0 || num % (i + 2) == 0) return false; return true; }
现在运行一下0~100000的结果:
for (int i = 0; i < 100000; i++)
a = 9592 此程序的运行时间为0.005秒!
0.005秒,跟1.244秒比,速度是原来的248.8倍。
接下来
for (int i = 0; i < 1000000; i++)
n = 78498 此程序的运行时间为0.064秒!
0.064秒相比于102.255秒,速度增加1597.7倍!简直是一个天上一个地下。
接下来再增大范围:
for (int i = 0; i < 10000000; i++)
n = 664579 此程序的运行时间为1.43秒!
for (int i = 0; i < 100000000; i++)
n = 5761455 此程序的运行时间为36.375秒!
行了行了,到此为止。
-
最快速的寻路算法 Jump Point Search
2020-11-13 18:00:00作者:runzhiwang,腾讯 TEG 后台开发工程师本文介绍一种跳点搜索算法 JPS 以及其四个优化算法,其寻路速度最快可是 A*算法的 273 倍。文中的 JPS-Bit 和 JP... -
素数判断算法 快速 C++
2019-04-22 12:14:12bool isPrime(int num) { if (num == 2 || num == 3) return true; if (num % 6 != 1 && num % 6 != 5) return false; int tmp = sqrt(num); for (int i = 5; i <= tmp;... -
python快速生成素数算法(一千万以内1.7秒)
2020-09-27 17:09:40def primes(n): if n<2: return [] if n==2: return [2] s=list(range(3,n,2)) mroot=n**0.5 half=len(s) i=0 m=3 while m<=mroot: if s[i]: j=(m*m-3)//2 s[j]=0 while j < half: -
经典加密算法的实现与破解&大素数生成算法
2021-10-13 17:39:30经典加密算法的实现与破解 一、实现凯撒加密 在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都... -
快速筛素数(埃式筛+线性筛+Miller_Rabin算法)
2018-08-18 20:20:01在CF上做到一道核心是需要筛出1~n所有素数的题目,然后刚好又没学过,就学习了快速筛素数的办法,基础的n根号n的算法这里大家每个人都知道吧QAQ,就不讲了,好像还是C语言上机说过的题目。 首先给大家介绍一下一个... -
判断素数———两种高效算法
2020-03-04 12:09:49相信大家在学习的过程中,时不时就会遇到判断素数的问题。今天就让我们来讨论讨论这个有趣的数学问题,看看如何更高效的来解决它吧! 在刚开始接触到这个问题时,我只想到了利用一个循环去在目标数的全部范围内一个... -
高效率求素数c算法,亲测速度快
2016-12-03 11:33:06高效率求取素数,耗时很少 -
C/C++判断是否为素数(最快)
2021-11-22 21:29:07质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数 常规解法,一层for循环从头开始遍历,小于sqrt(n),如果n % i == 0那么则不是素数。 利用数学知识,所有的数... -
判断素数(质数)高效算法
2021-10-22 19:18:48最近看到一篇高效的素数判断算法文章,但是文章中有些部分写的还不够完整清晰,所以在此详细记录一下此算法理解过程。(理解此算法前应先明白使用 sqrt(num) 为判断条件判断素数的方法) 此算法产生的原因(定理):... -
素数查找的两种算法
2019-04-03 20:57:31通过寻找公约数来判断,最经典的算法 boolean flag = true; for (int i = 2; i <= n; i++) { for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { flag = false; //如果i%j==0说明这个数是合数... -
算法——如何快速判断素数?
2020-03-13 13:18:28文章目录前言解决方案方案1方案2方案3(最优算法)总结 前言 最近闲来无事,刷刷题,碰到这样一个题目: 需求:要求实现一个判断素数的简单函数 相关信息:素数就是只能被1和自身整除的正整数。注意:1不是素数,2是... -
一个比较高效的素数判断算法
2021-04-03 22:20:35一个比较高效的素数判断算法高效素数判断算法算法概述规则详解算法时间复杂度复杂度Python代码实现 高效素数判断算法 算法概述 此算法将其他博主对基本素数算法的一些改进进行了整合,其中主要整合了如下三条规则: ... -
求质数(素数)算法,及算法优化
2019-08-11 10:47:29质数(素数):只能被1和其本身整除的数字(其中1和0不属于质数) 接下来我们用多种方法求1000以内(包含1000)的质数数量,并且统计每种方法的循环次数 (如果只想知道速度快的方法可以直接看方法五) 方法一: 循环... -
判断质数/素数——我知道的最快的方法
2017-12-01 20:23:32标准版:大部分人都知道的比较快的方法:判断从2到sqrt(n)是否存在其约数,时间复杂度O(sqrt(n)) 高配版:判断2之后,就可以判断从3到sqrt(n)之间的奇数了,无需再判断之间的偶数,时间复杂度O(sqrt(n)/2) 尊享... -
求素数的高效算法(BCB)
2009-12-17 15:23:42运用BCB 以空间换时间,基本原理是:把求出的素数保存,以后就只要除以前面的素数就可以了 -
求素数优化算法
2020-12-04 07:11:00在比赛或者工作时,有时候会经常要求我们编程求素数,但是我们自己写出来的时间复杂度太高,所以我在这里做个总结。先贴上最终函数,该段代码在开启最大代码优化时,可以直接内嵌进调用程序中,使得速度更加极致。... -
素数算法
2012-08-13 15:15:20最基本的想法就是对1到N得每个数进行判断,如果是素数则输出。一种改进的方法是不需要对1到N所有的数都进行判断,因为偶数肯定不是素数,而奇数可能是素数,可能不是。2,3,5都是素数,这可以直接得到。然后我们... -
算法之素数的快速筛选两种方式
2016-10-19 17:11:09素数打表法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 memset(f, 0, sizeof(f)); f[1]=1 ; i=2; while(i { for(j=i*2; j { f[j]=1; } i++; -
必背C语言算法 求素数的几种方法
2021-10-31 16:27:35素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。 思路1):因此判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除... -
【C语言】判断素数的算法从一般到高效
2020-03-11 14:30:55在刚开始学习使用C语言时,通过练习编程来提高对语法的思考是一个很...所以判断当前数是否为素数可以通过for()控制从2开始到当前数,如果在该过程中存在可以整除的数字则该数不是素数,若没有则该数为素数。 #includ... -
对高效率素数求解算法进行时间复杂度分析
2018-03-03 19:21:32在解习题的过程中找到一份高效率的素数求解算法,在这里分析一下算法的时间复杂度。算法引自:http://blog.csdn.net/aleac/article/details/6430408void GetPrimes(int n) // 对于输入的整数n,将所有小于n的素数... -
快速判断素数算法
2013-03-29 16:40:06引理:如果 a 是一个大于1的整数,而所有小于或等于根号 a 的素数都除不尽 a ,则 a 是素数。 理想的判断素数的方法应该是将所有小于或等于根号n的素数去除n,但是n是一个随机大于1的整数,小于这个数的平方根的... -
可能是求质数最高效的算法
2018-05-04 23:51:03因为需求2给出的 N,表示需要打印的质数的个数,那么这 N 个质数会分布在多大的范围捏?这可是个头疼的问题啊。 但是,来应聘的程序猿如果足够牛的话,当然不会被这个问题难倒。因为素数的分布,是有规律可循滴...