为什么使用大整数(System.Numerics)会导致系统溢出?

c#

我收到此错误: 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;
}

回答

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 的隐式转换。)


以上是为什么使用大整数(System.Numerics)会导致系统溢出?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>