考虑以下简单的Java代码块:
public static void main(String[] args) {
int a = 7;
double exp;
for (int i=0; i<71; ++i) {
exp = Math.pow(a,i) % 71;
if (exp == 59.0)
System.out.printf("k=%d: %.0f%n", i, exp);
}
}
我试图遍历所有指数k,使得^ x = 59 mod 71 ...但是应该只有一个,而我得到三个:k = 3,k = 23,k = 63。这显然是错误的,因为在验证时,只有k = 3才是正确的答案。浮点的工作方式是否存在一些固有的问题(因此Math.pow
),或者我的代码中是否存在其他逻辑问题? 我应该使用其他方法来计算^ x(mod n)吗?
答案 0 :(得分:3)
最简单的正确权宜之计不需要编写自己的方法可能是
BigInteger.valueOf(a)
.modPow(BigInteger.valueOf(i), BigInteger.valueOf(71))
.intValue();
答案 1 :(得分:3)
如果你想避免“大计算”,那么你可以在每次乘法后执行模数:
public static void main(String[] args)
{
for (int i=0,a=1; i<71; i++, a = (a*7)%71)
{
if (a == 59)
System.out.println("k = " + i);
}
}