有没有比Math.pow更好(更正确)的方法来计算某些功率的模数?

时间:2014-03-24 22:00:50

标签: java math floating-point

考虑以下简单的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)吗?

2 个答案:

答案 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);
    }
}