كلاس Operator
Package versions
The code on this page was developed using the following requirements. We recommend using these versions or newer.
qiskit[all]~=2.3.0
تُوضّح هذه الصفحة كيفية استخدام كلاس Operator. للاطّلاع على نظرة عامة عن تمثيلات العوامل (operators) في Qiskit، بما فيها كلاس Operator وغيره، راجع نظرة عامة على كلاسات العوامل.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
import numpy as np
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import CXGate, RXGate, XGate
from qiskit.quantum_info import Operator, Pauli, process_fidelity
تحويل الكلاسات إلى Operators
يمكن تحويل عدة كلاسات أخرى في Qiskit مباشرةً إلى كائن Operator باستخدام طريقة تهيئة العامل. على سبيل المثال:
- كائنات
Pauli - كائنات
GateوInstruction - كائنات
QuantumCircuit
لاحظ أن النقطة الأخيرة تعني أنه يمكنك استخدام كلاس Operator كمحاكٍ وحيدي (unitary simulator) لحساب المصفوفة الوحيدية النهائية لدائرة كمّية، دون الحاجة إلى استدعاء خلفية محاكٍ. إذا احتوت الدائرة على أي عمليات غير مدعومة، يُرفع استثناء. العمليات غير المدعومة هي: القياس (measure)، وإعادة الضبط (reset)، والعمليات الشرطية، أو أي بوابة لا تملك تعريف مصفوفة أو تحليلاً من حيث بوابات ذات تعريفات مصفوفة.
# Create an Operator from a Pauli object
pauliXX = Pauli("XX")
Operator(pauliXX)
Operator([[0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
[0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
[0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j]],
input_dims=(2, 2), output_dims=(2, 2))
# Create an Operator for a Gate object
Operator(CXGate())
Operator([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
[0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
[0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]],
input_dims=(2, 2), output_dims=(2, 2))
# Create an operator from a parameterized Gate object
Operator(RXGate(np.pi / 2))
Operator([[0.70710678+0.j , 0. -0.70710678j],
[0. -0.70710678j, 0.70710678+0.j ]],
input_dims=(2,), output_dims=(2,))
# Create an operator from a QuantumCircuit object
circ = QuantumCircuit(10)
circ.h(0)
for j in range(1, 10):
circ.cx(j - 1, j)
# Convert circuit to an operator by implicit unitary simulation
Operator(circ)
Operator([[ 0.70710678+0.j, 0.70710678+0.j, 0. +0.j, ...,
0. +0.j, 0. +0.j, 0. +0.j],
[ 0. +0.j, 0. +0.j, 0.70710678+0.j, ...,
0. +0.j, 0. +0.j, 0. +0.j],
[ 0. +0.j, 0. +0.j, 0. +0.j, ...,
0. +0.j, 0. +0.j, 0. +0.j],
...,
[ 0. +0.j, 0. +0.j, 0. +0.j, ...,
0. +0.j, 0. +0.j, 0. +0.j],
[ 0. +0.j, 0. +0.j, 0.70710678+0.j, ...,
0. +0.j, 0. +0.j, 0. +0.j],
[ 0.70710678+0.j, -0.70710678+0.j, 0. +0.j, ...,
0. +0.j, 0. +0.j, 0. +0.j]],
input_dims=(2, 2, 2, 2, 2, 2, 2, 2, 2, 2), output_dims=(2, 2, 2, 2, 2, 2, 2, 2, 2, 2))
استخدام Operators في الدوائر
يمكن إدراج Operators الوحيدية مباشرةً في QuantumCircuit باستخدام طريقة QuantumCircuit.append. يُحوّل هذا الكائنَ Operator إلى كائن UnitaryGate، الذي يُضاف بعدها إلى الدائرة.
إذا لم يكن العامل وحيدياً، يُرفع استثناء. يمكن التحقق من ذلك باستخدام الدالة Operator.is_unitary()، التي تُعيد True إذا كان العامل وحيدياً وFalse في غير ذلك.
# Create an operator
XX = Operator(Pauli("XX"))
# Add to a circuit
circ = QuantumCircuit(2, 2)
circ.append(XX, [0, 1])
circ.measure([0, 1], [0, 1])
circ.draw("mpl")
لاحظ أنه في المثال أعلاه يُهيَّأ العامل من كائن Pauli. غير أن كائن Pauli يمكن إدراجه مباشرةً في الدائرة ذاتها أيضاً، وسيُحوَّل عندئذٍ إلى سلسلة من بوابات Pauli أحادية الكيوبت:
# Add to a circuit
circ2 = QuantumCircuit(2, 2)
circ2.append(Pauli("XX"), [0, 1])
circ2.measure([0, 1], [0, 1])
circ2.draw()
┌────────────┐┌─┐
q_0: ┤0 ├┤M├───
│ Pauli(XX) │└╥┘┌─┐
q_1: ┤1 ├─╫─┤M├
└────────────┘ ║ └╥┘
c: 2/═══════════════╩══╩═
0 1