2011-09-13 56 views
8

Có thể tính được các gốc phức tạp của một số đã cho bằng Python không? Tôi đã một thời gian ngắn kiểm tra nó, và có vẻ như Python mang lại cho tôi sai/câu trả lời không đầy đủ:Python - cách tính tất cả các gốc thứ n của một số?

(-27.0j)**(1.0/3.0) sản xuất (2.598076211353316-1.4999999999999998j)

nhưng rễ thích hợp nên 3 số phức tạp, vì mỗi khác không số có số phức tạp n khác nhau rễ thứ n. Có thể bằng Python?

+0

liên quan: [Cách tính toán gốc thứ n của một số nguyên rất lớn trong python] (http://stackoverflow.com/questions/356090/how-to-compute-the-nth- root-of-a-rất-big-integer-in-python) [không phải là một dupe bởi vì trong câu hỏi này OP không muốn số nguyên, nhưng bất kỳ số nào] – amit

+2

Trên thực tế, không có gốc rễ nào - chúng chỉ giống nhau :) –

+0

@amit: đây hoàn toàn là một câu hỏi khác, từ khóa là "tất cả các gốc" – psihodelia

Trả lời

0

Nếu bạn muốn để có được tất cả các rễ trên python sạch bạn có thể tạo chức năng đơn giản để thực hiện việc này:

import math 

def root(num, r): 
    base = num ** (1.0/r) 
    roots = [base] 
    for i in range(1, r): 
     roots.append(complex(base * math.cos(2*math.pi * i/r), base * math.sin(2*math.pi * i/r))) 
    return roots 
4

Có nhiều hàm giá trị đa chức năng có thể có nhiều hơn một giá trị tương ứng với bất kỳ điểm nào trong miền của chúng. Ví dụ: rễ, lôgarit, hàm lượng giác ngược ...

Lý do các chức năng này có thể có nhiều giá trị thường là vì chúng là nghịch đảo của hàm có nhiều giá trị trong bản đồ miền với cùng giá trị.

Khi thực hiện tính toán với các chức năng như vậy, sẽ không thực tế khi luôn trả về tất cả các giá trị có thể có. Đối với hàm lượng giác ngược, có vô số giá trị có thể có.

Thông thường các giá trị hàm khác nhau có thể được biểu diễn dưới dạng hàm của tham số nguyên k. Ví dụ: giá trị của log z với z = r*(cos t + i*sin tlog r + i*(t + k*2*pi) với k bất kỳ số nguyên nào. Đối với gốc thứ n, nó là r**(1/n)*exp(i*(t+k*2*pi)/n với k=0..n-1 bao gồm.

Vì trả về tất cả các giá trị có thể là không thực tế, các hàm toán học trong Python và hầu như tất cả các ngôn ngữ lập trình phổ biến khác trả về giá trị chính của hàm. (reference) Giá trị chính thường là giá trị hàm với k = 0. Bất kỳ sự lựa chọn nào được thực hiện, cần được nêu rõ trong tài liệu.

Vì vậy, để có được tất cả các rễ phức tạp của một số phức tạp, bạn chỉ cần đánh giá chức năng cho tất cả các giá trị có liên quan của k:

def roots(z, n): 
    nthRootOfr = abs(z)**(1.0/n) 
    t = phase(z) 
    return map(lambda k: nthRootOfr*exp((t+2*k*pi)*1j/n), range(n)) 

(Bạn sẽ cần phải nhập khẩu các mô-đun cmath để làm công việc này.) Điều này cho biết:

>>> roots(-27j,3) 
[(2.59808-1.5j), (1.83691e-16+3j), (-2.59808-1.5j)] 
Các vấn đề liên quan