首页 > 代码库 > 找素数 ——第二次个人项目报告

找素数 ——第二次个人项目报告

  1. 首先采用了最朴素的埃拉托色尼筛法,求第一亿个素数的用时大概在40秒左右。
  2. 查阅了关于高速缓存的知识后,将数组开成100000大小,反复覆盖重用,求第一亿个素数的用时变为20秒左右。
  3. 后将数组开成2*3*5*7*11*13大小后,先人为去除2,3,5,7,11,13倍数的数,再进行筛法,用时大概在13秒左右。
  4. 另开一个数组,存放需要判断的下一个数的值。比如b[1]=17;b[17]=19…省去了需要不停重复初始化筛的时间,用时大概在10秒左右。
  5. 找到一个素数后,只筛去奇数倍的值,因为偶数倍的已经被2筛过了,用时大概变为7秒左右。

附截图

注:在网上找到了一个求f(x)的数论解,f(x)表示在1到x之间的素数个数,时间复杂度为O(1),此时再采用二分查找法,可以在大概4秒钟的时间内找到第一个素数,但因实在无法理解该数论方法,因此并没有采用这种方法。

源程序代码:https://github.com/zj140/prime/blob/master/prime.cpp

 

找素数 ——第二次个人项目报告