10

我正在使用 .NET BigInteger类来执行一些数学运算。但是ModPow方法给了我错误的结果。我将它与我认为正确的 Java 进行了比较:

// C#
var a = new BigInteger(-1);
var b = new BigInteger(3);
var c = new BigInteger(5);
var x = BigInteger.ModPow(a, b, c); // (x = -1)

// Java
BigInteger a = new BigInteger("-1");
BigInteger b = new BigInteger("3");
BigInteger c = new BigInteger("5");
BigInteger x = a.modPow(b, c); // (x = 4)

它是 .NET 类中的错误还是我做错了什么?

4

1 回答 1

9

这只是定义问题。来自C# 上的 MSDN

取模运算返回的值的符号取决于被除数的符号:如果被除数为正,则取模运算返回正结果;如果为负数,则取模运算返回负数结果。具有BigInteger值的模运算的行为与具有其他整数类型的模运算相同。

并来自JavaDocsmod

此方法的不同之处remainder在于它始终返回非负数BigInteger

有关详细信息,请参阅http://en.wikipedia.org/wiki/Modulo_operation#Remainder_calculation_for_the_modulo_operation

于 2013-06-02T15:29:50.867 回答