Ordinamento dei bit nell'SDK Qiskit
Versioni dei pacchetti
Il codice in questa pagina è stato sviluppato utilizzando i seguenti requisiti. Consigliamo di utilizzare queste versioni o versioni più recenti.
qiskit[all]~=2.5.2
Se hai un insieme di bit (o qubit), di solito etichetterai ciascun bit . Software e risorse diverse devono scegliere come ordinare questi bit sia nella memoria del computer sia quando vengono visualizzati sullo schermo.
Convenzioni di Qiskit
Ecco come l'SDK Qiskit ordina i bit nei diversi scenari.
Primitive
Per impostazione predefinita, Qiskit segue la convenzione di ordinamento dei bit little-endian. Tuttavia, il valore predefinito per BitArray è big (endian), il che causa alcune differenze nell'output delle primitive, a seconda che la primitiva modifichi o meno questa impostazione. Ad esempio, le primitive Sampler ed Estimator di IBM® Quantum Compute Service restituiscono risultati big-endian, mentre Executor restituisce risultati little-endian.
Circuiti quantistici
La classe QuantumCircuit memorizza i suoi qubit in una lista
(QuantumCircuit.qubits). L'indice di un qubit in questa lista definisce
l'etichetta del qubit.
# 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>
Diagrammi di circuito
In un diagramma di circuito, il qubit è il qubit più in alto e il qubit
è quello più in basso. Puoi modificare questo comportamento con l'argomento
reverse_bits di QuantumCircuit.draw (vedi Modificare l'ordinamento in
Qiskit).
qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘
Interi
Quando si interpretano i bit come un numero, il bit è il bit meno
significativo e il bit è il più significativo. Questo è utile durante
la programmazione perché ogni bit ha il valore (dove "label"
è l'indice del qubit in QuantumCircuit.qubits). Ad esempio, la seguente
esecuzione di circuito termina con il bit uguale a 0 e il bit uguale
a 1. Questo viene interpretato come il numero intero decimale 2 (misurato
con probabilità 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}
Stringhe
Quando si visualizza o si interpreta una lista di bit (o qubit) come stringa, il bit è il bit più a sinistra e il bit è quello più a destra. Questo accade perché di solito scriviamo i numeri con la cifra più significativa a sinistra, e in Qiskit il bit è interpretato come il bit più significativo.
Ad esempio, la seguente cella definisce uno Statevector a partire da una
stringa di stati a singolo qubit. In questo caso, il qubit si trova nello
stato e il qubit nello stato .
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)}
Questo a volte causa confusione quando si interpreta una stringa di bit, poiché ci si potrebbe aspettare che il bit più a sinistra sia il bit , mentre di solito rappresenta il bit .
Matrici dello statevector
Quando si rappresenta uno statevector come lista di numeri complessi (ampiezze), Qiskit ordina queste ampiezze in modo che l'ampiezza all'indice rappresenti lo stato della base computazionale .
print(sv[1]) # amplitude of state |01>
print(sv[2]) # amplitude of state |10>
(0.7071067811865475+0j)
0j
Gate
Ogni gate in Qiskit può interpretare una lista di qubit a modo suo, ma i gate
controllati seguono di solito la convenzione (control, target).
Ad esempio, la seguente cella aggiunge un gate controlled-X in cui il qubit è il controllo e il qubit è il target.
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘
Seguendo tutte le convenzioni Qiskit menzionate in precedenza, questo gate CX esegue la trasformazione e ha quindi la seguente matrice.
Modificare l'ordinamento in Qiskit
Per disegnare un circuito con i qubit in ordine inverso (cioè con il qubit
in basso), usa l'argomento reverse_bits. Questo influisce solo sul diagramma
generato e non sul circuito; il gate X agisce comunque sul qubit .
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
qc.x(0)
qc.draw(reverse_bits=True)
q_1: ─────
┌───┐
q_0: ┤ X ├
└───┘
Puoi usare il metodo reverse_bits per restituire un nuovo circuito con le
etichette dei qubit invertite (questo non modifica il circuito originale).
qc.reverse_bits().draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘
Nota che in questo nuovo circuito il gate X agisce sul qubit .
Passi successivi
- Guarda un esempio d'uso dei circuiti nel tutorial sull'Algoritmo di Grover.
- Esplora la documentazione di riferimento dell'API QuantumCircuit.