Zum Hauptinhalt springen
Dieses Projekt befindet sich in der Beta-Phase. Einen Fehler gefunden? GitHub Issue erstellen. Frage oder Idee? In Discussions fragen — wir freuen uns über dein Feedback!
Wie ist die Übersetzungsqualität auf dieser Seite?

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.5.2

Wenn du eine Menge von nn Bits (oder Qubits) hast, benennst du normalerweise jedes Bit mit 0→n−10 \rightarrow n-1. Verschiedene Softwarepakete und Ressourcen müssen festlegen, wie sie diese Bits sowohl im Arbeitsspeicher des Computers anordnen als auch auf dem Bildschirm darstellen.

Qiskit-Konventionen​

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

Primitives​

Standardmäßig folgt Qiskit der Little-Endian-Konvention für die Bit-Reihenfolge. Der Standard für BitArray ist jedoch big (Endian), was je nachdem, ob das Primitive diese Einstellung ändert, zu Unterschieden in der Primitive-Ausgabe führt. Zum Beispiel liefern die Sampler- und Estimator-Primitives des IBM® Quantum Compute Service Big-Endian-Ergebnisse, während Executor Little-Endian-Ergebnisse zurückgibt.

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

Circuit-Diagramme​

Auf einem Circuit-Diagramm ist Qubit 00 das oberste Qubit und Qubit n−1n-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 niedrigstwertige Bit (LSB) und Bit n−1n-1 das höchstwertige Bit (MSB). 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 die Dezimalzahl 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 n−1n-1 das ganz linke Bit und Bit 00 das ganz rechte Bit. Das liegt daran, dass wir normalerweise Zahlen mit der höchstwertigen Ziffer auf der linken Seite schreiben und in Qiskit Bit n−1n-1 als das höchstwertige 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 n−1n-1 repräsentiert.

Statevector-Matrizen​

Wird ein Statevector als Liste komplexer Zahlen (Amplituden) dargestellt, ordnet Qiskit diese Amplituden so an, dass die Amplitude bei Index xx den Zustand ∣x⟩|x\rangle der Rechenbasis 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 ∣01⟩↔∣11⟩|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 wirkt weiterhin 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 wirkt.

Nächste Schritte​

Empfehlungen