找到固定n模m的第一个r二项系数之和的算法

时间:2015-04-03 21:26:23

标签: algorithm modulo binomial-coefficients

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

(nC1 + nC2 + nC3 + ... + nCr)%M

其中r < = n。

是否有一种有效的算法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

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

我们想要计算固定n,nC0 + nC1 + ... + nC(r-1),模M的第一个r二项式系数之和。而不是通过减少n来减少nCk的计算,减少k更有意义:我们需要nC(k-1)作为总和的一部分;另外,我们可能比n少得多,所以通过递增n得到这个值可能远远不如递增r。

这是一个想法:首先请注意,如果r> n / 2我们有nC0 + ... + nC(r-1) = 2^n - (nCr + ... + nCn) = 2^n - (nC0 + ... + nC(n-r)),其中n-r&lt; n / 2,所以我们将问题减少到r <= n / 2的情况。

接下来,应用身份

nCk = n!/(k!(n-k)!) = n!/((k-1)!(n-(k-1)!) x (n-k+1)/k = nC(k-1) x (n-k+1)/k

按顺序计算总和的条款。如果out整数的大小无限,我们可以计算

sum = 0;
nCi = 1; // i=0
for i = 1 to r-1
  sum += nCi;
  nCi *= (n-k+1);
  nCi /= k;
sum %= M;

这个问题是数字nCi(因此总和)会变得很大,所以我们必须使用大整数,这会减慢计算速度。但是,我们只需要结果mod M,所以如果我们在循环中执行计算mod M,我们可以使用int

总和和产品是简单的模M,但是除法不是。为了将nCi除以k mod 10 ^ 6,我们需要以2 ^ s 5 ^ t u的形式写出nCi和k,其中u是10 ^ 6的相对素数。然后我们减去指数,并乘以u mod 10 ^ 6的倒数。为了以该形式编写nCi,我们还需要以该形式编写n-k + 1。

将k和n-k + 1放入2 ^ s 5 ^ tu的形式,其中u是10 ^ 6的相对素数,我们可以重复检查除数,然后除以2,并且相同为5。 ,似乎应该有更快的方式。

在任何情况下,算法现在都是O(r),这似乎是最快的,除非发现了总和的简单数学表达式。

答案 1 :(得分:1)

请注意&#34;首先&#34;固定n的二项式系数为nC0。 让f(n) = nC0 + nC1 + ... + nC(r-1)。 使用&#34; Pascal的三角形&#34;身份,nCk = (n-1)C(k-1) + (n-1)Ck 我们有     

    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(n) = 2f(n-1) - (n-1)C(r-1) 所以每个总和都可以通过将前一个加倍并减去(n-1)C(r-1)来计算。

例如,如果是r=3,那么     

    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,
    
等等。

要执行计算模型,您需要预先计算二项式系数(n-1)C(r-1) mod m。如果m是素数,则二项式系数mod m是循环的,周期为m^km的幂大于r-1)。如果m是素数的幂,则结果会更复杂。 (参见http://www.dms.umontreal.ca/~andrew/PDF/BinCoeff.pdf。)如果m具有多个素数因子,则可以使用中国剩余定理将计算减少到先前的情况。