סדר הביטים ב-Qiskit SDK
גרסאות חבילות
הקוד בדף זה פותח באמצעות הדרישות הבאות. אנחנו ממליצים להשתמש בגרסאות אלה או בגרסאות חדשות יותר.
qiskit[all]~=2.5.2
אם יש לכם קבוצה של ביטים (או קיוביטים), בדרך כלל תסמנו כל ביט . תוכנות ומשאבים שונים חייבים לבחור כיצד לסדר את הביטים הללו הן בזיכרון המחשב והן כאשר הם מוצגים על המסך.
מוסכמות Qiskit
כך ה-Qiskit SDK מסדר ביטים בתרחישים שונים.
פרימיטיבים
כברירת מחדל, Qiskit פועל לפי מוסכמת סידור הביטים little-endian. עם זאת, ברירת המחדל של BitArray היא big (endian), מה שגורם להבדלים מסוימים בפלט הפרימיטיבים, בהתאם לשאלה אם הפרימיטיב משנה הגדרה זו. לדוגמה, הפרימיטיבים Sampler ו-Estimator של IBM® Quantum Compute Service מחזירים תוצאות big-endian, אבל Executor מחזיר תוצאות little-endian.
מעגלים קוונטיים
המחלקה QuantumCircuit שומרת את הקיוביטים שלה ברשימה
(QuantumCircuit.qubits). האינדקס של קיוביט ברשימה זו מגדיר את התווית שלו.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"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")
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.