Mathematica для Python - PullRequest
       6

Mathematica для Python

8 голосов
/ 18 октября 2010

Как этот код Mathematica можно перенести на Python?Я не знаю синтаксиса Mathematica, и мне трудно понять, как это описано на более традиционном языке.

mathematica code

Источник (стр. 5): http://subjoin.net/misc/m496pres1.nb.pdf

Ответы [ 3 ]

6 голосов
/ 18 октября 2010

Это нельзя перенести на Python напрямую, так как определение a[j] использует символьную арифметическую функцию Mathematica.

a[j] - это, в основном, коэффициент x j в последовательном расширении этой рациональной функции внутри Apart.

Предположим, у вас есть a[j], тогда f[n] легко. Блок в Mathematica в основном вводит область видимости для переменных. Первый список инициализирует переменную, а остальное - выполнение кода. Так

from __future__ import division
def f(n):
  v = n // 5
  q = v // 20
  r = v % 20
  return sum(binomial(q+5-j, 5) * a[r+20*j] for j in range(5))

(binomial - это Биномиальный коэффициент .)

4 голосов
/ 25 ноября 2011

Используя предложенные решения из предыдущих ответов, я обнаружил, что sympy , к сожалению, не вычисляет отдельно () от рационального сразу.Это как-то запутано.Более того, список коэффициентов в Python, возвращаемый функцией * Poly.all_coeffs () *, имеет семантику, отличную от списка Mathmatica.Отсюда и предложение try-исключением в определении a () .

Следующий код работает, и вывод для некоторых проверенных значений совпадает с ответами, данными формулой Mathematica в Mathematica 7:

from __future__ import division
from sympy import expand, Poly, binomial, apart
from sympy.abc import x

A = Poly(apart(expand(((1-x**20)**5)) / expand((((1-x)**2)*(1-x**2)*(1-x**5)*(1-x**10))))).all_coeffs()

def a(n):
    try:
        return A[n]
    except IndexError:
        return 0

def f(n):
    v = n // 5
    q = v // 20
    r = v % 20
    return sum(a[r+20*j]* binomial(q+5-j, 5) for j in range(5))

print map(f, [100, 50, 1000, 150])
2 голосов
/ 18 октября 2010

Символику можно сделать с помощью sympy .В сочетании с ответом KennyTM что-то вроде этого может быть тем, что вам нужно:

from __future__ import division
from sympy import Symbol, apart, binomial

x = Symbol('x')
poly = (1-x**20)**5 / ((1-x)**2 * (1-x**2) * (1-x**5) * (1-x**10))
poly2 = apart(poly,x)

def a(j):
    return poly2.coeff(x**j)

def f(n):
    v = n // 5
    q = v // 20
    r = v % 20
    return sum(binomial(q+5-j, 5)*a(r+20*j) for j in range(5))

Хотя я должен признать, что f (n) не работает (я не очень хорош в Python).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...