ข้ามไปยังเนื้อหาหลัก
โครงการนี้อยู่ในช่วงเบต้า พบข้อผิดพลาด? สร้าง GitHub Issue มีคำถามหรือไอเดีย? ถามใน Discussions — ยินดีรับฟังความคิดเห็น!
คุณภาพการแปลในหน้านี้เป็นอย่างไร?

ระบุ observable ในฐาน Pauli

เวอร์ชันของแพ็กเกจ

โค้ดในหน้านี้พัฒนาขึ้นโดยใช้ requirement ต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า

qiskit[all]~=2.5.2

ใน quantum mechanics observable สอดคล้องกับคุณสมบัติทางกายภาพที่สามารถวัดได้ เมื่อพิจารณาระบบ spin เป็นตัวอย่าง เราอาจสนใจวัดพลังงานของระบบ หรือหาข้อมูลเกี่ยวกับการจัดเรียงของ spin เช่น ค่า magnetization หรือความสัมพันธ์ระหว่าง spin

ในการวัด observable แบบ nn-Qubit OO บนคอมพิวเตอร์ควอนตัม คุณต้องแทนค่ามันเป็นผลรวมของ tensor product ของตัวดำเนินการ Pauli นั่นคือ

O=∑k=1KαkPk,  Pk∈{I,X,Y,Z}⊗n,  αk∈R,O = \sum_{k=1}^K \alpha_k P_k,~~ P_k \in \{I, X, Y, Z\}^{\otimes n},~~ \alpha_k \in \mathbb{R},

โดยที่

I=(1001)  X=(0110)  Y=(0−ii0)  Z=(100−1)I = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} ~~ X = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} ~~ Y = \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix} ~~ Z = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

และเราใช้ข้อเท็จจริงที่ว่า observable เป็น Hermitian กล่าวคือ O†=OO^\dagger = O ถ้า OO ไม่เป็น Hermitian ก็ยังสามารถแยกสลายเป็นผลรวมของ Pauli ได้ แต่ค่าสัมประสิทธิ์ αk\alpha_k จะกลายเป็นจำนวนเชิงซ้อน

ในหลายกรณี observable จะถูกระบุโดยธรรมชาติในรูปแบบนี้หลังจากแมประบบที่สนใจไปยัง Qubit ต่างๆ ตัวอย่างเช่น ระบบ spin-1/2 สามารถแมปไปยัง Ising Hamiltonian ได้

H=∑⟨i,j⟩ZiZj−∑i=1nXi,H = \sum_{\langle i, j\rangle} Z_i Z_j - \sum_{i=1}^n X_i,

โดยที่ดัชนี ⟨i,j⟩\langle i, j\rangle วิ่งผ่าน spin ที่มีปฏิสัมพันธ์กัน และ spin ต่างๆ ถูกกระทำโดยสนามขวาง (transverse field) ใน XX ดัชนีตัวห้อยระบุว่าตัวดำเนินการ Pauli กระทำกับ Qubit ตัวใด กล่าวคือ XiX_i ใช้ตัวดำเนินการ XX กับ Qubit ii และปล่อยตัวที่เหลือไว้ตามเดิม

ใน Qiskit SDK Hamiltonian นี้สามารถสร้างได้ด้วยโค้ดต่อไปนี้

# 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")
from qiskit.quantum_info import SparsePauliOp

# define the number of qubits
n = 12

# define the single Pauli terms as ("Paulis", [indices], coefficient)
interactions = [
("ZZ", [i, i + 1], 1) for i in range(n - 1)
] # we assume spins on a 1D line
field = [("X", [i], -1) for i in range(n)]

# build the operator
hamiltonian = SparsePauliOp.from_sparse_list(
interactions + field, num_qubits=n
)
print(hamiltonian)
SparsePauliOp(['IIIIIIIIIIZZ', 'IIIIIIIIIZZI', 'IIIIIIIIZZII', 'IIIIIIIZZIII', 'IIIIIIZZIIII', 'IIIIIZZIIIII', 'IIIIZZIIIIII', 'IIIZZIIIIIII', 'IIZZIIIIIIII', 'IZZIIIIIIIII', 'ZZIIIIIIIIII', 'IIIIIIIIIIIX', 'IIIIIIIIIIXI', 'IIIIIIIIIXII', 'IIIIIIIIXIII', 'IIIIIIIXIIII', 'IIIIIIXIIIII', 'IIIIIXIIIIII', 'IIIIXIIIIIII', 'IIIXIIIIIIII', 'IIXIIIIIIIII', 'IXIIIIIIIIII', 'XIIIIIIIIIII'],
coeffs=[ 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j,
1.+0.j, 1.+0.j, 1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j,
-1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j])

ถ้าเราต้องการวัดพลังงาน observable ก็คือ Hamiltonian นั่นเอง หรืออีกทางหนึ่งเราอาจสนใจวัดคุณสมบัติของระบบ เช่น ค่า magnetization เฉลี่ย โดยนับจำนวน spin ที่จัดเรียงในทิศทาง ZZ ด้วย observable

O=1n∑i=1ZiO = \frac{1}{n} \sum_{i=1} Z_i

สำหรับ observable ที่ไม่ได้ระบุในรูปของ Pauli operator แต่อยู่ในรูปเมทริกซ์ เราต้องแปลงมันให้อยู่ในฐาน Pauli ก่อน จึงจะประเมินค่าได้บนคอมพิวเตอร์ quantum เราสามารถหาการแทนค่าเช่นนั้นได้เสมอ เนื่องจาก Pauli matrix เป็นฐาน (basis) สำหรับเมทริกซ์ Hermitian ขนาด 2n×2n2^n \times 2^n เราขยาย observable OO เป็น

O=12n∑P∈{I,X,Y,Z}⊗nTr(OP)P,O = \frac{1}{2^n} \sum_{P \in \{I, X, Y, Z\}^{\otimes n}} \mathrm{Tr}(O P) P,

โดยที่ผลรวมวิ่งผ่าน Pauli term แบบ nn-Qubit ทั้งหมด และ Tr(⋅)\mathrm{Tr}(\cdot) คือ trace ของเมทริกซ์ ซึ่งทำหน้าที่เป็น inner product ตัวประกอบ 1/2n1/2^n มาจากการนอร์มัลไลซ์แบบ Hilbert--Schmidt ของ Pauli string แบบ nn-Qubit คุณสามารถนำการแยกสลายจากเมทริกซ์ไปยัง Pauli term นี้ไปใช้ได้โดยใช้เมธอด SparsePauliOp.from_operator ดังนี้

import numpy as np
from qiskit.quantum_info import SparsePauliOp

matrix = np.array(
[[-1, 0, 0.5, -1], [0, 1, 1, 0.5], [0.5, 1, -1, 0], [-1, 0.5, 0, 1]]
)

observable = SparsePauliOp.from_operator(matrix)
print(observable)
SparsePauliOp(['IZ', 'XI', 'YY'],
coeffs=[-1. +0.j, 0.5+0.j, 1. -0.j])

ซึ่งหมายความว่าเมทริกซ์นี้สามารถเขียนในรูป Pauli term ได้เป็น O=−Z1+0.5X2+Y2Y1O = -Z_1 + 0.5 X_2 + Y_2 Y_1

หมายเหตุ

จำไว้ว่าลำดับ tensor product แมปกับ Qubit เป็น qn⊗qn−1⊗⋯⊗q1q_n \otimes q_{n-1} \otimes \cdots \otimes q_1

หมายเหตุ

ถ้า observable เป็น Hermitian (หมายความว่า O†=OO^\dagger = O) ค่าสัมประสิทธิ์ Pauli จะเป็นจำนวนจริง อย่างไรก็ตาม เราสามารถแยกสลายเมทริกซ์เชิงซ้อนอื่นๆ ในรูปของ Pauli ได้เช่นกัน ถ้าเราอนุญาตให้ค่าสัมประสิทธิ์เป็นจำนวนเชิงซ้อน

วัดในฐาน Pauli​

การวัดจะ project สถานะ Qubit ไปยังฐานการคำนวณ {∣0⟩,∣1⟩}\{|0\rangle, |1\rangle\} ซึ่งหมายความว่าคุณวัดได้เฉพาะ observable ที่เป็นแบบทแยงในฐานนี้เท่านั้น เช่น Pauli ที่ประกอบด้วยเพียงพจน์ II และ ZZ การวัด Pauli term ใดๆ จึงต้องเปลี่ยนฐาน (change of basis) เพื่อทำให้เป็นแบบทแยง โดยใช้การแปลงฐานต่อไปนี้

X→Z=HXHY→Z=HS†YSH,\begin{aligned} X &\rightarrow Z = H X H \\ Y &\rightarrow Z = H S^\dagger Y S H, \end{aligned}

โดยที่ HH คือ Hadamard Gate และ S=ZS = \sqrt{Z} บางครั้งเรียกว่า phase gate ถ้าคุณใช้ Estimator ในการคำนวณ expectation value การแปลงฐานจะถูกดำเนินการโดยอัตโนมัติ

ด้านล่างนี้เป็นตัวอย่างที่แสดงการเตรียม quantum Circuit และวัด Qubit 0 ในฐาน X, Qubit 1 ในฐาน Y และ Qubit 2 ในฐาน Z ด้วยตนเอง เราใช้ transformation ที่แสดงในสมการก่อนหน้าและได้ Circuit ดังนี้

from qiskit.circuit import QuantumCircuit

# create a circuit, where we would like to measure
# q0 in the X basis, q1 in the Y basis and q2 in the Z basis
circuit = QuantumCircuit(3)
circuit.ry(0.8, 0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.barrier()

# diagonalize X with the Hadamard gate
circuit.h(0)

# diagonalize Y with Hadamard as S^\dagger
circuit.sdg(1)
circuit.h(1)

# the Z basis is the default, no action required here

# measure all qubits
circuit.measure_all()
circuit.draw("mpl")

Output of the previous code cell

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

คำแนะนำ