C# BigInteger.ModPow bug?

问题描述 投票:11回答:1

我在使用.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# java .net biginteger
1个回答
9
投票

这只是一个定义的问题。 从 关于C#的MSDN:

模数运算返回的值的符号取决于红利的符号,如果红利为正,则模数运算返回正结果;如果红利为负,则模数运算返回负结果。如果红利为正数,模数运算返回正数结果;如果红利为负数,模数运算返回负数结果。模数运算的行为与 BigInteger 值与其他积分类型的模数运算相同。

而从 的JavaDocs mod:

这种方法不同于 remainder 因为它总是返回一个非负的 BigInteger.

更多信息,请参阅 http:/en.wikipedia.orgwikiModulo_operation#Remainder_calculation_for_the_modulo_operation。.

© www.soinside.com 2019 - 2024. All rights reserved.