【问题标题】:Negative exponents using the BigInteger class使用 BigInteger 类的负指数
【发布时间】:2018-12-01 14:32:54
【问题描述】:

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

b · φ(N)^−1 mod N

作为:

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

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

【问题讨论】:

  • 我投票结束这个问题,因为它不是关于编程,而是关于解决数学问题
  • 不,你这样想是不对的。请参阅 Sweeper 的回答。
  • @ernest_k:我认为它一个编程问题。

标签: java biginteger


【解决方案1】:

BigInteger 不能有负指数,因为这会使它成为一个分数(1 超过某物),而不是“整数”。

尝试改用BigDecimal

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

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

【讨论】:

  • 假设^在这里表示“指数”,而不是“异或”,您可以省略^1部分。
  • mod* 之间的运算符优先级应该是什么?
  • @RudyVelthuis 我知道,这只是为了清楚地表明存在正指数。
  • 虽然在技术上是正确的,但这个答案并没有真正触及 OP 错误的核心。
【解决方案2】:

必须使用修改后的规则执行算术 mod N。特别是逆运算必须有很大不同。逆的基本公理成立:

x * x-1 = 1 mod N.

但您不能通过将 1/x 计算为浮点或十进制值来计算 x-1 mod N。相反,您必须为此目的使用专门的算法。通常使用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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2021-07-13
    • 2017-08-27
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多