Saltar al contenido principal

Medir qubits

Versiones de paquetes

El código de esta página fue desarrollado con los siguientes requisitos. Recomendamos usar estas versiones o versiones más recientes.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Para obtener información sobre el estado de un qubit, puedes medirlo en un bit clásico. En Qiskit, las mediciones se realizan en la base computacional, es decir, la base de Pauli-ZZ de un solo qubit. Por lo tanto, una medición produce 0 o 1, dependiendo del solapamiento con los estados propios de Pauli-ZZ 0|0\rangle y 1|1\rangle:

qmeasure{0(outcome+1),with probability p0=q02,1(outcome1),with probability p1=q12.|q\rangle \xrightarrow{measure}\begin{cases} 0 (\text{outcome}+1), \text{with probability } p_0=|\langle q|0\rangle|^{2}\text{,} \\ 1 (\text{outcome}-1), \text{with probability } p_1=|\langle q|1\rangle|^{2}\text{.} \end{cases}

Mediciones a mitad del circuito

Las mediciones a mitad del circuito son un componente clave de los circuitos dinámicos. Antes de qiskit-ibm-runtime v0.43.0, measure era la única instrucción de medición en Qiskit. Sin embargo, las mediciones a mitad del circuito tienen requisitos de ajuste distintos a los de las mediciones terminales (mediciones que ocurren al final de un circuito). Por ejemplo, es necesario tener en cuenta la duración de la instrucción al ajustar una medición a mitad del circuito, ya que instrucciones más largas generan circuitos más ruidosos. No es necesario considerar la duración de la instrucción para las mediciones terminales, ya que no hay instrucciones después de ellas.

En qiskit-ibm-runtime v0.43.0 se introdujo la instrucción MidCircuitMeasure. Como su nombre indica, es una nueva instrucción de medición optimizada para mediciones a mitad del circuito en QPUs de IBM®.

nota

La instrucción MidCircuitMeasure se corresponde con la instrucción measure_2 reportada en las supported_instructions del backend. Sin embargo, measure_2 no está disponible en todos los backends. Usa service.backends(filters=lambda b: "measure_2" in b.supported_instructions) para encontrar backends que la soporten. En el futuro podrían añadirse nuevas mediciones, aunque no está garantizado.

Aplicar una medición a un circuito

Hay varias formas de aplicar mediciones a un circuito:

Método QuantumCircuit.measure

Usa el método measure para medir un QuantumCircuit.

Ejemplos:

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit

qc = QuantumCircuit(5, 5)
qc.x(0)
qc.x(1)
qc.x(4)
qc.measure(
range(5), range(5)
) # Measures all qubits into the corresponding clbit.
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260490>
from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure(1, 0) # Measure qubit 1 into the classical bit 0.
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260820>

Clase Measure

La clase Measure de Qiskit mide los qubits especificados.

from qiskit.circuit import Measure

qc = QuantumCircuit(3, 1)
qc.x([0, 1])
qc.append(Measure(), [0], [0]) # measure qubit 0 into clbit 0
<qiskit.circuit.instructionset.InstructionSet at 0x7fdc54260df0>

Método QuantumCircuit.measure_all

Para medir todos los qubits en los bits clásicos correspondientes, usa el método measure_all. Por defecto, este método agrega nuevos bits clásicos en un ClassicalRegister para almacenar estas mediciones.

from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure_all() # Measure all qubits.

Método QuantumCircuit.measure_active

Para medir todos los qubits que no están inactivos, usa el método measure_active. Este método crea un nuevo ClassicalRegister con un tamaño igual al número de qubits no inactivos que se están midiendo.

from qiskit import QuantumCircuit

qc = QuantumCircuit(3, 1)
qc.x([0, 2])
qc.measure_active() # Measure qubits that are not idle, that is, qubits 0 and 2.

Método MidCircuitMeasure

Usa MidCircuitMeasure para aplicar una medición a mitad del circuito (requiere qiskit-ibm-runtime v0.43.0 o posterior). Aunque puedes usar QuantumCircuit.measure para una medición a mitad del circuito, por su diseño, MidCircuitMeasure suele ser la mejor opción. Por ejemplo, añade menos sobrecarga a tu circuito que cuando usas QuantumCircuit.measure.

from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime.circuit import MidCircuitMeasure
from qiskit.circuit import Measure

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

circ = QuantumCircuit(2, 2)
circ.x(0)
circ.append(MidCircuitMeasure(), [0], [0])
# circ.measure([0], [0])
# circ.measure_all()
print(circ.draw(cregbundle=False))
┌───┐┌────────────┐
q_0: ┤ X ├┤0 ├
└───┘│ │
q_1: ─────┤ Measure_2 ├
│ │
c_0: ═════╡0 ╞
└────────────┘
c_1: ═══════════════════
Notas importantes
  • Debe existir al menos un registro clásico para poder usar mediciones.
  • La primitiva Sampler requiere mediciones en el circuito. Puedes añadir mediciones al circuito con la primitiva Estimator, pero serán ignoradas.

Siguientes pasos

Recomendaciones