Порядок бітів у Qiskit SDK
Package versions
Код на цій сторінці був розроблений з використанням наступних вимог. Ми рекомендуємо використовувати ці версії або новіші.
qiskit[all]~=2.4.0
Якщо у вас є набір з бітів (або кубітів), ви зазвичай позначатимете кожен біт . Різні програмні забезпечення та ресурси повинні вибрати, як вони впорядковують ці біти як у пам'яті комп'ютера, так і при відображенні на екрані.
Конвенції 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>
Діаграми схем
На діаграмі схеми кубіт є найвищим кубітом, а кубіт —
найнижчим кубітом. Ти можеш змінити це за допомогою аргументу 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.