סדר הביטים ב-Qiskit SDK
גרסאות חבילות
הקוד בדף זה פותח באמצעות הדרישות הבאות. אנו ממליצים להשתמש בגרסאות אלה או בגרסאות חדשות יותר.
qiskit[all]~=2.3.0
אם יש לך קבוצה של ביטים (או קיוביטים), בדרך כלל תתייג כל ביט מ- עד . תוכנות ומשאבים שונים צריכים לבחור כיצד לסדר את הביטים הללו – הן בזיכרון המחשב והן בעת הצגתם על-המסך.
מוסכמות 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>
דיאגרמות מעגל
בדיאגרמת מעגל, קיוביט הוא הקיוביט העליון ביותר, וקיוביט הוא התחתון ביותר. ניתן לשנות זאת עם הארגומנט reverse_bits של QuantumCircuit.draw (ראה שינוי הסדר ב-Qiskit).
qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘
מספרים שלמים
כשמפרשים ביטים כמספר, ביט הוא ביט הערך הנמוך ביותר (least significant), וביט הוא ביט הערך הגבוה ביותר. זה שימושי בכתיבת קוד מכיוון שלכל ביט יש את הערך (כאשר label הוא אינדקס הקיוביט ב-QuantumCircuit.qubits). לדוגמה, ריצת המעגל הבאה מסתיימת עם ביט בערך 0 וביט בערך 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}
מחרוזות
כשמציגים או מפרשים רשימת ביטים (א ו קיוביטים) כמחרוזת, ביט הוא הביט השמאלי ביותר וביט הוא הביט הימני ביותר. הסיבה לכך היא שאנחנו בדרך כלל כותבים מספרים עם הספרה המשמעותית ביותר משמאל, וב-Qiskit ביט מפורש כביט המשמעותי ביותר.
לדוגמה, התא הבא מגדיר Statevector ממחרוזת של מצבי קיוביט בודד. במקרה זה, קיוביט נמצא במצב וקיוביט נמצא במצב .
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)}
לפעמים זה גורם לבלבול בעת פירוש מחרוזת ביטים, כיוון שאולי תצפה שהביט השמאלי ביותר יהיה ביט , בעוד שבדרך כלל הוא מייצג ביט .
מטריצות וקטור מצב
כשמייצגים וקטור מצב כרשימה של מספרים מרוכבים (אמפליטודות), Qiskit מסדר את האמפליטודות כך שהאמפליטודה באינדקס מייצגת את מצב הבסיס החישובי .
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 שבו קיוביט הוא הבקר וקיוביט הוא המטרה.
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘
בהתאם לכל המוסכמות שהוזכרו קודם ב-Qiskit, ה-CX-gate הזה מבצע את הטרנספורמציה , ולכן יש לו את המטריצה הבאה.
שינוי הסדר ב-Qiskit
כדי לצייר מעגל עם קיוביטים בסדר הפוך (כלומר קיוביט בתחתית), השתמש בארגומנט reverse_bits. זה משפיע רק על הדיאגרמה המיוצרת ולא על המעגל עצמו; ה-X-gate עדיין פועל על קיוביט .
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 פועל על קיוביט .
השלבים הבאים
- ראה דוגמה לשימוש במעגלים במדריך אלגוריתם של גרובר.
- עיין בתיעוד QuantumCircuit API.