Zum Hauptinhalt springen

Bit-Reihenfolge im Qiskit SDK

Paketversionen

Der Code auf dieser Seite wurde mit den folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.

qiskit[all]~=2.3.0

Wenn du eine Menge von nn Bits (oder Qubits) hast, benennst du normalerweise jedes Bit mit 0n10 \rightarrow n-1. Verschiedene Softwares und Ressourcen müssen auswählen, wie sie diese Bits sowohl im Arbeitsspeicher des Computers ordnen als auch auf dem Bildschirm anzeigen.

Qiskit-Konventionen

Hier erfährst du, wie das Qiskit SDK Bits in verschiedenen Szenarien ordnet.

Quanten-Circuits

Die Klasse QuantumCircuit speichert ihre Qubits in einer Liste (QuantumCircuit.qubits). Der Index eines Qubits in dieser Liste definiert das Label des 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>

Circuit-Diagramme

Auf einem Circuit-Diagramm ist Qubit 00 das oberste Qubit und Qubit n1n-1 das unterste Qubit. Du kannst dies mit dem Argument reverse_bits von QuantumCircuit.draw ändern (siehe Reihenfolge in Qiskit ändern).

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

Integer

Wenn Bits als Zahl interpretiert werden, ist Bit 00 das am wenigsten signifikante Bit (least significant bit) und Bit n1n-1 das signifikanteste Bit (most significant bit). Das ist beim Coden hilfreich, da jedes Bit den Wert 2label2^\text{label} hat (wobei Label der Index des Qubits in QuantumCircuit.qubits ist). Die folgende Circuit-Ausführung endet zum Beispiel mit Bit 00 gleich 0 und Bit 11 gleich 1. Das wird als der dezimale Integer 2 interpretiert (gemessen mit Wahrscheinlichkeit 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}

Strings

Wenn eine Liste von Bits (oder Qubits) als String angezeigt oder interpretiert wird, ist Bit n1n-1 das ganz linke Bit und Bit 00 das ganz rechte Bit. Das liegt daran, dass wir normalerweise Zahlen mit der signifikantesten Ziffer auf der linken Seite schreiben und in Qiskit Bit n1n-1 als das signifikanteste Bit interpretiert wird.

Die folgende Zelle definiert beispielsweise einen Statevector aus einem String von Ein-Qubit-Zuständen. In diesem Fall befindet sich Qubit 00 im Zustand +|+\rangle und Qubit 11 im Zustand 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)}

Das führt gelegentlich zu Verwirrung bei der Interpretation eines Bit-Strings, da du vermuten könntest, dass das ganz linke Bit gleich Bit 00 ist, wohingegen es normalerweise Bit n1n-1 repräsentiert.

Statevector-Matrizen

Bei der Repräsentation eines Statevectors als Liste von komplexen Zahlen (Amplituden), ordnet Qiskit diese Amplituden so an, dass die Amplitude bei Index xx den Berechnungsbasiszustand x|x\rangle repräsentiert.

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

Gates

Jedes Gate in Qiskit kann eine Liste von Qubits auf seine eigene Weise interpretieren, aber kontrollierte Gates folgen für gewöhnlich der Konvention (control, target).

Die folgende Zelle fügt beispielsweise ein kontrolliertes X-Gate hinzu, wobei Qubit 00 die Kontrolle und Qubit 11 das Ziel (Target) ist.

from qiskit import QuantumCircuit

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

Wenn wir allen zuvor erwähnten Konventionen in Qiskit folgen, führt dieses CX-Gate die Transformation 0111|01\rangle \leftrightarrow |11\rangle aus. Es hat also die folgende Matrix.

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

Reihenfolge in Qiskit ändern

Um einen Circuit mit den Qubits in umgekehrter Reihenfolge (d.h. Qubit 00 ganz unten) zu zeichnen, benutze das Argument reverse_bits. Das betrifft nur das generierte Diagramm und verändert den Circuit nicht; das X-Gate agiert noch immer auf Qubit 00.

from qiskit import QuantumCircuit

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

Du kannst die Methode reverse_bits nutzen, um einen neuen Circuit mit umgekehrten Qubit-Labels zurückzugeben (dies verändert nicht den ursprünglichen Circuit).

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

Beachte, dass das X-Gate in diesem neuen Circuit auf Qubit 11 agiert.

Nächste Schritte

Empfehlungen