C# BigInteger.ModPow存在bug?

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类中的一个bug还是我做错了什么?


2
这个名字有误导性,它一开始就不是模数运算符。它是余数运算符。请参阅http://blogs.msdn.com/b/ericlippert/archive/2011/12/05/what-s-the-difference-remainder-vs-modulus.aspx。 - Eric Lippert
1个回答

9
这只是一些定义问题。来自C#的MSDN

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

而来自mod的JavaDocs

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

要了解更多信息,请参见http://en.wikipedia.org/wiki/Modulo_operation#Remainder_calculation_for_the_modulo_operation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接