ข้ามไปยังเนื้อหาหลัก

สังเคราะห์การดำเนินการยูนิทารี

เวอร์ชันของแพ็กเกจ

โค้ดในหน้านี้ถูกพัฒนาโดยใช้ข้อกำหนดดังต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า

qiskit[all]~=2.3.0

การดำเนินการยูนิทารีอธิบายการเปลี่ยนแปลงที่รักษาค่าบรรทัดฐานของระบบควอนตัม สำหรับ nn Qubit การเปลี่ยนแปลงนี้ถูกอธิบายด้วยเมทริกซ์เชิงซ้อนขนาด 2n×2n2^n \times 2^n มิติ UU ที่มี adjoint เท่ากับ inverse คือ UU=1U^\dagger U = \mathbb{1}

การสังเคราะห์การดำเนินการยูนิทารีเฉพาะให้เป็นชุดของ 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")

Output of the previous code cell

อย่างไรก็ตาม หลังจากการสังเคราะห์ใหม่ด้วยโค้ดต่อไปนี้ 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
Source: IBM Quantum docs — updated 27 เม.ย. 2569
English version on doQumentation — updated 7 พ.ค. 2569
This translation based on the English version of 11 มี.ค. 2569