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

ترتيب البتات في Qiskit SDK

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

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

qiskit[all]~=2.3.0

إذا كان لديك مجموعة من nn بتًا (أو كيوبت)، فعادةً ما تُسمّي كل بت بالرقم من 00 إلى n1n-1. تحتاج البرامج والموارد المختلفة إلى اختيار طريقة لترتيب هذه البتات، سواء في الذاكرة أو عند عرضها على الشاشة.

اتفاقيات Qiskit

إليك كيفية ترتيب Qiskit SDK للبتات في سيناريوهات مختلفة.

دوائر Quantum

تخزّن فئة QuantumCircuit كيوباتها في قائمة (QuantumCircuit.qubits). يُحدِّد فهرس الكيوبت في هذه القائمة تسمية الكيوبت.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit import Qubit

qc = QuantumCircuit(2)
qc.qubits[0] # qubit "0"

Qubit(QuantumRegister(2, "q"), 0)
<Qubit register=(2, "q"), index=0>

مخططات الدوائر

في مخطط الدائرة، الكيوبت 00 هو الكيوبت الأعلى، والكيوبت n1n-1 هو الأسفل. يمكنك تغيير ذلك باستخدام المعامل reverse_bits في QuantumCircuit.draw (انظر تغيير الترتيب في Qiskit).

qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

الأعداد الصحيحة

عند تفسير البتات كرقم، البت 00 هو البت الأقل أهمية، والبت n1n-1 هو الأكثر أهمية. هذا مفيد عند البرمجة لأن قيمة كل بت هي 2label2^\text{label} (حيث label هو فهرس الكيوبت في QuantumCircuit.qubits). مثلًا، تنتهي تنفيذ الدائرة التالية بالبت 00 بقيمة 0، والبت 11 بقيمة 1، وهو ما يُفسَّر كالعدد الصحيح العشري 2 (يُقاس باحتمال 1.0).

from qiskit.primitives import StatevectorSampler as Sampler

qc.measure_all()

job = Sampler().run([qc])
result = job.result()
print(f" > Counts: {result[0].data.meas.get_counts()}")
> Counts: {'10': 1024}

السلاسل النصية

عند عرض قائمة من البتات (أو الكيوبتات) كسلسلة نصية أو تفسيرها، يكون البت n1n-1 هو البت الأقصى يسارًا، والبت 00 هو الأقصى يمينًا. هذا لأننا عادةً نكتب الأرقام بوضع الرقم الأكثر أهمية على اليسار، وفي Qiskit يُعدّ البت n1n-1 هو الأكثر أهمية.

مثلًا، تُعرِّف الخلية التالية Statevector من سلسلة من حالات كيوبت منفردة. في هذه الحالة، الكيوبت 00 في الحالة +|+\rangle، والكيوبت 11 في الحالة 0|0\rangle.

from qiskit.quantum_info import Statevector

sv = Statevector.from_label("0+")
sv.probabilities_dict()
{np.str_('00'): np.float64(0.4999999999999999),
np.str_('01'): np.float64(0.4999999999999999)}

يتسبب هذا أحيانًا في الإرباك عند تفسير سلسلة من البتات، إذ قد تتوقع أن يكون البت الأقصى يسارًا هو البت 00، بينما يمثّل في الغالب البت n1n-1.

مصفوفات Statevector

عند تمثيل statevector كقائمة من الأعداد المركبة (السعات)، يرتّب Qiskit هذه السعات بحيث تمثّل السعة عند الفهرس xx حالة الأساس الحسابي x|x\rangle.

print(sv[1])  # amplitude of state |01>
print(sv[2]) # amplitude of state |10>
(0.7071067811865475+0j)
0j

البوابات

يمكن لكل Gate في Qiskit أن تفسّر قائمة الكيوبتات بطريقتها الخاصة، لكن البوابات المتحكّمة عادةً تتبع الاتفاقية (control, target).

مثلًا، تضيف الخلية التالية بوابة controlled-X حيث الكيوبت 00 هو المتحكم والكيوبت 11 هو الهدف.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘

باتباع جميع الاتفاقيات المذكورة سابقًا في Qiskit، تُجري بوابة CX هذه التحويل 0111|01\rangle \leftrightarrow |11\rangle، لذا فمصفوفتها هي:

(1000000100100100)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ \end{pmatrix}

تغيير الترتيب في Qiskit

لرسم دائرة مع الكيوبتات بترتيب معكوس (أي الكيوبت 00 في الأسفل)، استخدم المعامل reverse_bits. يؤثر هذا فقط على المخطط المُوَلَّد ولا يؤثر على الدائرة؛ لا تزال بوابة X تعمل على الكيوبت 00.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.x(0)
qc.draw(reverse_bits=True)
q_1: ─────
┌───┐
q_0: ┤ X ├
└───┘

يمكنك استخدام الأسلوب reverse_bits لإرجاع دائرة جديدة مع عكس تسميات الكيوبتات (لا يُعدِّل هذا الدائرة الأصلية).

qc.reverse_bits().draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

لاحظ أنه في هذه الدائرة الجديدة، تعمل بوابة X على الكيوبت 11.

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

توصيات