Saltar al contenido principal

Ordenamiento de bits (Bit-ordering) en el Qiskit SDK

Versiones de paquetes

El código de esta página se desarrolló utilizando los siguientes requisitos. Recomendamos usar estas versiones o más recientes.

qiskit[all]~=2.3.0

Si tienes un conjunto de nn bits (o qubits), normalmente etiquetarás cada bit 0n10 \rightarrow n-1. Los diferentes softwares y recursos deben elegir cómo ordenar estos bits tanto en la memoria de la computadora como cuando se muestran en la pantalla.

Convenciones de Qiskit

Así es como el Qiskit SDK ordena los bits en diferentes escenarios.

Circuitos cuánticos

La clase QuantumCircuit almacena sus qubits en una lista (QuantumCircuit.qubits). El índice de un qubit en esta lista define la etiqueta 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>

Diagramas de circuitos

En un diagrama de circuito, el qubit 00 es el qubit de más arriba, y el qubit n1n-1 el qubit de más abajo. Puedes cambiar esto con el argumento reverse_bits de QuantumCircuit.draw (consulta Cambiar ordenamiento en Qiskit).

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

Números enteros (Integers)

Al interpretar bits como un número, el bit 00 es el bit menos significativo y el bit n1n-1 el más significativo. Esto es útil al programar porque cada bit tiene el valor 2etiqueta2^\text{etiqueta} (siendo la etiqueta el índice del qubit en QuantumCircuit.qubits). Por ejemplo, la siguiente ejecución de circuito termina con el bit 00 siendo 0 y el bit 11 siendo 1. Esto se interpreta como el entero decimal 2 (medido con probabilidad 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}

Cadenas de texto (Strings)

Al mostrar o interpretar una lista de bits (o qubits) como una cadena (string), el bit n1n-1 es el bit más a la izquierda, y el bit 00 es el bit más a la derecha. Esto se debe a que nosotros usualmente escribimos los números con el dígito más significativo a la izquierda, y en Qiskit, el bit n1n-1 se interpreta como el bit más significativo.

Por ejemplo, la siguiente celda define un Statevector a partir de una cadena (string) de estados de un solo qubit. En este caso, el qubit 00 está en el estado +|+\rangle, y el qubit 11 en el estado 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)}

Esto ocasionalmente causa confusión al interpretar una cadena de bits, ya que podrías esperar que el bit más a la izquierda sea el bit 00, mientras que usualmente representa el bit n1n-1.

Matrices del vector de estado (Statevector)

Al representar un vector de estado (statevector) como una lista de números complejos (amplitudes), Qiskit ordena estas amplitudes de tal manera que la amplitud en el índice xx representa el estado base computacional x|x\rangle.

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

Puertas (Gates)

Cada puerta (gate) en Qiskit puede interpretar una lista de qubits a su propia manera, pero las puertas controladas suelen seguir la convención (control, objetivo).

Por ejemplo, la siguiente celda añade una puerta X controlada donde el qubit 00 es el control y el qubit 11 es el objetivo.

from qiskit import QuantumCircuit

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

Siguiendo todas las convenciones mencionadas anteriormente en Qiskit, esta puerta CX realiza la transformación 0111|01\rangle \leftrightarrow |11\rangle, por lo que tiene la siguiente matriz.

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

Cambiar ordenamiento en Qiskit

Para dibujar un circuito con los qubits en orden inverso (es decir, el qubit 00 en la parte inferior), usa el argumento reverse_bits. Esto solo afecta el diagrama generado y no afecta al circuito; la puerta X aún actúa sobre el qubit 00.

from qiskit import QuantumCircuit

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

Puedes usar el método reverse_bits para retornar un nuevo circuito con las etiquetas de los qubits invertidas (esto no muta o altera el circuito original).

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

Nota que en este nuevo circuito, la puerta X actúa sobre el qubit 11.

Siguientes pasos

Recomendaciones