ภาพรวมของคลาส 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
ใน Qiskit quantum operator ถูกแทนค่าด้วยคลาสจากโมดูล quantum_info คลาส operator ที่สำคัญที่สุดคือ SparsePauliOp ซึ่งแทนค่า quantum operator ทั่วไปในรูปแบบ linear combination ของ Pauli string SparsePauliOp เป็นคลาสที่ใช้บ่อยที่สุดในการแทน quantum observable ส่วนที่เหลือของหน้านี้อธิบายวิธีใช้ SparsePauliOp และคลาส operator อื่นๆ
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
import numpy as np
from qiskit.quantum_info.operators import Operator, Pauli, SparsePauliOp
SparsePauliOp
คลาส SparsePauliOp แทนค่า linear combination ของ Pauli string มีหลายวิธีในการ initialize SparsePauliOp แต่วิธีที่ยืดหยุ่นที่สุดคือใช้เมธอด from_sparse_list ดังที่แสดงใน code cell ต่อไปนี้ from_sparse_list รับ list ของ triplet (pauli_string, qubit_indices, coefficient)
op1 = SparsePauliOp.from_sparse_list(
[("ZX", [1, 4], 1.0), ("YY", [0, 3], -1 + 1j)], num_qubits=5
)
op1
SparsePauliOp(['XIIZI', 'IYIIY'],
coeffs=[ 1.+0.j, -1.+1.j])
SparsePauliOp รองรับการดำเนินการทางคณิตศาสตร์ ดังท ี่แสดงใน code cell ต่อไปนี้
op2 = SparsePauliOp.from_sparse_list(
[("XXZ", [0, 1, 4], 1 + 2j), ("ZZ", [1, 2], -1 + 1j)], num_qubits=5
)
# Addition
print("op1 + op2:")
print(op1 + op2)
print()
# Multiplication by a scalar
print("2 * op1:")
print(2 * op1)
print()
# Operator multiplication (composition)
print("op1 @ op2:")
print(op1 @ op2)
print()
# Tensor product
print("op1.tensor(op2):")
print(op1.tensor(op2))
op1 + op2:
SparsePauliOp(['XIIZI', 'IYIIY', 'ZIIXX', 'IIZZI'],
coeffs=[ 1.+0.j, -1.+1.j, 1.+2.j, -1.+1.j])
2 * op1:
SparsePauliOp(['XIIZI', 'IYIIY'],
coeffs=[ 2.+0.j, -2.+2.j])
op1 @ op2:
SparsePauliOp(['YIIYX', 'XIZII', 'ZYIXZ', 'IYZZY'],
coeffs=[ 1.+2.j, -1.+1.j, -1.+3.j, 0.-2.j])
op1.tensor(op2):
SparsePauliOp(['XIIZIZIIXX', 'XIIZIIIZZI', 'IYIIYZIIXX', 'IYIIYIIZZI'],
coeffs=[ 1.+2.j, -1.+1.j, -3.-1.j, 0.-2.j])
Pauli
คลาส Pauli แทนค่า Pauli string เดี่ยวพร้อม phase coefficient เสริมจากเซต สามารถ initialize Pauli ได้โดยส่ง string ของอักขระจากเซต {"I", "X", "Y", "Z"} โดยอาจมีคำนำหน้าหนึ่งจาก {"", "i", "-", "-i"} เพื่อแทน phase coefficient
op1 = Pauli("iXX")
op1
Pauli('iXX')
code cell ต่อไปนี้แสดงการใช้งาน attribute และเมธอดบางส่วน
print(f"Dimension of {op1}: {op1.dim}")
print(f"Phase of {op1}: {op1.phase}")
print(f"Matrix representation of {op1}: \n {op1.to_matrix()}")
Dimension of iXX: (4, 4)
Phase of iXX: 3
Matrix representation of iXX:
[[0.+0.j 0.+0.j 0.+0.j 0.+1.j]
[0.+0.j 0.+0.j 0.+1.j 0.+0.j]
[0.+0.j 0.+1.j 0.+0.j 0.+0.j]
[0.+1.j 0.+0.j 0.+0.j 0.+0.j]]
object Pauli มีเมธอดอื่นๆ อีกหลายอย่างในการจัดการ operator เช่น การหา adjoint การตรวจสอบว่ามัน (anti)commute กับ Pauli อื่นหรือไม่ และการคำนวณ dot product กับ Pauli อื่น ดูข้อมูลเพิ่มเติมที่ API documentation
Operator
คลาส Operator แทนค่า linear operator ทั่วไป ต่างจาก SparsePauliOp ที่ Operator เก็บ linear operator เป็น dense matrix เนื่องจากหน่วยความจำที่ต้องใช้เก็บ dense matrix ขยายตัวแบบ exponential ตามจำนวน Qubit คลาส Operator จึงเหมาะสำหรับใช้กับจำนวน Qubit น้อยๆ เท่านั้น
คุณสามารถ initialize Operator ได้โดยส่ง Numpy array ที่เก็บเมทริกซ์ของ operator โดยตรง ตัวอย่างเช่น code cell ต่อไปนี้สร้าง two-qubit Pauli XX operator:
XX = Operator(
np.array(
[
[0, 0, 0, 1],
[0, 0, 1, 0],
[0, 1, 0, 0],
[1, 0, 0, 0],
]
)
)
XX
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))
object operator เก็บเมทริกซ์พื้นฐาน และ input/output dimension ของ subsystem
data: เพื่อเข้าถึง Numpy array พื้นฐาน คุณสามารถใช้ propertyOperator.datadims: เพื่อคืนค่า input และ output dimension รวมของ operator คุณสามารถใช้ propertyOperator.dimหมายเหตุ: output จะคืนค่าเป็น tuple(input_dim, output_dim)ซึ่งเป็นลำดับย้อนกลับของ shape ของเมทริกซ์พื้นฐาน
XX.data
array([[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_dim, output_dim = XX.dim
input_dim, output_dim
(4, 4)
คลาส operator ยังติดตาม dimension ของ subsystem ด้วย ซึ่งสามารถใช้ในการ compose operator เข้าด้วยกัน สามารถเข้าถึงได้โดยใช้ฟังก์ชัน input_dims และ output_dims
สำหรับ operator ขนาด คูณ input และ output dimension จะถูกสันนิษฐานอัตโนมัติว่าเป็น M-qubit และ N-qubit:
op = Operator(np.random.rand(2**1, 2**2))
print("Input dimensions:", op.input_dims())
print("Output dimensions:", op.output_dims())
Input dimensions: (2, 2)
Output dimensions: (2,)
ถ้าเมทริกซ์ input ไม่สามารถแบ่งเป็น qubit subsystem ได้ ก็จะถูกเก็บเป็น single-qubit operator ตัวอย่างเช่น สำหรับเมทริกซ์ขนาด :
op = Operator(np.random.rand(6, 6))
print("Input dimensions:", op.input_dims())
print("Output dimensions:", op.output_dims())
Input dimensions: (6,)
Output dimensions: (6,)
input และ output dimension ยังสามารถระบุด้วยตนเองเมื่อ initialize operator ใหม่:
# Force input dimension to be (4,) rather than (2, 2)
op = Operator(np.random.rand(2**1, 2**2), input_dims=[4])
print("Input dimensions:", op.input_dims())
print("Output dimensions:", op.output_dims())
Input dimensions: (4,)
Output dimensions: (2,)
# Specify system is a qubit and qutrit
op = Operator(np.random.rand(6, 6), input_dims=[2, 3], output_dims=[2, 3])
print("Input dimensions:", op.input_dims())
print("Output dimensions:", op.output_dims())
Input dimensions: (2, 3)
Output dimensions: (2, 3)
คุณยังสามารถดึงเฉพาะ input หรือ output dimension ของ subsystem บางส่วนได้โดยใช้ฟังก์ชัน input_dims และ output_dims:
print("Dimension of input system 0:", op.input_dims([0]))
print("Dimension of input system 1:", op.input_dims([1]))
Dimension of input system 0: (2,)
Dimension of input system 1: (3,)
ขั้นตอนถัดไป
- เรียนรู้วิธี ระบุ observable ใน Pauli basis
- ดูตัวอย่างการใช้ operator ใน tutorial Combine error mitigation options with the Estimator primitive
- อ่าน เนื้อหาเชิงลึกเพิ่มเติมเกี่ยวกับคลาส Operator
- สำรวจ reference Operator API