Перейти до основного вмісту

Вимірювання кубітів

Версії пакетів

Код на цій сторінці розроблено з використанням наведених нижче залежностей. Рекомендуємо використовувати ці або новіші версії.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Щоб отримати інформацію про стан кубіта, можна виміряти його на класичний біт. У Qiskit вимірювання виконуються в обчислювальному базисі, тобто в однокубітному базисі Паулі-ZZ. Тому вимірювання дає результат 0 або 1, залежно від перекриття з власними станами Паулі-ZZ 0|0\rangle і 1|1\rangle:

qmeasure{0(outcome+1),with probability p0=q02,1(outcome1),with probability p1=q12.|q\rangle \xrightarrow{measure}\begin{cases} 0 (\text{outcome}+1), \text{with probability } p_0=|\langle q|0\rangle|^{2}\text{,} \\ 1 (\text{outcome}-1), \text{with probability } p_1=|\langle q|1\rangle|^{2}\text{.} \end{cases}

Вимірювання всередині схеми

Вимірювання всередині схеми є ключовим компонентом динамічних схем. До версії qiskit-ibm-runtime v0.43.0 інструкція measure була єдиним способом вимірювання в Qiskit. Проте вимірювання всередині схеми мають інші вимоги до налаштування, ніж термінальні вимірювання (ті, що виконуються в кінці схеми). Наприклад, при налаштуванні вимірювання всередині схеми потрібно враховувати тривалість інструкції, оскільки довші інструкції призводять до більш шумних схем. Для термінальних вимірювань тривалість інструкції не має значення, бо після них більше немає жодних інструкцій.

У версії qiskit-ibm-runtime v0.43.0 було введено інструкцію MidCircuitMeasure. Як випливає з назви, це нова інструкція вимірювання, оптимізована для вимірювань усередині схеми на QPU IBM®.

примітка

Інструкція MidCircuitMeasure відповідає інструкції measure_2, яка вказана у supported_instructions backend-у. Однак measure_2 підтримується не всіма backend-ами. Використовуй service.backends(filters=lambda b: "measure_2" in b.supported_instructions), щоб знайти backend-и, які її підтримують. У майбутньому можуть бути додані нові вимірювання, але це не гарантується.

Додавання вимірювання до схеми

Є кілька способів додати вимірювання до схеми:

Метод QuantumCircuit.measure

Використовуй метод measure, щоб виміряти QuantumCircuit.

Приклади:

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit

qc = QuantumCircuit(5, 5)
qc.x(0)
qc.x(1)
qc.x(4)
qc.measure(
range(5), range(5)
) # Measures all qubits into the corresponding clbit.
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260490>
from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure(1, 0) # Measure qubit 1 into the classical bit 0.
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260820>

Клас Measure

Клас Qiskit Measure вимірює вказані кубіти.

from qiskit.circuit import Measure

qc = QuantumCircuit(3, 1)
qc.x([0, 1])
qc.append(Measure(), [0], [0]) # measure qubit 0 into clbit 0
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260df0>

Метод QuantumCircuit.measure_all

Щоб виміряти всі кубіти у відповідні класичні біти, використовуй метод measure_all. За замовчуванням цей метод додає нові класичні біти в ClassicalRegister для збереження результатів вимірювань.

from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure_all() # Measure all qubits.

Метод QuantumCircuit.measure_active

Щоб виміряти всі кубіти, які не перебувають у стані простою, використовуй метод measure_active. Цей метод створює новий ClassicalRegister розміром, що дорівнює кількості активних кубітів, які вимірюються.

from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure_active() # Measure qubits that are not idle, that is, qubits 0 and 2.

Метод MidCircuitMeasure

Використовуй MidCircuitMeasure для вимірювання всередині схеми (потрібна версія qiskit-ibm-runtime v0.43.0 або пізніша). Хоча для вимірювання всередині схеми можна використовувати QuantumCircuit.measure, через особливості свого дизайну MidCircuitMeasure зазвичай є кращим вибором. Наприклад, він додає менше накладних витрат до схеми порівняно з QuantumCircuit.measure.

from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime.circuit import MidCircuitMeasure
from qiskit.circuit import Measure

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

circ = QuantumCircuit(2, 2)
circ.x(0)
circ.append(MidCircuitMeasure(), [0], [0])
# circ.measure([0], [0])
# circ.measure_all()
print(circ.draw(cregbundle=False))
┌───┐┌────────────┐
q_0: ┤ X ├┤0 ├
└───┘│ │
q_1: ─────┤ Measure_2 ├
│ │
c_0: ═════╡0 ╞
└────────────┘
c_1: ═══════════════════
Важливі примітки
  • Для використання вимірювань необхідний щонайменше один класичний регістр.
  • Примітив Sampler вимагає наявності вимірювань у схемі. Ти можеш додати вимірювання до схеми і при використанні примітиву Estimator, але вони ігноруватимуться.

Наступні кроки

Рекомендації