Aller au contenu principal
Ce projet est en phase bêta. Tu as trouvé un bug ? Ouvrir un ticket GitHub. Une question ou une idée ? Pose ta question dans Discussions — tes retours sont les bienvenus !
Quelle est la qualité de la traduction sur cette page ?

L'ordre des bits dans le SDK Qiskit

Package versions

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

Si tu disposes d'un ensemble de nn bits (ou qubits), tu attribueras généralement à chaque bit un label de 0→n−10 \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.

Primitives​

Par défaut, Qiskit suit la convention d'ordre des bits little-endian. Cependant, la valeur par défaut de BitArray est big (endian), ce qui entraîne des différences dans la sortie des primitives, selon que la primitive modifie ou non ce paramètre. Par exemple, les primitives Sampler et Estimator d'IBM® Quantum Compute Service renvoient des résultats big-endian, alors que Executor renvoie des résultats little-endian.

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 — 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>

Diagrammes de circuits​

Sur un diagramme de circuit, le qubit 00 est le qubit le plus en haut, et le qubit n−1n-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 n−1n-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 n−1n-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 n−1n-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 à un seul qubit. 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 n−1n-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 (control, target).

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