ניסוי Stern-Gerlach באמצעות מחשבים קוונטיים
במודול Qiskit in Classrooms הזה, על הסטודנטים להיות עם סביבת Python פעילה עם החבילות הבאות מותקנות:
qiskitv2.1.0 או חדש יותרqiskit-ibm-runtimev0.40.1 או חדש יותרqiskit-aerv0.17.0 או חדש יותרqiskit.visualizationnumpypylatexenc
כדי להגדיר ולהתקין את החבילות שלמעלה, ראו את המדריך התקנת 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, הוא ניבא שאלקטרונים קיימים במסלולים מקוונטים מסוימים, דומים לכוכבי לכת שמקיפים את השמש.

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

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

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

כיצד qubits יעזרו לנו לבדוק זאת?
רוב המחשבים הקוונטיים משתמשים ב-"qubits" - האנלוגים הקוונטיים של ביטים קלאסיים. ליתר דיוק, הם מתוכננים להיות מערכות דו-רמתיות, אנלוגיות למצבי "דלוק"/"כבוי" של ביטים קלאסיים. פרדיגמות מחשוב קוונטי קיימות המשתמשות במערכות תלת-רמתיות (הנקראות "qutrits") או מערכות רב-רמתיות (הנקראות "qudits"). אבל רוב העבודה מתרכזת ב-qubits. בפרט, מחשבים קוונטיים של IBM® משתמשים במה שמכונה qubits transmon בתדירות קבועה. אלה שונים למדי מתנע זווית מסלולי או ספין של אטומים. אבל כמו ספין האלקטרון, qubits של IBM® הם מערכות קוונטיות-מכניות שיכולות לקיים אינטראקציה עם אור ועליהן ניתן לבצע מדידות. למעשה, לעתים קרובות מוצאים אנלוגיות בין מצבי ספין קוונטי-מכני ומצבים חישוביים של Qubit. לדוגמה, לעתים קרובות רואים את מצב "ספין-למעלה" המשויך למצב החישובי 0, ו"ספין-למטה" המשויך למצב החישובי 1:
נוכל להשתמש בדמיונות האלה כדי לצפות בהתנהגות קוונטית-מכנית במחשבים קוונטיים של IBM שמחקה את ההתנהגות הקוונטית-מכנית של תנע זווית מסלולי או ספין באטומים. נבצע תצפיות דומות באמצעות קומבינציות לינאריות של מצבים אלו המאפשרות לנו להרחיב את הדיון לתנע זווית בכל כיוון.
ניסוי ראשון: מדידה בודדת
בניסוי הראשון הזה ולאורך כל המודול, נשתמש במסגרת למחשוב קוונטי הידועה בשם "דפוסי Qiskit", אשר מחלקת זרימות עבודה לשלבים הבאים:
- שלב 1: מיפוי קלטים קלאסיים לבעיה קוונטית
- שלב 2: אופטימיזציה של הבעיה לביצוע קוונטי
- שלב 3: ביצוע באמצעות Qiskit Runtime Primitives
- שלב 4: עיבוד לאחר ביצוע וניתוח קלאסי
נלך בדרך כלל לפי השלבים האלה, אם כי לא תמיד נסמן אותם במפורש.
שלב 1: מיפוי קלטים קלאסיים לבעיה קוונטית
כאן, הקלטים הקלאסיים הם כיוונים של ספין לפני מדידה במכשיר Stern-Gerlach. אל תדאגו יותר מדי מהטבע המדויק של המצב הקוונטי לפני המדידה. זה נושא של מודול Qiskit Classrooms אחר, על משפט Bell.
שימו לב שמחשבים קוונטיים של IBM מודדים מצבים לאורך ציר . כך, הניסוי הראשון הזה יהיה דומה מאוד לניסוי Stern-Gerlach עם גרדיאנט השדה המגנטי לאורך . נראה כיצד לשנות את המערכת כדי למדוד לאורך כיוונים שונים, בהמשך.
נתחיל בהכנת האנלוג של מצב ספין, כלומר, תערובת כלשהי של ו- או בשקילות של ו-. הצענו כמה ערכים התחלתיים. אבל חופשיים לשחק עם ערכים אחרים או אפילו ערכים אקראיים.
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)
אנחנו רואים שלפעמים אנחנו מודדים 0 ולפעמים מודדים 1. שימו לב שאנחנו לעולם לא מודדים שום דבר אחר! אפשר לשנות את מספר ה-shots ולשים לב שההסתברות למדידת 0 או 1 נראית די עקבית בין ריצות שונות עם מספרי shots שונים. אז משהו בהכנת המצב נראה קובע את ההסתברות לתוצאות המדידה, אם כי כל מדידה בודדת יכולה להניב 0 או 1.
ניסוי שלישי: ספינים אקראיים בתנור
בניסוי שטרן-גרלאך, החוקרים לא יכלו לציין זווית שבה וקטור תנע זוויתי יצא מהתנור. הכיוונים היו אקראיים (או משהו מסתורי עוד יותר! ראו את מודול Qiskit Classroom על משפט בל). אנלוגיה סבירה לאותו ניסוי תהיה שנאתחל באקראי את מצבי ה-Qubit שלנו ונבצע מדידות רבות.
שלב 1: מיפוי קלטים קלאסיים לבעיה קוונטית
ה-Circuit שאנחנו רוצים לבנות זהה לקודם. הה בדל היחיד הוא שהפעם, נבנה את ה-Circuit באמצעות Gates עם פרמטרים חופשיים ו-. ערכים מספריים לאותם פרמטרים ייוקצו לכל ריצה חדשה.
# 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")
הרצת 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)
אז אנחנו רואים שהמצב ההתחלתי האקראי של ה-Qubits (המקביל לכיוונים אקראיים של תנע זוויתי בניסוי שטרן-גרלאך) מניב מספרים דומים של מצבי 0 ו-1 (כמו מספרים דומים של מצבי ספין עלה וספין ירד). זה בדיוק מה שהניסוי המקורי של שטרן-גרלאך הראה.
ניסוי רביעי: מדידות חוזרות
כשה-Qubit מתחיל במצב אקראי, אנחנו רואים שיש סיכוי של בערך 50-50 למדוד קצה אחד על פני השני. אבל מה קורה למצב של ה-Qubit (או לתנע הזוויתי של החלקיק) אחרי המדידה? כדי לענות על כך, נצטרך להגדיר Circuit שמאפשר לנו לבצע מדידות מרובות של אותם Qubits. בואו נגדיר Circuit שנוכל להשתמש בו כדי לחקור זאת. נרצה לאפשר את האפשרות למדוד את שני המצבים ו-, אז נצטרך משהו שיסובב את המצב ההתחלתי של ה-Qubit ממצב ברירת המחדל . במקרה זה, נשתמש ב-Gate של הדאמר , מכיוון ש-. שימו לב שכברירת מחדל, שתי המדידות הללו יהיו לאורך .
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)
באיור למעלה, הפחים מסומנים "00", "01" וכן הלאה. כאן, המספרים הללו מתייחסים ל"תוצאה שנייה, תוצאה ראשונה". אז "00" אומר ששתי המדידות הניבו את המצב , ו-"01" אומר שהמדידה הראשונה הניבה , והשנייה הניבה . הרוב המכריע של ה-Qubits נמדדו או כשניהם במצב , או כשניהם במצב . היה נדיר מאוד ש-Qubits נמדדו במצב אחד ואז נמדדו במצב אחר, והמקרים הבודדים שבהם זה קרה (~1%) נובעים מרעש. במקרה זה הרעש סומולל בהתאם להתנהגות המערכת הקוונטית האמיתית. מתאם זה שנצפה בין מדידות עוקבות נצפה גם במדידות מסוג שטרן-גרלאך של חלקיקים עם תנע זוויתי של ספין. אם חלקיק נמדד כ"ספין עלה", מדידה עוקבת זמן קצר לאחר מכן תניב שוב "ספין עלה" (למעט שינוי קטן עקב רעש).
זה אולי נשמע טריוויאלי. אחרי הכל, אם Qubit נמדד במצב אחד, ואז אני מודד אותו שוב, מהר, למה לא יהיה עדיין באותו מצב? אבל אם נאחז בעדינות זו, זה עשוי לעזור לנו לבחור כלים מתמטיים לתיאור תופעה זו.
ניתוח הניסויים עד כה
בואו נאסוף כמה תצפיות מהניסויים שלנו עד כה:
- המדידה של מערכת קוונטית מכנית תניב רק אחד מקבוצת "ערכים מותרים". עבור מערכות דו-רמות כמו Qubits או חלקיקים ספין-1/2, מדידה תניב רק אחת מהתוצאות הבינאריות.
- כשאנחנו מאתחלים באקראי את מצב המערכת הבינארית שלנו (כמו חלקיקי ספין-1/2 היוצאים מתנור), כל אחת מתוצאות המדידה הבינאריות אפשרית.
- ברגע שמדידה מבוצעת ומצב המערכת ידוע, חזרה על המדידה של אותו אובסרבבל פיזי לא משנה את המצב! כלומר, אם אנחנו מקבלים את מצב 0 פעם אחת, כשאנחנו מודדים שוב הוא עדיין במצב 0 (למעט רעש קטן במערכת ~0.1% עד 1%).
שים לב במפורש שעדיין לא התייחסנו לאופי ההסתברותי של מכניקת הקוונטים, ולא אמרנו דבר על "קריסת" המצב לאייגנסטייט. בשימוש רק בתצפיות שלמעלה, יכול להיות פיתוי לחפש פעולה מתמטית שמשא ירה קבוצה מיוחדת של מצבים קוונטיים מכניים ללא שינוי, אולי עד כדי קבוע: , מכיוון שמדידה לאורך פעמיים מניבה את אותה תוצאה. בסופו של דבר, חיפוש זה ייכשל בתיאור כל ההתנהגויות שנראה. אבל הוא יכול לתאר כמה דברים, אז נמשיך בו עוד קצת.
קיימת פעולה כזו. פעולת מטריצה על וקטורים מסוימים משנה את הוקטורים, ופעולת מטריצה על וקטורים אחרים (אייגנוקטורים) משאירה את הוקטור ללא שינוי עד כדי קבוע. קח למשל את המטריצה ואת הוקטור כאשר
ו-
שים לב ש-
אבל עבור וקטורים אחרים, נניח , יש לנו
אולי ננסה לתאר את הספין של חלקיק באמצעות מטריצה, וננסה לתאר את מצבי החלקיקים אחרי מדידה באמצעות וקטור, שנקרא "וקטור מצב". לא ברור כלל אילו ערכים צריכים להיכנס למטריצה או לוקטור מצב כזה, אבל התכונה היחידה שיש לנו מהמדידות עד כה שנוכל להשתמש בה לסימון מצבים תהיה ההסתברות למדידת 0 או 1 ("ספין עלה" או "ספין ירד" בהקשר של חלקיקי ספין-1/2). עלינו לשקול שהרשומות בוקטורי המצב צריכות להיות קשורות להסתברות הזו (בדיוק ההסתברות, "אמפליטודת הסתברות" - כלומר אנחנו מעלים את הרשומה בריבוע כדי לקבל את ההסתברות, וכן הלאה). אבל בשלב זה, אנחנו לא בטוחים אם הרשומות במטריצות הללו צריכות להיות ממשיות לחלוטין, מרוכבות, או מה. לבטיחות, ננסה לפתח מסגרת שבה הוקטורים והמטריצות מקיימים את הדברים הבאים:
- אופרטורי המטריצה מחוברים לניסוי כמה שיותר. לדוגמה, נוכל לקשר את האייגנערכים של מטריצת ספין עם הטלות הספין שנצפו בניסוי.
- וקטורי המצב צריכים להיות קשורים להסתברות בדרך הבאה: אם חלקיק נמצא בוקטור המצב , ההסתברות שמדידה עוקבת תמצא את החלקיק במצב היא .
זה נותן לנו המון חופש בפיתוח המטריצות הראשונות שלנו. לדוגמה, נוכל לנסות בתמימות
כאן אומר שיש מצבים במחשבים קוונטיים ובמערכות ספין-1/2 שדומים מאוד ולעתים קרובות ממופים אחד לשני. הם ברור לא בדיוק אותו הדבר, מכיוון שהם מתייחסים למערכות שונות. אבל האלגברה המתארת מערכות דו-מצביות אלה יכולה לציית לאותם כללים (ספויילר: הן כן!). שים לב שהבחירה האקראית הזו כבר יש לה תכונה נחמדה אחת. שים לב ש-
כלומר, אם חלקיק כבר נמצא במצב , ההסתברות שמדידה עוקבת תניב גם היא 1 (ללא השפעות רעש). זה מצוין, כי כבר ראינו שברגע שמצב נמצא במצב 0 או "ספין עלה", הוא נשאר שם במדידה עוקבת. ההסתברות שלמעלה אכן צריכה להיות 100%.
בדוק את הבנתך
קרא את השאלות למטה, חשוב על התשובות שלך, ואז לחץ על המשולשים כדי לגלות את הפתרונות.
למה
בחירה טובה יותר מאשר, נניח,
תשובה:
הניסיון שלנו לקשר את ההסתברות של מדידה עם מכפלה פנימית בריבוע אומר שאנחנו צריכים שהגודל של כל וקטור יהיה 1. כלומר, לכל , מכיוון שההסתברות שדבר במצב יהיה במצב היא 100%. זה ידוע כ"תנאי הנורמליזציה".
למה
בחירה טובה יותר מאשר, נניח,
תשובה:
זו לא. אין סיבה שנצטרך לבחור בתחילה . זוהי מוסכמה בלבד. אולם, ברגע שאנחנו מבצעים את הבחירה הזו, היא מטילה אילוצים מסוימים על בחירות עתידיות. ראה למטה.
זכור שבניסויים שלמעלה, מצאנו ש-Qubit שהתחיל במצב נשאר באותו מצב במדידה עוקבת. אותו הדבר נכון לגבי . המשמעות היא ש-Qubit שנמצא ב- יש לו אפס הסתברות להימדד במצב (ללא השפעות רעש). הקשר הנדרש בין מכפלות פנימיות והסתברויות של מדידות אז אומר לנו ש-
ללא אובדן כלליות, נוכל לכתוב את וקטור המצב . אז נוכל לכתוב
הדרישה ש-, "תנאי הנורמליזציה" הידוע, אומרת לנו ש-. זה כשלעצמו באמת מגביל אותנו רק ל- עבור . מתברר שיש סיבות אחרות לבחור שחורגות ממבוא זה לנושא. לעת עתה, יספיק שנאמר ש- היא פתרון מקובל אחד.
הגענו רחוק למדי בניתוח שלנו. בחירת צורה לוקטורי המצב שלנו מאפשרת לנו לבנות מטריצה שמתארת משהו על התופעות הפיזיות שעובדות כאן. בפרט, מכיוון שניסוי שטרן-גרלאך המקורי מדד פיצול של מסלולים בהתבסס על רכיבי תנע זוויתי ספין לאורך ציר , היינו רוצים אופרטור שמתאר בדיוק את זה: . קשר מפתח נוסף לניסוי הוא שמכמות ההסטה, זמן המעבר, ועוצמת השדה המגנטי הידועה, ניתן לקבוע את גודל רכיב ה- של הספין. אם כי זה דורש הרבה הנחות לגבי דיוק ההגדרה הניסיונית, כאן פשוט נחזור על כך שרכיבי ה-z המדודים של תנע זוויתי ספין הם .
אז אנחנו מחפשים מטריצה עם אייגנערכים ממשיים (מסופק על ידי מטריצות הרמיטיות) עם אייגנערכים המתאימים לרכיבי הספין שנצפו בניסוי. ללא אובדן כלליות, נוכל לכתוב , ונוכל לדרוש:
בשילוב, ובהוצאת גורם הכולל , יש לנו
זהו אופרטור הספין-z הידוע המופיע בכל ספרי הלימוד של מכניקת הקוונטים. לעתים קרובות רואים זאת עם שהוסר, ובמקרה זה זהו אופרטור "פאולי-z", המסומן בדרך כלל :
זה שימושי, מכיוון שאופרטור פאולי זה (ומטריצות קשורות) יכולים לתאר מערכות פיזיות רבות הכוללות שתי רמות או שתי תוצאות אפשריות של מדידה, כולל מצבי Qubits של טרנסמון במחשב קוונטי.
לפני שנעבור לאופרטורים ומצבים אחרים הקשורים לזה, עלינו להתייחס לעובדה שהרבה אנשים טועים בה. פעולת אופרטור אינה זהה למדידה. במובן אחד, אפשר לומר, "כמובן שלא! אחד קורה על הנייר כחלק מחישוב מתמטי, והשני קורה במעבדה על מערכות פיזיות." כן, זה נכון, אבל זה יותר מזה. ביצוע מדידה של רכיב ה- של הספין תמיד יניב מצב "ספין עלה" או "ספין ירד", ללא קשר למצב ההתחלתי של המערכת. ראינו זאת עם האנלוגים של מחשוב קוונטי ו-. אתחלנו מצבים למאות כיוונים אקראיים, ומדידות תמיד הניבו או . זה ידוע כמדידה ש"קורסת את המצב" לאייגנסטייט. זה לא קורה כשמחילים מטריצה על מצב. נסה את השאלות למטה כדי לחקור זאת.
בדוק את הבנתך
קרא את השאלות למטה, חשוב על התשובה שלך, ואז לחץ על המשולש כדי לגלות את הפתרון.
נניח שאתה מתחיל עם חלקיק במצב ספין
(א) מה מקבלים כשמפעילים את האופרטור על וקטור המצב הזה? (ב) מה מקבלים כשעושים מדידה בודדת של רכיב ה- של הספין של החלקיק הזה? (ג) מה מקבלים כשמכינים הרבה חלקיקים זהים למצב הזה ועושים אלפי מדידות של רכיב ה- של הספין?
תשובות:
(א) מקבלים
זהו. אין כאן תוצאה ניסוי ית. פשוט מחילים את המטריצה על הוקטור ומקבלים וקטור קצת שונה שיש בו עכשיו סימן "-" חדש, ולא עוד בעל גודל 1, כי יש לו מקדם .
(ב) תקבל או . זה מתאים לצפייה בהטלת ספין על ציר ה- של או , בהתאמה. אפשר גם לקבוע את ההסתברות לכל תוצאה, כי