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

تركيب العمليات الأحادية

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

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

qiskit[all]~=2.3.0

العملية الأحادية (Unitary) تصف تغييرًا يحافظ على القاعدة في نظام كمي. بالنسبة لـ nn من الـ Qubits، يُوصف هذا التغيير بمصفوفة مركبة ذات أبعاد 2n×2n2^n \times 2^n تُسمى UU، يساوي فيها المرافق المعكوسَ، أي UU=1U^\dagger U = \mathbb{1}.

تركيب عمليات أحادية محددة في مجموعة من بوابات الكم مهمةٌ أساسية تُستخدم، مثلاً، في تصميم وتطبيق الخوارزميات الكمية أو في ترجمة الدوائر الكمية.

في حين يمكن إجراء التركيب بكفاءة لفئات معينة من المصفوفات الأحادية — كتلك المكوّنة من بوابات كليفورد أو ذات بنية الجداء التنسوري — فإن معظم المصفوفات الأحادية لا تندرج في هذه الفئات. بالنسبة للمصفوفات الأحادية العامة، يُعدّ التركيب مهمةً معقدة تتزايد تكاليفها الحسابية بشكل أسي مع عدد الـ Qubits. لذا، إذا كنت تعرف تحليلاً فعّالاً للمصفوفة الأحادية التي تريد تنفيذها، فمن المرجح أن يكون أفضل من التركيب العام.

ملاحظة

إذا لم يتوفر أي تحليل، يوفر لك Qiskit SDK الأدوات اللازمة للعثور على واحد. غير أنه تجدر الإشارة إلى أن هذا يُولّد بشكل عام دوائر عميقة قد لا تكون مناسبة للتشغيل على أجهزة الكم ذات الضوضاء.

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
import numpy as np
from qiskit import QuantumCircuit

U = 0.5 * np.array(
[[1, 1, 1, 1], [-1, 1, -1, 1], [-1, -1, 1, 1], [-1, 1, 1, -1]]
)

circuit = QuantumCircuit(2)
circuit.unitary(U, circuit.qubits)
<qiskit.circuit.instructionset.InstructionSet at 0x7fedb83e7a90>

إعادة التركيب لتحسين الدائرة

أحيانًا يكون من المفيد إعادة تركيب سلسلة طويلة من بوابات Qubit الأحادية والثنائية، إذا كان يمكن تقليل طولها. على سبيل المثال، تستخدم الدائرة التالية ثلاث بوابات ثنائية Qubit.

from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit

qreg_q = QuantumRegister(2, "q")
creg_c = ClassicalRegister(4, "c")
circuit = QuantumCircuit(qreg_q, creg_c)

circuit.h(qreg_q[0])
circuit.cx(qreg_q[0], qreg_q[1])
circuit.sx(qreg_q[1])
circuit.cz(qreg_q[0], qreg_q[1])
circuit.x(qreg_q[1])
circuit.x(qreg_q[0])
circuit.cx(qreg_q[0], qreg_q[1])
circuit.h(qreg_q[0])
circuit.draw("mpl")

مخرجات خلية الكود السابقة

لكن بعد إعادة التركيب باستخدام الكود التالي، لا تحتاج الدائرة سوى إلى بوابة CX واحدة فقط. (نستخدم هنا أسلوب QuantumCircuit.decompose() لتمثيل أوضح للبوابات المستخدمة في إعادة تركيب المصفوفة الأحادية.)

from qiskit.quantum_info import Operator

# compute unitary matrix of circuit
U = Operator(circuit)

# re-synthesize
better_circuit = QuantumCircuit(2)
better_circuit.unitary(U, range(2))
better_circuit.decompose().draw()
global phase: 6.2071
┌───────────────┐ ┌────────────────┐
q_0: ─┤ U(π/2,π/2,-π) ├────■────┤ U(π/2,-π,-π/2) ├─
┌┴───────────────┴─┐┌─┴─┐┌─┴────────────────┴┐
q_1: ┤ U(1.7229,π/2,-π) ├┤ X ├┤ U(π/2,0.15207,-π) ├
└──────────────────┘└───┘└───────────────────┘

دالة transpile في Qiskit تُجري هذه الإعادة للتركيب تلقائيًا عند مستوى تحسين مرتفع بما فيه الكفاية.

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

توصيات