Самый быстрорастущий факториал (функция Покхаммера) в питоне - PullRequest
2 голосов
/ 03 августа 2011

Мне нужно вычислить возрастающий факториал больших чисел, лучшее, что я нашел до сих пор, это возрастающая факториальная функция из пакета 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)])

EDIT: с учетом возрастающего факториала 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]

Ответы [ 3 ]

4 голосов
/ 04 августа 2011

Попробуйте этот пакет: http://tnt.math.se.tmu.ac.jp/nzmath/

Как и было сказано в задании, вам нужна функция Стирлинга 1-го рода (я разработал рекурсивное определение и собирался опубликовать его, но не знал названия).

Функция nzmath.combinatorial.stirling1

3 голосов
/ 03 августа 2011

Другие версии, о которых я знаю, находятся в mpmath.qfunctions и scipy.special.orthogonal .

Если ни те, ни SymPy не достаточно быстрые, вы можете попробовать PyPy (другую реализацию Python), чтобы ускорить их. Если это не сработает, попробуйте Psyco (модуль расширения), Shedskin или Nuitka (компиляторы Python), Cython или запишите его на языке C.

2 голосов
/ 04 августа 2011

Это просто беззнаковые числа Стирлинга первого рода . У меня нет быстрого метода их вычисления, но вы, вероятно, могли бы использовать тот факт, что они следуют простым рекурсивным отношениям: S(n,k) = (n-1)*S(n-1,k) + S(n-1,k-1)

...