בשיעור הקודם, הצצנו לראשונה למחלקות Statevector ו-Operator ב-Qiskit, והשתמשנו בהן לסימולציה של פעולות ומדידות על Qubit בודד.
בחלק הזה, נשתמש במחלקות אלה כדי לחקור את ההתנהגות של Qubitים מרובים.
# Added by doQumentation — required packages for this notebook !pip install -q numpy qiskit
from qiskit import __version__ print(__version__)
2.1.1
נתחיל בייבוא המחלקות Statevector ו-Operator, וכן פונקציית השורש הריבועי מ-NumPy.
מכאן ואילך, באופן כללי, נדאג לכל הייבואים הנדרשים בתחילת כל שיעור.
from qiskit.quantum_info import Statevector, Operator from numpy import sqrt
למחלקה Statevector יש מתודה בשם tensor, שמחזירה את המכפלה הטנסורית של אותו Statevector עם אחר הניתן כארגומנט.
הארגומנט מתפרש כגורם הטנסורי מצד ימין.
למשל, בקוד הבא אנחנו יוצרים שני וקטורי מצב המייצגים את ∣0⟩ ו-∣1⟩, ומשתמשים במתודה tensor כדי ליצור וקטור חדש, ∣ψ⟩=∣0⟩⊗∣1⟩.
שימו לב שאנחנו משתמשים במתודה from_label כדי להגדיר את המצבים ∣0⟩ ו-∣1⟩, במקום להגדיר אותם בעצמנו.
zero = Statevector.from_label("0") one = Statevector.from_label("1") psi = zero.tensor(one) display(psi.draw("latex"))
∣01⟩
תוויות מותרות נוספות כוללות "+" ו-"-" עבור מצבי פלוס ומינוס, וכן "r" ו-"l" (קיצורים של "right" ו-"left") עבור המצבים
∣+i⟩=21∣0⟩+2i∣1⟩and∣−i⟩=21∣0⟩−2i∣1⟩.
כאן, "+" ,"-" או "right" ו-"left" מגיעים מהקשר של ספין קוונטי מכני, שבו רכיב ספין יכול להצביע שמאלה או ימינה בניסוי; זה לא מתייחס לה-Qubit הימני או השמאלי ביותר במערכות של Qubitים מרובים. הנה דוגמה למכפלה הטנסורית של ∣+⟩ ו-∣−i⟩.
plus = Statevector.from_label("+") minus_i = Statevector.from_label("l") phi = plus.tensor(minus_i) display(phi.draw("latex"))
21∣00⟩−2i∣01⟩+21∣10⟩−2i∣11⟩
אפשרות נוספת היא להשתמש בפעולה ^ למכפלות טנסוריות, שמניבה כמובן את אותן התוצאות.
display((plus ^ minus_i).draw("latex"))
21∣00⟩−2i∣01⟩+21∣10⟩−2i∣11⟩
למחלקה Operator יש גם מתודה tensor (וכן מתודה from_label), כפי שרואים בדוגמאות הבאות.
H = Operator.from_label("H") Id = Operator.from_label("I") X = Operator.from_label("X") display(H.tensor(Id).draw("latex")) display(H.tensor(Id).tensor(X).draw("latex"))
ניתן לפתח מצבים מורכבים באמצעות פעולות מורכבות כפי שהיינו מצפים — בדיוק כפי שראינו עבור מערכות בודדות בשיעור הקודם.
לדוגמה, הקוד הבא מחשב את המצב (H⊗I)∣ϕ⟩ עבור ∣ϕ⟩=∣+⟩⊗∣−i⟩ (שכבר הוגדר לעיל).
display(phi.evolve(H ^ Id).draw("latex"))
22∣00⟩−22i∣01⟩
הנה קוד שמגדיר פעולת CX ומחשב CX∣ψ⟩ עבור ∣ψ⟩=∣+⟩⊗∣0⟩. להבהרה, זוהי פעולת CX שבה ה-Qubit השמאלי הוא הבקר וה-Qubit הימני הוא המטרה. התוצאה היא מצב Bell ∣ϕ+⟩.
בשיעור הקודם, השתמשנו במתודה measure לסימולציה של מדידה של וקטור מצב קוונטי.
מתודה זו מחזירה שני פריטים: תוצאת המדידה המסומלצת, וה-Statevector החדש בהינתן מדידה זו.
כברירת מחדל, measure מודדת את כל ה-Qubitים בוקטור המצב.
לחלופין, ניתן לספק רשימה של מספרים שלמים כארגומנט, מה שגורם למדידה של אינדקסי Qubit אלה בלבד.
כדי להדגים זאת, הקוד הבא יוצר את המצב
∣w⟩=3∣001⟩+∣010⟩+∣100⟩
ומודד את Qubit מספר 0, שהוא ה-Qubit הימני ביותר.
(Qiskit ממספר Qubitים החל מ-0, מימין לשמאל. נחזור למוסכמת מספור זו בשיעור הבא.)
w = Statevector([0,1,1,0,1,0,0,0]/ sqrt(3)) display(w.draw("latex")) result, state = w.measure([0]) print(f"Measured: {result}\nState after measurement:") display(state.draw("latex")) result, state = w.measure([0,1]) print(f"Measured: {result}\nState after measurement:") display(state.draw("latex"))