Trong phép toán số nguyên 32 bit, phép tính cơ bản của phép cộng và nhân được tính ngầm ẩn 2^32, có nghĩa là kết quả của bạn sẽ là thứ tự thấp nhất bit của phép cộng hoặc nhân.Tính toán (a * b) mod c nhanh chóng cho c = 2^N + -1
Nếu bạn muốn tính kết quả bằng một mô đun khác, bạn chắc chắn có thể sử dụng bất kỳ số lượng lớp BigInt nào bằng các ngôn ngữ khác nhau. Và đối với các giá trị a, b, c < 2^32, bạn có thể tính toán giá trị trung gian trong 64 bit ints dài và sử dụng được xây dựng trong% toán tử để giảm số trả lời thích hợp
Nhưng tôi đã được thông báo rằng có các thủ thuật đặc biệt để hiệu quả tính toán a * b mod C khi C có dạng (2^N) -1 hoặc (2^N) +1, không sử dụng phép toán 64 bit hoặc thư viện BigInt và khá hiệu quả, nhiều hơn một đánh giá mô đun tùy ý, và cũng có thể tính toán các trường hợp bình thường sẽ tràn một int 32 bit nếu bạn đã bao gồm phép nhân trung gian.
Thật không may, mặc dù nghe rằng các trường hợp đặc biệt như vậy có phương pháp đánh giá nhanh, tôi chưa thực sự tìm thấy mô tả về phương pháp. "Đó không phải là ở Knuth sao?" "Đó không phải là một nơi nào đó trên Wikipedia?" là những lầm bầm tôi đã nghe.
Có vẻ như đây là một kỹ thuật phổ biến trong các trình tạo số ngẫu nhiên đang làm số nhân * b mod 2147483647, vì 2147483647 là số nguyên bằng 2^31 -1.
Vì vậy, tôi sẽ hỏi các chuyên gia. Trường hợp đặc biệt thông minh này có phương pháp nhân với mod mà tôi không thể tìm thấy bất kỳ cuộc thảo luận nào?
Và vẫn không hiểu toán học đằng sau đây là lý do tại sao tôi bỏ học toán ở trường đại học ... –
Vâng, nó giống như nhận phần còn lại khi chia cho 9 (10-1). Bạn chỉ cần thêm các chữ số. Bây giờ trong trường hợp này, thay vì căn cứ 10, hoặc căn cứ 2, bạn là "cơ sở" 2^N – FryGuy