Orden de los bits en el Qiskit SDK
Package versions
El código de esta página se desarrolló utilizando los siguientes requisitos. Recomendamos usar estas versiones o más recientes.
qiskit[all]~=2.5.2
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.
Primitivas
De forma predeterminada, Qiskit sigue la convención de ordenamiento de bits little-endian. Sin embargo, el valor predeterminado de BitArray es big (endian), lo que provoca algunas diferencias en la salida de las primitivas, según si la primitiva modifica este ajuste. Por ejemplo, las primitivas Sampler y Estimator del IBM® Quantum Compute Service devuelven resultados big-endian, pero Executor devuelve resultados little-endian.
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 — 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>
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 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 en Qiskit puede interpretar una lista de qubits a su manera, pero
las puertas controladas suelen seguir la convención (control, target).
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 obtener un nuevo circuito con las
etiquetas de los qubits invertidas (esto no modifica el circuito original).
qc.reverse_bits().draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘
Observa 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.