Naive Primality测试优化
Naive Primality Testing Optimization
我有一个算法来测试素性,它使用这里列出的naive实现http://en.wikipedia.org/wiki/Primality_test#Naive_methods
static boolean check(int n)
{
if(n == 2 || n == 3)
{
return true;
}
if(n < 2 || n % 2 == 0 || n % 3 == 0)
{
return false;
}
for(int i = 6; i * i <= n; i += 6)
{
if(n % (i - 1) == 0 || n % (i + 1) == 0)
{
return false;
}
}
return true;
}
我一直走到6k+1路段,但在那之后,我迷路了。否则我如何进一步优化速度?
如果你想坚持naive方法,那么你的下一步是使用你链接到的维基百科页面中列出的下一个属性:
所以所有素数的形式都是30k+i,对于i=1,7,11,13,17,19、23、29(即对于i<30使得gcd(i,30)=1)。
除了你可能会选择与2.3.5 略有不同/更多的素数
你可以用30步循环代替6步循环,(并用手检查所有小于30的素数)
代码可能看起来像这样:
static boolean check(int n)
{
if(n<30)
{
return n==2 || n==3 || n==5 || n==7 || ...
}
for(int i = 30; i * i <= n; i += 30)
{
if (n % (i + 1))==0 return false;
if (n % (i + 7))==0 return false;
if (n % (i + 11))==0 return false;
if (n % (i + 13))==0 return false;
if (n % (i + 17))==0 return false;
if (n % (i + 19))==0 return false;
if (n % (i + 23))==0 return false;
if (n % (i + 29))==0 return false;
}
return true;
}
然而,你会注意到,这扫描8/30(=27%)个数字,而6步进循环扫描2/6(=33%)所以它扫描的数字减少了20%,所以你最多可以预期20%的速度。当你在列表中添加更多素数时,你会得到递减的回报。
真的,如果你需要快速素数检查,那么你需要远离天真的方法。而且之前有很多关于栈上溢出的问题。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 空基优化子对象的地址
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 关闭||运算符优化
- 数据成员SFINAE的C++17测试:gcc vs clang
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- 我是否正确测试了返回值优化?
- 禁用优化后,quick-bench.com 基准测试要快得多
- Naive Primality测试优化
- if/else优化测试结果令人震惊
- visual studio是否有任何扩展来优化C++代码单元测试
- 有一个很好的测试c++优化编译器
- 防止基准测试的空语句优化
- 析构函数单元测试会被优化掉吗?
- 在基准测试代码中使用volatile来阻止编译器优化
- C++ 尝试通过替换测试来优化代码
- MSVC 中微基准测试的优化屏障:告诉优化器您的内存