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 bits (o qubits), normalmente etiquetarás cada bit . 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 es el qubit de más arriba, y el qubit 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 es el bit menos significativo y el
bit el más significativo. Esto es útil al programar porque cada bit tiene
el valor (siendo la etiqueta el índice del qubit en
QuantumCircuit.qubits). Por ejemplo, la siguiente ejecución de circuito termina
con el bit siendo 0 y el bit 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 es el bit más a la izquierda, y el bit 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 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 está en el estado , y
el qubit en el estado .
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 , mientras que usualmente representa el bit .
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 representa el estado base computacional .
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 es el control y el qubit 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 , por lo que tiene la siguiente matriz.
Cambiar ordenamiento en Qiskit
Para dibujar un circuito con los qubits en orden inverso (es decir, el qubit 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 .
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 .
Siguientes pasos
- Mira un ejemplo del uso de circuitos en el tutorial Algoritmo de Grover.
- Explora la referencia de la API de QuantumCircuit.