Vai al contenuto principale

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 nn bit (o qubit), di solito etichetti ciascun bit da 0n10 \rightarrow n-1. 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 00 è il qubit più in alto e il qubit n1n-1 è 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 00 è il bit meno significativo e il bit n1n-1 è il più significativo. Questo è utile durante la programmazione perché ogni bit ha il valore 2label2^\text{label} (dove "label" è l'indice del qubit in QuantumCircuit.qubits). Ad esempio, la seguente esecuzione di circuito termina con il bit 00 uguale a 0 e il bit 11 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 n1n-1 è il bit più a sinistra e il bit 00 è quello più a destra. Questo accade perché di solito scriviamo i numeri con la cifra più significativa a sinistra, e in Qiskit il bit n1n-1 è 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 00 si trova nello stato +|+\rangle e il qubit 11 nello stato 0|0\rangle.

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 00, mentre di solito rappresenta il bit n1n-1.

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 xx rappresenti lo stato della base computazionale x|x\rangle.

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 00 è il controllo e il qubit 11 è 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 0111|01\rangle \leftrightarrow |11\rangle e ha quindi la seguente matrice.

(1000000100100100)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ \end{pmatrix}

Modificare l'ordinamento in Qiskit

Per disegnare un circuito con i qubit in ordine inverso (cioè con il qubit 00 in basso), usa l'argomento reverse_bits. Questo influisce solo sul diagramma generato e non sul circuito; il gate X agisce comunque sul qubit 00.

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 11.

Passi successivi

Raccomandazioni