Python中的快速上升阶乘(Pochhammer函数)

2 投票
3 回答
2032 浏览
提问于 2025-04-16 22:49

我需要计算大数字的上升阶乘,到目前为止我找到的最好的是来自sympy包的上升阶乘函数sympy包,这个函数确实不错,但我还是希望能有更快的版本。

我具体需要的是这个的一个非常快速的版本:

from itertools import combinations
from numpy import prod

def my_rising_factorial(degree, elt):
    return sum([prod(i) for i in combinations(xrange(1,degree),elt)])

编辑:

给定一个上升阶乘,x(n) = x (x + 1)(x + 2)...(x + n-1),我想从它的展开公式中提取出某个特定的系数。

例如:

给定:x(6) = x(x + 1)(x + 2)(x + 3)(x + 4)(x + 5)(x + 6)

以及它的展开形式:x(6) = x**6 + 15*x**5 + 85*x**4 + 225*x**3 + 274*x**2 + 120*x

我想以某种方式得到这些系数中的一个(在这个例子中是1, 15, 85, 225, 274, 120)。

用“my_rising_factorial()”这个方法可以做到……但速度真的很慢。

>>>[my_rising_factorial(6,i) for i in xrange (6)]
[1.0, 15, 85, 225, 274, 120]

3 个回答

2

这些就是无符号的第一类斯特林数。我没有快速计算它们的方法,但你可以利用它们遵循的一个简单的递归关系来计算:S(n,k) = (n-1)*S(n-1,k) + S(n-1,k-1)

3

我知道的其他版本在 mpmath.qfunctionsscipy.special.orthogonal 这两个地方。

如果这些库的速度都不够快,或者SymPy也不够快,你可以试试PyPy(这是Python的另一种实现方式),它可以让运行速度更快。如果这样还是不行,可以尝试Psyco(一个扩展模块)、Shedskin或Nuitka(Python编译器)、Cython,或者直接用C语言来写。

4

试试这个包:http://tnt.math.se.tmu.ac.jp/nzmath/

就像之前提到的,你想要的函数是第一类斯特林数(我之前已经算出了递归定义,准备发出来,但我不知道这个名字)。

这个函数是 nzmath.combinatorial.stirling1

撰写回答