Recibo este error: System.OverflowException: 'El valor no es un número'. Tenía la impresión de que un entero grande podría almacenar cualquier valor de tamaño (500 ^ 500 en este caso), así que no entiendo por qué sucede esto.
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); Bueno, Math.Pow(code, d) % pq no es un BigInteger, es una expresión de tipo double . La conversión del resultado a BigInteger no tendrá efecto hasta que se complete el cálculo (y se haya desbordado).
Math.Pow puede desbordarse fácilmente a Double.PositiveInfinity con números grandes, y Double.PositiveInfinity % someNumber produce Double.NaN . Llamar new BigInteger(Double.NaN) produce el error que ha descrito.
Necesita hacer el cálculo en BigInteger. Afortunadamente, hay un método exactamente para ese propósito ( BigInteger.ModPow ):
BigInteger decodedMessage = BigInteger.ModPow(code, d, pq);(BigInteger.ModPow requiere parámetros BigInteger, pero hay conversiones implícitas de int a BigInteger).
Parece que pq es 0 , luego lanza la misma excepción:
new BigInteger(0.0 % 0); La división de double por cero da como resultado Double.NaN que no es un valor válido para instanciar un BigInteger de acuerdo con docs :
Excepciones
OverflowException
el
valuees NaN, NegativeInfinity o PositiveInfinity.
O, como @Heinzi mencionó correctamente en los comentarios, Math.Pow da como resultado Infinity.