用最少的计算量找到素数的算法
Algorithm for finding a prime with the least amount of computations
假设你要写一个函数/方法来找到一个素数,最有效的方法是什么?我想应该是这样的测试:
半c++代码
bool primeTest (int x) { //X is the number we're testing
int testUpTo = (int)((sqrt(x))+1);
for (int i=3; i<testUpTo; i+=2){
if ((x%i)==0) {
return false;
}
}
return true;
}
有人有更好的方法去解决这个问题,将需要更少的计算吗?
edit:稍微修改了代码两次。我写这篇文章时没有考虑到任何特定的语言,尽管我认为它是c++而不是java,因为bool这个词。
我会使用Miller Rabin检验,它可以很容易地对小于341,550,071,728,321的数字进行确定(而2^31比这小得多)。
伪代码:有很多不同的情况
-
x
小于9:返回(x & 1) != 0 || x == 2
-
x
小于约200(可调整):使用试用分割(您使用的) -
x
小于1373653:使用以2和3为底的Miller Rabin -
x
小于4759123141(这是其他的一切):使用米勒拉宾与基数2,7和61。
除2和3外,所有素数都比6的倍数多1或少1。利用这一事实将改进您的代码。像这样(未经测试)
bool primeTest (int x){//X is the number we're testing
if (x == 1) return false;
if (x == 2 || x == 3) return true;
if(x%2 == 0 || x%3 == 0)
return false;
int testUpTo = (int)((sqrt(x))+1);
for(int i=6; i<testUpTo; i+=6){
if ((x%(i-1))==0 || x%(i+1)==0){
return false;
}
}
return true;
}
当然,几个世纪以来,高等数学一直在试图找到更有效的素数测试。
维基百科上有一篇很好的文章:
http://en.wikipedia.org/wiki/Primality_test你可以看看这篇论文谁测试了不同素数测试的性能:
priality TESTING by Richard p . Brent: http://cs.anu.edu.au/student/comp4600/lectures/comp4600_primality.pdf
(参见另一篇文章:对于2^1024到2^4096范围内的数字,最快的确定性素数测试是什么?)
您可以改进仅测试奇数值的代码。
bool primeTest (int x){//X is the number we're testing
if(x == 2)
return true;
int testUpTo = (int)((sqrt(x))+1);
for(int i=3; i<testUpTo; i+=2){
if ((x%i)==0){
return false;
}
}
return true;
}
相关文章:
- 如何实现高效的算法来计算大型数据集的多个不同值?
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- 通过指针算法计算数组长度
- 计算数组重复次数的组合的有效算法,加起来达到给定的总和
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 当比特数不是8的倍数时,使用切片8算法计算CRC
- 使用 Prim 算法计算最小生成树:如何使其简单?
- 计算数组中存在其总和的对数的算法
- 如何计算摘要/将使用哪种算法?
- 通过分而治算法计算数组的最大数量
- 使用位移算法计算平方根始终输出相同的数字
- 使用 Dijkstra 算法计算两个节点之间的最短路径
- openCV的EMD-L1算法计算的距离为零
- 利用OpenGL、c++实现了绕线数算法计算内外部区域
- SSE算法计算矩阵乘积的速度比直接算法慢得多
- 算法:计算单词列表频率的更好方法
- 为我的算法计算每字节的周期
- 有没有快速的算法计算能力乘以1 / 2
- 模块化算法计算错误
- 用Chudnovsky算法计算圆周率