Mathematica到Python

Eri*_*ver 8 python wolfram-mathematica

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

mathematica代码

来源(第5页):http://subjoin.net/misc/m496pres1.nb.pdf

ken*_*ytm 6

这不能直接移植到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二项式系数.)


nan*_*ous 5

使用之前答案中提出的解决方案,我发现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)