BigInteger.pow 和 BigInteger.isProbablePrime 的复杂性是什么?

Peđ*_*zić 6 java complexity-theory biginteger

什么是Java 7中的方法的复杂性pow,并isProbablePrimeBigInteger上课吗?

我知道 Rabin 测试的简单实现是 O(k(log(n))^3) 复杂度,并且可以通过结合Schönhage-Strassen 算法来快速乘以长整数来降低复杂度。

Mys*_*ial 4

假设标准算法,复杂度为:

pow()             : O( M(n * exponent) )
IsProbablePrime() : O( M(n) * n )
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • n是操作数中的位数。
  • exponent是幂函数的指数。
  • M(n)是数字乘法的运行时间n x n。我相信是O(n^2)从 Java 6 开始的。

解释pow()

对于 n 位长的输入操作数的 次方exp,输出的长度大致n * exp为数位。这是通过二进制供电算法完成的,其中操作数在每次迭代时进行平方。所以复杂度就变成了:

O( M(n) + M(2*n) + M(4*n) + ... M(n * exp/2) ) = O( M(n * exp) )
Run Code Online (Sandbox Code Playgroud)

这是一个几何和,因此总和变为O( M(n * exp) )

解释IsProbablePrime()

对于固定次数的 Rabin-Miller 迭代,每次迭代都有O(n)大小n x n数字的乘法。因此,复杂度变为O( n * M(n) )

  • @EJP:BigInteger pow() 函数对整数进行整数幂。这里没有发生浮点。将 N 位整数乘方为“m”的指数的结果将得到许多大约“N * m”位长的数字 - 这是通过大型乘法完成的。 (2认同)