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