我正在使用Java BigInteger类进行一些数学运算,但是当我尝试使用负数作为指数时遇到错误。我认为您可以重新排列是正确的吗?
b · φ(N)^−1 mod N
为:
b
------------
φ(N)^1 mod N
如果没有,我该如何重新排列表达式以免在Java代码中出现负指数错误?
答案 0 :(得分:3)
BigInteger
不能有负指数,因为那会使它成为分数(不是1就是整数)。
尝试改用BigDecimal
。
对于表达式的重新排列,应该这样重新排列:
b
------------ mod N
φ(N)^1
答案 1 :(得分:3)
算术mod N必须以修改后的规则执行。特别是,逆的计算必须大不相同。逆的基本公理成立:
x * x -1 = 1 mod N。
但是您不能通过将1 / x计算为浮点或十进制值来计算x -1 modN。相反,您必须为此专门使用一种算法。通常使用extended euclidean algorithm的变体。
为方便起见,Java的BigInteger类已经为您提供了以下算法:modInverse()
。因此您的计算应类似于:
BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
BigInteger phiInverse = phi.modInverse(N);
BigInteger result = b.multiply(phiInverse).mod(N);