如果a、bs 和p相当小,则更喜欢@KellyBundy 的取消因子或计算质因子的方法。
给定整数m和n以及其他一些整数k:
(m * n) modulo k = ((m modulo k) * (n mod k)) modulo k
Run Code Online (Sandbox Code Playgroud)
这允许计算大的乘积而modulo p不必担心溢出,因为我们始终可以将参数保持在 range 内[0, k)。
例如计算阶乘a! modulo k,在Python中:
(m * n) modulo k = ((m modulo k) * (n mod k)) modulo k
Run Code Online (Sandbox Code Playgroud)
如果p是素数,那么对于任何n不能被 整除的整数p,我们可以找到一个整数,我将inv(n)其称为:
(n * inv(n)) modulo p = 1
Run Code Online (Sandbox Code Playgroud)
这个数称为 的模逆数n。有多种算法可以找到模逆,我不会在这里描述(但请参见例如此处)。
现在,给定整数n和m,并假设m / n是整数,我们可以应用以下规则:
(m / n) modulo p = (m * inv(n)) modulo p
Run Code Online (Sandbox Code Playgroud)
因此,只要我们可以计算模逆,我们就可以将除法转换为乘法,然后应用前面的规则。