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