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

标签 c++ algorithm random 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;
}

最佳答案

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

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

关于c++ - 我如何提高这种随机素性测试算法的复杂性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23345592/

相关文章:

c++ - 以编程方式设置应用程序的播放设备

python - 二进制搜索算法测试重复值

c - 使用二进制搜索在 C 中查找数字的平方根

c++ - GoogleTest CMake 和 Make 测试未运行

c++ - 包含 glew c++ 后不能使用 glut 函数

C++ 预处理器决策

algorithm - 分词算法

java - random() 中的唯一值

matlab - 使用 MATLAB 函数 block 在 Simulink 中生成随机数

php - 来自文本种子的随机数