ข้ามไปยังเนื้อหาหลัก

ภาพรวมของคลาส 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 เสริมจากเซต {+1,i,1,i}\set{+1, i, -1, -i} สามารถ 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 พื้นฐาน คุณสามารถใช้ property Operator.data
  • dims: เพื่อคืนค่า input และ output dimension รวมของ operator คุณสามารถใช้ property Operator.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 ขนาด 2N2^N คูณ 2M2^M 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 ตัวอย่างเช่น สำหรับเมทริกซ์ขนาด 6×66\times6:

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,)

ขั้นตอนถัดไป

คำแนะนำ
Source: IBM Quantum docs — updated 27 เม.ย. 2569
English version on doQumentation — updated 7 พ.ค. 2569
This translation based on the English version of 11 มี.ค. 2569