Tôi muốn tạo một cổng Toffoli được điều khiển bởi n qubit và triển khai nó trong QISKit. Điều này có thể được thực hiện? Nếu vậy thì thế nào?
Tôi muốn tạo một cổng Toffoli được điều khiển bởi n qubit và triển khai nó trong QISKit. Điều này có thể được thực hiện? Nếu vậy thì thế nào?
Câu trả lời:
Một cách đơn giản để làm điều này được minh họa trong Hình 4.10 của Nielsen & Chuang.
Trong đó U có thể là bất kỳ phép quay qubit đơn nào (trong trường hợp này là cổng X).
Mạch này hoạt động như thế này: Chúng tôi chỉ muốn áp dụng U cho qubit mục tiêu nếu AND của tất cả các qubit kiểm soát là 1. Một Toffoli bình thường cung cấp cho chúng tôi AND của 2 qubit. Vì vậy, bằng cách kết nối một vài Toffolis, chúng ta có thể nhận được c1.c2.c3.c4.c5, với điều kiện là một số qubit "hoạt động" (hoặc ancilla) đã được giới thiệu để lưu trữ kết quả trung gian. Sau khi áp dụng CU cuối cùng, chúng tôi nhận được kết quả cuối cùng trong mục tiêu. Bây giờ chúng ta có thể dọn sạch các qubit công việc trung gian bằng cách hoàn tác các tính toán của chúng, đưa chúng trở về trạng thái | 0>. Mô hình này tính toán đảo ngược được gọi là phương pháp "tính toán-copy-uncompute", và lần đầu tiên được đề xuất bởi Charlie Bennett vào năm 1973 .
Dưới đây là mã QISKit để xây dựng mạch và trực quan hóa nó:
from qiskit import QuantumRegister, QuantumCircuit
n = 5 # must be >= 2
ctrl = QuantumRegister(n, 'ctrl')
anc = QuantumRegister(n-1, 'anc')
tgt = QuantumRegister(1, 'tgt')
circ = QuantumCircuit(ctrl, anc, tgt)
# compute
circ.ccx(ctrl[0], ctrl[1], anc[0])
for i in range(2, n):
circ.ccx(ctrl[i], anc[i-2], anc[i-1])
# copy
circ.cx(anc[n-2], tgt[0])
# uncompute
for i in range(n-1, 1, -1):
circ.ccx(ctrl[i], anc[i-2], anc[i-1])
circ.ccx(ctrl[0], ctrl[1], anc[0])
from qiskit.tools.visualization import circuit_drawer
circuit_drawer(circ)
Sản lượng:
Tôi muốn thêm một phương thức không sử dụng qubit ancilla, nhưng yêu cầu cổng phức tạp hơn chỉ kiểm soát - không. Tôi tin rằng phương pháp này lần đầu tiên được trình bày bởi Barenco et. al. trong bài báo này , Bổ đề 7.5:
Ở đâu
Đây là một định nghĩa đệ quy, vì vậy cổng n qubit điều khiển được xác định theo thuật ngữ của cổng qubit n-1 điều khiển. Điều này sẽ tiếp tục cho đến khi bạn đạt đến hai cổng qubit CNOT.
Việc thực hiện này hơi khó khăn, tuy nhiên, tồn tại một cách đơn giản hơn nếu người ta không ngại thu thập một pha tương đối (xem Bổ đề 7.9 của cùng một bài viết).
Qiskit của QuantumCircuit có mct phương pháp để xây dựng nhiều kiểm soát cổng toffoli với nhiều chế độ: cơ bản, cơ bản-dơ-Ancilla, tiên tiến, noancilla. Ví dụ cổng Toffoli với 3 qubit kiểm soát:
from qiskit import QuantumCircuit, QuantumRegister
controls = QuantumRegister(3, "c_qb")
target = QuantumRegister(1, "t_qb")
circuit = QuantumCircuit(controls, target)
circuit.mct(controls, target[0], None, mode='advanced')
print(circuit)
Đầu ra:
c_qb_0: |0>──────■────────■────────────────■──────────────────────────────────■──────────────────────────────────■────────────────────
│ ┌─┴─┐ ┌─┴─┐ │ │
c_qb_1: |0>──────┼──────┤ X ├──────■─────┤ X ├──────■────────■────────────────┼─────────────────■────────────────┼────────────────────
│ └───┘ │ └───┘ │ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐
c_qb_2: |0>──────┼─────────────────┼────────────────┼──────┤ X ├──────■─────┤ X ├──────■──────┤ X ├──────■─────┤ X ├──────■───────────
┌───┐ │-pi/4 ┌───┐┌───┐ │pi/4 ┌───┐┌───┐ │-pi/4 ├───┤┌───┐ │pi/4 ├───┤┌───┐ │-pi/4 ├───┤┌───┐ │pi/4 ├───┤┌───┐ │-pi/4 ┌───┐
t_qb_0: |0>┤ H ├─■──────┤ H ├┤ H ├─■─────┤ H ├┤ H ├─■──────┤ H ├┤ H ├─■─────┤ H ├┤ H ├─■──────┤ H ├┤ H ├─■─────┤ H ├┤ H ├─■──────┤ H ├
└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘