有效地找到前 n 个素数
Finding first n primes efficiently
我有一个蛮力算法,它接受输入 n,并显示前 n 个素数。代码有效,但我也必须回答这个问题:
Give the number of test items that would be required to assure correctness.
有没有办法计算这个?我在技术上是否需要测试每个可能的 int 值(所有 20 亿种可能性)?
如果你有一个数字 n,并且需要检查它是否是素数,有比暴力更有效的方法。
一种方法是使用 Miller-Rabin Primality Test。 Miller-Rabin 测试要么找到一个数是合数的证据,要么找不到这样的证据(它不直接证明一个数是素数)。所以方案是:
运行 Miller-Rabin最多k次(或者直到它发现这个数是合数)
如果 Miller-Rabin 声称它是一个可能的素数,则执行暴力检查
米勒-拉宾 运行s as follows。显然,你只需要测试奇数 n,所以 n - 1 是偶数,你可以写成 n - 1 = 2sd 对于一些正数 s 和正数 d。从范围 (0, n - 1) 中随机选择一个 a。如果ad≠1 | n 和 a2rd ≠ -1 | n,则n是合数。
如果 n 是复合的,则 Miller-Rabin 的 k 次迭代无法证明这一点的概率小于 4-k。请注意,到 Prime Number theorem,素数稀缺。
k Miller-Rabin 应用程序的计算复杂度,即使是天真的实现,is,也是 O(k log3(n)).
我有一个蛮力算法,它接受输入 n,并显示前 n 个素数。代码有效,但我也必须回答这个问题:
Give the number of test items that would be required to assure correctness.
有没有办法计算这个?我在技术上是否需要测试每个可能的 int 值(所有 20 亿种可能性)?
如果你有一个数字 n,并且需要检查它是否是素数,有比暴力更有效的方法。
一种方法是使用 Miller-Rabin Primality Test。 Miller-Rabin 测试要么找到一个数是合数的证据,要么找不到这样的证据(它不直接证明一个数是素数)。所以方案是:
运行 Miller-Rabin最多k次(或者直到它发现这个数是合数)
如果 Miller-Rabin 声称它是一个可能的素数,则执行暴力检查
米勒-拉宾 运行s as follows。显然,你只需要测试奇数 n,所以 n - 1 是偶数,你可以写成 n - 1 = 2sd 对于一些正数 s 和正数 d。从范围 (0, n - 1) 中随机选择一个 a。如果ad≠1 | n 和 a2rd ≠ -1 | n,则n是合数。
如果 n 是复合的,则 Miller-Rabin 的 k 次迭代无法证明这一点的概率小于 4-k。请注意,到 Prime Number theorem,素数稀缺。
k Miller-Rabin 应用程序的计算复杂度,即使是天真的实现,is,也是 O(k log3(n)).