乘法屬性模運算如下:
ab mod m = (a mod m)(b mod m) mod m // Rule 1
由此可以得出:
abc mod m = (ab mod m)(c mod m) mod m // Expand (ab)c mod m
= ((a mod m)(b mod m) mod m mod m)(c mod m) mod m // Expand ab mod m
= ((a mod m)(b mod m) mod m)(c mod m) mod m // Trim extra mod m
= (a mod m)(b mod m)(c mod m) mod m // Reverse rule 1 with
// a' = (a mod m)(b mod m)
// b' = c mod m
這爲實現三路模乘法提供了兩種選擇。最簡單的方法是將所有三個mod模項相乘,並對結果進行mod模擬,但如果對每個中間結果進行mod模擬,則不太可能發生溢出。假設C++:
template <typename T, size_t N>
T mulmod(T (&multiplicands)[N], T m) {
T result = 1;
for (T n : multiplicands)
result = (result * (n % m)) % m;
return result;
}
int nums = {123, 345, 656, 841};
std::cout << mulmod(nums, 373) << "\n"; // Prints 88
@invisial它會是平等的嗎?你怎麼能這麼說? – user3086701
@ user3086701,我添加了解釋。 – invisal
@invisal當你移動到第3行時=(de + r + q)m + rq'我認爲它應該是'=(dem + dq + er)m + rq'對嗎? – Gaith