2010-10-18 14 views

Odpowiedz

5

To nie może być przeniesione do Python bezpośrednio jak definicja a[j] używa symbolicznego arytmetyczne cechę Mathematica.

a[j] jest w zasadzie współczynnikiem x j w rozszerzeniu serii tej racjonalnej funkcji wewnątrz Apart.

Załóżmy, że masz a[j], a następnie f[n] jest łatwe. Blok w Mathematica zasadniczo wprowadza zakres zmiennych. Pierwsza lista inicjuje zmienną, a reszta to wykonanie kodu. Więc

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

2

W symboliką można zrobić z sympy. W połączeniu z odpowiedzią KennyTM za coś takiego może być to, co chcesz:

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

Chociaż muszę przyznać, że f (n) nie działa (nie jestem bardzo dobry w Pythonie).

4

Stosując proponowane rozwiązania z poprzednich odpowiedziach odkryłem, że sympy niestety nie obliczyć siebie() racjonalnego natychmiast. Jakoś się myli. Co więcej, lista współczynników zwracanych przez * Poly.all_coeffs() * na pythonie ma inną semantykę niż lista Mathmatica. Stąd klauzula try-except w definicji a().

Następujący kod działa oraz wyjście dla niektórych badanych wartości zgadza się z odpowiedzi podane przez wzór Mathematica w Mathematicą 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]) 
Powiązane problemy