![内存分配是什么意思?](https://linux22.com/image/229899/%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D%EF%BC%9F.png)
我使用 Linux Mint 21.2,我的机器是 Intel Core i-7 6700 3.4GHZ。
我用 Python 编写了一个素数测试,并用大量数据对其进行了检查。
它就像许多测试一样,是小费马的变体,所以我做了一些模幂运算,例如powmod(3, n-1, n)
.
我可以证明那n = k * 2^k+1
是 的素数k = 6679881
。这并不奇怪,因为它已经被证明是素数。我的测试需要 124 小时才能完成这个 2.010.852 位数字。
现在我想检查费马数 F_33,它n = 2^(2^k)+1
带有k = 33
.该数字有约 2.500.000 位数字。
如果我运行它,几分钟后,我会收到以下错误:
NU MP: Cannot allocate memory (size=549755818000)
bash: line 1: 19354 Aborted
(core dumped)
我有机会进行此测试吗?
答案1
您正在尝试使用 512GB RAM。要么优化程序,要么租用服务器。
我不认为交换可以帮助你。
答案2
即使你可以继续下去,你也几乎不可能活着看到结果;你不能,因为这个错误告诉你你的内存已经用完了。
为什么我说你永远看不到结局:
我们来比较一下复杂度:
n = k * 2^k+1 对于 k = 6679881 是素数
6,679,881 大约是 2²³(事实上,这是一个安全的上限),所以你的 n≈2 2²³+ 6679881 ≈2 2²³
n = 2^(2^k)+1 其中 k = 33
让我们将其除以前一个 n 的粗略大小,以了解此问题发生了多少次。
2 233 / 2 223 = 2 233-223 ≈ 2 233
换句话说,较大的 n 检查素数要复杂得多,以至于与新问题的指数相比,您等待的时间无关紧要,甚至不会出现。