2

我需要计算大数的上升阶乘,到目前为止我发现的最好的是来自 sympy 包sympy package的上升阶乘函数,这非常好,但我仍然需要更快的东西。

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

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 + 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]
4

3 回答 3

4

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

就像工作说的那样,你想要的函数是第一类的斯特林数(我已经制定了递归定义并准备发布它,但我不知道它的名字)。

函数是 nzmath.combinatorial.stirling1

于 2011-08-04T17:12:09.483 回答
3

我知道的其他版本在mpmath.qfunctionsscipy.special.orthogonal中。

如果这些和 SymPy 都不够快,您可以尝试 PyPy(Python 的另一种实现)来加速它们。如果这不起作用,请尝试 Psyco(扩展模块)、Shedskin 或 Nuitka(Python 编译器)、Cython,或用 C 编写。

于 2011-08-03T18:09:54.607 回答
2

这些只是第一类无符号斯特林数。我没有快速计算它们的方法,但您可能会使用它们遵循简单递归关系的事实:S(n,k) = (n-1)*S(n-1,k) + S(n-1,k-1)

于 2011-08-04T16:23:11.177 回答