有没有一种方法可以简化以下术语:
sum(binom(m,i)* binom(n,i)*阶乘(i),i = 1..min(n,m))
其中binom是二项式系数。
谢谢!
答案 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()
。然后,您只需乘以每个素数的幂,就可以通过平方运算(甚至对于较小的幂和因数,甚至是查找表)通过幂运算来更快地计算出它们本身。