你写道
"sympy.ntheory.multinomial.multinomial_coefficients
返回与多项式系数相关的字典",但从该评论中并不清楚你是否知道如何从该字典中提取特定的系数。使用维基百科链接中的符号,SymPy函数为给定的
m和
n提供了
所有的多项式系数。如果你只想要一个特定的系数,只需从字典中提取即可:
In [39]: from sympy import ntheory
In [40]: def sympy_multinomial(params):
...: m = len(params)
...: n = sum(params)
...: return ntheory.multinomial_coefficients(m, n)[tuple(params)]
...:
In [41]: sympy_multinomial([1, 2, 3])
Out[41]: 60
In [42]: sympy_multinomial([10, 20, 30])
Out[42]: 3553261127084984957001360
Busy Beaver提供了一个用scipy.special.binom
编写的答案。这种实现的潜在问题在于binom(n, k)
返回一个浮点数值。如果系数足够大,它将不是精确值,因此它可能无法帮助您解决Project Euler问题。您可以使用scipy.special.comb
代替binom
,并使用参数exact=True
。这是Busy Beaver的函数,修改后使用comb
:
In [46]: from scipy.special import comb
In [47]: def scipy_multinomial(params):
...: if len(params) == 1:
...: return 1
...: coeff = (comb(sum(params), params[-1], exact=True) *
...: scipy_multinomial(params[:-1]))
...: return coeff
...:
In [48]: scipy_multinomial([1, 2, 3])
Out[48]: 60
In [49]: scipy_multinomial([10, 20, 30])
Out[49]: 3553261127084984957001360