【问题标题】:How do i improve the complexity of this randomized primality testing algorithm?如何提高这种随机素性测试算法的复杂性?
【发布时间】:2014-06-14 06:22:07
【问题描述】:

我编写了以下程序,如果数字是素数,则返回 1,如果是合数,则返回 0。 虽然有可能错误地将复合物识别为素数。我想要改进(降低)以下算法的时间复杂度的建议。

int compute(int n)
{
    int x;
    for(int i = 1; i < 100 * sqrt(n); i++)
    {
        x = rand() % ((int)sqrt(n) + 1);
        if(x != 0 && x != 1 && x!=n)
        {
            if(n % x == 0)
            return 0;
        }
    }
    return 1;
}

【问题讨论】:

  • 那么,你想要一个不同的算法吗?
  • 为什么不使用适当的素数测试?
  • 同样在 sqrt(n) 中你可以只检查所有除数候选,不需要随机化
  • 我需要测试的数字非常大,大约为 10^9,所以我不能采用幼稚的方法。
  • 这不是一个好的算法,因为你线性地用计算来换取确定一个合数是合数的概率。例如,如果您进行 sqrt(n)/2 次迭代,您找到除数的概率约为 1/2(如果该范围内只有一个除数)。如果您进行 sqrt(n)/4 次迭代,您的概率约为 1/4 等。即使少于 c * sqrt(n) 次迭代(其中 c 是常数),您也希望有很高的概率

标签: c++ algorithm random-sample primality-test


【解决方案1】:

您可能想看看Miller-Rabin primality test。在本次测试中 您使用一系列“见证”值并执行一些计算。每个见证人 计算给出“复合”或“可能是素数”的结果。如果您使用 k 个见证人 他们都给出“可能是素数”的结果,这个数字实际上是的概率 复合是 1/4^k。

运行时间是 O(k log^3 n),这比你的 O(sqrt(n)) 有了很大的改进 算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多