Python有一个计算多项系数的函数吗?

Rei*_*tin 10 python combinatorics scipy

我正在寻找一个计算多项系数的Python库函数.

我在任何标准库中都找不到任何这样的函数.对于二项式系数(其中多项系数是一般化),有scipy.special.binomscipy.misc.comb.此外,numpy.random.multinomial从多项分布中抽取样本,并且sympy.ntheory.multinomial.multinomial_coefficients返回与多项式系数相关的字典.

不过,我也没有找到一个多项式系数正确发挥作用,这给A,B,...,Z回报(A + B + ... + Z)!/(A!b!... Z!).我错过了吗?有没有可用的充分理由?

我很乐意为SciPy做出有效的实施.(我必须弄清楚如何贡献,因为我从未这样做过).

对于背景,它们在扩展时会出现(a + b + ... + z)^ n.此外,他们的指望沉积的方法A + B + ... + Z不同的对象到不同的垃圾箱,使得第一箱包含一个对象,等我需要他们偶尔的项目欧拉问题.

顺便说一句,其他语言确实提供这个功能:Mathematica,MATLAB,Maple.

Mar*_*rco 7

不,Python 中没有内置的多项式库或函数。

无论如何,这次数学可以帮助你。事实上,计算多项式的简单方法

关注性能是通过使用多项式系数的特征作为二项式系数的乘积来重写它:

当然在哪里

多亏scipy.special.binom了递归的魔力,你可以解决这样的问题:

from scipy.special import binom

def multinomial(params):
    if len(params) == 1:
        return 1
    return binom(sum(params), params[-1]) * multinomial(params[:-1])
Run Code Online (Sandbox Code Playgroud)

哪里params = [n1, n2, ..., nk]

注意:将多项式拆分为二项式的乘积通常也有助于防止溢出。


Rei*_*tin 5

为了部分回答我自己的问题,这是我对多项函数的简单而高效的实现:

def multinomial(lst):
    res, i = 1, 1
    for a in lst:
        for j in range(1,a+1):
            res *= i
            res //= j
            i += 1
    return res
Run Code Online (Sandbox Code Playgroud)

从目前的评论看来,在任何标准库中都没有有效的功能实现。由于这很麻烦,因此我将尝试将代码贡献给SymPy(而不是SciPy,因为他们对scipy.special.binom的实现返回的是浮点数,而不是整数,我不喜欢整数值函数)。

  • 这当然取决于你想要做什么。你不会用这种方法解决任何(3 位)Project Euler 问题 (3认同)