ฉันต้องการสร้างประตู Toffoli ที่ควบคุมโดย n qubits และนำไปใช้ใน QISKit สามารถทำได้หรือไม่ ถ้าเป็นเช่นนั้นได้อย่างไร
ฉันต้องการสร้างประตู Toffoli ที่ควบคุมโดย n qubits และนำไปใช้ใน QISKit สามารถทำได้หรือไม่ ถ้าเป็นเช่นนั้นได้อย่างไร
คำตอบ:
วิธีง่ายๆในการทำสิ่งนี้แสดงไว้ในรูปที่ 4.10 ของ Nielsen & Chuang
โดยที่ U สามารถหมุนรอบควอตเดียว (ในกรณีนี้คือเกท X)
วงจรนี้ทำงานเช่นนี้: เราต้องการใช้ U กับ qubit เป้าหมายเฉพาะถ้าและของ qubits ควบคุมทั้งหมดเป็น 1 Toffoli ปกติให้เราและของ 2 qubits ดังนั้นโดยการผูกมัด Toffolis เราสามารถรับ c1.c2.c3.c4.c5 ด้วยการจับว่ามีการทำงานบางอย่าง (หรือ ancilla) qubits เพื่อเก็บผลลัพธ์ระดับกลาง หลังจากใช้ CU ขั้นสุดท้ายเราจะได้ผลลัพธ์สุดท้ายตามเป้าหมาย ตอนนี้เราสามารถทำความสะอาดงานกลางโดยการเลิกทำการคำนวณของพวกเขากลับไปที่สถานะ | 0> รูปแบบของการคำนวณแบบย้อนกลับนี้เป็นที่รู้จักกันในชื่อ "วิธีคำนวณ - คัดลอก - ไม่คำนวณ" และเป็นครั้งแรกที่เสนอโดย Charlie Bennett ในปี 1973ที่เสนอโดยชาร์ลีเบนเน็ตต์ในปี 1973
นี่คือรหัส QISKit เพื่อสร้างวงจรและเห็นภาพ:
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)
อัตราผลตอบแทน:
ฉันต้องการเพิ่มวิธีการที่ไม่ใช้ ancilla qubits แต่ต้องการประตูที่ซับซ้อนกว่าการควบคุมเพียงอย่างเดียว ฉันเชื่อว่าวิธีนี้ถูกนำเสนอครั้งแรกโดย Barenco et อัล ในบทความนี้เลมม่า 7.5:
และด้วยเหตุนี้
นี่เป็นนิยามแบบเรียกซ้ำดังนั้นการควบคุม n qubit gate ถูกกำหนดในแง่ของการควบคุม n-1 qubit สิ่งนี้จะดำเนินต่อไปจนกว่าคุณจะไปถึงประตูควิบิตทั้งสอง
การนำไปปฏิบัตินี้ค่อนข้างยาก แต่มีวิธีที่ง่ายกว่าหากไม่มีการเก็บรวบรวมเฟสที่สัมพันธ์กัน (ดูเลมม่า 7.9 ของบทความเดียวกัน)
เพื่อใช้เกทเช่น ใน QISKIT คุณจะต้องใช้ประตู qubit เดียวขั้นสูง
QuantumCircuitของ Qiskit มีวิธีmct ในการสร้างเกต Toffoli แบบควบคุมได้หลายแบบด้วยโหมดหลายโหมด: พื้นฐาน, ขั้นพื้นฐาน - สกปรก -Canilla, ขั้นสูง, noancilla ตัวอย่างเช่นประตู Toffoli ที่มีการควบคุม 3 qubits:
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)
เอาท์พุท:
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 ├
└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘