我得到了一个错误: 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;
}发布于 2021-04-20 20:37:39
BigInteger decodedMessage = new BigInteger(Math.Pow(code, d) % pq);Math.Pow(code, d) % pq不是BigInteger,它是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的隐式转换。)
https://stackoverflow.com/questions/67185915
复制相似问题