Перейти до основного вмісту
Цей проєкт у бета-версії. Знайшов(-ла) помилку? Відкрити issue на GitHub. Є запитання чи ідея? Запитати в Discussions — будемо раді твоєму відгуку!
Яка якість перекладу на цій сторінці?

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

Package versions

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

qiskit[all]~=2.5.2

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

Конвенції Qiskit​

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

Примітиви​

За замовчуванням Qiskit дотримується конвенції порядку бітів little-endian. Проте для BitArray за замовчуванням використовується big (endian), що спричиняє деякі відмінності у вихідних даних примітивів залежно від того, чи змінює примітив це налаштування. Наприклад, примітиви Sampler та Estimator сервісу IBM® Quantum Compute Service повертають результати у форматі big-endian, а Executor повертає результати у форматі little-endian.

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

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

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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 є найвищим кубітом, а кубіт n−1n-1 — найнижчим кубітом. Ти можеш змінити це за допомогою аргументу reverse_bits методу QuantumCircuit.draw (дивись Зміна впорядкування в Qiskit).

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

Цілі числа​

При інтерпретації бітів як числа біт 00 є найменш значущим бітом, а біт n−1n-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}

Рядки​

При відображенні або інтерпретації списку бітів (або кубітів) як рядка біт n−1n-1 є крайнім лівим бітом, а біт 00 — крайнім правим бітом. Це тому, що ми зазвичай записуємо числа з найбільш значущою цифрою зліва, а в Qiskit біт n−1n-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, тоді як він зазвичай представляє біт n−1n-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-вентиль виконує перетворення ∣01⟩↔∣11⟩|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.

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

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