2013-06-02 6 views
9

Ich verwende .NET BigInteger Klasse, um einige mathematische Operationen durchzuführen. Aber ModPow Methode gibt mir falsche Ergebnisse. Ich habe es auf Java verglichen, die ich denke, ist richtig:C# BigInteger.ModPow Fehler?

// 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) 

Ist es ein Fehler in .NET-Klasse oder ich tue etwas falsch gemacht?

+2

Der Name ist irreführend; es ist nicht der Modulus-Operator an erster Stelle. Es ist der Restbetreiber. Siehe http://blogs.msdn.com/b/ericlippert/archive/2011/12/05/what-s-the-difference-remainder-vs-modulus.aspx –

Antwort

8

Es ist nur eine Frage der Definitionen. Von :

Das Vorzeichen des von der Modulusoperation zurückgegebenen Werts hängt vom Vorzeichen der Dividende ab: Wenn Dividend positiv ist, gibt die Modulusoperation ein positives Ergebnis zurück; Wenn es negativ ist, liefert die Modulusoperation ein negatives Ergebnis. Das Verhalten der Moduloperation mit BigInteger Werten ist identisch mit der Modulusoperation mit anderen ganzzahligen Typen.

Und von the JavaDocs for mod:

Diese Methode von remainder dadurch unterscheidet, dass es immer eine nicht negative BigInteger zurückgibt.

Weitere Informationen finden Sie unter http://en.wikipedia.org/wiki/Modulo_operation#Remainder_calculation_for_the_modulo_operation.