2010-10-18 24 views

Trả lời

5

này không thể được chuyển đến Python trực tiếp như định nghĩa a[j] sử dụng tính năng Arithmetic tượng trưng của Mathematica.

a[j] về cơ bản là hệ số x j trong chuỗi mở rộng của hàm hợp lý bên trong Ngoài.

Giả sử bạn có a[j], sau đó f[n] thật dễ dàng. Một khối trong Mathematica về cơ bản giới thiệu một phạm vi cho các biến. Danh sách đầu tiên khởi tạo biến và phần còn lại là thực thi mã. Vì vậy,

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

(binomialBinomial coefficient.)

2

Các biễu tượng có thể được thực hiện với sympy. Kết hợp với câu trả lời của KennyTM, một cái gì đó như thế này có thể là những gì bạn muốn:

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

Mặc dù tôi phải thừa nhận rằng f (n) không hoạt động (tôi không giỏi Python).

4

Sử dụng các giải pháp được đề xuất từ ​​các câu trả lời trước đây mà tôi thấy rằng sympy thật đáng buồn là không tính cách nhau() của lý do ngay lập tức. Nó bằng cách nào đó bị lẫn lộn. Hơn nữa, danh sách python của các hệ số được trả về bởi * Poly.all_coeffs() * có một ngữ nghĩa khác với một danh sách Mathmatica. Do đó, mệnh đề try-except trong định nghĩa của a().

Các mã sau đây không làm việc và đầu ra, đối với một số giá trị thử nghiệm, đồng ý với câu trả lời được đưa ra bởi công thức Mathematica trong 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])