انتقل إلى المحتوى الرئيسي

قياس الكيوبتات

إصدارات الحزم

تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث منها.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

للحصول على معلومات حول حالة الكيوبت، يمكنك قياسه على بت كلاسيكي. في Qiskit، تُجرى القياسات في الأساس الحسابي، أي أساس Pauli-ZZ أحادي الكيوبت. لذلك، يُعطي القياس القيمة 0 أو 1، تبعاً للتداخل مع الحالات الذاتية لـ Pauli-ZZ وهي 0|0\rangle و1|1\rangle:

qmeasure{0(outcome+1),with probability p0=q02,1(outcome1),with probability p1=q12.|q\rangle \xrightarrow{measure}\begin{cases} 0 (\text{outcome}+1), \text{with probability } p_0=|\langle q|0\rangle|^{2}\text{,} \\ 1 (\text{outcome}-1), \text{with probability } p_1=|\langle q|1\rangle|^{2}\text{.} \end{cases}

قياسات منتصف الدائرة

قياسات منتصف الدائرة هي مكوّن أساسي في الدوائر الديناميكية. قبل الإصدار v0.43.0 من qiskit-ibm-runtime، كانت measure هي تعليمة القياس الوحيدة في Qiskit. غير أن قياسات منتصف الدائرة تختلف في متطلبات الضبط عن القياسات الطرفية (القياسات التي تحدث في نهاية الدائرة). فمثلاً، تحتاج إلى مراعاة مدة التعليمة عند ضبط قياس منتصف الدائرة، لأن التعليمات الأطول تُنتج دوائر أكثر ضوضاءً. في المقابل، لا تحتاج إلى مراعاة مدة التعليمة في القياسات الطرفية لأنه لا توجد تعليمات بعدها.

في الإصدار v0.43.0 من qiskit-ibm-runtime، تم تقديم تعليمة MidCircuitMeasure. كما يوحي الاسم، هي تعليمة قياس جديدة مُحسَّنة لقياسات منتصف الدائرة على أجهزة IBM® QPU.

ملاحظة

تعليمة MidCircuitMeasure تُعيَّن إلى تعليمة measure_2 المُبلَّغ عنها في supported_instructions الخاصة بالجهاز الخلفي. إلا أن measure_2 غير مدعومة على جميع الأجهزة الخلفية. استخدم service.backends(filters=lambda b: "measure_2" in b.supported_instructions) للعثور على الأجهزة التي تدعمها. قد تُضاف قياسات جديدة في المستقبل، لكن هذا غير مضمون.

تطبيق قياس على دائرة

هناك عدة طرق لتطبيق القياسات على دائرة:

طريقة QuantumCircuit.measure

استخدم طريقة measure لقياس QuantumCircuit.

أمثلة:

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit

qc = QuantumCircuit(5, 5)
qc.x(0)
qc.x(1)
qc.x(4)
qc.measure(
range(5), range(5)
) # Measures all qubits into the corresponding clbit.
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260490>
from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure(1, 0) # Measure qubit 1 into the classical bit 0.
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260820>

صنف Measure

يقوم صنف Qiskit Measure بقياس الكيوبتات المحددة.

from qiskit.circuit import Measure

qc = QuantumCircuit(3, 1)
qc.x([0, 1])
qc.append(Measure(), [0], [0]) # measure qubit 0 into clbit 0
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260df0>

طريقة QuantumCircuit.measure_all

لقياس جميع الكيوبتات في البتات الكلاسيكية المقابلة لها، استخدم طريقة measure_all. بشكل افتراضي، تضيف هذه الطريقة بتات كلاسيكية جديدة في ClassicalRegister لتخزين هذه القياسات.

from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure_all() # Measure all qubits.

طريقة QuantumCircuit.measure_active

لقياس جميع الكيوبتات غير الخاملة، استخدم طريقة measure_active. تنشئ هذه الطريقة ClassicalRegister جديداً بحجم يساوي عدد الكيوبتات غير الخاملة المُراد قياسها.

from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure_active() # Measure qubits that are not idle, that is, qubits 0 and 2.

طريقة MidCircuitMeasure

استخدم MidCircuitMeasure لتطبيق قياس منتصف دائرة (يتطلب qiskit-ibm-runtime v0.43.0 أو أحدث). بينما يمكنك استخدام QuantumCircuit.measure لقياس منتصف الدائرة، إلا أن MidCircuitMeasure يُعدّ في الغالب خياراً أفضل نظراً لتصميمه. فمثلاً، يُضيف عبئاً أقل على دائرتك مقارنةً باستخدام QuantumCircuit.measure.

from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime.circuit import MidCircuitMeasure
from qiskit.circuit import Measure

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

circ = QuantumCircuit(2, 2)
circ.x(0)
circ.append(MidCircuitMeasure(), [0], [0])
# circ.measure([0], [0])
# circ.measure_all()
print(circ.draw(cregbundle=False))
┌───┐┌────────────┐
q_0: ┤ X ├┤0 ├
└───┘│ │
q_1: ─────┤ Measure_2 ├
│ │
c_0: ═════╡0 ╞
└────────────┘
c_1: ═══════════════════
ملاحظات مهمة
  • يجب أن يكون هناك سجل كلاسيكي واحد على الأقل لاستخدام القياسات.
  • يتطلب primitive المُعيِّن (Sampler) قياسات الدائرة. يمكنك إضافة قياسات الدائرة مع primitive المُقدِّر (Estimator)، لكنها تُتجاهل.

الخطوات التالية

توصيات