ระบุ observable ในฐาน Pauli
เวอร์ชันของแพ็กเกจ
โค้ดในหน้านี้พัฒนาขึ้นโดยใช้ requirement ต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า
qiskit[all]~=2.3.0
ใน quantum mechanics ค่า observable สอดคล้องกับคุณสมบัติทางกายภาพที่สามารถวัดได้ เมื่อพิจารณาระบบ spin เป็นตัวอย่าง เราอาจสนใจวัดพลังงานของระบบ หรือหาข้อมูลเกี่ยวกับการจัดเรียงของ spin เช่น ค่า magnetization หรือความสัมพันธ์ระหว่าง spin
ในการวัด observable แบบ -Qubit บนคอมพิวเตอร์ quantum คุณต้องแทนค่ามันเป็นผลรวมของ tensor product ของตัวดำเนินการ Pauli นั่นคือ
โดยที่
และเราใช้ข้อเท็จจริงที่ว่า observable เป็น Hermitian กล่าวคือ ถ้า ไม่เป็น Hermitian ก็ยังสามารถแยกสลายเป็นผลรวมของ Pauli ได้ แต่ค่าสัมประสิทธิ์ จะกลายเป็นจำนวนเชิงซ้อน
ในหลายกรณ ี observable จะถูกระบุโดยธรรมชาติในรูปแบบนี้หลังจากแมประบบที่สนใจไปยัง Qubit ต่างๆ ตัวอย่างเช่น ระบบ spin-1/2 สามารถแมปไปยัง Ising Hamiltonian ได้
โดยที่ดัชนี วิ่งผ่าน spin ที่มีปฏิสัมพันธ์กัน และ spin ต่างๆ ถูกกระทำโดยสนามขวาง (transversal field) ใน ดัชนีตัวห้อยระบุว่า Pauli operator ทำงานกับ Qubit ตัวใด กล่าวคือ ใช้ตัวดำเนินการ กับ Qubit และปล่อยตัวที่เหลือไว้ตามเดิม
ใน Qiskit SDK Hamiltonian นี้สามารถสร้างได้ด้วยโค้ดต่อไปนี้
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
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 ที่จัดเรียงในทิศทาง ด้วย observable
สำหรับ observable ที่ไม่ได้ระ บุในรูปของ Pauli operator แต่อยู่ในรูปเมทริกซ์ เราต้องแปลงมันให้อยู่ในฐาน Pauli ก่อน จึงจะประเมินค่าได้บนคอมพิวเตอร์ quantum เราสามารถหาการแทนค่าเช่นนั้นได้เสมอ เนื่องจาก Pauli matrix เป็นฐาน (basis) สำหรับเมทริกซ์ Hermitian ขนาด เราขยาย observable เป็น
โดยที่ผลรวมวิ่งผ่าน Pauli term แบบ -Qubit ทั้งหมด และ คือ trace ของเมทริกซ์ ซึ่งทำหน้าที่เป็น inner product
คุณสามารถนำการแยกสลายจากเมทริกซ์ไปยัง 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 ได้เป็น
จำไว้ว่าลำดับ tensor product แมปกับ Qubit เป็น
ถ้า observable เป็น Hermitian (หมายความว่า ) ค่าสัมประสิทธิ์ Pauli จะเป็นจำนวนจริง อย่างไรก็ตาม เราสามารถแยกสลายเมทริกซ์เชิงซ้อนอื่นๆ ในรูปของ Pauli ได้เช่นกัน ถ้าเราอนุญาตให้ค่าสัมประสิทธิ์เป็นจำนวนเชิงซ้อน
วัดในฐาน Pauli
การวัดจะ project สถานะ Qubit ไปยังฐานการคำนวณ ซึ่งหมายความว่าคุณวัดได้เฉพาะ observable ที่เป็นแบบทแยงในฐานนี้เท่านั้น เช่น Pauli ที่ประกอบด้วยเพียงพจน์ และ การวัด Pauli term ที่หลากหลายจึงต้องเปลี่ยนฐาน (change of basis) เพื่อให้เป็นแบบทแยง วิธีทำคือ ทำ transformation ต่อไปนี้
โดยที่ คือ Hadamard Gate และ บางครั้งเรียกว่า 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")
ขั้นตอนถัดไป
- อ่าน SparsePauliOp API reference