【发布时间】:2013-05-04 15:03:43
【问题描述】:
如何找到小于 n 的最大素数,其中 n ≤ 10¹⁸ ? 请帮我找到一个有效的算法。
for(j=n;j>=2;j--) {
if(j%2 == 1) {
double m = double(j);
double a = (m-1)/6.0;
double b = (m-5)/6.0;
if( a-(int)a == 0 || b-(int)b == 0 ) {
printf("%llu\n",j);
break;
}
}
}
我使用了这种方法,但是对于 n>10^10 的求解效率不高;
如何优化这个..
编辑: 解决方案:对每个 j 使用素性检验。
【问题讨论】:
-
我们坚持人们在这里提出编程问题。做一些研究,想出一个算法,然后如果你在某些方面遇到困难,请回到这里。
-
我对此做了很多研究......使用了复杂度为 O(nlog(n)) 的算法,但现在想要更高效..
-
您可能已经找到了这个,但它仍然提供了一些参考:stackoverflow.com/questions/6741947/…
-
en.wikipedia.org/wiki/Primality_test 。从 n 开始连续使用该页面中的一些测试,直到第一次成功。向下舍入为奇数,并逐步为 (-2)。
-
使用浮点是一个很好的指标,表明您在这里有错误的想法。使用
uint64_t(或等效项)。