Vai al contenuto principale
Questo progetto è in fase beta. Hai trovato un bug? Apri una issue su GitHub. Hai una domanda o un'idea? Chiedi su GitHub Discussions — apprezziamo il tuo feedback!
Com'è la qualità della traduzione su questa pagina?

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 nn bit (o qubit), di solito etichetterai ciascun bit 0→n−10 \rightarrow n-1. 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 00 è il qubit più in alto e il qubit n−1n-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 n−1n-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 n−1n-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 n−1n-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 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 00, mentre di solito rappresenta il bit n−1n-1.

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 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 ∣01⟩↔∣11⟩|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