2010-10-18 4 views

Antwort

5

Dies kann nicht auf Python direkt als Definition portiert werden a[j] verwendet die symbolische Arithmetik Funktion von Mathematica.

a[j] ist im Grunde der Koeffizient von x j in der Reihenentwicklung dieser rationalen Funktion innerhalb Apart.

Angenommen, Sie haben a[j], dann f[n] ist einfach. Ein Block in Mathematica führt einen Bereich für Variablen ein. Die erste Liste initialisiert die Variable und der Rest ist die Ausführung des Codes. So

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 ist die Binomial coefficient.)

2

Die symbolics mit sympy erfolgen. In Kombination mit KennyTM Antwort, so etwas wie das sein könnte, was Sie wollen:

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)) 

Obwohl ich, dass f zugeben (n) nicht funktioniert (ich Python bin nicht sehr gut).

4

die vorgeschlagenen Lösungen aus den früheren Antworten Mit fand ich, dass sympy leider nicht sofort auseinander() der rational nicht berechnen. Es wird irgendwie verwirrt. Außerdem hat die von * Poly.all_coeffs() * zurückgegebene Python-Liste der Koeffizienten eine andere Semantik als eine Mathmatica-Liste. Daher die try-except-Klausel in der Definition von a().

Der folgende Code funktioniert und die Ausgabe für einige getestet Werte, stimmt mit den von der Mathematica Formel Antworten in 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])