[英]Mathematica to Python
如何將這個Mathematica代碼移植到Python? 我不知道Mathematica語法,並且很難理解如何用更傳統的語言描述它。
來源(第5頁): http : //subjoin.net/misc/m496pres1.nb.pdf
這不能直接移植到Python,因為定義a[j]
使用Mathematica的符號算術功能。
a[j]
基本上是在Apart內部的有理函數的級數展開中的x j的系數。
假設你有a[j]
,那么f[n]
很容易。 Mathematica中的Block基本上引入了變量的范圍。 第一個列表初始化變量,其余的是代碼的執行。 所以
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
是二項式系數 。)
使用前面答案中提出的解決方案,我發現, 很少有人能夠直接計算理性的分離() 。 它有點混淆。 此外,* Poly.all_coeffs()*返回的python系數列表具有與Mathmatica列表不同的語義。 因此a()的定義中的try-except子句。
以下代碼確實有效,對於某些測試值,輸出與Mathematica 7中Mathematica公式給出的答案一致:
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])
符號可以用同情來完成。 結合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)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.