使用 BigInteger class 的负指数

Negative exponents using the BigInteger class

我正在使用 Java BigInteger class 做一些数学运算,但是当我尝试使用负数作为指数时出现错误。我认为你可以重新排列是否正确:

b · φ(N)^−1 mod N

如:

      b
------------
φ(N)^1 mod N

如果不是,我该如何重新排列表达式,以免在我的 Java 代码中出现负指数错误?

BigInteger 不能有负指数,因为那会使它成为分数(1 大于某物),这不是 "integer".

请尝试使用 BigDecimal

至于你对表达式的重新排列,应​​该是这样重新排列的:

      b
------------  mod N
   φ(N)^1

算术 mod N 必须使用 mod 固定规则执行。特别是倒数必须以不同的方式计算。逆的基本公理成立:

x * x-1 = 1 mod N.

但是您不能通过将 1/x 计算为浮点数或十进制值来计算 x-1 mod N。相反,您必须使用专门用于此目的的算法。通常使用 extended euclidean algorithm 的变体。

方便,Java的BigInteger class already includes this algorithm for you: modInverse()。所以你的计算应该是这样的:

BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
BigInteger phiInverse = phi.modInverse(N);
BigInteger result = b.multiply(phiInverse).mod(N);