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 bits (ou qubits), tu attribueras généralement à chaque bit un label de . 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 est le qubit le plus en haut, et le qubit 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 est le bit de poids faible, et
le bit le bit de poids fort. C'est pratique lors du codage, car chaque bit a
la valeur (le label étant l'index du qubit dans
QuantumCircuit.qubits). Par exemple, l'exécution du circuit suivant se termine
avec le bit à 0 et le bit à 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 est le bit le plus à gauche, et le bit 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 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 est dans l'état , et
le qubit dans l'état .
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 , alors qu'il représente généralement le bit .
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 représente l'état de base calculatoire .
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 est le contrôle et le qubit 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 , et possède donc la matrice suivante.
Modifier l'ordre dans Qiskit
Pour afficher un circuit avec les qubits dans l'ordre inversé (c'est-à-dire le qubit 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 .
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 .