2013-06-02 18 views
9

Używam klasy .NET BigInteger do wykonywania niektórych operacji matematycznych. Jednak metoda ModPow daje mi złe wyniki. Porównywałem go do Javy, który uważam za poprawny: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) 

Czy to błąd w klasie .NET, czy robię coś nie tak?

+2

Nazwa wprowadza w błąd; to nie jest operator modulusa. To jest operator pozostały. Zobacz http://blogs.msdn.com/b/ericlippert/archive/2011/12/05/what-s-the-difference-remainder-vs-modulus.aspx –

Odpowiedz

8

To tylko kwestia definicji. Od MSDN on C#:

Znak wartości zwracanej przez działanie modułu zależy od znaku dywidendy: Jeżeli dywidenda jest dodatnia, operacja moduł zwraca wynik pozytywny; jeśli jest ujemny, działanie modułu zwraca wynik ujemny. Zachowanie modułu modulacji z wartościami BigInteger jest identyczne jak działanie modułu z innymi rodzajami całek.

I od the JavaDocs for mod:

Metoda ta różni się od remainder tym, że zawsze zwraca nieujemną BigInteger. Aby uzyskać więcej informacji, zobacz

.