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 Bits (oder Qubits) hast, benennst du normalerweise jedes Bit mit . 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 das oberste Qubit und Qubit 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 das niedrigstwertige Bit (LSB) und
Bit das höchstwertige Bit (MSB). Das ist beim Coden hilfreich, da jedes Bit den
Wert hat (wobei Label der Index des Qubits in
QuantumCircuit.qubits ist). Die folgende Circuit-Ausführung endet zum Beispiel
mit Bit gleich 0 und Bit 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 das ganz linke Bit und Bit 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 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 im Zustand und
Qubit im Zustand .
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 ist, wohingegen es normalerweise Bit repräsentiert.
Statevector-Matrizen
Wird ein Statevector als Liste komplexer Zahlen (Amplituden) dargestellt, ordnet Qiskit diese Amplituden so an, dass die Amplitude bei Index den Zustand 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 die Kontrolle und Qubit 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 aus. Es hat also die folgende Matrix.
Reihenfolge in Qiskit ändern
Um einen Circuit mit den Qubits in umgekehrter Reihenfolge (d.h. Qubit 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 .
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 wirkt.
Nächste Schritte
- Sieh dir im Tutorial Grover's Algorithm ein Beispiel für die Nutzung von Circuits an.
- Erforsche die QuantumCircuit API Referenz.