2

我收到此错误:System.OverflowException:“值不是数字。” 我的印象是大整数可以存储任何大小的值(在这种情况下为 500 ^ 500),所以我不明白为什么会这样。

public int decode(int code)
{
   int totient = (p - 1) * (q - 1);
   int d = modInverse(e, totient);
   int pq = p * q;
   BigInteger decodedMessage = new BigInteger(Math.Pow(code, d) % pq);
   return (int)decodedMessage;
}
4

2 回答 2

6
BigInteger decodedMessage = new BigInteger(Math.Pow(code, d) % pq);

好吧,Math.Pow(code, d) % pq它不是 BigInteger,它是 type 的表达式double在计算完成(并且溢出)之前,将结果转换为 BigInteger 不会产生影响。

Math.Pow可以很容易地溢出到Double.PositiveInfinity大量数字,并Double.PositiveInfinity % someNumber产生Double.NaN. 调用new BigInteger(Double.NaN)会产生您描述的错误。

您需要在 BigInteger 中进行计算。幸运的是,有一种方法可以达到这个目的(BigInteger.ModPow):

BigInteger decodedMessage = BigInteger.ModPow(code, d, pq);

(BigInteger.ModPow 需要 BigInteger 参数,但存在从 int 到 BigInteger 的隐式转换。)

于 2021-04-20T20:37:39.137 回答
1

似乎pq0,下一个抛出相同的异常:

new BigInteger(0.0 % 0);

根据文档double除以零导致Double.NaN其不是实例化 a 的有效值:BigInteger

例外

溢出异常

value是 NaN、NegativeInfinity 或 PositiveInfinity。

或者,正如@Heinzi在评论中正确提到的那样,Math.Pow会导致 Infinity。

于 2021-04-20T20:34:24.063 回答