สังเคราะห์การดำเนินการยูนิทารี
เวอร์ชันของแพ็กเกจ
โค้ดในหน้านี้ถูกพัฒนาโดยใช้ข้อกำหนดดังต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า
qiskit[all]~=2.3.0
การดำเนินการยูนิทารีอธิบายการเปลี่ยนแปลงที่รักษาค่าบรรทัดฐานของระบบควอนตัม สำหรับ Qubit การเปลี่ยนแปลงนี้ถูกอธิบายด้วยเมทริกซ์เชิงซ้อนขนาด มิติ ที่มี adjoint เท่ากับ inverse คือ
การสังเคราะห์การดำเนินการยูนิทารีเฉพาะให้เป็นชุดของ Gate ควอนตัมเป็นงานพื้นฐานที่ใช้ เช่น ในการออกแบบและประยุกต์ใช้อัลกอริทึมควอนตัม หรือในการคอมไพล์ Circuit ควอนตัม
แม้ว่าการสังเคราะห์ที่มีประสิทธิภาพจะเป็นไปได้สำหรับยูนิทารีบางประเภท เช่น ยูนิทารีที่ประกอบด้วย Clifford gate หรือที่มีโครงสร้างผลคูณเทนเซอร์ แต่ยูนิทารีส่วนใหญ่ไม่อยู่ในหมวดหมู่เหล่านี้ สำหรับเมทริกซ์ยูนิทารีทั่วไป การสังเคราะห์เป็นงานที่ซับซ้อนและมีต้นทุนการคำนวณที่เพิ่มขึ้นแบบเอกซ์โพเนนเชียลตามจำนวน Qubit ดังนั้น ถ้าคุณรู้การสลายตัวที่มีประสิทธิภาพสำหรับยูนิทารีที่ต้องการนำไปใช้ มันมักจะดีกว่าการสังเคราะห์แบบทั่วไป
ถ้าไม่มีการสลายตัวที่ใช้ได้ Qiskit SDK มีเครื่องมือที่ช่วยให้คุณหาได้ อย่างไรก็ตาม โปรดทราบว่าโดยทั่วไปจะสร้าง Circuit ที่ลึกมากซึ่งอาจไม่เหมาะสำหรับรันบนคอมพิวเตอร์ควอนตัมที่มีสัญญาณรบกวน
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
import numpy as np
from qiskit import QuantumCircuit
U = 0.5 * np.array(
[[1, 1, 1, 1], [-1, 1, -1, 1], [-1, -1, 1, 1], [-1, 1, 1, -1]]
)
circuit = QuantumCircuit(2)
circuit.unitary(U, circuit.qubits)
<qiskit.circuit.instructionset.InstructionSet at 0x7fedb83e7a90>
การสังเคราะห์ใหม่เพื่อเพิ่มประสิทธิภาพ Circuit
บางครั้งการสังเคราะห์ใหม่สำหรับชุด Gate เดี่ยว- และสอง Qubit ที่ยาวก็เป็นประโยชน์ ถ้าความยาวสามารถลดได้ ตัวอย่างเช่น Circuit ต่อไปนี้ใช้ Gate สอง Qubit สาม Gate
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qreg_q = QuantumRegister(2, "q")
creg_c = ClassicalRegister(4, "c")
circuit = QuantumCircuit(qreg_q, creg_c)
circuit.h(qreg_q[0])
circuit.cx(qreg_q[0], qreg_q[1])
circuit.sx(qreg_q[1])
circuit.cz(qreg_q[0], qreg_q[1])
circuit.x(qreg_q[1])
circuit.x(qreg_q[0])
circuit.cx(qreg_q[0], qreg_q[1])
circuit.h(qreg_q[0])
circuit.draw("mpl")
อย่างไรก็ตาม หลังจากการสังเคราะห์ใหม่ด้วยโค้ดต่อไปนี้ Circuit ต้องการแค่ Gate CX เดียวเท่านั้น (ที่นี่เราใช้เมธอด QuantumCircuit.decompose() เพื่อแสดงภาพ Gate ที่ใช้ในการสังเคราะห์ยูนิทารีใหม่ได้ชัดเจนขึ้น)
from qiskit.quantum_info import Operator
# compute unitary matrix of circuit
U = Operator(circuit)
# re-synthesize
better_circuit = QuantumCircuit(2)
better_circuit.unitary(U, range(2))
better_circuit.decompose().draw()
global phase: 6.2071
┌───────────────┐ ┌────────────────┐
q_0: ─┤ U(π/2,π/2,-π) ├────■────┤ U(π/2,-π,-π/2) ├─
┌┴───────────────┴─┐┌─┴─┐┌─┴────── ──────────┴┐
q_1: ┤ U(1.7229,π/2,-π) ├┤ X ├┤ U(π/2,0.15207,-π) ├
└──────────────────┘└───┘└───────────────────┘
ฟังก์ชัน transpile ของ Qiskit ทำการสังเคราะห์ใหม่นี้โดยอัตโนมัติสำหรับระดับการเพิ่มประสิทธิภาพที่สูงเพียงพอ
ขั้นตอนถัดไป
- ดูตัวอย่างการสลาย Circuit ใน tutorial Grover's Algorithm
- สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Qiskit Transpiler เยี่ยมชม ส่วน Transpile