דלג לתוכן הראשי
פרויקט זה בשלב בטא. מצאת באג? פתח issue ב-GitHub. יש שאלה או רעיון? שאל ב-Discussions — נשמח לשמוע ממך!
מה איכות התרגום בדף זה?

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

Package versions

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

qiskit[all]~=2.5.2

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

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

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

הערה

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

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"numpy": "numpy", "qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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 0x1058da0b0>

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

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

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: 15π/8
┌───────────────┐ ┌────────────────┐
q_0: ┤ U(π/2,π/2,-π) ├───■──┤ U(π/2,-π,-π/2) ├
├───────────────┴┐┌─┴─┐├───────────────┬┘
q_1: ┤ U(3π/4,π/2,-π) ├┤ X ├┤ U(π/2,π/4,-π) ├─
└────────────────┘└───┘└───────────────┘

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

השלבים הבאים​

המלצות