تحديد المراقبات في أساس باولي
إصدارات الحزم
تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث منها.
qiskit[all]~=2.3.0
في ميكانيكا الكم، تقابل المراقبات الخصائص الفيزيائية التي يمكن قياسها. عند دراسة نظام من السبينات (spins)، على سبيل المثال، قد تكون مهتماً بقياس طاقة النظام أو الحصول على معلومات حول محاذاة السبينات، كالمغنطة أو الترابطات بين السبينات.
لقياس مراقِبة -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 على الأساس الحسابي . هذا يعني أنك لا تستطيع قياس إلا المراقِبات القطرية في هذا الأساس، كمراقِبات باولي التي تتألف فقط من حدود و. لذا يتطلب قياس حدود باولي الاعتباطية تغيير الأساس لتحويلها إلى صورة قطرية. لإنجاز ذلك، طبّق التحويلات التالية،
حيث هو بوابة هادامار و تُعرف أحياناً ببوابة الطور. إذا كنت تستخدم Estimator لحساب قيم التوقع، يتم تنفيذ تحويلات الأساس تلقائياً.
فيما يلي مثال يوضح كيفية تحضير دائرة كمّية وقياس Qubit 0 يدوياً في أساس X، وQubit 1 في أساس Y، وQubit 2 في أساس Z. نُطبّق التحويلات المبيّنة في المعادلة السابقة ونحصل على الدائرة التالية:
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.