Mô Phỏng Tính Toán Lượng Bằng Python: Hướng Dẫn Sử Dụng Qiskit-Aer
Bài viết này cung cấp hướng dẫn chi tiết về cách thiết lập môi trường Python và sử dụng thư viện Qiskit của IBM để chạy các thí nghiệm tính toán lượng tử trên máy tính cục bộ. Người đọc sẽ được hướng dẫn xây dựng các mạch lượng tử cơ bản, áp dụng các cổng điều khiển như cổng Hadamard và thực hiện các phép đo kết quả thông qua mô phỏng.

Tính toán lượng tử (Quantum Computing) là lĩnh vực công nghệ sử dụng các nguyên lý của cơ học lượng tử, cụ thể là siêu vị trí (Superposition) và liên kết (Entanglement), để xử lý thông tin theo một cách hoàn toàn khác biệt so với máy tính cổ điển. Đơn giản hóa, thay vì chỉ sử dụng bit (0 hoặc 1), máy tính lượng tử sử dụng qubit để giải quyết các bài toán phức tạp trong hóa học, khoa học vật liệu và tối ưu hóa, với tốc độ có thể vượt xa các giải pháp truyền thống.
Trong thực tế, các bài toán được giải quyết bằng cách xây dựng các mô hình toán học gọi là mạch lượng tử (quantum circuits): một chuỗi các phép toán và lệnh nhận đầu vào và trả về kết quả (tương tự như hồi quy tuyến tính hay mạng nơ-ron). Trong tính toán lượng tử, các phép toán này được gọi là cổng (gates) thay đổi trạng thái của qubit. Cơ bản mà nói, một mạch là một câu, và các cổng là những từ ngữ cấu thành nên câu đó.
Mạch lượng tử được sử dụng để chạy các thí nghiệm. Cụ thể, có 2 loại mô phỏng lượng tử:
- Mô phỏng máy tính lượng tử bằng máy tính thông thường: Sử dụng Python để viết mạch và một bộ giả lập để chạy nó, trong khi máy tính lượng tử thực tế sẽ hiện thực hóa mạch vật lý.
- Mô phỏng hệ thống lượng tử thực tế: Sử dụng máy tính lượng tử để mô phỏng các hệ thống tự nhiên như nguyên tử hoặc electron. Máy tính cổ điển gặp khó khăn khi mô phỏng hệ thống này do không gian trạng thái tăng theo cấp số nhân, trong khi máy móc lượng tử có thể mô hình hóa chúng hiệu quả hơn.
Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách chạy một mô phỏng lượng tử trên máy tính của mình. Bài viết này là phần tiếp theo của "Hướng dẫn dành cho người mới bắt đầu về Tính toán lượng tử với Python".
Hình minh họa về mạch lượng tử và các cổng điều khiển
Đầu tiên, chúng ta cần cài đặt Qiskit (pip install qiskit), một thư viện mã nguồn mở làm việc với máy tính lượng tử do IBM phát triển, cho phép bạn mô phỏng thiết bị lượng tử trên máy tính cục bộ của mình.
Đoạn mã cơ bản nhất có thể viết là tạo một mạch lượng tử (môi trường tính toán lượng tử) chỉ có một qubit và khởi tạo nó bằng 0. Để đo trạng thái của qubit, chúng ta cần một statevector (vector trạng thái), nó cho biết thực tại lượng tử hiện tại của mạch.
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
q = QuantumCircuit(1,0) # mạch có 1 qubit và 0 bit cổ điển
state = Statevector.from_instruction(q) # đo trạng thái
state.probabilities() # in xác suất %
Nghĩa là xác suất để qubit là 0 (phần tử đầu tiên) là 100%, và xác suất để qubit là 1 (phần tử thứ hai) là 0%. Hãy hình dung trạng thái này:
Hình minh họa quả cầu Bloch
Một cổng lượng tử là một phép toán đơn lẻ thay đổi trạng thái lượng tử. Một mạch lượng tử là chuỗi các cổng được áp dụng lên các qubit theo thời gian.
Hãy bắt đầu xây dựng một mạch đơn giản. Đầu tiên, vẽ mạch:
q = QuantumCircuit(1,0) # mạch với 1 qubit
q.draw(output="mpl", scale=0.7) # hiển thị mạch với matplotlib
Chúng ta có một qubit, nhưng để đo nó, chúng ta cần thêm một bit cổ điển vào mạch.
q = QuantumCircuit(1,1) # thêm 1 bit cổ điển
q.draw(output="mpl", scale=0.7)
Để xây dựng một mạch, bạn cần biết mình muốn đạt được kết quả gì, hoặc nói cách khác, bạn cần biết các cổng và chức năng của chúng. Cách tiếp cận tương tự như các mạng nơ-ron: bạn chỉ cần xếp chồng các lớp lên nhau để đạt được kết quả mong muốn. Phép toán phổ biến nhất là Cổng Hadamard (cổng H), nó áp dụng siêu vị trí cho một qubit.
q = QuantumCircuit(1,1)
q.h(0) # Cổng Hadamard (Siêu vị trí)
q.draw(output="mpl", scale=0.7)
Từ hình ảnh, chúng ta thấy cổng H màu đỏ được áp dụng cho qubit, chuyển nó từ trạng thái xác định là 0 thành sự hỗn hợp 50/50 giữa 0 và 1. Hãy thêm một hộp đo, làm cho siêu vị trí này sụp đổ thành một giá trị thực tế (0 hoặc 1), bằng cách lưu kết quả đó vào bit cổ điển.
q = QuantumCircuit(1,1)
q.h(0)
q.measure(qubit=0, cbit=0) # đo qubit bằng bit cổ điển
q.draw(output="mpl", scale=0.7)
Mạch này đã được thiết kế toán học bởi máy tính cổ điển của tôi như khi viết trên giấy, nhưng nó chưa được thực thi.
Biểu đồ phân phối kết quả mô phỏng
Một mô phỏng lượng tử là khi bạn sử dụng máy tính để mô hình hóa hành vi của một hệ thống lượng tử. Nếu bạn viết một mạch (như tôi đã làm ở trên), bạn chỉ đang mô tả mô hình toán học. Để chạy nó, bạn cần một engine backend thực thi mạch lượng tử trong mô phỏng.
Qiskit-Aer (pip install qiskit-aer) là engine thực thi các mạch lượng tử trong mô phỏng. Aer cho phép bạn chạy các mạch lượng tử trên máy tính của mình, mô phỏng các khía cạnh khác nhau của phần cứng lượng tử thực tế (trạng thái lượng tử, đo lường, hệ thống nhiễu).
Tôi sẽ chạy thí nghiệm với mạch đã viết ở trên (một bit cổ điển + một qubit trong siêu vị trí) 1000 lần.
from qiskit_aer import AerSimulator
sim = AerSimulator()
result = sim.run(q, shots=1000).result()
result.get_counts()
Qubit được đo 1000 lần, kết quả là 1 ở 500 lần và 0 ở 500 lần còn lại. Chúng ta có thể hình dung nó:
from qiskit.visualization import plot_histogram
plot_histogram(result.get_counts(),
figsize=(5,4), color="black", title="1-qubit trong siêu vị trí")
Kết quả hoàn toàn cân bằng vì Aer có thể mô phỏng các trạng thái lượng tử hoàn hảo, điều mà phần cứng thực tế khó đạt được. Trong thế giới thực, thông tin lượng tử cực kỳ mong manh và hoạt động dựa trên giả định rằng hệ thống hoàn hảo và ổn định, cho phép các hạt tồn tại trong nhiều trạng thái (tính nhất quán). Nhưng ngay khi qubit tương tác với bất cứ thứ gì, như nhiệt hay rung động, hệ thống mất sự hài hòa và các tính chất lượng tử (tính suy giảm).
Do đó, bạn chỉ có thể hình dung một qubit trong siêu vị trí (cả 0 và 1 cùng lúc) trong mô phỏng, nhưng không bao giờ trong thế giới thực. Vì ngay khi bạn quan sát qubit, bạn mang theo nhiễu và hệ thống sụp đổ thành một con số duy nhất (0 hoặc 1). Trong thực tế, máy tính lượng tử thực tế chỉ để đo kết quả, trong khi mô phỏng được sử dụng để thiết kế các mô hình lượng tử.
Để làm thí nghiệm thực tế hơn, bạn có thể thêm nhiễu vào mô phỏng.
from qiskit_aer import noise
n = noise.NoiseModel()
error = noise.depolarizing_error(param=0.10, num_qubits=1) # xác suất lỗi 10%
n.add_all_qubit_quantum_error(error=error, instructions=['h'])
sim = AerSimulator(noise_model=n)
result = sim.run(q, shots=1000).result()
plot_histogram(result.get_counts(),
figsize=(5,4), color="black", title="1-qubit trong siêu vị trí")
Bài viết này là một hướng dẫn để giới thiệu mô phỏng lượng tử với Python và Qiskit. Chúng ta đã học được sự khác biệt giữa phần cứng thực tế và thí nghiệm lượng tử. Chúng ta cũng đã học cách thiết kế các mạch lượng tử và chạy một mô phỏng trên máy tính cổ điển.
Bạn có thể tìm thấy toàn bộ mã cho bài viết này tại: GitHub.
Hy vọng bạn đã thích bài viết này! Hãy liên hệ với tôi nếu có câu hỏi hoặc phản hồi, hoặc chỉ đơn giản là chia sẻ các dự án thú vị của bạn.
Bài viết liên quan

Công nghệ
George Orwell đã tiên đoán sự trỗi dậy của "rác thải AI" trong tác phẩm 1984
16 tháng 4, 2026

Phần mềm
Anthropic ra mắt Claude Opus 4.7: Nâng cấp mạnh mẽ cho lập trình nhưng vẫn thua Mythos Preview
16 tháng 4, 2026

Công nghệ
Qwen3.6-35B-A3B: Quyền năng Lập trình Agentic, Nay Đã Mở Cửa Cho Tất Cả
16 tháng 4, 2026
