2010-10-18 14 views

Respuesta

5

Esto no puede ser portado a Python directamente como la definición a[j] utiliza la función aritmética simbólica de Mathematica.

a[j] es básicamente el coeficiente de x j en la expansión en serie de esa función racional dentro de Apart.

Suponga que tiene a[j], a continuación, f[n] es fácil. Un bloque en Mathematica básicamente introduce un alcance para las variables. La primera lista inicializa la variable, y el resto es la ejecución del código. Así

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 es el Binomial coefficient.)

2

la simbólica se puede hacer con sympy. En combinación con la respuesta de KennyTM, algo como esto podría ser lo que quiere:

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

Aunque tengo que admitir que f (n) no funciona (no soy muy bueno en Python).

4

Utilizando las soluciones propuestas a partir de las respuestas anteriores que he encontrado que sympy lamentablemente no computa el aparte() de lo racional inmediatamente. De alguna manera se confunde. Además, la lista de coeficientes python devueltos por * Poly.all_coeffs() * tiene una semántica diferente a la de una lista Mathmatica. De ahí la cláusula try-except-en la definición de a().

El siguiente código hace el trabajo y la salida, para algunos valores probados, está de acuerdo con las respuestas dadas por la fórmula Mathematica en 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])