您能简化二项式乘积的求和

时间:2019-01-07 23:40:56

标签: math binomial-coefficients

有没有一种方法可以简化以下术语:

sum(binom(m,i)* binom(n,i)*阶乘(i),i = 1..min(n,m))

其中binom是二项式系数。

谢谢!

1 个答案:

答案 0 :(得分:0)

由于这是stackoverflow,而不是math.stackexchange,因此仅合理地假设您计划实际实现一个程序来计算此总和。考虑到这一点,我将做一些通常在纯数学/假设环境下通常不会做的“简化”。

首先,要知道

binom(n, i) => factorial(n) / (factorial(i) * factorial(n - i))

将其加入您的等式中,我们可以抵消两个factorial(i)项。

factorial(n) * factorial(m) / ((factorial(i) * factorial(n - i) * factorial(m - i))

现在,如果我们创建一个函数product(a, b),该函数采用所有数字[a, b]的乘积,我们可以将这些阶乘分解为可抵消的范围。为了使以下代码段更简洁,我将阶乘缩写为fac,将乘积缩写为prod

fac(n)*fac(m) / (fac(i) * fac(n-i) * fac(m-i))
=> prod(m+1, n) * fac(m)**2 / (fac(i) * fac(n-i) * fac(m-i))
=> prod(m+1, n) * fac(m)**2 / (fac(i) * prod(m-i+1,n-i) * fac(m-i)**2)
=> prod(m+1, n) * prod(m-i+1,m)**2 / (fac(i) * prod(m-i+1,n-i))
=> prod(m+1, n) * prod(m-i+1,m) / (fac(i) * prod(m+1,n-i))
=> prod(n-i+1, n) * prod(m-i+1,m) / fac(i)

所以最后,我们有

product(n-i+1, n) * product(m-i+1,m) / factorial(i)

-需要很少的乘法运算。当然,现在,理想的计算方法不是评估我上面描述的函数,中间值仍然会很大。

第一种选择是开始将每个product()中的值相乘,并尝试从factorial()中除以较小的因子。但是,这可能会很耗时,因为与实际减少数量相比,检查可分割性将浪费更多的时间。

另一种选择是构造三个集合,代表每个函数调用中要相乘的数字。然后将product集之一与factorial集的交集,并从每个原始集中减去这些元素。然后,使用其他product集和新的factorial集重复此过程。然后像以前一样将每个集合中的值相乘。

一个更明智的选择是获取乘以product()factorial()的每个数字的质因式分解(也许通过查找表),然后简单地将{{ 1}}并减去product()。然后,您只需乘以每个素数的幂,就可以通过平方运算(甚至对于较小的幂和因数,甚至是查找表)通过幂运算来更快地计算出它们本身。