Przejdź do głównej treści

Kolejność bitów w Qiskit SDK

Wersje pakietów

Kod na tej stronie został opracowany przy użyciu następujących wymagań. Zalecamy użycie tych lub nowszych wersji.

qiskit[all]~=2.3.0

Jeśli masz zbiór nn bitów (lub qubitów), zazwyczaj każdy bit oznaczasz etykietą od 0n10 \rightarrow n-1. Różne programy i zasoby muszą wybrać sposób porządkowania tych bitów zarówno w pamięci komputera, jak i podczas wyświetlania na ekranie.

Konwencje Qiskit

Oto jak Qiskit SDK porządkuje bity w różnych scenariuszach.

Quantum Circuit

Klasa QuantumCircuit przechowuje swoje qubity na liście (QuantumCircuit.qubits). Indeks qubitu na tej liście definiuje etykietę qubitu.

# 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>

Diagramy Circuit

Na diagramie Circuit qubit 00 jest qubitem znajdującym się najwyżej, a qubit n1n-1 najniżej. Możesz to zmienić za pomocą argumentu reverse_bits metody QuantumCircuit.draw (zobacz Zmiana kolejności w Qiskit).

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

Liczby całkowite

Przy interpretowaniu bitów jako liczby, bit 00 jest bitem najmniej znaczącym, a bit n1n-1 najbardziej znaczącym. Jest to wygodne podczas pisania kodu, ponieważ każdy bit ma wartość 2label2^\text{label} (gdzie label to indeks qubitu w QuantumCircuit.qubits). Na przykład poniższe wykonanie Circuit kończy się z bitem 00 równym 0 i bitem 11 równym 1. Jest to interpretowane jako dziesiętna liczba całkowita 2 (zmierzona z prawdopodobieństwem 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}

Ciągi znaków

Przy wyświetlaniu lub interpretowaniu listy bitów (lub qubitów) jako ciągu znaków, bit n1n-1 jest bitem znajdującym się najbardziej na lewo, a bit 00 najbardziej na prawo. Wynika to z tego, że zazwyczaj zapisujemy liczby z najbardziej znaczącą cyfrą po lewej stronie, a w Qiskit bit n1n-1 jest interpretowany jako bit najbardziej znaczący.

Na przykład poniższa komórka definiuje Statevector na podstawie ciągu stanów jednoQubitowych. W tym przypadku qubit 00 jest w stanie +|+\rangle, a qubit 11 w stanie 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)}

Czasami prowadzi to do nieporozumień przy interpretowaniu ciągu bitów, ponieważ możesz oczekiwać, że bit najbardziej na lewo to bit 00, podczas gdy zazwyczaj reprezentuje on bit n1n-1.

Macierze Statevector

Przy reprezentowaniu wektora stanu jako listy liczb zespolonych (amplitud), Qiskit porządkuje te amplitudy tak, że amplituda pod indeksem xx reprezentuje stan bazy obliczeniowej x|x\rangle.

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

Gate

Każdy Gate w Qiskit może interpretować listę qubitów na swój własny sposób, jednak bramki kontrolowane zazwyczaj stosują konwencję (control, target).

Na przykład poniższa komórka dodaje Gate controlled-X, gdzie qubit 00 jest kontrolnym, a qubit 11 docelowym.

from qiskit import QuantumCircuit

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

Zgodnie ze wszystkimi wcześniej wymienionymi konwencjami Qiskit, ta bramka CX wykonuje transformację 0111|01\rangle \leftrightarrow |11\rangle, a więc ma następującą macierz.

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

Zmiana kolejności w Qiskit

Aby narysować Circuit z qubitami w odwróconej kolejności (czyli qubit 00 na dole), użyj argumentu reverse_bits. Wpływa to tylko na wygenerowany diagram i nie zmienia Circuit; Gate X nadal działa na qubicie 00.

from qiskit import QuantumCircuit

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

Możesz użyć metody reverse_bits, aby zwrócić nowy Circuit z odwróconymi etykietami qubitów (nie zmienia to oryginalnego Circuit).

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

Zauważ, że w tym nowym Circuit Gate X działa na qubicie 11.

Następne kroki

Zalecenia