2010-10-18 4 views

Répondre

5

Cela ne peut pas être porté sur Python directement la définition a[j] utilise la fonction Arithmétique symbolique de Mathematica.

a[j] est fondamentalement le coefficient de x j dans l'expansion en série de cette fonction rationnelle à l'intérieur de Apart. Si vous avez a[j], alors f[n] est facile. Un bloc dans Mathematica introduit fondamentalement une portée pour les variables. La première liste initialise la variable et le reste est l'exécution du code. Alors

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 est le Binomial coefficient.)

2

Les symbolics peut être fait avec sympy. Combiné avec la réponse de KennyTM, quelque chose comme cela pourrait être ce que vous voulez:

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

Même si je dois admettre que f (n) ne fonctionne pas (je ne suis pas très bon à Python).

4

En utilisant les solutions proposées par les réponses précédentes je trouve que sympy ne malheureusement calcule pas la à part() du rationnel immediat. Il devient en quelque sorte confus. De plus, la liste python des coefficients retournés par * Poly.all_coeffs() * a une sémantique différente de celle d'une liste Mathmatica. D'où la clause try-except-dans la définition de a().

Le code suivant fonctionne et la sortie, pour certaines valeurs testées, est d'accord avec les réponses données par la formule 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])