Tukuyin ang mga observable sa Pauli basis
Mga bersyon ng package
Ang code sa pahinang ito ay ginawa gamit ang mga sumusunod na requirements. Inirerekomenda naming gamitin ang mga bersyong ito o mas bago.
qiskit[all]~=2.3.0
Sa quantum mechanics, ang mga observable ay tumutugma sa mga pisikal na katangian na maaaring sukatin. Kapag pinag-aaralan ang isang sistema ng mga spin, halimbawa, maaaring interesado ka sa pagsukat ng enerhiya ng sistema o sa pagkuha ng impormasyon tungkol sa pagkakahanay ng mga spin, tulad ng magnetization o ng mga kaugnayan sa pagitan ng mga spin.
Para sukatin ang isang -qubit observable na sa isang quantum computer, kailangan mong ipahayag ito bilang kabuuan ng mga tensor product ng mga Pauli operator, ibig sabihin
kung saan
at ginagamit mo ang katotohanang ang observable ay Hermitian, ibig sabihin, . Kung ang ay hindi Hermitian, maaari pa rin itong i-decompose bilang kabuuan ng mga Pauli, ngunit ang coefficient na ay magiging complex.
Sa maraming kaso, ang observable ay natural na tinutukoy sa representasyong ito matapos i-map ang sistema ng interes sa mga qubit. Halimbawa, ang isang spin-1/2 na sistema ay maaaring i-map sa isang Ising Hamiltonian
kung saan ang mga index na ay tumatakbo sa mga nakikipag-ugnayan na spin at ang mga spin ay napapailalim sa transversal field sa . Ang subscript index ay nagpapahiwatig kung saang qubit kumikilos ang Pauli operator, ibig sabihin, ang ay nag-aaplay ng operator sa qubit at iniiwanan ang natitirang hindi nagbabago.
Sa Qiskit SDK, ang Hamiltonian na ito ay maaaring itayo gamit ang sumusunod na code.
# 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])
Kung gusto nating sukatin ang enerhiya, ang observable ay ang Hamiltonian mismo. Bilang alternatibo, maaari tayong interesado sa pagsukat ng mga katangian ng sistema tulad ng average magnetization sa pamamagitan ng pagbibilang ng bilang ng mga spin na nakahanay sa -direksyon gamit ang observable
Para sa mga observable na hindi ibinibigay sa mga Pauli operator kundi sa matrix form, kailangan muna nating baguhin ang representasyon nito sa Pauli basis para masuri ang mga ito sa isang quantum computer. Palagi tayong makakahanap ng ganitong representasyon dahil ang mga Pauli matrix ay bumubuo ng basis para sa Hermitian na mga matrix. Inaayos natin ang observable na bilang
kung saan ang kabuuan ay tumatakbo sa lahat ng posibleng -qubit Pauli term at ang ay ang trace ng isang matrix, na gumaganap bilang inner product.
Maaari mong ipatupad ang decomposition na ito mula sa isang matrix patungong Pauli term gamit ang SparsePauliOp.from_operator na method, ganito:
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])
Ibig sabihin nito, ang matrix ay maaaring isulat bilang mga Pauli term na .
Tandaan na ang tensor product order ay namamap sa mga qubit bilang .
Kung ang observable ay Hermitian (ibig sabihin, ), ang mga Pauli coefficient ay mga tunay na numero. Gayunpaman, maaari rin nating i-decompose ang anumang iba pang complex matrix sa mga Pauli, kung papayagan natin ang mga complex-valued na coefficient.
Sukatin sa mga Pauli basisβ
Ang isang measurement ay nagpro-project ng estado ng qubit sa computational basis na . Ibig sabihin nito, maaari ka lang sumukat ng mga observable na diagonal sa basis na ito, tulad ng mga Pauli na binubuo lamang ng at na mga term. Ang pagsukat ng mga arbitrary na Pauli term ay nangangailangan ng pagbabago ng basis para i-diagonalize ang mga ito. Para gawin ito, isagawa ang mga sumusunod na transformasyon,
kung saan ang ay ang Hadamard gate at ang ay tinatawag minsan na phase gate. Kung gumagamit ka ng Estimator para sa pagkalkula ng mga expectation value, ang mga basis transformation ay awtomatikong isinasagawa.
Nasa ibaba ang isang halimbawa na nagpapakita kung paano maghanda ng quantum circuit at mano-manong sukatin ang qubit 0 sa X basis, ang qubit 1 sa Y basis, at ang qubit 2 sa Z basis. Inilalapat natin ang mga transformasyong ipinakita sa nakaraang equation at nakukuha natin ang sumusunod na 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")
Mga susunod na hakbangβ
- Basahin ang SparsePauliOp API reference.