D.J.中10 ^ 15的限制在哪里伯恩斯坦的'primegen'计划来自哪里?

时间:2011-09-27 17:16:47

标签: cryptography reverse-engineering

http://cr.yp.to/primegen.html,您可以找到使用Atkin筛子生成素数的程序源。正如作者所说,回复发送给他的电子邮件可能需要几个月的时间(我明白,他肯定是一个被占领的人!)我发布了这个问题。

该页面指出'primegen可以生成高达1000000000000000的素数'。我试图理解为什么会这样。当然有一个限制,最多2 ^ 64~2 * 10 ^ 19(长无符号整数的大小),因为这是数字的表示方式。我确信如果存在巨大的主要差距(> 2 ^ 31),那么打印数字将会失败。但是在这个范围内,我认为没有这样的优势差距。

要么作者高估了界限(实际上它大约是10 ^ 19),要么在源代码中有一个位置,算术运算可以溢出或类似的东西。

有趣的是,你实际上可以为数字运行它> 10 ^ 15:

./primes 10000000000000000 10000000000000100
10000000000000061
10000000000000069
10000000000000079
10000000000000099

如果你相信Wolfram Alpha,那就是正确的。

我曾经“反向设计”的一些事实:

  1. 数字分批筛选1,920 * PRIMEGEN_WORDS = 3,932,160(参见primegen_next.c中的primegen_fill函数)
  2. PRIMEGEN_WORDS控制单个筛选的大小 - 您可以在primegen_impl.h中调整它以适合您的CPU缓存,
  3. 筛子本身的实现是在primegen.c文件中 - 我认为它是正确的;你得到的是pg-> buf中的素数位掩码(参见primegen_fill函数)
  4. 分析位掩码并将素数存储在pg-> p阵列中。
  5. 我认为溢出可能发生的地方没有意义。

2 个答案:

答案 0 :(得分:1)

我希望我在电脑上看,但我怀疑如果从1开始作为你的下限,你会有不同的成功。

答案 1 :(得分:0)

从算法中我可以得出结论,上限来自32位数字。 该页面提到Pentium-III为CPU,所以我猜它很老,不使用64位。

2 ^ 32约为10 ^ 9。 Atkins筛选(算法使用)需要N ^(1/2)位(它使用大位域)。这意味着在2 ^ 32大记忆中你可以使(保守)N大约10 ^ 15。由于这个数字是一个粗略的保守上限(你有系统和其他程序占用内存,保留IO的地址范围,......)真正的上限是/可能更高。