Để thực hiện phép tính này khi lắp ráp, nhưng có thể gọi từ Python, tôi muốn thử inline assembly từ số Python module written in C. Cả hai GCC và MSVC trình biên dịch tính năng lắp ráp nội tuyến, chỉ với cú pháp khác nhau.
Lưu ý rằng mô-đun của chúng tôi p = 1000000007
chỉ vừa với 30 bit. Kết quả mong muốn (a*b)%p
có thể được tính trong các thanh ghi Intel 80x86 cho một số hạn chế yếu trên a,b
không lớn hơn nhiều so với p
.
Hạn chế về kích thước của a,b
(1) a,b
là 32-bit số nguyên unsigned
(2) a*b
là ít hơn p << 32
, ví dụ:p
lần 2^32
Cụ thể nếu a,b
mỗi số ít hơn 2*p
, sẽ không thể tràn. Cho (1), nó cũng đủ rằng một trong số chúng nhỏ hơn p
.
Hướng dẫn Intel 80x86 MUL có thể nhân hai số nguyên không dấu 32 bit và lưu trữ kết quả 64 bit trong cặp đăng ký tích lũy EDX: EAX. Một số chi tiết và các câu hỏi về MUL được thảo luận trong Mục 10.2.1 của mục này hữu ích summary.
Lệnh DIV sau đó có thể chia kết quả 64 bit này bằng hằng số 32 bit (mô đun p
), lưu trữ thương trong EAX và phần còn lại trong EDX. Xem Phần 10.2.2 của liên kết cuối cùng. Kết quả chúng tôi muốn là phần còn lại. Đó là hướng dẫn phân chia DIV này đòi hỏi phải có nguy cơ tràn, nên sản phẩm 64 bit trong tử số EDX: EAX cho một thương lớn hơn 32 bit do không thỏa mãn (2) ở trên.
Tôi đang làm việc trên đoạn mã trong phần C/inline assembly cho "bằng chứng khái niệm". Tuy nhiên, lợi ích tối đa về tốc độ sẽ phụ thuộc vào việc sắp xếp các mảng dữ liệu a,b
để xử lý, phân bổ chi phí cho các cuộc gọi hàm, v.v. Python (nếu đó là nền tảng đích).
Vâng, một tối ưu hóa đơn giản sẽ là kết hợp tất cả những gì thành một tuyên bố duy nhất ... nhanh hơn khoảng 6% trong các bài kiểm tra của tôi. – kindall
Googling "phép nhân mô đun nhanh" mang lại một số giấy tờ, chẳng hạn như [giấy tờ này] (http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=5638011). – unutbu
9 chữ số có thể quá nhỏ đối với các thuật toán đặc biệt như [Montgomery reduction] (http: // vi.wikipedia.org/wiki/Montgomery_reduction) mang lại bất kỳ lợi ích nào. Đừng tối ưu hóa sớm. Nguồn của 'a, b' (cấu trúc dữ liệu) là gì? Hồ sơ của bạn nói gì? – jfs