مكتبة الدوائر
إصدارات الحزم
تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو ما هو أحدث منها.
qiskit[all]~=2.3.0
يتضمن Qiskit SDK مكتبةً من الدوائر الشائعة يمكن استخدامها كلبنات بناء في برامجك الخاصة. يوفر استخدام الدوائر المحددة مسبقاً الوقت في البحث وكتابة الكود وتصحيح الأخطاء. تشمل المكتبة دوائر شائعة في الحوسبة الكمية، ودوائر يصعب محاكاتها بالطرق الكلاسيكية، ودوائر مفيدة لقياس أداء الأجهزة الكمية.
تسرد هذه الصفحة فئات الدوائر المختلفة التي توفرها المكتبة. للاطلاع على قائمة كاملة بالدوائر، راجع توثيق API لمكتبة الدوائر.
البوابات القياسية
تتضمن مكتبة الدوائر أيضاً بوابات كمية قياسية. بعضها بوابات أساسية (مثل UGate)، وبعضها بوابات متعددة الكيوبت تحتاج عادةً إلى بنائها من بوابات أحادية وثنائية الكيوبت. لإضافة البوابات المستوردة إلى دائرتك، استخدم الدالة append؛ الوسيطة الأولى هي البوابة، والوسيطة التالية هي قائمة بالكيوبتات التي ستُطبَّق عليها البوابة.
على سبيل المثال، يُنشئ الكود التالي دائرةً تحتوي على بوابة Hadamard وبوابة multi-controlled-X.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
from qiskit.circuit.library import HGate, MCXGate
mcx_gate = MCXGate(3)
hadamard_gate = HGate()
qc = QuantumCircuit(4)
qc.append(hadamard_gate, [0])
qc.append(mcx_gate, [0, 1, 2, 3])
qc.draw("mpl")
راجع البوابات القياسية في توثيق API لمكتبة الدوائر.
دوائر N-local
تتناوب هذه الدوائر بين طبقات من بوابات الدوران أحادية الكيوبت وطبقات من بوابات التشابك متعددة الكيوبت.
تحظى هذه العائلة من الدوائر بشعبية كبيرة في خوارزميات الكم التغايرية لأنها قادرة على إنتاج مجموعة واسعة من الحالات الكمية. تضبط الخوارزميات التغايرية معاملات البوابات للعثور على الحالات التي تمتلك خصائص معينة (مثل الحالات التي تمثل حلاً جيداً لمسألة تحسين). لهذا الغرض، يكون كثير من الدوائر في المكتبة ذات معاملات قابلة للتعيين، أي يمكنك تعريفها دون قيم ثابتة.
يستورد الكود التالي دائرة n_local تكون فيها بوابات التشابك بوابات ثنائية الكيوبت. تتداخل هذه الدائرة بين كتل من بوابات أحادية الكيوبت ذات معاملات وكتل تشابك من بوابات ثنائية الكيوبت. ينشئ ال كود التالي دائرة ثلاثية الكيوبت تضم بوابات RX أحادية الكيوبت وبوابات CZ ثنائية الكيوبت.
from qiskit.circuit.library import n_local
two_local = n_local(3, "rx", "cz")
two_local.draw("mpl")
يمكنك الحصول على كائن يشبه القائمة يحتوي على معاملات الدائرة من خلال الخاصية parameters.
two_local.parameters
ParameterView([ParameterVectorElement(θ[0]), ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]), ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]), ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]), ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]), ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]), ParameterVectorElement(θ[11])])
يمكنك أيضاً استخدام ذلك لتعيين هذه المعاملات لقيم حقيقية باستخدام قاموس بالشكل { Parameter: number }. لتوضيح ذلك، يعيّن الكود التالي كل معامل في الدائرة إلى القيمة 0.
bound_circuit = two_local.assign_parameters(
{p: 0 for p in two_local.parameters}
)
bound_circuit.decompose().draw("mpl")
لمزيد من المعلومات، راجع بوابات N-local في توثيق API لمكتبة الدوائر، أو خذ دورة تصميم الخوارزميات التغايرية في IBM Quantum Learning.
دوائر ترميز البيانات
تُرمِّز هذه الدوائر ذات المعاملات القابلة للتعيين البياناتِ على الحالات الكمية لمعالجتها بواسطة خوارزميات تعلم الآلة الكمية. بعض الدوائر التي يدعمها Qiskit هي:
- الترميز بالسعة (Amplitude encoding)، الذي يُرمِّز كل رقم في سعة حالة أساسية. يمكنه تخزين رقم في حالة واحدة، لكن قد يكون مكلفاً في التنفيذ.
- الترميز بالأساس (Basis encoding)، الذي يُرمِّز عدداً صحيحاً بتحضير حالة الأساس المقابلة .
- الترميز بالزاوية (Angle encoding)، الذي يضع كل رقم في البيانات كزاوية دوران في دائرة ذات معاملات قابلة للتعيين.
يعتمد النهج الأفضل على تفاصيل تطبيقك. على أجهزة الكم الحالية مع ذلك، نستخدم في الغالب دوائر الترميز بالزاوية مثل zz_feature_map.
from qiskit.circuit.library import zz_feature_map
features = [0.2, 0.4, 0.8]
feature_map = zz_feature_map(feature_dimension=len(features))
encoded = feature_map.assign_parameters(features)
encoded.draw("mpl")
راجع دوائر ترميز البيانات في توثيق API لمكتبة الدوائر.
دوائر تطور الزمن
تحاكي هذه الدوائر تطور حالة كمية عبر الزمن. استخدم دوائر تطور الزمن للتحقيق في التأثيرات الفيزيائية كانتقال الحرارة أو تحولات الطور في نظام ما. كما تُعدّ دوائر تطور الزمن لبنةً بناءً أساسيةً في دوال موجة الكيمياء (مثل حالات التجربة من نوع unitary coupled-cluster) وفي خوارزمية QAOA التي نستخدمها لمسائل التحسين.
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
# Prepare an initial state with a Hadamard on the middle qubit
state = QuantumCircuit(3)
state.h(1)
hamiltonian = SparsePauliOp(["ZZI", "IZZ"])
evolution = PauliEvolutionGate(hamiltonian, time=1)
# Evolve state by appending the evolution gate
state.compose(evolution, inplace=True)
state.draw("mpl")
اقرأ توثيق API الخاص بـ PauliEvolutionGate.
دوائر المقارنة المرجعية ونظرية التعقيد
تمنحنا دوائر المقارنة المرجعية فكرةً عن مدى كفاءة أجهزتنا فعلياً، فيما تساعدنا دوائر نظرية التعقيد على فهم مدى صعوبة المسائل التي نريد حلها.
على سبيل المثال، يقيس معيار "الحجم الكمي" (quantum volume) مدى دقة تنفيذ حاسوب كمي لنوع من دوائر الكم العشوائية. يزداد تقييم الحاسوب الكمي مع حجم الدائرة التي يستطيع تشغيلها بشكل موثوق. يأخذ ذلك في الاعتبار جميع جوانب الحاسوب، بما فيها عدد الكيوبتات، وأمانة التعليمات، واتصالية الكيوبت، وحزمة البرمجيات التي تُترجم البرنامج وتعالج النتائج. اقرأ المزيد عن الحجم الكمي في ورقة الحجم الكمي الأصلية.
يُظهر الكود التالي مثالاً على دائرة حجم كمي مبنية في Qiskit تعمل على أربعة كيوبتات (كتل unitary هي بواب ات ثنائية الكيوبت عشوائية).
from qiskit.circuit.library import quantum_volume
quantum_volume(4).draw("mpl")
تتضمن مكتبة الدوائر أيضاً دوائر يُعتقد أنها صعبة المحاكاة بالطرق الكلاسيكية، كدوائر كثيرة الحدود الكمومية الآنية (IQP). تُحاصر هذه الدوائر بعض البوابات القطرية (في الأساس الحسابي) بين كتل من بوابات Hadamard.
تشمل الدوائر الأخرى grover_operator للاستخدام في خوارزمية Grover، ودائرة fourier_checking لمسألة فحص فورييه. راجع هذه الدوائر في دوائر الكم الخاصة في توثيق API لمكتبة الدوائر.
دوائر الحساب
العمليات الحسابية هي دوال كلاسيكية، كجمع الأعداد الصحيحة والعمليات على مستوى البتات. قد تكون هذه مفيدة مع خوارزميات كتقدير السعة لتطبيقات التمويل، وفي خوارزميات مثل خوارزمية HHL التي تحل أنظمة المعادلات الخطية.
كمثال، لنجرب جمع عددين ثلاثيَّي البت باستخدام دائرة "ripple-carry" لإجراء الجمع في الموضع (FullAdderGate). يجمع هذا الجامع عددين (سنسميهما "A" و"B") ويكت ب النتيجة في السجل الذي يحمل B. في المثال التالي، A=2 وB=3.
from qiskit.circuit.library import FullAdderGate
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
adder = FullAdderGate(3) # Adder of 3-bit numbers
# Create the number A=2
reg_a = QuantumRegister(3, "a")
number_a = QuantumCircuit(reg_a)
number_a.initialize(2) # Number 2; |010>
# Create the number B=3
reg_b = QuantumRegister(3, "b")
number_b = QuantumCircuit(reg_b)
number_b.initialize(3) # Number 3; |011>
# Create a circuit to hold everything, including a classical register for
# the result
qregs = [
QuantumRegister(1, "cin"),
QuantumRegister(3, "a"),
QuantumRegister(3, "b"),
QuantumRegister(1, "cout"),
]
reg_result = ClassicalRegister(3)
circuit = QuantumCircuit(*qregs, reg_result)
# Compose number initializers with the adder. Adder stores the result to
# register B, so we'll measure those qubits.
circuit = (
circuit.compose(number_a, qubits=reg_a)
.compose(number_b, qubits=reg_b)
.compose(adder)
)
circuit.measure(reg_b, reg_result)
circuit.draw("mpl")
تُظهر محاكاة الدائرة أنها تُخرج القيمة 5 لكل 1024 محاولة (أي تُقاس باحتمالية 1.0).
from qiskit.primitives import StatevectorSampler
result = StatevectorSampler().run([circuit]).result()
print(f"Count data:\n {result[0].data.c0.get_int_counts()}")
Count data:
{5: 1024}
راجع الحساب في توثيق API لمكتبة الدوائر.
الخطوات التالية
- تعلم الأساليب المتقدمة لإنشاء الدوائر في موضوع بناء الدوائر.
- اطلع على مثال لاستخدام الدوائر في درس خوارزمية Grover.
- راجع مرجع API مكتبة الدوائر.