تركيب العمليات الأحادية
إصدارات الحزم
تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث منها.
qiskit[all]~=2.4.0
العملية الأحادية (Unitary) تصف تغييرًا يحافظ على المعيار (norm) في نظام كمي. بالنسبة لـ من الـ qubits، يُوصف هذا التغيير بمصفوفة مركبة ذات أبعاد تُسمى ، يساوي فيها المرافق المعكوسَ، أي .
إن تركيب عمليات أحادية محددة إلى مجموعة من البوابات الكمية مهمةٌ أساسية تُستخدم، مثلاً، في تصميم وتطبيق الخوارزميات الكمية أو في ترجمة الدوائر الكمية.
في حين يمكن إجراء التركيب بكفاءة لفئات معينة من المصفوفات الأحادية — كتلك المكوّنة من بوابات كليفورد أو ذات بنية الجداء التنسوري — فإن معظم المصفوفات الأحادية لا تندرج في هذه الفئات. بالنسبة للمصفوفات الأحادية العامة، يُعدّ التركيب مهمةً معقدة تتزايد تكاليفها الحسابية بشكل أسي مع عدد الـ 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 0x7f5ec46183d0>
إعادة التركيب لتحسين الدائرة
أحيانًا يكون من المفيد إعادة تركيب سلسلة طويلة من البوابات أحادية الكيوبت وثنائية الكيوبت، إذا كان يمكن تقليل طولها. على سبيل المثال، تستخدم الدائرة التالية ثلاث بوابات ثنائية الكيوبت.
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 تُجري هذه الإعادة للتركيب تلقائيًا عند مستوى تحسين مرتفع بما فيه الكفاية.
الخطوات التالية
- اطّلع على مثال لتحليل الدائرة في درس خوارزمية غروفر.
- لمزيد من المعلومات حول Transpiler في Qiskit، زُر قسم Transpile.