Luôn có hai căn bậc hai thực của một số dương. Ví dụ, nếu x² = 25, x là ±5. Tuy nhiên, nếu x² = -25, căn thực không tồn tại. Căn bậc hai của số âm là căn bậc hai của giá trị tuyệt đối nhân với đơn vị ảo j = √(-1).
Do đó √(-25) = √25 × √(-1) = 5j
Số phức gồm phần thực và phần ảo. Diễn diễn dưới dạng x+yj. Cả x và y là số thực. Y nhân với đơn vị ảo tạo phần ảo của số phức.
Ví dụ: 3+2j, 10-5.5J, 9.55+2.3j, 5.11e-6+4j
Python có kiểu dữ liệu complex tích hợp sẵn. Đối tượng số phức có thể tạo bằng biểu diễn literal:
>>> x = 2+3j >>> type(x)
Đối tượng số phức có hai thuộc tính real (trả về phần thực) và imag (trả về phần ảo trừ đơn vị ảo j)
>>> x.real 2.0 >>> x.imag 3.0
Nó cũng có phương thức conjugate(). Số phức liên hợp (conjugate) có cùng phần thực và phần ảo nhưng dấu ngược lại. Do đó conjugate của 2+3j là 2-3j
>>> x.conjugate() (2-3j)
Python cũng có hàm built-in complex() trả về đối tượng số phức. Hàm nhận hai tham số, mỗi cái cho phần thực và phần ảo. Chúng có thể là bất kỳ kiểu số nào (int, float, complex)
>>> complex(9,5) (9+5j) >>> complex(-6, -2.5) (-6-2.5j) >>> complex(1.5j, 2.5j) (-2.5+1.5j)
Nếu chỉ cho một tham số, nó được coi là phần thực, phần ảo mặc định bằng 0.
>>> complex(15) (15+0j)
Hàm cũng chấp nhận chuỗi làm đối số nếu chuỗi chứa biểu diễn số.
>>> complex('51') (51+0j) >>> complex('1.5') (1.5+0j) Cộng và trừ số phức tương tự như số nguyên hoặc float. Phần thực và phần ảo được cộng/trừ riêng biệt.
>>> a = 6+4j >>> b = 3+6j >>> a+b (9+10j) >>> a-b (3-2j)
Với nhân, xem số phức như nhị thức và nhân từng hạng tử trong số thứ nhất với từng hạng tử trong số thứ hai.
a = 6+4j b = 3+2j c = a*b c = (6+4j)*(3+2j) c = (18+12j+12j+8*-1) c = 10+24j
Trong Python console kết quả xác nhận điều này –
>>> a = 6+4j >>> b = 3+2j >>> a*b (10+24j)
Chia số phức làm như sau –
Hai số là
a = 2+4j
b = 1-2j
Muốn tính a/b.
Lấy conjugate của mẫu số là 1+2j
Nhân tử và mẫu số cùng nhân với conjugate của mẫu số để có kết quả phép chia
c = a/b c = (2+4j)*(1+2j)/(1-2j)(1+2j) c = (2+4j+4j+8*-1)/(1+2j-2j-4*-1) c = (-6+8j)/5 c = -1.2+1.6j
Phiên làm việc Python console sau xác nhận điều trên.
>>> a = 2+4j >>> b = 1-2j >>> a/b (-1.2+1.6j)
Module cmath
Các hàm toán học trong module math của thư viện chuẩn Python xử lý số thực (floating point). Cho số phức, thư viện Python chứa module cmath.
Số phức z = x+yj là biểu diễn Descartes (Cartesian). Nội bộ nó biểu diễn bằng tọa độ cực (polar coordinates) với modulus r (như hàm built-in abs() trả về) và góc pha Φ (phi) là góc ngược chiều kim đồng hồ tính bằng radian, giữa trục x và đoạn nối x với gốc tọa độ. Sơ đồ sau minh họa biểu diễn cực của số phức –

Các hàm trong module cmath cho phép chuyển đổi biểu diễn Descartes sang cực và ngược lại.
polar() – Hàm này trả về biểu diễn cực của ký pháp Descartes của số phức. Giá trị trả về là tuple gồm modulus và phase.
>>> import cmath >>> a = 2+4j >>> cmath.polar(a) (4.47213595499958, 1.1071487177940904)
Lưu ý modulus được trả về bởi hàm abs()
>>> abs(a) 4.47213595499958
phase() – Hàm này trả về góc ngược chiều kim đồng hồ giữa trục x và đoạn nối a với gốc. Góc dùng radian, nằm giữa π và -π
>>> cmath.phase(a) 1.1071487177940904 z = x+yj Φ
rect() – Hàm này trả về biểu diễn Descartes của số phức dưới dạng cực (modulus và phase)
>>> cmath.rect(4.47213595499958, 1.1071487177940904) (2.0000000000000004+4j)
Module cmath chứa các hàm thay thế cho tất cả hàm toán học trong module math. Có hàm lượng giác và logarit như giải thích dưới –
cmath.sin() – Trả về tỷ số sin lượng giác cho góc pha dùng radian.
>>> import cmath >>> a = 2+4j >>> p = cmath.phase(a) >>> cmath.sin(p) (0.8944271909999159+0j)
Tương tự, các hàm cho tỷ số khác cos(), tan(), asin(), acos(), atan() cũng được định nghĩa trong cmath.
cmath.exp() – Tương tự math.exp(), hàm này trả về e^x với x là số phức và e = 2.71828
>>> cmath.exp(a) (-1.1312043837568135+2.4717266720048188j)
cmath.log10() – Tính log của số phức lấy cơ số 10
>>> a = 1+2j >>> cmath.log10(a) (0.3494850021680094+0.480828578784234j)
cmath.sqrt() – Trả về căn bậc hai của số phức.
>>> cmath.sqrt(a) (1.272019649514069+0.7861513777574233j)
Trong bài này, ta học các tính năng quan trọng của kiểu dữ liệu số phức Python và cách thực hiện phép toán số học trên nó. Cũng khám phá các hàm trong module cmath.