当您尝试计算此商模 p(对于某个素数)时,让我假设您知道结果是一个整数。
正如人们所提到的,如果 q >= p,那么你不能计算分母的倒数,因为 q! 与模数不互质,所以这个数不可逆。但这并不意味着您不能计算 整个 商模p。
令a、b分别为分子和分母中p因子的个数。因为结果是一个整数,所以我们有 a >= b。如果不等式是严格的,则结果为 0。否则,如果等式成立,我们可以从分子和分母中删除这些因素并继续,因为现在分母与 p 互质。
那么让我从有效计算这些 a、b 数字的方法开始。密钥被称为De Polignac's formula,它表示对于给定的k,可以计算出k! 中p 因子的数量像这样:
int polignac(int k, int p) {
int res = 0, power = p;
while (k >= power) {
res += k/power;
power *= p;
}
return res;
}
因此,我们获得了 n! 和 q! 的 p 因子,因此获得 是微不足道的q!^r 的 p 个因数(乘以 r)。
在严格不等式的情况下,我们完成了。如果不是,我们必须计算分子和分母的模数,“删除”所有 p 因子。这也可以有效解决。我们可以这样写k!:
k! = 1 x 2 x 3 x ... x p x (p + 1) x (p + 2) ... x (p^2) x ...
如果我们去掉 p 因素并应用模数,我们有以下结果:
k! = 1 x 2 x 3 x ... x(这里什么都没有,只有一个 1)x 1 x 2 ... x(另一个 1)x ...
因此,相同的产品不断重复直到结束。所以计算 1 x 2 x ... x (p - 1) 模 p,将其提高到适当的幂模 p(使用快速取幂),然后将其乘以“剩余”项,因为一般 k 不能被 p 整除。