تركيب العمليات الأحادية
إصدارات الحزم
تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث منها.
qiskit[all]~=2.5.2
العملية الأحادية (Unitary) تصف تغييرًا يحافظ على المعيار (norm) في نظام كمي. بالنسبة لـ من الكيوبتات، يُوصف هذا التغيير بمصفوفة مركبة ذات أبعاد تُسمى ، يساوي فيها المرافق المعكوسَ، أي .
إن تركيب عمليات أحادية محددة إلى مجموعة من البوابات الكمية مهمةٌ أساسية تُستخدم، مثلاً، في تصميم وتطبيق الخوارزميات الكمية أو في ترجمة الدوائر الكمية.
في حين يمكن إجراء التركيب بكفاءة لفئات معينة من المصفوفات الأحادية — كتلك المكوّنة من بوابات كليفورد أو ذات بنية الجداء التنسوري — فإن معظم المصفوفات الأحادية لا تندرج في هذه الفئات. بالنسبة للمصفوفات الأحادية العامة، يُعدّ التركيب مهمةً معقدة تتزايد تكاليفها الحسابية بشكل أسي مع عدد الكيوبتات. لذا، إذا كنت تعرف تحليلاً فعّالاً للمصفوفة الأحادية التي تريد تنفيذها، فمن المرجح أن يكون أفضل من التركيب العام.
إذا لم يتوفر أي تحليل، فإن Qiskit SDK يوفر لك الأدوات اللازمة لإيجاد واحد منها. غير أنه تجدر الإشارة إلى أن هذا يُولّد بشكل عام دوائر عميقة قد لا تكون مناسبة للتشغيل على أجهزة الكم ذات الضوضاء.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "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")
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 0x1058da0b0>
إعادة التركيب لتحسين الدائرة
أحيانًا يكون من المفيد إعادة تركيب سلسلة طويلة من البوابات أحادية الكيوبت وثنائية الكيوبت، إذا كان يمكن تقليل طولها. على سبيل المثال، تستخدم الدائرة التالية ثلاث بوابات ثنائية الكيوبت.
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: 15π/8
┌───────────────┐ ┌────────────────┐
q_0: ┤ U(π/2,π/2,-π) ├───■──┤ U(π/2,-π,-π/2) ├
├───────────────┴┐┌─┴─┐├───────────────┬┘
q_1: ┤ U(3π/4,π/2,-π) ├┤ X ├┤ U(π/2,π/4,-π) ├─
└────────────────┘└───┘└───────────────┘
دالة transpile في Qiskit تُعيد هذا التركيب تلقائيًا عند مستوى تحسين مرتفع بما يكفي.
الخطوات التالية
- اطّلع على مثال لتحليل الدائرة في درس خوارزمية غروفر.
- لمزيد من المعلومات حول Transpiler في Qiskit، زُر قسم Transpile.