Eri*_*ver 8 python wolfram-mathematica
如何将这个Mathematica代码移植到Python?我不知道Mathematica语法,并且很难理解如何用更传统的语言描述它.

这不能直接移植到Python,因为定义a[j]使用Mathematica的符号算术功能.
a[j]基本上是除了内部有理函数的系列展开中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))
Run Code Online (Sandbox Code Playgroud)
(binomial是二项式系数.)
使用之前答案中提出的解决方案,我发现sympy遗憾地不会立即计算有理数的Apart() 。它不知何故变得混乱。此外,*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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5143 次 |
| 最近记录: |