【发布时间】:2019-08-05 08:08:10
【问题描述】:
我正在查看 Java BigInteger gcd 方法源代码。我发现了在类的任何地方都没有定义的 hybridGCD() 方法。
这里是链接: http://hg.openjdk.java.net/jdk/jdk11/file/tip/src/java.base/share/classes/java/math/BigInteger.java
public BigInteger gcd(BigInteger val) {
if (val.signum == 0)
return this.abs();
else if (this.signum == 0)
return val.abs();
MutableBigInteger a = new MutableBigInteger(this);
MutableBigInteger b = new MutableBigInteger(val);
MutableBigInteger result = a.hybridGCD(b);
return result.toBigInteger(1);
}
gcd 方法在一个小时内没有响应两个相当大的数字(每个都包含百万位数)。
【问题讨论】:
-
我不知道hybridgcd到底是做什么的,但是运行时间是有道理的。很可能是欧几里得算法。它执行多个 a % b 操作,这应该是相当昂贵的(n^2 或 n^3,iirc,其中 n 是长度)。该算法执行此操作 O(n) 次,因此会很长。
-
我曾经看过 GCD 算法用于非常大的操作数。我发现 GMP(Gnu Multiprecision 库,一个 C/C++ 库)包含优于其他 BigInt 库的算法。不仅更快,因为它是本机代码,而且更快,因为它是一种更好的算法。如果您决心实现比
hybridGCD()更快的东西,mpn/gcd.c的源代码和注释可能是一个很好的资源
标签: java biginteger