【发布时间】:2015-11-14 22:24:07
【问题描述】:
我已经实现了Sieve of Atkin,它在质数接近 100,000,000 左右时效果很好。除此之外,它还会因为内存问题而崩溃。
在算法中,我想用基于硬盘的阵列替换基于内存的阵列。 Python 的“wb”文件函数和 Seek 函数可以解决问题。在我开始发明新轮子之前,有人可以提供建议吗?一开始就出现了两个问题:
- 有没有办法将 Atkin 的筛子“分块”以处理内存中的片段,以及
- 有没有办法暂停活动并稍后返回 - 建议我可以序列化内存变量并恢复它们。
我为什么要这样做?一个寻找娱乐和保持面条工作的老家伙。
【问题讨论】:
-
无论存储问题如何,您都在“发明轮子”。顺便说一句,我不确定你是如何实现它的,因为你没有提供你的代码,但考虑到你想检查直到
max的所有数字,使用(max-1)/24+1字节数组就足够了。所以对于 100,000,000,这大约是 4MB 的内存。 -
100M 不是很大,甚至不是“大”——9 位数字不算什么,例如,常用 rsa 密钥有 100s-1000 位数字。这是question that discusses numbers with 100M digits。 sieve algorithm is
O(sqrt(N))in memory 即~10KB 应该足够了。问题是您的特定实施。展示代码并询问如何改进其内存使用率。 -
a quick search 显示这是 already asked 在 SO(并已回答)。关于细分,我的意思是。
-
已经为我的问题发布了几个答案和一些好的 cmets——足以让我在问更多问题之前再去剥洋葱皮。我很难选择任何一个答案作为“最好的”,因为每个答案似乎都处理了我最初模糊的一组问题的不同方面。作为 SO 的新手,我将感谢所有回复并发布我自己的答案,以结束问题并让人们与更好的付费客户相处。
标签: python math primes sieve sieve-of-atkin