使用 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);
我正在使用 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);