2013-06-02 42 views
9

Tôi đang sử dụng lớp .NET BigInteger để thực hiện một số phép toán. Tuy nhiên phương pháp ModPow cho tôi kết quả sai. Tôi đã so sánh nó với Java mà tôi nghĩ là chính xác:C# BigInteger.ModPow lỗi?

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

Đây có phải là lỗi trong lớp .NET hoặc tôi đang làm điều gì sai?

+2

Tên gây hiểu nhầm; nó không phải là nhà điều hành mô-đun ở nơi đầu tiên. Đó là toán tử còn lại. Xem http://blogs.msdn.com/b/ericlippert/archive/2011/12/05/what-s-the-difference-remainder-vs-modulus.aspx –

Trả lời

8

Đó chỉ là vấn đề về định nghĩa. Từ MSDN on C#:

Dấu hiệu của giá trị trả về bởi hoạt động mô đun phụ thuộc vào dấu hiệu của cổ tức: Nếu cổ tức dương, hoạt động mô đun trả về kết quả dương; nếu nó là số âm, phép toán mô đun trả về kết quả âm. Hành vi của hoạt động modulus với các giá trị BigInteger giống hệt với hoạt động mô đun với các kiểu tích phân khác.

Và từ the JavaDocs for mod:

Phương pháp này khác với remainder ở chỗ nó luôn luôn trả về một không âm BigInteger.

Để biết thêm thông tin, hãy xem http://en.wikipedia.org/wiki/Modulo_operation#Remainder_calculation_for_the_modulo_operation.