Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 求固定n模m的前r个二项式系数之和的算法_Algorithm_Modulo_Binomial Coefficients - Fatal编程技术网

Algorithm 求固定n模m的前r个二项式系数之和的算法

Algorithm 求固定n模m的前r个二项式系数之和的算法,algorithm,modulo,binomial-coefficients,Algorithm,Modulo,Binomial Coefficients,我试图找到固定n的第一个r二项式系数之和 (nC1+nC2+nC3+…+nCr)%M 其中rn/2,我们有nC0+…+nC(r-1)=2^n-(nCr+…+nCn)=2^n-(nC0+…+nC(n-r))其中n-r

我试图找到固定n的第一个r二项式系数之和

(nC1+nC2+nC3+…+nCr)%M 其中r<=n

有没有有效的算法来解决这个问题?

注意,固定
n
的“第一”二项式系数是
nC0
。 设
f(n)=nC0+nC1+…+nC(r-1)
。 使用“帕斯卡三角形”恒等式,
nCk=(n-1)C(k-1)+(n-1)Ck
我们有 等等


要执行mod m计算,您需要预先计算二项式系数
(n-1)C(r-1)mod m
。如果
m
是素数,则二项式系数
mod m
是循环的
m^k
m
的幂大于
r-1
)。如果
m
是素数的幂,结果就相当复杂。(参见。)如果m有一个以上的素因子,则可以使用中国剩余定理将计算简化为以前的情况

我的第一个答案不令人满意,原因有几个,其中一个是我引用的论文很难理解和实施。因此,我将为下面的问题提出一个不同的解决方案

我们想计算固定n,
nC0+nC1+…+的前r个二项式系数之和nC(r-1)
,模M。与其通过减少n来减少
nCk
的计算,不如减少k:我们需要
nC(k-1)
已经作为总和的一部分;此外,我们可能有r远小于n,因此通过增加n来获取值的效率可能远远低于增加r


这里的想法是:首先注意,如果r>n/2,我们有
nC0+…+nC(r-1)=2^n-(nCr+…+nCn)=2^n-(nC0+…+nC(n-r))
其中n-rnC0
nC1
nC2
,…,
nCr
mod
M
,然后将它们相加?为什么要费劲定义和使用
f(n)
?是的,我完全同意,我也有同样的想法。然而,我提到的这篇论文并不是很容易翻译成代码的,所以我一直在试图想出一种方法来解决这个问题,而不是使用这篇论文的结果。我想我有一个解决办法:最好从三角形的边缘开始,而不是从三角形的顶部开始。我很快会提交另一个答案。Re:“无论如何,算法现在是O(r)”:你能详细说明一下吗?你所描述的计算对我来说似乎不明显。 nC0 + nC1 + nC2 + ... + nC(r-1) = (n-1)C(-1) + (n-1)C0 + (n-1)C0 + (n-1)C1 + (n-1)C1 + (n-1)C2 + ... + (n-1)C(r-2) + (n-1)C(r-1) = 2[(n-1)C0 + (n-1)C1 + (n-1)C2 + ... + (n-1)C(r-2)] + (n-1)C(r-1) = 2[(n-1)C0 + ... + (n-1)C(r-1)] - (n-1)C(r-1), f(0) = 1, f(1) = 1 + 1 = 2 = 2f(0) - 0C2, f(2) = 1 + 2 + 1 = 4 = 2f(1) - 1C2, f(3) = 1 + 3 + 3 = 7 = 2f(2) - 2C2, f(4) = 1 + 4 + 6 = 11 = 2f(3) - 3C2, f(5) = 1 + 5 + 10 = 16 = 2f(4) - 4C2,
nCk = n!/(k!(n-k)!) = n!/((k-1)!(n-(k-1)!) x (n-k+1)/k = nC(k-1) x (n-k+1)/k
sum = 0;
nCi = 1; // i=0
for i = 1 to r-1
  sum += nCi;
  nCi *= (n-k+1);
  nCi /= k;
sum %= M;