Algorithm 求固定n模m的前r个二项式系数之和的算法
我试图找到固定n的第一个r二项式系数之和 (nC1+nC2+nC3+…+nCr)%M 其中r<=n 有没有有效的算法来解决这个问题?注意,固定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
的“第一”二项式系数是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
modM
,然后将它们相加?为什么要费劲定义和使用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;