【问题标题】:What are complexities of BigInteger.pow and BigInteger.isProbablePrime?BigInteger.pow 和 BigInteger.isProbablePrime 的复杂性是什么?
【发布时间】:2011-10-03 06:41:07
【问题描述】:

BigInteger 类中的 Java 7 方法 powisProbablePrime 的复杂性是什么?

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

【问题讨论】:

  • 你看过源代码吗?还是您希望我们为您做这件事?
  • 他们是否将乘法改进为次二次?上次我检查它仍然是O(n^2)。所有其他主要功能在很大程度上取决于乘法的速度。
  • 我想指出,pow()isProbablyPrime() 已包含在 BigInteger(根据 JavaDoc)的第一个版本中,BigInteger 是在 JDK 1.1 中引入的!所以这绝不是 Java 7 的新特性。
  • @Stephen C:除非在源代码中明确写出了复杂性,否则仅仅看代码并不容易弄清楚。
  • @Mysticial - 这不符合我的观点。

标签: java complexity-theory biginteger


【解决方案1】:

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

pow()             : O( M(n * exponent) )
IsProbablePrime() : O( M(n) * n )

地点:

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

pow()的解释:

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

O( M(n) + M(2*n) + M(4*n) + ... M(n * exp/2) ) = O( M(n * exp) )

这是一个几何和,所以和变成O( M(n * exp) )

IsProbablePrime()的解释:

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

【讨论】:

  • 您对 pow() 的回答是错误的,因为它是通过 FPU 中的对数计算得出的。与乘法或位数无关。无论如何,对积分幂求幂都是错误的,因为有比仅仅乘以“指数”时间要快得多的算法。您对 isProbablePrime 的回答看起来只是猜测。
  • @EJP:BigInteger pow() 函数将整数幂为整数幂。这里没有浮点数。将一个 N 位整数乘以 m 的指数的结果将导致大约有 N * m 位长 - 这是通过大乘法完成的。
  • 但不是 O(M(n*exponent)) 乘法。 BigInteger.pow() 使用 Knuth ACP vol II #4.6.3 中描述的平方和乘法算法。乘法次数为 O(sqrt(N))。
  • @EJP: n*exponent 指的是操作数的大小。所以M(n * exponent) 表示两个大小n * exponent 相乘所需的时间。 (不是乘法的# - 这显然是O(log(n)))不要忘记大乘法不是恒定的。 (这就是为什么会有M()
  • 那么你根本就没有乘法次数的因素吗?
【解决方案2】:

简短的回答是它没有被指定,因此取决于实施者的选择。

【讨论】:

    【解决方案3】:

    如果你想看看源代码,这里是:http://futureboy.us/temp/BigInteger.java

    您的问题的相关材料也在这里:What complexity are operations on Java 7's BigInteger?

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      相关资源
      最近更新 更多