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

ניסוי Stern-Gerlach באמצעות מחשבים קוונטיים

במודול Qiskit in Classrooms הזה, על הסטודנטים להיות עם סביבת Python פעילה עם החבילות הבאות מותקנות:

  • qiskit v2.1.0 או חדש יותר
  • qiskit-ibm-runtime v0.40.1 או חדש יותר
  • qiskit-aer v0.17.0 או חדש יותר
  • qiskit.visualization
  • numpy
  • pylatexenc

כדי להגדיר ולהתקין את החבילות שלמעלה, ראו את המדריך התקנת Qiskit. כדי להריץ משרות על מחשבים קוונטיים אמיתיים, הסטודנטים יצטרכו להגדיר חשבון ב-IBM Quantum® על ידי ביצוע השלבים במדריך הגדרת חשבון IBM Cloud שלך.

המודול הזה נבדק והשתמש ב-2 שניות של זמן QPU. זהו הערכה בלבד. השימוש בפועל עשוי להשתנות.

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'

צפו בהדרכת המודול של ד"ר Katie McCormick למטה, או לחצו כאן כדי לצפות ביוטיוב.


רקע

בתחילת שנות ה-1900, ראיות להתנהגות מקוונטת בסקלות אטומיות הלכו ורבו. פירושים מוצלחים רבים של נתונים כמו הסבר הקטסטרופה האולטרה-סגולה של Max Planck, וניסויים כמו זה של Otto Stern ו-Walther Gerlach היו קריטיים בשכנוע העולם שמערכת של מכניקת קוונטים הכרחית, ושתופעות פיזיקליות מסוימות מקוונטות. במקרה של ניסוי Stern-Gerlach (שנוּצַר על ידי Stern ב-1921 ובוצע על ידי Stern ו-Gerlach ב-1922), המטרה הייתה לבדוק את קוונטיזציית תנע הזווית באטומים.

באותה תקופה, מודל רווח לאטום היה מודל Bohr-Sommerfeld, שהיה הרחבה של מודל Bohr, וכמו מודל Bohr, הוא ניבא שאלקטרונים קיימים במסלולים מקוונטים מסוימים, דומים לכוכבי לכת שמקיפים את השמש.

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

למרות שהטיפול הזה בסופו של דבר יתברר כבלתי מספיק להסביר את ההתנהגות הקוונטית של האטום, באופן כללי, הוא כן ניבא תופעות רבות שנצפו, כמו קווי הספקטרום הבדידים של אטומים. המסלולים המקוונטים של אלקטרונים עם אנרגיות ספציפיות מתאימים לערכים מקוונטים של תנע זווית. זהו תנע הזווית המסלולי הזה שStern ו-Gerlach ביקשו לצפות בניסוי שלהם, אם כי הניסוי חל על כל סוג של תנע זווית מקוונט, כולל ספין. לעתים קרובות אפשר לשמוע על ניסוי Stern-Gerlach המיושם על ספינים. המיקוד של הניסוי המקורי היה על תנע זווית מסלולי פשוט מכיוון ש-George Uhlenbeck ו-Samuel Goudsmit לא יתאוריו את קיום הספין עד שנת 1925.

ללא קשר לסוג תנע הזווית, מטען עם תנע זווית יש לו מומנט מגנטי. בטיפול הקלאסי של תנועה מסלולית, היינו מצפים שלחלקיק בעל מטען qq, מסה mm ותנע זווית L\vec{L} יהיה מומנט מגנטי μ\mu הנתון על ידי

μ=q2mL\vec{\mu} = \frac{q}{2m}\vec{L}

מסתבר שכמעט אותה נוסחה מתקיימת עבור תנע זווית קוונטי-מכני, עם הסתייגות של הוספת יחס מספרי הקשור לסוג תנע הזווית, הנקרא גורם g gg. כאשר משלבים סוגים שונים של תנע זווית, או מכלילים לסוג שרירותי, לעתים קרובות רואים J\vec{J} בשימוש במקום L\vec{L}, כך שנכתוב:

μ=gq2mJ\vec{\mu} = \frac{gq}{2m}\vec{J}

עבור עצמים קלאסיים g=1g=1. עבור אלקטרונים, g2g\approx 2, ויש ערכים רבים לגרעינים שונים וחלקיקים תת-אטומיים. הנקודה העיקרית כאן היא שתנע זווית מקוונט פירושו מומנט מגנטי מקוונט!

המומנט המגנטי הזה יחווה כוח-סיבוב בשדה מגנטי:

τ=μ×B\vec{\tau}=\vec{\mu}\times \vec{B}

והוא יחווה כוח בשדה מגנטי עם גרדיאנט שאינו אפס:

F=(μB)\vec{F} = \nabla(\vec{\mu}\cdot\vec{B})

לעתים קרובות נשקול את הביטוי לעיל רכיב אחד בכל פעם, אז אולי יהיה נוח לחשוב על הרכיב ה-zz שלו:

Fz=μzdBzdzF_z = \mu_z \frac{dB_z}{dz}

על ידי שילוב ביטויים, נוכל לקבל

Fz=gq2mdBzdzJzF_z = \frac{gq}{2m} \frac{dB_z}{dz} J_z

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

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

איור. ניסוי Stern-Gerlach[1]: אטומי כסף העוברים דרך שדה מגנטי לא הומוגני, ומוסטים למעלה או למטה בהתאם לספין שלהם. קלאסית, היינו מצפים להתפלגות רציפה על המסך, אך בניסוי רואים שתי נקודות נפרדות.

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

מה הינו מצפים, קלאסית?

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

אכן, למומנט מגנטי בשדה מגנטי חיצוני יש אנרגיה פוטנציאלית הקשורה אליו:

U=μB=μBcos(θ)U = -\vec{\mu}\cdot \vec{B} = -\mu B \cos(\theta)

לכן, אם מומנט מגנטי היה מסתובב בשדה המגנטי החיצוני, היה שינוי אנרגיה הנתון על ידי:

ΔU=UfUi=μB(cos(θf)cos(θi)).\Delta U = U_f - U_i = -\mu B (\cos(\theta_f) - \cos(\theta_i)).

במקרה המיוחד של מגנט קטן שמיושר בדיוק נגד השדה החיצוני ומתהפך ומתיישר איתו, זה יתאים לירידה באנרגיה הפוטנציאלית:

ΔU=UfUi=μB(cos(0)cos(π))=2μB.\Delta U = U_f - U_i = -\mu B (\cos(0) - \cos(\pi)) = -2\mu B.

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

מה הינו מצפים בהחלת חשיבה קלאסית על סקלות אטומיות?

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

בדוק את ההבנה שלך

קרא את השאלות למטה, חשוב על התשובות שלך, ואז לחץ על המשולשים כדי לחשוף את הפתרונות.

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

תשובה:

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

בהתחשב בהתנהגות הצפויה בתשובה לעיל, איזה התפלגות של חלקיקים מגנטיים היית מצפה לראות על המסך?

תשובה:

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

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

מה מכניקת הקוונטים תחזה?

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

בדוק את ההבנה שלך

קרא את השאלה למטה, חשוב על התשובה שלך, ואז לחץ על המשולש כדי לחשוף את הפתרון.

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

תשובה:

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

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

כיצד qubits יעזרו לנו לבדוק זאת?

רוב המחשבים הקוונטיים משתמשים ב-"qubits" - האנלוגים הקוונטיים של ביטים קלאסיים. ליתר דיוק, הם מתוכננים להיות מערכות דו-רמתיות, אנלוגיות למצבי "דלוק"/"כבוי" של ביטים קלאסיים. פרדיגמות מחשוב קוונטי קיימות המשתמשות במערכות תלת-רמתיות (הנקראות "qutrits") או מערכות רב-רמתיות (הנקראות "qudits"). אבל רוב העבודה מתרכזת ב-qubits. בפרט, מחשבים קוונטיים של IBM® משתמשים במה שמכונה qubits transmon בתדירות קבועה. אלה שונים למדי מתנע זווית מסלולי או ספין של אטומים. אבל כמו ספין האלקטרון, qubits של IBM® הם מערכות קוונטיות-מכניות שיכולות לקיים אינטראקציה עם אור ועליהן ניתן לבצע מדידות. למעשה, לעתים קרובות מוצאים אנלוגיות בין מצבי ספין קוונטי-מכני ומצבים חישוביים של Qubit. לדוגמה, לעתים קרובות רואים את מצב "ספין-למעלה" המשויך למצב החישובי 0, ו"ספין-למטה" המשויך למצב החישובי 1:

0|\uparrow\rangle \sim |0\rangle 1|\downarrow \rangle \sim |1\rangle

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

ניסוי ראשון: מדידה בודדת

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

  • שלב 1: מיפוי קלטים קלאסיים לבעיה קוונטית
  • שלב 2: אופטימיזציה של הבעיה לביצוע קוונטי
  • שלב 3: ביצוע באמצעות Qiskit Runtime Primitives
  • שלב 4: עיבוד לאחר ביצוע וניתוח קלאסי

נלך בדרך כלל לפי השלבים האלה, אם כי לא תמיד נסמן אותם במפורש.

שלב 1: מיפוי קלטים קלאסיים לבעיה קוונטית

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

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

נתחיל בהכנת האנלוג של מצב ספין, כלומר, תערובת כלשהי של |\uparrow\rangle ו-|\downarrow\rangle או בשקילות של 0|0\rangle ו-1|1\rangle. הצענו כמה ערכים התחלתיים. אבל חופשיים לשחק עם ערכים אחרים או אפילו ערכים אקראיים.

import random
from numpy import pi
import numpy as np

# Use these lines to choose your own arbitrary state vector and normalize it.
# a = 2
# b = (1+1j)
# norm = np.sqrt(a*np.conjugate(a)+b*np.conjugate(b))
# a = a/norm
# b = b/norm
# print(a,b)

# Use these lines if you would rather look at at random spin orientations.
a = random.random()
b = random.random()
norm = np.sqrt(a * np.conjugate(a) + b * np.conjugate(b))
a = a / norm
b = b / norm
print(a, b)
0.7032089086145691 0.7109832845047109

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

from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit, Parameter

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Initialize the quantum state
qc.initialize([a, b])
qc.measure(0, 0)
qc.draw("mpl")

פלט של תא הקוד הקודם

שלב 2: אופטימיזציה של הבעיה לביצוע קוונטי

כדי להריץ את הניסוי שלנו על מחשב קוונטי אמיתי, עלינו לטעון את Qiskit Runtime Service, ולבחור מחשב קוונטי (או "Backend"). למטה, אנחנו פשוט בוחרים את המחשב הקוונטי הפנוי ביותר הזמין לנו.

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

# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService

# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform', instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')

# Syntax for specifying a channel and instance (if you need to change from the default set above)
# service = QiskitRuntimeService(channel='<channel name here>', instance="<your instance name here>")

# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import Session, SamplerV2 as Sampler

# Use the least busy backend, specify options as needed
# backend = service.least_busy(operational=True, simulator=False, min_num_qubits = 127)
backend = service.least_busy()
print(backend.name)
ibm_sherbrooke

עכשיו עלינו לבצע Transpile ל-Circuit, כלומר עלינו למפות את ה-Circuit שלנו על ה-Gates הבסיסיות הזמינות במחשב הקוונטי שבחרנו, ואנחנו רוצים לייעל את ה-Circuit שלנו להרצה על אותו מחשב קוונטי.

# Transpile the circuit and optimize for running on the quantum computer selected
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

pm = generate_preset_pass_manager(optimization_level=3, backend=backend)
qc_ibm = pm.run(qc)

שלב 3: ביצוע באמצעות Qiskit Runtime Primitives

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

# Specify that we want to use only a single shot, to represent a single measurement of a spin in a SG device.
num_shots = 1

# Evaluate the problem using a QPU via Qiskit IBM Runtime
# The best practice is to use a session as shown below. This is available to Premium Plan, Flex Plan, and On-Prem (IBM Quantum Platform API) Plan users.
with Session(backend=backend) as session:
sampler = Sampler(mode=session)
dist = sampler.run([qc_ibm], shots=num_shots).result()
session.close()
counts = dist[0].data.c.get_counts()

# Open users can still carry out this experiment, but without making use of a session, meaning repeated queuing is possible.
# from qiskit_ibm_runtime import Batch,
# batch = Batch(backend=backend)
# sampler = Sampler(mode=batch)
# dist = sampler.run([qc_ibm], shots=num_shots).result()
# Close the batch because no context manager was used.
# batch.close()
# counts = dist[0].data.c.get_counts()

השתמש בקוד למטה אם אין ביכולתך להריץ את הניסוי על מחשב קוונטי אמיתי.

# This uses a local simulator
# from qiskit_aer import AerSimulator

# This generates a simulator that mimics the real quantum system
# backend_sim = AerSimulator.from_backend(backend)

# Import an estimator, this time from qiskit (we import from Runtime for real hardware)
# from qiskit.primitives import BackendSamplerV2
# sampler = BackendSamplerV2(backend = backend_sim)

# num_shots = 1

# This runs the job
# dist = sampler.run([qc_ibm], shots = num_shots).result()

# This selects measurement counts for the 0th circuit, which in this case is the only circuit
# counts=dist[0].data.c.get_counts()

שלב 4: עיבוד לאחר ביצוע וניתוח קלאסי

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

from qiskit.visualization import plot_histogram

print("counts = ", counts)
plot_histogram(counts)
counts =  {'0': 1}

פלט של תא הקוד הקודם

ביצענו מדידה אחת וקיבלנו "0". זה לא מפתיע אותנו. אנחנו יודעים שאנחנו משתמשים במחשב קוונטי המורכב מ-qubits ואנחנו מאוד רגילים לכך שביטים קלאסיים מחזירים 0 או 1. אבל זכרו: זהו האנלוג של מחשוב קוונטי לניסויים שנעשו עם חלקיקים עם מומנטים מגנטיים. אם היינו מצפים להתפלגות שווה בין 0 ל-+1, זה אכן היה מפתיע אותנו שקיבלנו קצה אחד במדידה הראשונה שלנו. הקוונטיזציה המפתיעה הזאת של תוצאות בניסוי Stern-Gerlach היא שהובילה אותנו להבנה טובה יותר של הטבע, ושבתורה עזרה לנו לבנות בסופו של דבר מחשבים קוונטיים.

נראה מה קורה כשאנחנו מבצעים אנסמבל של מדידות.

ניסוי שני: מדידה של חלקיקים רבים

כדי לאסוף סטטיסטיקה על מדידות רבות כאלה, לא צריך לחזור על שלבים 1 ו-2. אפשר פשוט להגדיל את מספר ה-shots בניסוי. אל תהסס לשחק עם מספר ה-shots במופע של שלב 3 למטה.

from qiskit_ibm_runtime import Session, SamplerV2 as Sampler

num_shots = 100

# Evaluate the problem using a QPU via Qiskit IBM Runtime
# The best practice is to use a session as shown below. This is available to Premium Plan, Flex Plan, and On-Prem (IBM Quantum Platform API) Plan users.
with Session(backend=backend) as session:
sampler = Sampler(mode=session)
dist = sampler.run([qc_ibm], shots=num_shots).result()
session.close()
counts = dist[0].data.c.get_counts()

# Open users can still carry out this experiment, but without making use of a session, meaning repeated queuing is possible.
# batch = Batch(backend=backend)
# sampler = Sampler(mode=batch)
# dist = sampler.run([qc_ibm], shots=num_shots).result()
# Close the batch because no context manager was used.
# batch.close()
# counts = dist[0].data.c.get_counts()

כמו קודם, אם אתה לא יכול להריץ על מחשב קוונטי אמיתי, בטל את ה-comment מהבלוק שלמעלה מהניסוי הראשון, ופשוט שנה num_shots = 1 ל-num_shots = 100 או יותר.

plot_histogram(counts)

Output of the previous code cell

אנחנו רואים שלפעמים אנחנו מודדים 0 ולפעמים מודדים 1. שימו לב שאנחנו לעולם לא מודדים שום דבר אחר! אפשר לשנות את מספר ה-shots ולשים לב שההסתברות למדידת 0 או 1 נראית די עקבית בין ריצות שונות עם מספרי shots שונים. אז משהו בהכנת המצב נראה קובע את ההסתברות לתוצאות המדידה, אם כי כל מדידה בודדת יכולה להניב 0 או 1.

ניסוי שלישי: ספינים אקראיים בתנור

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

שלב 1: מיפוי קלטים קלאסיים לבעיה קוונטית

ה-Circuit שאנחנו רוצים לבנות זהה לקודם. ההבדל היחיד הוא שהפעם, נבנה את ה-Circuit באמצעות Gates עם פרמטרים חופשיים θ\theta ו-ϕ\phi. ערכים מספריים לאותם פרמטרים ייוקצו לכל ריצה חדשה.

# from qiskit.circuit import QuantumCircuit, Parameter

theta = Parameter("θ")
phi = Parameter("$\phi$")

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Add rotation gates for rotating the state of qubit 0 to random orientations
qc.rx(theta, 0)
qc.rz(phi, 0)
qc.measure(0, 0)

qc.draw("mpl")

Output of the previous code cell

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

# This uses a local simulator
from qiskit_aer import AerSimulator

# Import an estimator, this time from qiskit (we import from Runtime for real hardware)
from qiskit.primitives import BackendSamplerV2

# This generates a simulator that mimics the real quantum system
backend_sim = AerSimulator.from_backend(backend)
sampler_sim = BackendSamplerV2(backend=backend_sim)

# from qiskit.primitives import BackendSamplerV2
# sampler = BackendSamplerV2(backend=backend)
# A list to store the accumulated probabilities of the two possible measurement outcomes.
probslist = {"0": 0.0, "1": 0.0}

# Choose how many "particles"/measurements
measurements = 100
num_shots = 1

for i in range(measurements):
# Assign a random orientation for each measurement
phi = random.random() * 2 * pi
theta = random.random() * 2 * pi

angles = [phi, theta]
circuit = qc.assign_parameters(angles)
qc_ibm = pm.run(circuit)

# Run the circuit
# job = sampler.run([circuit],num_shots = 1)
dist = sampler_sim.run([qc_ibm], shots=num_shots).result()

# Update the list of probabilities
zeroterm = dist[0].data.c.get_counts().get("0") or 0
oneterm = dist[0].data.c.get_counts().get("1") or 0
probslist.update({"0": probslist.get("0") + zeroterm})
probslist.update({"1": probslist.get("1") + oneterm})

probslist.update({"0": probslist.get("0") / measurements})
probslist.update({"1": probslist.get("1") / measurements})
# print(probslist)
plot_histogram(probslist)

Output of the previous code cell

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

ניסוי רביעי: מדידות חוזרות

כשה-Qubit מתחיל במצב אקראי, אנחנו רואים שיש סיכוי של בערך 50-50 למדוד קצה אחד על פני השני. אבל מה קורה למצב של ה-Qubit (או לתנע הזוויתי של החלקיק) אחרי המדידה? כדי לענות על כך, נצטרך להגדיר Circuit שמאפשר לנו לבצע מדידות מרובות של אותם Qubits. בואו נגדיר Circuit שנוכל להשתמש בו כדי לחקור זאת. נרצה לאפשר את האפשרות למדוד את שני המצבים 0|0\rangle ו-1|1\rangle, אז נצטרך משהו שיסובב את המצב ההתחלתי של ה-Qubit ממצב ברירת המחדל 0|0\rangle. במקרה זה, נשתמש ב-Gate של הדאמר HH, מכיוון ש-H0=12(0+1)H|0\rangle = \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle). שימו לב שכברירת מחדל, שתי המדידות הללו יהיו לאורך zz.

from qiskit import QuantumCircuit

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)

# Initialize the qubit to be a mixture of 0 and 1 states.
qc.h(0)

# Add a first measurement
qc.measure(0, 0)
qc.barrier()

# Add a second measurement
qc.measure(0, 1)

qc.draw("mpl")

qc_ibm = pm.run(qc)
# Step 3: Run the job

num_shots = 1000
dist = sampler.run([qc_ibm], shots=num_shots).result()
# To run on a simulator, uncomment the line below and comment out the line above.
# dist = sampler_sim.run([qc_ibm], shots=num_shots).result()
counts = dist[0].data.c.get_counts()
print(counts)
{'00': 497, '11': 498, '01': 3, '10': 2}
# Step 4: Post-process
plot_histogram(counts)

Output of the previous code cell

באיור למעלה, הפחים מסומנים "00", "01" וכן הלאה. כאן, המספרים הללו מתייחסים ל"תוצאה שנייה, תוצאה ראשונה". אז "00" אומר ששתי המדידות הניבו את המצב 0|0\rangle, ו-"01" אומר שהמדידה הראשונה הניבה 1|1\rangle, והשנייה הניבה 0|0\rangle. הרוב המכריע של ה-Qubits נמדדו או כשניהם במצב 0|0\rangle, או כשניהם במצב 1|1\rangle. היה נדיר מאוד ש-Qubits נמדדו במצב אחד ואז נמדדו במצב אחר, והמקרים הבודדים שבהם זה קרה (~1%) נובעים מרעש. במקרה זה הרעש סומולל בהתאם להתנהגות המערכת הקוונטית האמיתית. מתאם זה שנצפה בין מדידות עוקבות נצפה גם במדידות מסוג שטרן-גרלאך של חלקיקים עם תנע זוויתי של ספין. אם חלקיק נמדד כ"ספין עלה", מדידה עוקבת זמן קצר לאחר מכן תניב שוב "ספין עלה" (למעט שינוי קטן עקב רעש).

זה אולי נשמע טריוויאלי. אחרי הכל, אם Qubit נמדד במצב אחד, ואז אני מודד אותו שוב, מהר, למה לא יהיה עדיין באותו מצב? אבל אם נאחז בעדינות זו, זה עשוי לעזור לנו לבחור כלים מתמטיים לתיאור תופעה זו.

ניתוח הניסויים עד כה

בואו נאסוף כמה תצפיות מהניסויים שלנו עד כה:

  • המדידה של מערכת קוונטית מכנית תניב רק אחד מקבוצת "ערכים מותרים". עבור מערכות דו-רמות כמו Qubits או חלקיקים ספין-1/2, מדידה תניב רק אחת מהתוצאות הבינאריות.
  • כשאנחנו מאתחלים באקראי את מצב המערכת הבינארית שלנו (כמו חלקיקי ספין-1/2 היוצאים מתנור), כל אחת מתוצאות המדידה הבינאריות אפשרית.
  • ברגע שמדידה מבוצעת ומצב המערכת ידוע, חזרה על המדידה של אותו אובסרבבל פיזי לא משנה את המצב! כלומר, אם אנחנו מקבלים את מצב 0 פעם אחת, כשאנחנו מודדים שוב הוא עדיין במצב 0 (למעט רעש קטן במערכת ~0.1% עד 1%).

שים לב במפורש שעדיין לא התייחסנו לאופי ההסתברותי של מכניקת הקוונטים, ולא אמרנו דבר על "קריסת" המצב לאייגנסטייט. בשימוש רק בתצפיות שלמעלה, יכול להיות פיתוי לחפש פעולה מתמטית OO שמשאירה קבוצה מיוחדת של מצבים קוונטיים מכניים ψ|\psi\rangle ללא שינוי, אולי עד כדי קבוע: Oψ=cψO|\psi\rangle = c|\psi \rangle, מכיוון שמדידה לאורך zz פעמיים מניבה את אותה תוצאה. בסופו של דבר, חיפוש זה ייכשל בתיאור כל ההתנהגויות שנראה. אבל הוא יכול לתאר כמה דברים, אז נמשיך בו עוד קצת.

קיימת פעולה כזו. פעולת מטריצה על וקטורים מסוימים משנה את הוקטורים, ופעולת מטריצה על וקטורים אחרים (אייגנוקטורים) משאירה את הוקטור ללא שינוי עד כדי קבוע. קח למשל את המטריצה MM ואת הוקטור v|v\rangle כאשר

M=(1221)M= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}

ו-

v=(11)|v\rangle = \begin{pmatrix} 1\\1 \end{pmatrix}

שים לב ש-

Mv=(1221)(11)=(11+2121+11)=(33)=3v.M|v\rangle= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}\begin{pmatrix} 1\\1 \end{pmatrix} = \begin{pmatrix} 1*1+2*1\\2*1+1*1 \end{pmatrix} = \begin{pmatrix} 3\\3 \end{pmatrix} = 3|v\rangle.

אבל עבור וקטורים אחרים, נניח v=(12)|v'\rangle = \begin{pmatrix} 1\\2\end{pmatrix}, יש לנו

Mv=(1221)(12)=(11+2221+12)=(54)cv.M|v'\rangle= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}\begin{pmatrix} 1\\2 \end{pmatrix} = \begin{pmatrix} 1*1+2*2\\2*1+1*2 \end{pmatrix} = \begin{pmatrix} 5\\4 \end{pmatrix} \neq c|v'\rangle.

אולי ננסה לתאר את הספין של חלקיק באמצעות מטריצה, וננסה לתאר את מצבי החלקיקים אחרי מדידה באמצעות וקטור, שנקרא "וקטור מצב". לא ברור כלל אילו ערכים צריכים להיכנס למטריצה או לוקטור מצב כזה, אבל התכונה היחידה שיש לנו מהמדידות עד כה שנוכל להשתמש בה לסימון מצבים תהיה ההסתברות למדידת 0 או 1 ("ספין עלה" או "ספין ירד" בהקשר של חלקיקי ספין-1/2). עלינו לשקול שהרשומות בוקטורי המצב צריכות להיות קשורות להסתברות הזו (בדיוק ההסתברות, "אמפליטודת הסתברות" - כלומר אנחנו מעלים את הרשומה בריבוע כדי לקבל את ההסתברות, וכן הלאה). אבל בשלב זה, אנחנו לא בטוחים אם הרשומות במטריצות הללו צריכות להיות ממשיות לחלוטין, מרוכבות, או מה. לבטיחות, ננסה לפתח מסגרת שבה הוקטורים והמטריצות מקיימים את הדברים הבאים:

  • אופרטורי המטריצה מחוברים לניסוי כמה שיותר. לדוגמה, נוכל לקשר את האייגנערכים של מטריצת ספין עם הטלות הספין שנצפו בניסוי.
  • וקטורי המצב צריכים להיות קשורים להסתברות בדרך הבאה: אם חלקיק נמצא בוקטור המצב A|A\rangle, ההסתברות שמדידה עוקבת תמצא את החלקיק במצב B|B\rangle היא PABAB2P_{AB}\equiv |\langle A| B \rangle|^2.

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

0(10).|0\rangle \sim |\uparrow\rangle \sim \begin{pmatrix} 1 \\0 \end{pmatrix}.

כאן 0|0\rangle \sim |\uparrow\rangle אומר שיש מצבים במחשבים קוונטיים ובמערכות ספין-1/2 שדומים מאוד ולעתים קרובות ממופים אחד לשני. הם ברור לא בדיוק אותו הדבר, מכיוון שהם מתייחסים למערכות שונות. אבל האלגברה המתארת מערכות דו-מצביות אלה יכולה לציית לאותם כללים (ספויילר: הן כן!). שים לב שהבחירה האקראית הזו כבר יש לה תכונה נחמדה אחת. שים לב ש-

P00=002=(10)(10)2=12=1.P_{00} = |\langle 0| 0 \rangle|^2 = \vert \begin{pmatrix} 1 & 0\end{pmatrix} \begin{pmatrix} 1 \\ 0\end{pmatrix}\vert ^2 = |1|^2 = 1.

כלומר, אם חלקיק כבר נמצא במצב 0|0\rangle, ההסתברות שמדידה עוקבת תניב גם 0|0\rangle היא 1 (ללא השפעות רעש). זה מצוין, כי כבר ראינו שברגע שמצב נמצא במצב 0 או "ספין עלה", הוא נשאר שם במדידה עוקבת. ההסתברות שלמעלה אכן צריכה להיות 100%.

בדוק את הבנתך

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

למה

0=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}

בחירה טובה יותר מאשר, נניח,

0=(20)?|0\rangle = \begin{pmatrix} 2 \\0 \end{pmatrix}?

תשובה:

הניסיון שלנו לקשר את ההסתברות של מדידה עם מכפלה פנימית בריבוע אומר שאנחנו צריכים שהגודל של כל וקטור יהיה 1. כלומר, vv2=1|\langle v|v\rangle|^2 = 1 לכל v|v\rangle, מכיוון שההסתברות שדבר במצב v|v\rangle יהיה במצב v|v\rangle היא 100%. זה ידוע כ"תנאי הנורמליזציה".

למה

0=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}

בחירה טובה יותר מאשר, נניח,

0=(01)?|0\rangle = \begin{pmatrix} 0 \\1 \end{pmatrix}?

תשובה:

זו לא. אין סיבה שנצטרך לבחור בתחילה 0=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}. זוהי מוסכמה בלבד. אולם, ברגע שאנחנו מבצעים את הבחירה הזו, היא מטילה אילוצים מסוימים על בחירות עתידיות. ראה למטה.

זכור שבניסויים שלמעלה, מצאנו ש-Qubit שהתחיל במצב 0|0\rangle נשאר באותו מצב במדידה עוקבת. אותו הדבר נכון לגבי 1|1\rangle. המשמעות היא ש-Qubit שנמצא ב-0|0\rangle יש לו אפס הסתברות להימדד במצב 1|1\rangle (ללא השפעות רעש). הקשר הנדרש בין מכפלות פנימיות והסתברויות של מדידות אז אומר לנו ש-

P01=P10=0.P_{01} = P_{10}=0.

ללא אובדן כלליות, נוכל לכתוב את וקטור המצב 1=(ab)|1\rangle = \begin{pmatrix} a \\ b \end{pmatrix}. אז נוכל לכתוב

P01=012=(10)(ab)2=a2=0.P_{01} = |\langle 0| 1 \rangle|^2 = \vert \begin{pmatrix} 1 & 0\end{pmatrix} \begin{pmatrix} a \\ b\end{pmatrix}\vert ^2 = |a|^2 = 0.

הדרישה ש-P11=1P_{11} = 1, "תנאי הנורמליזציה" הידוע, אומרת לנו ש-b2=1|b|^2=1. זה כשלעצמו באמת מגביל אותנו רק ל-b=eiϕb=e^{i\phi} עבור ϕR\phi \in \mathbb{R}. מתברר שיש סיבות אחרות לבחור b=1b=1 שחורגות ממבוא זה לנושא. לעת עתה, יספיק שנאמר ש-b=1b=1 היא פתרון מקובל אחד.

הגענו רחוק למדי בניתוח שלנו. בחירת צורה לוקטורי המצב שלנו מאפשרת לנו לבנות מטריצה שמתארת משהו על התופעות הפיזיות שעובדות כאן. בפרט, מכיוון שניסוי שטרן-גרלאך המקורי מדד פיצול של מסלולים בהתבסס על רכיבי תנע זוויתי ספין לאורך ציר zz, היינו רוצים אופרטור שמתאר בדיוק את זה: SzS_z. קשר מפתח נוסף לניסוי הוא שמכמות ההסטה, זמן המעבר, ועוצמת השדה המגנטי הידועה, ניתן לקבוע את גודל רכיב ה-zz של הספין. אם כי זה דורש הרבה הנחות לגבי דיוק ההגדרה הניסיונית, כאן פשוט נחזור על כך שרכיבי ה-z המדודים של תנע זוויתי ספין הם ±/2\pm \hbar/2.

אז אנחנו מחפשים מטריצה עם אייגנערכים ממשיים (מסופק על ידי מטריצות הרמיטיות) עם אייגנערכים המתאימים לרכיבי הספין שנצפו בניסוי. ללא אובדן כלליות, נוכל לכתוב Sz=(s11s12s21s22)S_z = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}, ונוכל לדרוש:

Sz=(s11s12s21s22)(10)=(s11s21)=!2(10)s11=/2,s21=0S_z |\uparrow\rangle = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}\begin{pmatrix}1 \\0\end{pmatrix} = \begin{pmatrix} s_{11} \\ s_{21} \end{pmatrix} \overset{!}{=} \frac{\hbar}{2} \begin{pmatrix}1 \\0\end{pmatrix} \rightarrow s_{11} = \hbar/2,s_{21}=0 Sz=(s11s12s21s22)(01)=(s12s22)=!2(01)s12=0,s22=/2S_z |\downarrow\rangle = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}\begin{pmatrix}0 \\1\end{pmatrix} = \begin{pmatrix} s_{12} \\ s_{22} \end{pmatrix} \overset{!}{=} -\frac{\hbar}{2} \begin{pmatrix}0 \\1\end{pmatrix} \rightarrow s_{12} = 0, s_{22}=-\hbar/2

בשילוב, ובהוצאת גורם הכולל /2\hbar/2, יש לנו

Sz=2(1001).S_z = \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix}.

זהו אופרטור הספין-z הידוע המופיע בכל ספרי הלימוד של מכניקת הקוונטים. לעתים קרובות רואים זאת עם /2\hbar/2 שהוסר, ובמקרה זה זהו אופרטור "פאולי-z", המסומן בדרך כלל σz\sigma_z:

σz=(1001).\sigma_z = \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix}.

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

לפני שנעבור לאופרטורים ומצבים אחרים הקשורים לזה, עלינו להתייחס לעובדה שהרבה אנשים טועים בה. פעולת אופרטור אינה זהה למדידה. במובן אחד, אפשר לומר, "כמובן שלא! אחד קורה על הנייר כחלק מחישוב מתמטי, והשני קורה במעבדה על מערכות פיזיות." כן, זה נכון, אבל זה יותר מזה. ביצוע מדידה של רכיב ה-zz של הספין תמיד יניב מצב "ספין עלה" או "ספין ירד", ללא קשר למצב ההתחלתי של המערכת. ראינו זאת עם האנלוגים של מחשוב קוונטי 0|0\rangle ו-1|1\rangle. אתחלנו מצבים למאות כיוונים אקראיים, ומדידות תמיד הניבו 0|0\rangle או 1|1\rangle. זה ידוע כמדידה ש"קורסת את המצב" לאייגנסטייט. זה לא קורה כשמחילים מטריצה על מצב. נסה את השאלות למטה כדי לחקור זאת.

בדוק את הבנתך

קרא את השאלות למטה, חשוב על התשובה שלך, ואז לחץ על המשולש כדי לגלות את הפתרון.

נניח שאתה מתחיל עם חלקיק במצב ספין

ψ=(3/52/5).|\psi\rangle = \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}.

(א) מה מקבלים כשמפעילים את האופרטור SzS_z על וקטור המצב הזה? (ב) מה מקבלים כשעושים מדידה בודדת של רכיב ה-zz של הספין של החלקיק הזה? (ג) מה מקבלים כשמכינים הרבה חלקיקים זהים למצב הזה ועושים אלפי מדידות של רכיב ה-zz של הספין?

תשובות:

(א) מקבלים

Szψ=2(1001)(3/52/5)S_z |\psi\rangle = \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}=2(3/52/5).= \frac{\hbar}{2} \begin{pmatrix}\sqrt{3/5} \\ -\sqrt{2/5}\end{pmatrix}.

זהו. אין כאן תוצאה ניסויית. פשוט מחילים את המטריצה על הוקטור ומקבלים וקטור קצת שונה שיש בו עכשיו סימן "-" חדש, ולא עוד בעל גודל 1, כי יש לו מקדם /2\hbar/2.

(ב) תקבל |\uparrow\rangle או |\downarrow\rangle. זה מתאים לצפייה בהטלת ספין על ציר ה-zz של /2\hbar/2 או /2-\hbar/2, בהתאמה. אפשר גם לקבוע את ההסתברות לכל תוצאה, כי

Pψ=ψ2=(10)(3/52/5)2=3/52=35P_{\uparrow\psi}=|\langle \uparrow|\psi\rangle|^2 = \vert \begin{pmatrix}1 & 0\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}\vert^2 = |\sqrt{3/5}|^2 = \frac{3}{5}Pψ=ψ2=(01)(3/52/5)2=2/52=25P_{\downarrow\psi}=|\langle \downarrow|\psi\rangle|^2 = \vert \begin{pmatrix}0 & 1\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}\vert^2 = |\sqrt{2/5}|^2 = \frac{2}{5}

אז למרות שמצב ספין-למעלה סביר ב-20% יותר, שתי התוצאות אפשריות, ונקבל רק אחת משתי המצבים האלה.

(ג) בערך 60% מהמדידות יניבו חלקיקים עם ספין-למעלה, ובערך 40% יניבו חלקיקים עם ספין-למטה, לפי ההסתברויות שחושבו בחלק (ב).

אמת את התשובות לחלקים (ב) ו-(ג) של השאלה הקודמת על ידי שימוש באנלוגיה בין מצבי ספין-למעלה של אטום ומצבי Qubit:

0.|\uparrow\rangle\sim|0\rangle.

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

תשובה:

#Use the backend sampler for part (b) because it allows us to use a single shot.
from qiskit_aer import AerSimulator
backend_sim = AerSimulator.from_backend(backend)
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend = backend_sim)

#Create a quantum circuit to initialize the state.
import math
psi = [math.sqrt(3/5),math.sqrt(2/5)]
qc = QuantumCircuit(1,1)
qc.initialize(psi, [0])

#Add measurement to the circuit
qc.measure(0,0)
qc.draw('mpl')

#Set num_shots =1 for part (b) and num_shots = 1000 or more for part (c).
num_shots = 1000

#Run the job and print the result. You should obtain only 0 or 1 in part (b) for a single shot.
#You should obtain a probability distribution with approximately 60% 0 and 40% 1 in part (c)

dist = sampler.run([qc_ibm], shots = num_shots).result()
counts=dist[0].data.c.get_counts()
print(counts)

#You should obtain {0: 599, 1: 401} or something equivalently close to the 60%-40% distribution predicted.

הניסוי החמישי: מדידת אובייקטים נצפים שונים

עד כה עשינו מדידות רק לאורך ציר ה-z. בניסוי שטרן-גרלך, אם רצינו למדוד לאורך, נגיד, ציר ה-x, היינו פשוט מכוונים את השדה המגנטי האי-הומוגני לכיוון ציר ה-xx, ומחפשים הסטות לאורך xx על המסך. מחשבי הקוונטום של IBM, לעומת זאת, מתוכננים לעשות מדידות לאורך ציר אחד בלבד (zz). כדי למדוד מצב לאורך xx עלינו לבצע "שינוי בסיס". זה אומר שעלינו לבצע פעולה שמעבירה מצבים לאורך xx בכדור בלוך ל-zz, ולהפך. יש כמה דרכים לממש זאת, אבל הדרך המועדפת היא Hadamard Gate:

H=12(1111)H=\frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}

בדוק את הבנתך

קרא את השאלות למטה, חשוב על התשובה שלך, ואז לחץ על המשולש כדי לגלות את הפתרון.

הוכח ש-H0=+xH|0\rangle = |+\rangle_x וש-H+x=0H|+\rangle_x = |0\rangle

תשובה:

H0=12(1111)(10)=12(11)=+xH|0\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\begin{pmatrix}1 \\ 0\end{pmatrix} = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} = |+\rangle_xH+x=1(2)(1111)12(11)=12(20)=(10)=0H|+\rangle_x = \frac{1}{\sqrt(2)}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} = \frac{1}{2}\begin{pmatrix}2 \\ 0\end{pmatrix} = \begin{pmatrix}1 \\ 0\end{pmatrix} = |0\rangle

הוכח ש-H1=xH|1\rangle = |-\rangle_x וש-Hx=1H|-\rangle_x = |1\rangle

תשובה:

H1=12(1111)(01)=12(11)=xH|1\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\begin{pmatrix}0 \\ 1\end{pmatrix} = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} = |-\rangle_xHx=1(2)(1111)12(11)=12(02)=(01)=1H|-\rangle_x = \frac{1}{\sqrt(2)}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} = \frac{1}{2}\begin{pmatrix}0 \\ 2\end{pmatrix} = \begin{pmatrix}0 \\ 1\end{pmatrix} = |1\rangle
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Add a hadamard gate to rotate into the x-basis
qc.h(0)
qc.measure(0, 0)

qc.draw("mpl")

Output of the previous code cell

Circuit זה מסובב את המערכת שלנו כך שמדידות (לאורך zz) מספרות לנו על המאפיינים של xx לפני הסיבוב. כבר יודעים שהמחשב הקוונטי מאתחל מצבים ל-0|0\rangle שמתאים ל-|\uparrow\rangle. בוא נראה מה קורה כשמודדים את הטלת הספין לאורך xx עבור מצב שמתחיל ב-|\uparrow\rangle. מראים את השלב הזה על סימולטור כדי לעודד אותך לחקור את הסטטיסטיקה של Circuit-ים אחרים עם אתחולים שונים.

from qiskit.primitives import StatevectorSampler as Sampler

sampler_sv = Sampler()

job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())
{'1': 4977, '0': 5023}

זה מראה לנו שעבור Qubit שמתחיל ב-0|0\rangle (או בהתאמה, ספין ב-|\uparrow\rangle) ההסתברות למדוד הטלה לאורך +x+x או x-x היא בערך 50-50. במובן מסוים, זה הגיוני לחלוטין. אחרי הכל, אם משהו היה מצביע לכיוון ה-z, לא היה לו שום העדפה ל-±x\pm x. אפשר לצפות לאותו הדבר אם מתחילים עם המצב 1|1\rangle (או |\downarrow\rangle). בוא נבדוק:

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Add a NOT gate and hadamard gate. Measure.
qc.x(0)
qc.h(0)
qc.measure(0, 0)

qc.draw("mpl")

Output of the previous code cell

job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())
{'0': 4935, '1': 5065}

כן! שוב, מוצאים הסתברות של 50-50 למדידת הטלות לאורך ±x\pm x. באנלוגיה למדידות לאורך zz, אפשר לחשוד עוד שחלקיק שמתמוטט למצב מוגדר לאורך +x+x עשוי להיות בעל הסתברות אפס לאחר מכן להימדד לאורך x-x. בוא נבדוק:

from qiskit import QuantumCircuit

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)

# Rotate into x-basis using a Hadamard gate, then make two measurements in succession
qc.h(0)
qc.measure(0, 0)
qc.barrier()
qc.measure(0, 1)

qc.draw("mpl")

Output of the previous code cell

job = sampler_sv.run([qc])
print(job.result()[0].data.c.get_counts())
plot_histogram(job.result()[0].data.c.get_counts())
{'00': 504, '11': 520}

Output of the previous code cell

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

אנחנו יודעים:

  • למצבים עם הטלות מוגדרות לאורך +z+z או z-z יש הסתברות של 50% להימצא עם הטלה לאורך +x+x והסתברות של 50% שיש להם הטלה לאורך x-x.
  • למצבים עם הטלה מוגדרת לאורך +x+x יש הסתברות אפס להימדד לאחר מכן עם הטלה לאורך x-x, ולהפך.

אפשר להשתמש בתוצאות אלה לבניית מצבים עם הטלה מוגדרת וחיובית לאורך xx (שנקרא להם +x|+x\rangle), ואלה עם הטלה מוגדרת שלילית לאורך xx (שנקרא להם x|-x\rangle). מתוך המצבים האלה אפשר לבנות את המטריצה המתאימה ל-SxS_x, בדיוק כפי שעשינו עבור SzS_z. אנחנו משאירים אלה כתרגילים ללומד. באופן דומה, אפשר לבנות ניסויים שעושים מדידות לאורך ציר ה-yy, לקבוע וקטורים עבור +y|+y\rangle ו-y|-y\rangle, ולבסוף לקבל ביטוי עבור SyS_y.

אם מאספים את כל הוקטורים והמטריצות האלה יחד, יש לנו

+x=12(11)x=12(11)Sx=2(0110)+y=12(1i)y=12(1i)Sy=2(0ii0)+z=(10)z=(01)Sz=2(1001)\begin{aligned} |+x\rangle &= \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} & \: & |-x\rangle &=& \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} & \: &S_x &=& \frac{\hbar}{2} \begin{pmatrix} 0 & 1 \\ 1 & 0\end{pmatrix}\\ |+y\rangle &= \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i\end{pmatrix} & \: & |-y\rangle &=& \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -i\end{pmatrix} & \: &S_y &=& \frac{\hbar}{2} \begin{pmatrix} 0 & -i \\ i & 0\end{pmatrix}\\ |+z\rangle &= \begin{pmatrix}1 \\ 0\end{pmatrix} & \: &|-z\rangle &=& \begin{pmatrix}0 \\ 1\end{pmatrix} & \: &S_z &=& \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & 1\end{pmatrix}\\ \end{aligned}

שאלות

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

מושגים קריטיים:

  • עבור חלקיק ספין-1/2, מדידה של הטלת הספין על ציר כלשהו יכולה להניב רק אחת משתי תוצאות, שנקראות לרוב "למעלה" ו"למטה".
  • Qubit-ים יכולים להימדד רק באחד משני מצבים, שנקראים לרוב 0|0\rangle ו-1|1\rangle.
  • אפשר לדמות את ניסוי שטרן-גרלך על חלקיקי ספין-1/2 באמצעות Qubit-ים במחשב קוונטי.
  • מדידות חוזרות של אותו אובייקט נצפה פיזי של אותו חלקיק/Qubit יניבו את אותה תוצאה (אלא אם המערכת מופרעת על ידי רעש).
  • אפשר להשתמש בתוצאות מניסוי שטרן-גרלך או מהניסויים האנלוגיים עם מחשבי קוונטום כדי לגזור מערכת של וקטורי מצב ואופרטורי מטריצה המתארים ספין מכניקת קוונטים.

שאלות נכון/לא נכון:

  1. נ/ל החל מתצפיות ניסויות, הבחירה היחידה התקפה לוקטור המייצג |\uparrow\rangle היא (10)\begin{pmatrix}1 \\ 0\end{pmatrix}
  2. נ/ל אם =(10)|\uparrow\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix}, הבחירה היחידה עבור |\downarrow\rangle היא (01)\begin{pmatrix}0 \\ 1\end{pmatrix} (עד לפאזה גלובלית).
  3. נ/ל חלקיק שנמדד להיות במצב 0|0\rangle ימשיך להימצא במצב 0|0\rangle במדידות עוקבות לאורך zz.
  4. נ/ל חלקיק שנמדד להיות במצב 0|0\rangle ימשיך להימצא במצב 0|0\rangle במדידות עוקבות לאורך xx.
  5. נ/ל חלקיק שנמדד להיות במצב 0|0\rangle תמיד יימצא במצב +x|+\rangle_x במדידות עוקבות לאורך xx.

שאלות רב-ברירה:

  1. מה ההסתברות של חלקיק שמתחיל ב-|\uparrow\rangle להימדד במצב +x|+x\rangle?

    • א. 0%
    • ב. 25%
    • ג. 50%
    • ד. 71%
    • ה. 100%
  2. מה ההסתברות של חלקיק שמתחיל ב-|\uparrow\rangle להימדד במצב |\downarrow\rangle?

    • א. 0%
    • ב. 25%
    • ג. 50%
    • ד. 71%
    • ה. 100%
  3. המצב |\uparrow\rangle של חלקיק ספין-1/2 קשור לרוב לאיזה מצב חישוב קוונטי?

    • א. +|+\rangle
    • ב. |-\rangle
    • ג. 0|0\rangle
    • ד. 1|1\rangle
    • ה. אף אחת מהאפשרויות לעיל

שאלות לדיון:

  1. שלושה חברים דנים במדידות קוונטיות ואופרטורים. חבר א' אומר, "עשיית מדידה לאורך zz ופעולה עם האופרטור σz\sigma_z הן אותו הדבר." חבר ב' אומר, "ובכן, הן נהלים שונים, אבל יש להן אותה תוצאה." חבר ג' אומר, "הן שונות לחלוטין; יש להן אפילו השפעות שונות על רוב המצבים." עם מי אתה מסכים ולמה?

בעיות בתגובה חופשית:

  1. בהתחשב בתצפיות הניסויות ובתחביר המוצע:

P+x=(10)(ab)2=a2=12P_{\uparrow+x}=\vert \begin{pmatrix}1 & 0\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |a|^2 =\frac{1}{2} P+x=(01)(ab)2=b2=12P_{\downarrow+x}=\vert \begin{pmatrix}0 & 1\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |b|^2 =\frac{1}{2}

הוכח שעד לפאזה גלובלית

+x=12(1eiα)|+\rangle_x = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ e^{i\alpha}\end{pmatrix}

בחר α=0\alpha = 0 כדי לקבל את התוצאה הסטנדרטית.

  1. בהתחשב בתצפיות הניסויות ובתחביר המוצע:

Px=(10)(ab)2=a2=12P_{\uparrow-x}=\vert \begin{pmatrix}1 & 0\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |a|^2 =\frac{1}{2} Px=(01)(ab)2=b2=12P_{\downarrow-x}=\vert \begin{pmatrix}0 & 1\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |b|^2 =\frac{1}{2}

ובשימוש בתוצאה מבעיית האתגר 3:

P+xx=12(11)(cd)2=12c+d2=0P_{+x-x}=\vert \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1\end{pmatrix}\begin{pmatrix}c \\ d\end{pmatrix}\vert^2 = \frac{1}{2}|c+d|^2 =0

הוכח שעד לפאזה גלובלית

+x=12(11)|+\rangle_x = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix}

הכרת תודה