如何提高这种随机素性测试算法的复杂性?

时间:2014-04-28 15:50:39

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

我编写了以下程序,如果数字是素数则返回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;
}

1 个答案:

答案 0 :(得分:4)

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

运行时为O(k log ^ 3 n),这比你的O(sqrt(n))有了实质性的改进 算法。