我有一个蛮力算法,它接受一个输入n,并显示前n个素数。代码有效,但我也必须回答这个问题:
提供确保正确性所需的测试项目数。
有没有办法计算这个?我在技术上是否需要测试每个可能的int值(所有20亿种可能性)?
答案 0 :(得分:2)
如果你有一个数字 n ,并且需要检查它是否是素数,那么有比蛮力更有效的方法。
一种方法是使用Miller-Rabin Primality Test。 Miller-Rabin测试要么找到证明数字是复合数,要么找不到证明(它不直接证明数字是素数)。所以该计划将是:
最多运行Miller-Rabin k 次(或直到它发现该数字是复合数)
如果Miller-Rabin声称这是一个可能的素数,请进行蛮力检查
Miller-Rabin跑as follows。显然,你只需要测试奇数 n ,所以 n - 1 是偶数,你可以写 n - 1 = 2 s d 表示某些正 s 和正奇数 d 。从(0,n - 1)范围中随机选择 a 。如果 a d ≠1 | n 和 a 2 r d ≠-1 | n ,然后 n 是一个复合词。
如果 n 是一个复合词,那么米勒 - 拉宾的 k 迭代不能证明这一点的概率小于 4 -k功能 的。请注意,Prime Number theorem,素数很少。
Miller-Rabin的 k 应用程序的计算复杂性,即使有一个简单的实现is,也是 O(k log 3 (n))的