如果一个数的倍数的个数是是2357的倍数那么这个数一定是合数对还是错

内容提示:质数与合数(1)

文档格式:PPT| 浏览次数:5| 上传日期: 03:20:06| 文档星级:?????

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

之前说到2 和 3之后,所有质数都必须满足6 n ± 1这个条件所以利用这原理,可以提升三倍性能这公式怎么来的呢?

首先我们知道2以后的质数都必须是奇数,公式表达就昰2n + 1当然用2n - 1也行。

我们要把能整除3的过滤掉即 2n + 1 不能整除3。我们做适当转换:

可见我们只要确保1 - n不能整除3就可以。

同样当我们有了6n ± 1の后,怎么去除 5和7 的倍数呢刚好就这么巧:

懂了吧,剩下展开就行了实测下,把3倍数过滤掉用欧拉确实获得巨大的性能提升。

再把5倍数过滤掉还能提升一点。到再过滤7倍数的时候优势就有点看不到了,原因是5级过滤到7级过滤,计算总量是从8/30 降到 48/210节约率相比原始来说才3.8%,收益不多

说好的代码呢?呃上吧,F# 的代码

loopPrime 4 // 把0 改为 4,这一步很重要因为原理上杜绝了 2357倍数的检查, // 所以直接不用标注, 2000万數据测试下节约了1/4时间

看完一圈,没有一个好打的

就抄个公式出来了事。那些所谓擅长数学的怎么不知道2和3之后,所有质数都必须滿足6 n ± 1这个条件因为只有6 n ± 1才能避开2和3的倍数。 欧拉筛法改一下速度一下子提到3倍了。即使你真的不懂也该知道2之后,所有质数都昰奇数吧?也能从原来提升两倍速度了如果你想,数组也可以趁机把数组开小一点优化都没尝试过就说这个算法内存占用什么的。。。

不才还有个「210里面中检测48个可能位置的」也就是说,从开始就排除2、3、5、7的倍数大概能提升到4倍(略低于4倍)。原理和代码稍晚放出

参考资料

 

随机推荐