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 Bits (oder Qubits) hast, benennst du normalerweise jedes Bit mit . 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 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 am wenigsten signifikante Bit (least significant bit) und
Bit das signifikanteste Bit (most significant bit). 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 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 das ganz linke Bit und Bit das ganz rechte Bit. Das liegt daran, dass wir normalerweise Zahlen mit der signifikantesten Ziffer auf der linken Seite schreiben und in Qiskit Bit 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 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
Bei der Repräsentation eines Statevectors als Liste von komplexen Zahlen (Amplituden), ordnet Qiskit diese Amplituden so an, dass die Amplitude bei Index den Berechnungsbasiszustand 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 agiert noch immer 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 agiert.
Nächste Schritte
- Sieh dir im Tutorial Grover's Algorithm ein Beispiel für die Nutzung von Circuits an.
- Erforsche die QuantumCircuit API Referenz.