מחלקת ה-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. לסקירה ברמה גבוהה של ייצוגי אופרטורים ב-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 כסימולטור יוניטרי לחישוב מטריצת היוניטרי הסופית של Circuit קוונטי, מבלי לקרוא ל-Backend סימולטור. אם ה-Circuit מכיל פעולות שאינן נתמכות, תוטל חריגה. פעולות שאינן נתמכות הן: מדידה, איפוס, פעולות מותנות, או Gate שאין לו הגדרת מטריצה או פירוק מבחינת Gates עם הגדרות מטריצה.
# 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 בתוך Circuits
ניתן להכניס Operators יוניטריים ישירות ל-QuantumCircuit באמצעות מתודת QuantumCircuit.append. פעולה זו ממירה את ה-Operator לאובייקט UnitaryGate, המתווסף ל-Circuit.
אם האופרטור אינו יוניטרי, תוטל חריגה. ניתן לבדוק זאת באמצעות הפונקציה 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 ישירות ל-Circuit עצמו, והוא יומר לרצף של Gates של Pauli חד-Qubit:
# 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
שילוב Operators
ניתן לשלב אופרטורים בכמה שיטות.
מכפלת טנזור
שני אופרטורים ו- ניתנים לשילוב למכפלת טנזור באמצעות הפונקציה Operator.tensor. שים לב שאם גם וגם הם אופרטורים חד-Qubit, אז A.tensor(B) = יהיה עם תת-מערכות ממוספרות כך שמטריצה על תת-מערכת 0, ומטריצה על תת-מערכת 1.
A = Operator(Pauli("X"))
B = Operator(Pauli("Z"))
A.tensor(B)
Operator([[ 0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
[ 0.+0.j, -0.+0.j, 0.+0.j, -1.+0.j],
[ 1.+0.j, 0.+0.j, 0.+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))