为Rabin-Miller测试找到Big-O.

时间:2018-03-08 22:35:02

标签: java big-o

所以我试图找出Big-O对于Rabin-Miller测试是什么,我已经对它进行了一些研究,但我无法找到一个很好的解释。让我困惑的是这部分:

while( !isPrime(n)){
n = new BigInteger(bit, new Random());
}   

这是我的主要程序的一部分,我一直生成一个新的数字,直到我找到一个素数,然后它退出循环。当我不知道while循环运行多少次时,如何估计Big-O?

1 个答案:

答案 0 :(得分:1)

在计算Big-O时,有三件事要做

  1. 找到最好的案例

  2. 找到最坏的情况 以及

  3. 查找平均情况。

  4. 在这种情况下,最坏的情况Big-O显然是O(无穷大),这将在极不可能的情况下实现,n最初不是素数,并且所有新计算的n的实例也从不将成为素数。

    最好的情况Big-O与isPrime()方法的Big-O相同。这是因为最好的情况是当n最初是素数时,这将导致while循环永远不会被执行。需要注意的一点是,你的while循环条件做了两件事:检查一个布尔值是否为真,并调用isPrime()方法。因此,要找到Big-O,必须将isPrime()方法的Big-O乘以被检查的布尔值的Big-O。被检查的布尔值的Big-O是O(1)。因此,最佳情况与isPrime()方法的Big-O相同,为1 * x = x。我不知道你的isPrime()方法是怎么写的,所以不能告诉你最好的Big-O案例。

    然而,平均情况更难以找到,因为您正在处理随机数。由于我们处理随机数,因此可以使用称为expected analysis的东西来计算平均情况。但是,为了做到这一点,我们需要知道随机数的范围。 java api说你正在使用的bigInteger构造函数计算0到2 ^ bit-1(包括0和2 ^ bit-1)范围内的随机数。(仅限正数)。由于我不知道代码中bit的价值,我不能给你一般情况,但希望你能够自己计算。

    如果您有任何问题,请直接询问!