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

סדר הביטים ב-Qiskit SDK

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

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

qiskit[all]~=2.3.0

אם יש לך קבוצה של nn ביטים (או קיוביטים), בדרך כלל תתייג כל ביט מ-00 עד n1n-1. תוכנות ומשאבים שונים צריכים לבחור כיצד לסדר את הביטים הללו – הן בזיכרון המחשב והן בעת הצגתם על-המסך.

מוסכמות Qiskit

כך ה-Qiskit SDK מסדר ביטים בתרחישים שונים.

מעגלים קוונטיים

המחלקה QuantumCircuit שומרת את הקיוביטים שלה ברשימה (QuantumCircuit.qubits). האינדקס של קיוביט ברשימה זו מגדיר את התווית שלו.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit import Qubit

qc = QuantumCircuit(2)
qc.qubits[0] # qubit "0"

Qubit(QuantumRegister(2, "q"), 0)
<Qubit register=(2, "q"), index=0>

דיאגרמות מעגל

בדיאגרמת מעגל, קיוביט 00 הוא הקיוביט העליון ביותר, וקיוביט n1n-1 הוא התחתון ביותר. ניתן לשנות זאת עם הארגומנט reverse_bits של QuantumCircuit.draw (ראה שינוי הסדר ב-Qiskit).

qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

מספרים שלמים

כשמפרשים ביטים כמספר, ביט 00 הוא ביט הערך הנמוך ביותר (least significant), וביט n1n-1 הוא ביט הערך הגבוה ביותר. זה שימושי בכתיבת קוד מכיוון שלכל ביט יש את הערך 2label2^\text{label} (כאשר label הוא אינדקס הקיוביט ב-QuantumCircuit.qubits). לדוגמה, ריצת המעגל הבאה מסתיימת עם ביט 00 בערך 0 וביט 11 בערך 1. זה מפורש כמספר עשרוני 2 (נמדד עם הסתברות 1.0).

from qiskit.primitives import StatevectorSampler as Sampler

qc.measure_all()

job = Sampler().run([qc])
result = job.result()
print(f" > Counts: {result[0].data.meas.get_counts()}")
> Counts: {'10': 1024}

מחרוזות

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

לדוגמה, התא הבא מגדיר Statevector ממחרוזת של מצבי קיוביט בודד. במקרה זה, קיוביט 00 נמצא במצב +|+\rangle וקיוביט 11 נמצא במצב 0|0\rangle.

from qiskit.quantum_info import Statevector

sv = Statevector.from_label("0+")
sv.probabilities_dict()
{np.str_('00'): np.float64(0.4999999999999999),
np.str_('01'): np.float64(0.4999999999999999)}

לפעמים זה גורם לבלבול בעת פירוש מחרוזת ביטים, כיוון שאולי תצפה שהביט השמאלי ביותר יהיה ביט 00, בעוד שבדרך כלל הוא מייצג ביט n1n-1.

מטריצות וקטור מצב

כשמייצגים וקטור מצב כרשימה של מספרים מרוכבים (אמפליטודות), Qiskit מסדר את האמפליטודות כך שהאמפליטודה באינדקס xx מייצגת את מצב הבסיס החישובי x|x\rangle.

print(sv[1])  # amplitude of state |01>
print(sv[2]) # amplitude of state |10>
(0.7071067811865475+0j)
0j

Gates

כל Gate ב-Qiskit יכול לפרש רשימת קיוביטים בדרכו שלו, אך gates מבוקרים בדרך כלל פועלים לפי המוסכמה (control, target).

לדוגמה, התא הבא מוסיף controlled-X gate שבו קיוביט 00 הוא הבקר וקיוביט 11 הוא המטרה.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘

בהתאם לכל המוסכמות שהוזכרו קודם ב-Qiskit, ה-CX-gate הזה מבצע את הטרנספורמציה 0111|01\rangle \leftrightarrow |11\rangle, ולכן יש לו את המטריצה הבאה.

(1000000100100100)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ \end{pmatrix}

שינוי הסדר ב-Qiskit

כדי לצייר מעגל עם קיוביטים בסדר הפוך (כלומר קיוביט 00 בתחתית), השתמש בארגומנט reverse_bits. זה משפיע רק על הדיאגרמה המיוצרת ולא על המעגל עצמו; ה-X-gate עדיין פועל על קיוביט 00.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.x(0)
qc.draw(reverse_bits=True)
q_1: ─────
┌───┐
q_0: ┤ X ├
└───┘

ניתן להשתמש בשיטה reverse_bits כדי להחזיר מעגל חדש עם התוויות של הקיוביטים הפוכות (פעולה זו אינה משנה את המעגל המקורי).

qc.reverse_bits().draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

שים לב שבמעגל החדש הזה, ה-X-gate פועל על קיוביט 11.

השלבים הבאים

המלצות