阶乘的模除以阶乘

Far*_*ind 0 c++ algorithm factorial modulo number-theory

如何计算a!/(b1! b2! ... bm!) modulo pp素数在哪里?a和的阶乘b可能非常大(long long int不够),所以我需要传递到模。

myr*_*cat 5

如果abs 和p相当小,则更喜欢@KellyBundy 的取消因子或计算质因子的方法。

乘法和模运算

给定整数mn以及其他一些整数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。有多种算法可以找到模逆,我不会在这里描述(但请参见例如此处)。

现在,给定整数nm,并假设m / n是整数,我们可以应用以下规则:

(m / n) modulo p = (m * inv(n)) modulo p
Run Code Online (Sandbox Code Playgroud)

因此,只要我们可以计算模逆,我们就可以将除法转换为乘法,然后应用前面的规则。