ترتيب البتات في Qiskit SDK
Package versions
تم تطوير الشيفرة في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث.
qiskit[all]~=2.5.2
إذا كان لديك مجموعة من بتات (أو qubits)، فستقوم عادةً بتصنيف كل بت بـ . يجب على البرمجيات والموارد المختلفة اختيار كيفية ترتيب هذه البتات، سواء في ذاكرة الحاسوب أو عند عرضها على الشاشة.
اتفاقيات Qiskit
إليك كيفية ترتيب Qiskit SDK للبتات في سيناريوهات مختلفة.
Primitives
افتراضيًا، يتبع Qiskit اصطلاح ترتيب البتات little-endian. لكن القيمة الافتراضية في BitArray هي big (endian)، مما يسبب بعض الاختلافات في ناتج primitives، بحسب ما إذا كانت primitive تغيّر هذا الإعداد أم لا. على سبيل المثال، تُرجع primitives من نوع Sampler وEstimator في IBM® Quantum Compute Service نتائج big-endian، بينما يُرجع Executor نتائج little-endian.
الدوائر الكمومية
تخزّن فئة QuantumCircuit كيوباتها في قائمة
(QuantumCircuit.qubits). يُحدِّد فهرس الكيوبت في هذه القائمة
تسمية الكيوبت.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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>
مخططات الدوائر
في مخطط الدائرة، الكيوبت هو الكيوبت الأعلى، والكيوبت هو
الأسفل. يمكنك تغيير ذلك باستخدام المعامل reverse_bits في
QuantumCircuit.draw (انظر تغيير الترتيب في
Qiskit).
qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘
الأعداد الصحيحة
عند تفسير البتات كرقم، البت هو البت الأقل أهمية، والبت هو الأكثر أهمية. هذا مفيد عند البرمجة لأن قيمة كل بت هي (حيث label هو فهرس الكيوبت في QuantumCircuit.qubits). مثلًا، ينتهي تنفيذ الدائرة التالية بالبت بقيمة 0، والبت بقيمة 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}
السلاسل النصية
عند عرض قائمة من البتات (أو الكيوبتات) كسلسلة نصية أو تفسيرها، يكون البت هو البت الأقصى يسارًا، والبت هو الأقصى يمينًا. هذا لأننا عادةً نكتب الأرقام بوضع الرقم الأكثر أهمية على اليسار، وفي Qiskit يُعدّ البت هو الأكثر أهمية.
مثلًا، تُعرِّف الخلية التالية Statevector من سلسلة من حالات كيوبت منفردة. في هذه الحالة، الكيوبت في الحالة ، والكيوبت في الحالة .
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)}
يتسبب هذا أحيانًا في الإرباك عند تفسير سلسلة من البتات، إذ قد تتوقع أن يكون البت الأقصى يسارًا هو البت ، بينما يمثّل في الغالب البت .
مصفوفات Statevector
عند تمثيل statevector كقائمة من الأعداد المركبة (السعات)، يرتّب Qiskit هذه السعات بحيث تمثّل السعة عند الفهرس حالة الأساس الحسابي .
print(sv[1]) # amplitude of state |01>
print(sv[2]) # amplitude of state |10>
(0.7071067811865475+0j)
0j
البوابات
يمكن لكل Gate في Qiskit أن تفسّر قائمة الكيوبتات بطريقتها الخاصة، لكن البوابات المتحكّمة عادةً تتبع الاتفاقية (control, target).
مثلًا، تضيف الخلية التالية بوابة controlled-X حيث الكيوبت هو المتحكم والكيوبت هو الهدف.
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘
باتباع جميع الاتفاقيات المذكورة سابقًا في Qiskit، تُجري بوابة CX هذه التحويل ، لذا فمصفوفتها هي:
تغيير الترتيب في Qiskit
لرسم دائرة مع الكيوبتات بترتيب معكوس (أي الكيوبت في الأسفل)، استخدم المعامل reverse_bits. يؤثر هذا فقط على المخطط المُوَلَّد ولا يؤثر على الدائرة؛ لا تزال بوابة X تعمل على الكيوبت .
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 على الكيوبت .
الخطوات التالية
- اطّلع على مثال لاستخدام الدوائر في درس خوارزمية غروفر.
- استكشف مرجع QuantumCircuit API.