דלג לתוכן הראשי

סינתזה של פעולות יוניטריות

גרסאות חבילות

הקוד בדף זה פותח באמצעות הדרישות הבאות. אנחנו ממליצים להשתמש בגרסאות אלו או בגרסאות חדשות יותר.

qiskit[all]~=2.3.0

פעולה יוניטרית מתארת שינוי משמר-נורמה במערכת קוונטית. עבור nn קיוביטים, השינוי הזה מתואר על ידי מטריצה מרוכבת בממד 2n×2n2^n \times 2^n שנקראת UU, שבה הצמוד שלה שווה לאינווֹרסה, כלומר UU=1U^\dagger U = \mathbb{1}.

סינתזה של פעולות יוניטריות ספציפיות לתוך קבוצת שערים קוונטיים היא משימה בסיסית שמשמשת, לדוגמה, בתכנון ויישום אלגוריתמים קוונטיים או בקומפילציה של מעגלים קוונטיים.

בעוד שסינתזה יעילה אפשרית עבור סוגים מסוימים של מטריצות יוניטריות – כמו אלו המורכבות משערי Clifford או בעלות מבנה של מכפלה טנזורית – רוב המטריצות היוניטריות אינן נמצאות בקטגוריות אלה. עבור מטריצות יוניטריות כלליות, הסינתזה היא משימה מורכבת שעלויותיה החישוביות גדלות בצורה אקספוננציאלית עם מספר הקיוביטים. לכן, אם אתה מכיר פירוק יעיל עבור המטריצה היוניטרית שברצונך לממש, סביר להניח שהוא יהיה טוב יותר מסינתזה כללית.

הערה

אם אין פירוק זמין, ה-Qiskit SDK מספק לך את הכלים למצוא אחד. עם זאת, שים לב שבדרך כלל זה מייצר מעגלים עמוקים שעשויים להיות לא מתאימים להרצה על מחשבים קוונטיים רועשים.

# 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>

סינתזה מחדש לאופטימיזציה של מעגלים

לעיתים כדאי לבצע סינתזה מחדש של סדרה ארוכה של שערים חד-קיוביטיים ודו-קיוביטיים, אם ניתן לצמצם את האורך. לדוגמה, המעגל הבא משתמש בשלושה שערים דו-קיוביטיים.

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

אולם, לאחר סינתזה מחדש עם הקוד הבא, המעגל זקוק לשער CX בודד בלבד. (כאן אנחנו משתמשים בשיטה QuantumCircuit.decompose() כדי לדמיין טוב יותר את השערים המשמשים לסינתזה מחדש של המטריצה היוניטרית.)

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 מבצעת את הסינתזה מחדש הזאת אוטומטית עבור רמת אופטימיזציה גבוהה מספיק.

השלבים הבאים

המלצות