我试图计算nCr模p,其中p是素数。
我尝试过的一种方法是计算n!/ (r!*(N)!)模p使用乘法逆,但当r或n-r大于或等于p时,这就失败了,因为阶乘数是零模p,而逆不存在。
什么方法在所有情况下都有效,而不仅仅是当乘法逆存在时?
发布于 2015-04-04 09:35:10
我会用卢卡斯定理
C(14,1), p=13
N = 14 = 1 * 13 + 1
K = 1 = 0 * 13 + 1
C(N,K) mod p = (C(1,0) mod 13 ) * (C(1,1) mod 13) = 1发布于 2015-09-08 21:15:28
计算nCr模p,p是素数
modular_inverse可以通过使用费马小定理或扩展欧氏算法很容易地找到。(因为p是素数,两者都可以使用)
另一种方法:您也可以使用pascal方法计算nCr
对于任何nCr,您都可以使用
row[0]=1;
for(i=1;i<n/2;i++)
{
row[i]=row[i-1]*(n-i+1)/i
}
for(i=n/2;i<=n;i++)
{
row[i]=row[n-i]
}在这方面,您必须使用上述任何一种方式( modulo_inverse of (i) )( 费马小定理或扩展欧氏算法 )。
参考资料:最著名的计算nCr %M的算法
https://stackoverflow.com/questions/29444013
复制相似问题