我在使用.NET 大整数 类来执行一些数学运算。然而 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类的错误还是我做错了什么?
这只是一个定义的问题。 从 关于C#的MSDN:
模数运算返回的值的符号取决于红利的符号,如果红利为正,则模数运算返回正结果;如果红利为负,则模数运算返回负结果。如果红利为正数,模数运算返回正数结果;如果红利为负数,模数运算返回负数结果。模数运算的行为与
BigInteger
值与其他积分类型的模数运算相同。
而从 的JavaDocs mod
:
这种方法不同于
remainder
因为它总是返回一个非负的BigInteger
.
更多信息,请参阅 http:/en.wikipedia.orgwikiModulo_operation#Remainder_calculation_for_the_modulo_operation。.