我写了这行代码:
class C extends B
val z = test2("", new B, new C) // doesn't compile; can't prove B =:= C
val w = test2[B, B]("", new B, new C) // does compile
我希望输出为System.out.println(Math.pow(7, 23) % 143); // 7^23 mod 143
,但输出为2
。有人知道我做错了吗?
答案 0 :(得分:7)
数字“溢出”double
,这是Math.pow()
期望并返回的内容。改为使用BigInteger
:
BigInteger.valueOf(7)
.pow(23)
.mod(BigInteger.valueOf(143))
或者只需一步,如@Felk所建议的那样:
BigInteger.valueOf(7)
.modPow(BigInteger.valueOf(23), BigInteger.valueOf(143))
答案 1 :(得分:3)
Math.pow
的结果是double
,其中有64位;其中53个是尾数位。这意味着任何大于2^53-1 = 9007199254740991
的整数都不能精确地表示为double。
7 ^ 23大于2 ^ 53-1(实际上它仅略大于2 ^ 64),因此无法精确表示。因此,%
的结果不是您所期望的。
使用BigInteger
,而@Costi已经建议。
答案 2 :(得分:0)
如果中间取幂结果太大而无法容纳变量,请使用Modular exponentiation algorithm。
System.out.println(powMod(7, 23, 143)); // = 2
// Example from Wikipedia with minor changes
private static int powMod(int base, int exponent, int modulus) {
if (modulus == 1)
return 0;
base %= modulus;
int result = 1;
while (exponent > 0) {
if ((exponent & 1) == 1)
result = (result * base) % modulus;
exponent >>= 1;
base = (base * base) % modulus;
}
return result;
}