2013-06-02 8 views
9

Bazı matematik işlemlerini gerçekleştirmek için .NET BigInteger sınıfını kullanıyorum. Ancak ModPow yöntemi yanlış sonuçlar veriyor. Ben doğru olduğunu düşünüyorum hangi Java için karşılaştırdık adres:C# BigInteger.ModPow hatası?

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

o .NET sınıfında bir hata mı veya yanlış bir şey yapıyorum?

+2

Ad yanıltıcı; ilk etapta modül operatörü değil. Kalan operatör. Http://blogs.msdn.com/b/ericlippert/archive/2011/12/05/what-s-the-difference-remainder-vs-modulus.aspx adresine bakın. –

cevap

8

Sadece bir tanımlamalar meselesi. MSDN on C# Gönderen:

modülü işlemi tarafından döndürülen değerin işareti temettü işaretine bağlıdır

: bölen pozitif ise, modül çalışması olumlu sonuç döndürür; negatifse, modül işlemi negatif bir sonuç verir. Modül çalışmasının BigInteger değerleri ile davranışı, diğer tümleşik tiplerle modüle çalışmasıyla aynıdır.

ve the JavaDocs for mod den

:

Bu yöntem her zaman, negatif olmayan bir BigInteger döner olmasıyla remainder farklıdır.

Daha fazla bilgi için bkz. http://en.wikipedia.org/wiki/Modulo_operation#Remainder_calculation_for_the_modulo_operation.