Порядок бітів у Qiskit SDK
Package versions
Код на цій сторінці розроблено з урахуванням таких вимог. Ми рекомендуємо використовувати ці версії або новіші.
qiskit[all]~=2.5.2
Якщо у тебе є набір з бітів (або кубітів), ти зазвичай позначатимеш кожен біт . Різне програмне забезпечення та ресурси мають вирішити, як вони впорядковують ці біти як у пам'яті комп'ютера, так і при відображенні на екрані.
Конвенції 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>
Діаграми схем
На діаграмі схеми кубіт є найвищим кубітом, а кубіт —
найнижчим кубітом. Ти можеш змінити це за допомогою аргументу reverse_bits методу
QuantumCircuit.draw (дивись Зміна впорядкування в
Qiskit).
qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘
Цілі числа
При інтерпретації бітів як числа біт є найменш значущим бітом, а
біт — найбільш значущим. Це корисно при програмуванні, оскільки кожен біт має
значення (label — це індекс кубіта в
QuantumCircuit.qubits). Наприклад, наступне виконання схеми закінчується
тим, що біт є 0, а біт є 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}
Рядки
При відображенні або інтерпретації списку бітів (або кубітів) як рядка біт є крайнім лівим бітом, а біт — крайнім правим бітом. Це тому, що ми зазвичай записуємо числа з найбільш значущою цифрою зліва, а в Qiskit біт інтерпретується як найбільш значущий біт.
Наприклад, наступна комірка визначає Statevector з рядка
станів одного кубіта. У цьому випадку кубіт знаходиться в стані , а
кубіт — в стані .
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)}
Це іноді викликає плутанину при інтерпретації рядка бітів, оскільки ти можеш очікувати, що крайній лівий біт буде бітом , тоді як він зазвичай представляє біт .
Матриці вектора стану
При представленні вектора стану як списку комплексних чисел (амплітуд), Qiskit впорядковує ці амплітуди так, що амплітуда за індексом представляє обчислювальний базисний стан .
print(sv[1]) # amplitude of state |01>
print(sv[2]) # amplitude of state |10>
(0.7071067811865475+0j)
0j
Вентилі
Кожен вентиль у Qiskit може інтерпретувати список кубітів по-своєму, але
керовані вентилі зазвичай дотримуються конвенції (control, target).
Наприклад, наведена нижче комірка додає керований X-вентиль, де кубіт є керуючим, а кубіт — цільовим.
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘
Дотримуючись усіх раніше згаданих конвенцій у Qiskit, цей CX-вентиль виконує перетворення , тож має таку матрицю.
Зміна впорядкування в Qiskit
Щоб намалювати схему з кубітами в зворотному порядку (тобто кубіт внизу), використовуй аргумент reverse_bits. Це впливає лише на згенеровану
діаграму і не впливає на схему; X-вентиль все ще діє на кубіт .
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-вентиль діє на кубіт .
Наступні кроки
- Подивись приклад використання схем у підручнику Алгоритм Гровера.
- Вивчи довідку API QuantumCircuit.