Aller au contenu principal

L'ordre des bits dans le SDK Qiskit

Versions des paquets

Le code de cette page a été développé avec les dépendances suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.

qiskit[all]~=2.3.0

Si tu disposes d'un ensemble de nn bits (ou qubits), tu attribueras généralement à chaque bit un label de 0n10 \rightarrow n-1. Les différents logiciels et ressources doivent choisir comment ordonner ces bits, que ce soit en mémoire ou à l'écran.

Conventions Qiskit

Voici comment le SDK Qiskit ordonne les bits dans différents contextes.

Circuits quantiques

La classe QuantumCircuit stocke ses qubits dans une liste (QuantumCircuit.qubits). L'index d'un qubit dans cette liste définit le label du 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>

Diagrammes de circuits

Sur un diagramme de circuit, le qubit 00 est le qubit le plus en haut, et le qubit n1n-1 le plus en bas. Tu peux modifier cela avec l'argument reverse_bits de QuantumCircuit.draw (voir Modifier l'ordre dans Qiskit).

qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

Entiers

Lorsqu'on interprète des bits comme un nombre, le bit 00 est le bit de poids faible, et le bit n1n-1 le bit de poids fort. C'est pratique lors du codage, car chaque bit a la valeur 2label2^\text{label} (le label étant l'index du qubit dans QuantumCircuit.qubits). Par exemple, l'exécution du circuit suivant se termine avec le bit 00 à 0 et le bit 11 à 1. Cela est interprété comme l'entier décimal 2 (mesuré avec une probabilité de 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}

Chaînes de caractères

Lorsqu'on affiche ou interprète une liste de bits (ou de qubits) sous forme de chaîne de caractères, le bit n1n-1 est le bit le plus à gauche, et le bit 00 est le bit le plus à droite. C'est parce qu'on écrit habituellement les nombres avec le chiffre de poids fort à gauche, et dans Qiskit, le bit n1n-1 est interprété comme le bit de poids fort.

Par exemple, la cellule suivante définit un Statevector à partir d'une chaîne d'états de qubits uniques. Dans ce cas, le qubit 00 est dans l'état +|+\rangle, et le qubit 11 dans l'état 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)}

Cela peut parfois prêter à confusion lors de l'interprétation d'une chaîne de bits, car on pourrait s'attendre à ce que le bit le plus à gauche soit le bit 00, alors qu'il représente généralement le bit n1n-1.

Matrices de vecteurs d'état

Lorsqu'on représente un vecteur d'état sous forme de liste de nombres complexes (amplitudes), Qiskit ordonne ces amplitudes de telle sorte que l'amplitude à l'index xx représente l'état de base calculatoire x|x\rangle.

print(sv[1])  # amplitude of state |01>
print(sv[2]) # amplitude of state |10>
(0.7071067811865475+0j)
0j

Portes

Chaque porte dans Qiskit peut interpréter une liste de qubits à sa manière, mais les portes contrôlées suivent généralement la convention (contrôle, cible).

Par exemple, la cellule suivante ajoute une porte X contrôlée où le qubit 00 est le contrôle et le qubit 11 est la cible.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘

En appliquant toutes les conventions Qiskit mentionnées précédemment, cette porte CX effectue la transformation 0111|01\rangle \leftrightarrow |11\rangle, et possède donc la matrice suivante.

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

Modifier l'ordre dans Qiskit

Pour afficher un circuit avec les qubits dans l'ordre inversé (c'est-à-dire le qubit 00 en bas), utilise l'argument reverse_bits. Cela n'affecte que le diagramme généré et ne modifie pas le circuit ; la porte X agit toujours sur le qubit 00.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.x(0)
qc.draw(reverse_bits=True)
q_1: ─────
┌───┐
q_0: ┤ X ├
└───┘

Tu peux utiliser la méthode reverse_bits pour obtenir un nouveau circuit avec les labels des qubits inversés (cela ne modifie pas le circuit d'origine).

qc.reverse_bits().draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

Note que dans ce nouveau circuit, la porte X agit sur le qubit 11.

Étapes suivantes

Recommandations