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

Порядок бітів у Qiskit SDK

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

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

qiskit[all]~=2.3.0

Якщо у вас є набір з nn бітів (або кубітів), ви зазвичай позначатимете кожен біт 0n10 \rightarrow n-1. Різні програмні забезпечення та ресурси повинні вибрати, як вони впорядковують ці біти як у пам'яті комп'ютера, так і при відображенні на екрані.

Конвенції Qiskit

Ось як Qiskit SDK впорядковує біти в різних сценаріях.

Квантові схеми

Клас QuantumCircuit зберігає свої кубіти в списку (QuantumCircuit.qubits). Індекс кубіта в цьому списку визначає мітку кубіта.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit import Qubit

qc = QuantumCircuit(2)
qc.qubits[0] # qubit "0"

Qubit(QuantumRegister(2, "q"), 0)
<Qubit register=(2, "q"), index=0>

Діаграми схем

На діаграмі схеми кубіт 00 є найвищим кубітом, а кубіт n1n-1 — найнижчим кубітом. Ти можеш змінити це за допомогою аргументу reverse_bits методу QuantumCircuit.draw (дивіться Зміна впорядкування в Qiskit).

qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

Цілі числа

При інтерпретації бітів як числа біт 00 є найменш значущим бітом, а біт n1n-1 — найбільш значущим. Це корисно при програмуванні, оскільки кожен біт має значення 2label2^\text{label} (label — це індекс кубіта в QuantumCircuit.qubits). Наприклад, наступне виконання схеми закінчується тим, що біт 00 є 0, а біт 11 є 1. Це інтерпретується як десяткове ціле число 2 (виміряно з ймовірністю 1.0).

from qiskit.primitives import StatevectorSampler as Sampler

qc.measure_all()

job = Sampler().run([qc])
result = job.result()
print(f" > Counts: {result[0].data.meas.get_counts()}")
> Counts: {'10': 1024}

Рядки

При відображенні або інтерпретації списку бітів (або кубітів) як рядка біт n1n-1 є крайнім лівим бітом, а біт 00 — крайнім правим бітом. Це тому, що ми зазвичай записуємо числа з найбільш значущою цифрою зліва, а в Qiskit біт n1n-1 інтерпретується як найбільш значущий біт.

Наприклад, наступна комірка визначає Statevector з рядка станів одного кубіта. У цьому випадку кубіт 00 знаходиться в стані +|+\rangle, а кубіт 11 — в стані 0|0\rangle.

from qiskit.quantum_info import Statevector

sv = Statevector.from_label("0+")
sv.probabilities_dict()
{np.str_('00'): np.float64(0.4999999999999999),
np.str_('01'): np.float64(0.4999999999999999)}

Це іноді викликає плутанину при інтерпретації рядка бітів, оскільки ти можеш очікувати, що крайній лівий біт буде бітом 00, тоді як він зазвичай представляє біт n1n-1.

Матриці вектора стану

При представленні вектора стану як списку комплексних чисел (амплітуд), Qiskit впорядковує ці амплітуди так, що амплітуда за індексом xx представляє обчислювальний базисний стан x|x\rangle.

print(sv[1])  # amplitude of state |01>
print(sv[2]) # amplitude of state |10>
(0.7071067811865475+0j)
0j

Вентилі

Кожен вентіль у Qiskit може інтерпретувати список кубітів по-своєму, але контрольовані вентилі зазвичай дотримуються конвенції (control, target).

Наприклад, наступна комірка додає контрольований X-вентіль, де кубіт 00 є керуючим, а кубіт 11 — цільовим.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘

Дотримуючись усіх раніше згаданих конвенцій у Qiskit, цей CX-вентіль виконує перетворення 0111|01\rangle \leftrightarrow |11\rangle, тож має наступну матрицю.

(1000000100100100)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ \end{pmatrix}

Зміна впорядкування в Qiskit

Щоб намалювати схему з кубітами в зворотному порядку (тобто кубіт 00 внизу), використовуйте аргумент reverse_bits. Це впливає лише на згенеровану діаграму і не впливає на схему; X-вентіль все ще діє на кубіт 00.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.x(0)
qc.draw(reverse_bits=True)
q_1: ─────
┌───┐
q_0: ┤ X ├
└───┘

Ти можеш використовувати метод reverse_bits, щоб повернути нову схему з зворотними мітками кубітів (це не змінює оригінальну схему).

qc.reverse_bits().draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

Зверніть увагу, що в цій новій схемі X-вентіль діє на кубіт 11.

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

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