给定一个奇数long x
,我要找到一个long y
,使得它们的乘积在模2**64
下等于1(即使用常规溢出算术)。为了明确我的意思:这样可以通过以下方式计算几千年:
for (long y=1; ; y+=2) {
if (x*y == 1) return y;
}
我知道可以使用扩展欧几里得算法快速解决这个问题,但需要能够表示涉及的所有数字(范围高达2**64
,因此即使使用无符号算术也无济于事)。使用BigInteger
肯定会有帮助,但我想知道是否有一种更简单的方法,可能是使用针对正长整型实现的扩展欧几里得算法。
pow(long, long)
(在LongMath
中缺失)来实现一种方法。 - maaartinuspow(long, long)
故意被省略,因为将任何东西提高到一个不适合于int
的幂次方基本上保证会溢出。(虽然我猜这正是你想要的。) - Louis WassermancheckedPow
或saturatedPow
这样的东西,我同意长指数没有意义,但对于pow
,我不这么认为。我已经发布了6种不同解决方案的基准测试和测试。关于Guava,我建议包括来自链接的Math64的内容。 - maaartinuspow
和checkedPow
之间的区别不在于是否预期会溢出,而在于您是否想要支付检查的开销。 - Louis Wasserman