Вказання спостережуваних у базисі Паулі
Версії пакетів
Код на цій сторінці було розроблено з використанням таких вимог. Рекомендуємо використовувати ці або новіші версії.
qiskit[all]~=2.3.0
У квантовій механіці спостережувані відповідають фізичним властивостям, які можна виміряти. Наприклад, розглядаючи систему спінів, тебе може цікавити вимірювання енергії системи або отримання інформації про вирівнювання спінів, як-от намагніченість або кореляції між спінами.
Щоб виміряти -кубітну спостережувану на квантовому комп'ютері, треба подати її як суму тензорних добутків операторів Паулі, тобто
де
і використовується факт, що спостережувана є ермітовою, тобто . Якщо не є ермітовою, її все одно можна розкласти як суму Паулі, але коефіцієнт стає комплексним.
У багатьох випадках спостережувана природно задається в цьому поданні після відображення системи, що цікавить, на кубіти. Наприклад, система спін-1/2 може бути відображена на гамільтоніан Ізінга
де індекси пробігають по взаємодіючих спінах, а спіни підпорядковані поперечному полю в . Нижній індекс вказує, на який кубіт діє оператор Паулі, тобто застосовує оператор до кубіта , залишаючи решту без змін.
У Qiskit SDK цей гамільтоніан можна побудувати за допомогою такого коду.
# 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])
Якщо ми хочемо виміряти енергію, то спостережуваною є сам гамільтоніан. Або ж нас може цікавити вимірювання властивостей системи, як-от середня намагніченість, шляхом підрахунку кількості спінів, вирівняних у напрямку , за допомогою спостережуваної
Для спостережуваних, заданих не в термінах операторів Паулі, а у матричній формі, спочатку треба переформулювати їх у базисі Паулі для обчислення на квантовому комп'ютері. Таке подання завжди можна знайти, оскільки матриці Паулі утворюють базис для ермітових матриць . Розкладемо спостережувану як
де сума береться по всіх можливих -кубітних термах Паулі, а — це слід матриці, що виступає скалярним добутком.
Цей розклад від матриці до термів Паулі можна реалізувати за допомогою методу 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])
Це означає, що матрицю можна записати через терми Паулі як .
Пам'ятай, що порядок тензорного добутку відображається на кубіти як .
Якщо спостережувана є ермітовою (тобто ), коефіцієнти Паулі є дійсними числами. Проте ми також можемо розкласти будь-яку іншу комплексну матрицю через Паулі, якщо допускаємо комплексно-значні коефіцієнти.
Вимірювання в базисах Паулі
Вимірювання проектує стан кубіта на обчислювальний базис . Це означає, що можна вимірювати лише спостережувані, діагональні в цьому базисі, як-от Паулі, що складаються лише з термів та . Тому вимірювання довільних термів Паулі потребує зміни базису для їх діагоналізації. Для цього виконай такі перетворення:
де — вентиль Адамара, а іноді називають фазовим вентилем. Якщо ти використовуєш Estimator для обчислення очікуваних значень, базисні перетворення виконуються автоматично.
Нижче наведено приклад, що демонструє, як підготувати квантову схему та вручну виміряти кубіт 0 у базисі X, кубіт 1 у базисі Y та кубіт 2 у базисі Z. Застосовуємо перетворення, показані в попередньому рівнянні, і отримуємо таку схему:
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.