2013-06-02 13 views
9

Utilizzo la classe .NET BigInteger per eseguire alcune operazioni matematiche. Tuttavia il metodo ModPow mi sta dando risultati errati. Ho paragonato a Java che credo sia corretto:C# BigInteger.ModPow bug?

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

E 'un bug in classe .NET o sto facendo qualcosa di sbagliato?

+2

Il nome è fuorviante; non è l'operatore del modulo in primo luogo. È il resto dell'operatore. Vedi http://blogs.msdn.com/b/ericlippert/archive/2011/12/05/what-s-the-difference-remainder-vs-modulus.aspx –

risposta

8

È solo una questione di definizioni. Da MSDN on C#:

Il segno del valore restituito dall'operazione modulo dipende dal segno del dividendo: Se dividendo è positivo, l'operazione di modulo restituisce un risultato positivo; se è negativo, l'operazione di modulo restituisce un risultato negativo. Il comportamento dell'operazione modulo con i valori BigInteger è identico all'operazione modulo con altri tipi interi.

E da the JavaDocs for mod:

Questo metodo differisce dalla remainder in quanto restituisce sempre un non negativo BigInteger.

Per ulteriori informazioni, vedere http://en.wikipedia.org/wiki/Modulo_operation#Remainder_calculation_for_the_modulo_operation.