我刚刚在stackoverflow上回答了同样的问题,所以我将在这里复制我的答案(我不认为重复是要走的路;也许应该迁移这个问题):
让我们假设您通过选择随机值来选择一个素数p,直到您找到一个 Miller-Rabin 所说的:那个看起来像一个素数。Miller-Rabin 测试最多使用n轮。(对于所谓的“安全素数”,除了运行两个嵌套测试之外,事情没有改变。)
一个随机的 1024 位整数是素数的概率约为 1/900。现在,您不想做任何愚蠢的事情,因此您只生成奇数值(偶数 1024 位整数保证非素数),并且更一般地说,仅当该值不是“明显" 非素数,即可以被一个小素数整除。因此,在达到素数(平均)之前,您最终会使用 Miller-Rabin 尝试大约 300 个值。当该值是非质数时,Miller-Rabin 将在每轮以 3/4 的概率检测到它,因此对于单个非质数,您将运行的 Miller-Rabin 轮数平均为 1+(1/4 )+(1/16)+... = 4/3。对于 300 个值,这意味着大约 400 轮 Miller-Rabin,无论您为n选择什么。
(编辑:实际上,对于随机选择的非素数,Miller-Rabin 的效果比这更好(参见@Brett 的回答),平均轮数将接近 300 次而不是 400 次。它并没有显着改变我的论点。)
因此,如果您选择n为例如 40,则n隐含的成本小于总计算成本的 10%。随机素数选择过程由对非素数的测试控制,这些测试不受您选择的n值的影响。我在这里谈到了 1024 位整数;对于更大的数字,n的选择就更不重要了,因为随着大小的增加,素数变得越来越稀疏(对于 2048 位整数,上面的“10%”变成“5%”)。
因此,您可以选择n=40并对此感到满意(或者至少知道减少n无论如何都不会给您带来太多好处)。另一方面,使用大于 40 的n是没有意义的,因为这会使您获得的概率低于简单计算错误的风险。计算机是硬件,它们可能会出现随机故障。例如,素数测试函数可以为非素数返回“真”,因为宇宙射线(一种高速穿过宇宙的高能粒子)碰巧在正确的时间击中了正确的晶体管,翻转了返回值从 0(“假”)到 1(“真”)。这是非常不可能的——但不亚于概率2 -80。看到这个stackoverflow答案了解更多详情。底线是,无论您如何确保整数是素数,您仍然有一个不可避免的概率元素,并且 40 轮 Miller-Rabin 已经为您提供了您所希望的最佳结果。
总而言之,使用 40 发子弹。