2010-10-18 14 views

risposta

5

Questo non può essere portato su Python direttamente come la definizione a[j] utilizza la funzione aritmetica simbolica di Mathematica.

a[j] è fondamentalmente il coefficiente di x j nell'espansione di serie di quella funzione razionale all'interno di Apart.

Si supponga di avere a[j], quindi f[n] è facile. Un blocco in Mathematica introduce fondamentalmente uno scope per variabili. Il primo elenco inizializza la variabile e il resto è l'esecuzione del codice. Così

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 è il Binomial coefficient.)

2

Gli emblemi può essere fatto con sympy. In combinazione con la risposta di KennyTM, qualcosa di simile a questo potrebbe essere ciò che si desidera:

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

Anche se devo ammettere che f (n) non funziona (io non sono molto bravo a Python).

4

Utilizzando le soluzioni proposte dalle risposte precedenti ho scoperto che sympy purtroppo non calcola il a parte() del razionale immediatamente. In qualche modo si confonde. Inoltre, l'elenco di coefficienti python restituito da * Poly.all_coeffs() * ha una semantica diversa da una lista Mathmatica. Da qui la clausola try-except nella definizione di a().

Il codice seguente funziona e l'uscita, per alcuni valori testati, concorda con le risposte fornite dalla formula 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])