我看到this c code使用Eratosthenes的Sieve方法来查找素数,但我不能将它扩展到更大的整数(例如,到1000000000甚至更大)因为内存消耗来分配这么大的char数组
将代码扩展到更大的数字的策略是什么?任何参考文献也欢迎。
感谢。
答案 0 :(得分:2)
要应用的标准改进是将每个i
处理为代表数字2*i+1
,因此仅代表 赔率 ,将阵列的大小减半。对于每个新的素数p
,这也需要从p*p
开始标记并按2*p
递增,以跳过平均值。 2
本身就是一个特例。另请参阅this question,其中包含大量答案。
另一种策略是切换到 分段筛 。这样你只需要大约pi(sqrt(m)) = 2*sqrt(m)/log(m)
个内存(m
作为你的上限),为初始的素数序列留出一些你用它来筛选较小的固定大小的数组,依次代表数字段。如果你只需要在一些狭窄的远距离[m-d,m]
范围内需要素数,你就可以在收集了所有需要的素数之后直接跳过这个范围,如图所示。在this answer。
根据您的具体情况,要获得高达10 ^ 9的质数,仍然可以使用一个连续的数组。对仅赔率使用 bitarray ,您需要10 ^ 9/16字节,即大约60 MB的内存。更容易按细分工作;我们只需要3402个素数,低于31627,即可筛选低于10 ^ 9的每个片段阵列。
答案 1 :(得分:0)
正是由于所需阵列的大小,Eratosthenes的筛子在某些时候变得不切实际。修改后的筛子常见于找到较大的素数(如explained on Wikipedia)。
答案 2 :(得分:0)
您可以使用gmp
库。有关Eratosthenes筛选的快速实施,请参阅Speed up bitstring/bit operations in Python?。将提供的解决方案转换为C语言应该相对容易。