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演算の動作は、他の整数型を使用した剰余演算と同じです。

そしてJavaDocs formodから:

remainderこのメソッドは、常に負でない を返すという点でとは異なりますBigInteger

詳細については、http://en.wikipedia.org/wiki/Modulo_operation#Reminder_calculation_for_the_modulo_operationを参照してください。

于 2013-06-02T15:29:50.867 に答える