ציון אובזרבלים בבסיס פאולי
גרסאות חבילות
הקוד בדף זה פותח תוך שימוש בדרישות הבאות. אנחנו ממליצים להשתמש בגרסאות אלו או בגרסאות חדשות יותר.
qiskit[all]~=2.4.0
במכניקת הקוונטים, אובזרבלים מתאימים לתכונות פיזיקליות שניתן למדוד. כשבוחנים מערכת של ספינים, למשל, אפשר להתעניין במדידת האנרגיה של המערכת או בקבלת מידע על יישור הספינים, כמו המגנטיזציה או הקורלציות בין ספינים.
כדי למדוד אובזרבל -Qubit על מחשב קוונטי, יש לייצג אותו כסכום של מכפלות טנסוריות של אופרטורי פאולי, כלומר
כאשר
ומשתמשים בעובדה שאובזרבל הוא הרמיטי, כלומר . אם אינו הרמיטי, עדיין ניתן לפרק אותו כסכום של פאולים, אך המקדם הופך מרוכב.
במקרים רבים, האובזרבל מוגדר באופן טבעי בייצוג זה לאחר מיפוי המערכת המעניינת ל-Qubits. לדוגמה, מערכת ספין-1/2 ניתנת למיפוי להמילטוניאן איזינג
כאשר האינדקסים רצים על ספינים מקיימי אינטראקציה, והספינים כפופים לשדה רוחבי ב-. אינדקס המשנה מציין על איזה qubit פועל אופרטור פאולי, כלומר מפעיל אופרטור על qubit ומשאיר את השאר ללא שינוי.
ב-Qiskit SDK, ניתן לבנות את ההמילטוניאן הזה עם הקוד הבא.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
from qiskit.quantum_info import SparsePauliOp
# define the number of qubits
n = 12
# define the single Pauli terms as ("Paulis", [indices], coefficient)
interactions = [
("ZZ", [i, i + 1], 1) for i in range(n - 1)
] # we assume spins on a 1D line
field = [("X", [i], -1) for i in range(n)]
# build the operator
hamiltonian = SparsePauliOp.from_sparse_list(
interactions + field, num_qubits=n
)
print(hamiltonian)
SparsePauliOp(['IIIIIIIIIIZZ', 'IIIIIIIIIZZI', 'IIIIIIIIZZII', 'IIIIIIIZZIII', 'IIIIIIZZIIII', 'IIIIIZZIIIII', 'IIIIZZIIIIII', 'IIIZZIIIIIII', 'IIZZIIIIIIII', 'IZZIIIIIIIII', 'ZZIIIIIIIIII', 'IIIIIIIIIIIX', 'IIIIIIIIIIXI', 'IIIIIIIIIXII', 'IIIIIIIIXIII', 'IIIIIIIXIIII', 'IIIIIIXIIIII', 'IIIIIXIIIIII', 'IIIIXIIIIIII', 'IIIXIIIIIIII', 'IIXIIIIIIIII', 'IXIIIIIIIIII', 'XIIIIIIIIIII'],
coeffs=[ 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j,
1.+0.j, 1.+0.j, 1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j,
-1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j])
אם נרצה למדוד את האנרגיה, האובזרבל הוא ההמילטוניאן עצמו. לחלופין, אפשר להתעניין במדידת תכונות המערכת כמו המגנטיזציה הממוצעת על ידי ספירת מספר הספינים המיושרים בכיוון עם האובזרבל
עבור אובזרבלים שאינם נתונים במונחי אופרטורי פאולי אלא בצורת מטריצה, יש קודם לנסח אותם מחדש בבסיס פאולי כדי לחשב אותם על מחשב קוונטי. תמיד ניתן למצוא ייצוג כזה שכן מטריצות פאולי מהוות בסיס למטריצות ההרמיטיות . מפרקים את האובזרבל כ-
כאשר הסכום רץ על כל איברי פאולי -Qubit האפשריים ו- הוא העקבה של מטריצה, הפועלת כמכפלה פנימית.
ניתן לממש פירוק זה ממטריצה לאיברי פאולי באמצעות מתודת SparsePauliOp.from_operator, כך:
import numpy as np
from qiskit.quantum_info import SparsePauliOp
matrix = np.array(
[[-1, 0, 0.5, -1], [0, 1, 1, 0.5], [0.5, 1, -1, 0], [-1, 0.5, 0, 1]]
)
observable = SparsePauliOp.from_operator(matrix)
print(observable)
SparsePauliOp(['IZ', 'XI', 'YY'],
coeffs=[-1. +0.j, 0.5+0.j, 1. -0.j])
משמעות הדבר היא שניתן לכתוב את המטריצה כאיברי פאולי: .
זכור שסדר המכפלה הטנסורית ממפה ל-Qubits כ-.
אם האובזרבל הרמיטי (כלומר ), מקדמי פאולי הם מספרים ממשיים. עם זאת, ניתן גם לפרק כל מטריצה מרוכבת אחרת במונחי פאולים, אם מאפשרים מקדמים עם ערכים מרוכבים.
מדידה בבסיסי פאולי
מדידה מקרינה את מצב ה-Qubit לבסיס החישובי . משמעות הדבר היא שניתן למדוד רק אובזרבלים שהם אלכסוניים בבסיס זה, כמו פאולים המורכבים רק מאיברי ו-. מדידת איברי פאולי שרירותיים מחייבת לכן שינוי בסיס לאלכסון שלהם. לשם כך, מבצעים את הטרנספורמציות הבאות,
כאשר הוא Gate הדמארד ו- מכונה לפעמים gate הפאזה. אם משתמשים ב-Estimator לחישוב ערכי ציפייה, טרנספורמציות הבסיס מתבצעות אוטומטית.
להלן דוגמה המדגימה כיצד להכין Circuit קוונטי ולמדוד ידנית את qubit 0 בבסיס X, Qubit 1 בבסיס Y ו-Qubit 2 בבסיס Z. מיישמים את הטרנספורמציות שהוצגו במשוואה הקודמת ומקבלים את ה-Circuit הבא:
from qiskit.circuit import QuantumCircuit
# create a circuit, where we would like to measure
# q0 in the X basis, q1 in the Y basis and q2 in the Z basis
circuit = QuantumCircuit(3)
circuit.ry(0.8, 0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.barrier()
# diagonalize X with the Hadamard gate
circuit.h(0)
# diagonalize Y with Hadamard as S^\dagger
circuit.sdg(1)
circuit.h(1)
# the Z basis is the default, no action required here
# measure all qubits
circuit.measure_all()
circuit.draw("mpl")
הצעדים הבאים
- קרא את תיעוד SparsePauliOp API.