首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算nCr模p,素数

计算nCr模p,素数
EN

Stack Overflow用户
提问于 2015-04-04 07:50:05
回答 2查看 1.2K关注 0票数 4

我试图计算nCr模p,其中p是素数。

我尝试过的一种方法是计算n!/ (r!*(N)!)模p使用乘法逆,但当r或n-r大于或等于p时,这就失败了,因为阶乘数是零模p,而逆不存在。

什么方法在所有情况下都有效,而不仅仅是当乘法逆存在时?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-04 09:35:10

我会用卢卡斯定理

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2015-09-08 21:15:28

计算nCr模p,p是素数

  1. 预计算n模p的阶乘 factn=n*factn-1%p
  2. 预计算n模p的阶乘逆,使用 modular_inverse(n)*infactn-1%p =

modular_inverse可以通过使用费马小定理扩展欧氏算法很容易地找到。(因为p是素数,两者都可以使用)

  1. 通过乘factn*infactr*infactn-r%p获得nCr

另一种方法:您也可以使用pascal方法计算nCr

对于任何nCr,您都可以使用

代码语言:javascript
复制
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的算法

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29444013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档