在这篇文章中,我们介绍了一些可以(相当)有效地计算二项式系数的漂亮数学,然后我们将比较我们介绍的方法与 MatLab 实现的效率。
首先,二项式系数定义为:
在哪里!表示n的阶乘。作为问题的介绍,我们将解释 MatLab 如何使用nchoosek函数计算此操作。
nchoosek函数_
此函数接受两个输入n和k,并返回它们的二项式系数(从 n 中选择 k 元素的方法数)。计算以两种不同的方式执行,具体取决于n是否可以表示为 64 位整数。
如果n可以表示为一个 64 位整数并假设k < n/2(这个假设并不意味着由于公式的对称性而失去一般性)然后它简化了表达式n!/(nk)! . 因此,为了获得结果而要计算的表达式是(n-k+1)⋅…⋅n/k!. 最新的表达式是通过分解分母中的每个元素并将该元素除以可被该因子整除的分子来计算的。这是在 nchoosek.m 的第 133-145 行执行的。
如果n需要双重表示,则计算如下进行。假设k < n/2,它简化了n!/(nk)! 所以应该计算的值是(n-k+1)⋅…⋅n/k!. 为了避免较大的数值误差,其余计算按(n-k+1)/1 ⋅ (n-k+2)/2 ⋅…⋅n/k执行。这是在 nchoosek.m 的第 86-89 行执行的。
MatLab的实现依赖于化简很大一部分分数,然后对剩余的因数进行算术运算。
一种不同的方法
很明显,输入n和k以及输出都是整数. 这允许一些数学魔