c - 高效计算 nCk mod p

标签 c performance overflow combinatorics

这个问题我已经遇到过很多次了,但是一直无法解决。在某些情况下会出现错误的答案,或者我编写的程序会太慢。正式地说,我正在谈论计算

nCk mod p 其中 p 是质数 n 是一个大数,且 1<=k<=n。

我尝试过什么:

我知道阶乘的递归公式,然后将其建模为动态规划问题,但我觉得它很慢。递归公式为(nCk) + (nCk-1) = (n+1Ck)。我在将值存储在数组中以避免溢出时处理了模数,但我不确定仅对结果执行 mod p 是否会避免所有溢出,因为可能需要删除。

最佳答案

要计算 nCr,有一个基于规则 nCr = (n - 1)C(r - 1) * n/r 的简单算法:

def nCr(n,r):
  if r == 0:
    return 1
  return n * nCr(n - 1, r - 1) // r

现在,在模算术中,我们不完全有除法,但我们有模逆(当用素数进行模运算时)同样好

def nCrModP(n, r, p):
  if r == 0:
    return 1
  return n * nCrModP(n - 1, r - 1) * modinv(r, p) % p

这是一个implementation of modinv在罗塞塔代码上

关于c - 高效计算 nCk mod p,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13780137/

相关文章:

jquery - 关闭切换后无法滚动正文

html - 文本不换行在表格布局中,溢出

C 函数在串口关闭之前不会发送

c - 二维数组中值滤波

c++ - 如何提高C++中merkle根的计算速度?

python - 有效地生成所有可能的4人团队组合,其中包含130个角色中的特定角色并计算某些值

c# - 增强以下组合算法的性能

css - 内容背景被截断

c - 带有指向 char 数组的指针的链表

C 内存管理 -> 哈希