Ordinamento dei bit nell'SDK Qiskit
Versioni dei pacchetti
Il codice in questa pagina è stato sviluppato usando i seguenti requisiti. Si consiglia di utilizzare queste versioni o versioni più recenti.
qiskit[all]~=2.3.0
Se hai un insieme di bit (o qubit), di solito etichetti ciascun bit da . I diversi software e le diverse risorse 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.
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 — 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>
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 può causare 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 del vettore di stato
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.