Kolejność bitów w Qiskit SDK
Wersje pakietów
Kod na tej stronie przygotowano z użyciem następujących wersji pakietów. Zalecamy użycie tych lub nowszych wersji.
qiskit[all]~=2.6.1
Jeśli masz zbiór bitów (lub qubitów), zazwyczaj każdy bit oznaczasz etykietą od . 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.
Prymitywy
Domyślnie Qiskit stosuje konwencję kolejności bitów little-endian. Jednak domyślną wartością dla BitArray jest big (endian), co powoduje pewne różnice w wynikach prymitywów, w zależności od tego, czy prymityw zmienia to ustawienie. Na przykład prymitywy Sampler i Estimator usługi IBM® Quantum Compute Service zwracają wyniki w formacie big-endian, natomiast Executor zwraca wyniki w formacie little-endian.
Quantum Circuit
Klasa QuantumCircuit przechowuje swoje qubity na liście
(QuantumCircuit.qubits). Indeks qubitu na tej liście definiuje
etykietę qubitu.
# 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>
Diagramy Circuit
Na diagramie Circuit qubit jest qubitem znajdującym się najwyżej, a qubit
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 jest bitem najmniej znaczącym, a
bit najbardziej znaczącym. Jest to wygodne podczas pisania kodu, ponieważ każdy bit ma
wartość (gdzie label to indeks qubitu w
QuantumCircuit.qubits). Na przykład po wykonaniu poniższego Circuit bit ma wartość 0, a bit wartość 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 jest bitem znajdującym się najbardziej na lewo, a bit najbardziej na prawo. Wynika to z tego, że zazwyczaj zapisujemy liczby z najbardziej znaczącą cyfrą po lewej stronie, a w Qiskit bit 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 jest w stanie , a
qubit w stanie .
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 , podczas gdy zazwyczaj reprezentuje on bit .
Macierze Statevector
Przy reprezentowaniu wektora stanu jako listy liczb zespolonych (amplitud), Qiskit porządkuje te amplitudy tak, że amplituda pod indeksem reprezentuje stan bazy obliczeniowej .
print(sv[1]) # amplitude of state |01>
print(sv[2]) # amplitude of state |10>
(0.7071067811865475+0j)
0j
Gate
Każda bramka w Qiskit może interpretować listę qubitów na swój sposób, jednak
bramki kontrolowane zazwyczaj stosują konwencję (control, target).
Na przykład poniższa komórka dodaje Gate controlled-X, gdzie qubit jest kontrolnym, a qubit 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ę , a więc ma następującą macierz.
Zmiana kolejności w Qiskit
Aby narysować Circuit z qubitami w odwróconej kolejności (czyli qubit 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 .
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 .
Następne kroki
- Zobacz przykład użycia Circuit w tutorialu Algorytm Grovera.
- Zapoznaj się z dokumentacją API QuantumCircuit.