Introducción a Qiskit#

Cuando se usa Qiskit, el flujo de trabajo de un usuario consiste nominalmente en los siguientes cuatro pasos de alto nivel:

  • Construir: Diseña uno o varios circuitos cuánticos que representen el problema que estás considerando.

  • Compilar: Compila circuitos para un servicio cuántico específico, por ejemplo un sistema cuántico o un simulador clásico.

  • Ejecutar: Ejecuta los circuitos compilados en los servicios cuánticos especificados. Estos servicios pueden estar basados en la nube o ser locales.

  • Analizar: Calcula estadísticas resumidas y visualiza los resultados de los experimentos.

A continuación, se muestra un ejemplo de todo el flujo de trabajo, con cada paso explicado en detalle en las secciones siguientes:

from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram

# Use Aer's AerSimulator
simulator = AerSimulator()

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(2, 2)

# Add a H gate on qubit 0
circuit.h(0)

# Add a CX (CNOT) gate on control qubit 0 and target qubit 1
circuit.cx(0, 1)

# Map the quantum measurement to the classical bits
circuit.measure([0, 1], [0, 1])

# Compile the circuit for the support instruction set (basis_gates)
# and topology (coupling_map) of the backend
compiled_circuit = transpile(circuit, simulator)

# Execute the circuit on the aer simulator
job = simulator.run(compiled_circuit, shots=1000)

# Grab results from the job
result = job.result()

# Returns counts
counts = result.get_counts(compiled_circuit)
print("\nTotal count for 00 and 11 are:", counts)

# Draw the circuit
circuit.draw("mpl")

(Source code)

_images/intro_tutorial1-1.png
# Plot a histogram
plot_histogram(counts)

(Source code)

_images/intro_tutorial1-2.png

Flujo de Trabajo Paso a Paso#

El programa anterior se puede dividir en seis pasos:

  1. Importar paquetes

  2. Inicializar variables

  3. Agregar compuertas

  4. Visualizar el circuito

  5. Simular el experimento

  6. Visualizar los resultados

Paso 1 : Importar Paquetes#

Los elementos básicos necesarios para tu programa se importan de la siguiente manera:

from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram

Más detalladamente, las importaciones son

  • QuantumCircuit: puede pensarse como las instrucciones del sistema cuántico. Contiene todas tus operaciones cuánticas.

  • AerSimulator: es el simulador de circuitos Aer de alto rendimiento.

  • plot_histogram: crea histogramas.

Paso 2 : Inicializar Variables#

Considera la siguiente línea de código

circuit = QuantumCircuit(2, 2)

Aquí, estás inicializando con 2 qubits en el estado cero; con 2 bits clásicos puestos en cero; y circuit es el circuito cuántico.

Sintaxis:

  • QuantumCircuit(int, int)

Paso 3 : Agregar Compuertas#

Puedes agregar compuertas (operaciones) para manipular los registros de tu circuito.

Considera las siguientes tres líneas de código:

circuit.h(0)
circuit.cx(0, 1)
circuit.measure([0, 1], [0, 1])

Las compuertas se agregan al circuito una por una para formar el estado de Bell

\[\lvert\psi\rangle = \left(\lvert00\rangle+\lvert11\rangle\right)/\sqrt{2}.\]

El código anterior aplica las siguientes compuertas:

  • QuantumCircuit.h(0): Una compuerta Hadamard \(H\) en el qubit 0, que lo pone en un estado de superposición.

  • QuantumCircuit.cx(0, 1): Una operación NOT controlada (\(CNOT\)) con el control en el qubit 0 y el objetivo en el qubit 1, colocando los qubits en un estado entrelazado.

  • QuantumCircuit.measure([0,1], [0,1]): Si pasas todos los registros cuánticos y clásicos a measure, el resultado de la medición del i-ésimo qubit se almacenará en el i-ésimo bit clásico.

Paso 4 : Visualizar el Circuito#

Puedes usar qiskit.circuit.QuantumCircuit.draw() para ver el circuito que has diseñado en las diversas formas utilizadas en muchos libros de texto y artículos de investigación.

circuit.draw("mpl")

(Source code)

_images/intro_tutorial1-3.png

En este circuito, los qubits se ordenan con el qubit cero en la parte superior y el qubit uno en la parte inferior. El circuito se lee de izquierda a derecha, lo que significa que las compuertas que se aplicaron primero en el circuito se muestran más a la izquierda.

El backend predeterminado para QuantumCircuit.draw() o qiskit.visualization.circuit_drawer() es el backend de texto. Sin embargo, dependiendo de tu entorno local, es posible que desees cambiar estos valores predeterminados a algo más adecuado para tu caso de uso. Esto se hace con el archivo de configuración del usuario. Por defecto, el archivo de configuración del usuario debe estar ubicado en ~/.qiskit/settings.conf y es un archivo .ini.

Por ejemplo, un archivo settings.conf para configurar un dibujador Matplotlib es:

[default]
circuit_drawer = mpl

Puedes usar cualquiera de los backends de visualización de circuitos válidos para esta configuración, esto incluye text, mpl, latex y latex_source.

Paso 5: Simular el Experimento#

Qiskit Aer is a high performance simulator framework for quantum circuits. It provides several backends to achieve different simulation goals.

If you have issues installing Aer, you can alternatively use the Basic Aer provider by replacing Aer with BasicAer. Basic Aer is included in Qiskit.

from qiskit import QuantumCircuit, transpile
from qiskit.providers.basicaer import QasmSimulatorPy
...

Para simular este circuito, utilizarás el AerSimulator. Cada ejecución de este circuito producirá la cadena de bits 00 o 11.

simulator = AerSimulator()
compiled_circuit = transpile(circuit, simulator)
job = simulator.run(compiled_circuit, shots=1000)
result = job.result()
counts = result.get_counts(circuit)
print("\nTotal count for 00 and 11 are:",counts)

(Source code)

Como era de esperar, la cadena de bits de salida es 00 aproximadamente el 50 por ciento del tiempo. El número de veces que se ejecuta el circuito se puede especificar mediante el argumento shots del método execute. El número de iteraciones de la simulación se estableció en 1000 (el valor predeterminado es 1024).

Una vez que tengas un objeto result, puedes acceder a los conteos a través del método get_counts(circuit). Esto te brinda los resultados agregados del experimento que ejecutaste.

Paso 6 : Visualizar los Resultados#

Qiskit proporciona muchas visualizaciones,

incluyendo la función plot_histogram, para ver tus resultados.

plot_histogram(counts)

(Source code)

_images/intro_tutorial1-5.png

Las probabilidades observadas \(Pr(00)\) y \(Pr(11)\) se calculan tomando los conteos respectivos y dividiendo por el número total de iteraciones.

Nota

Intenta cambiar la palabra clave shots en el método run() para ver cómo cambian las probabilidades estimadas.

Siguientes Pasos#

Ahora que has aprendido los conceptos básicos, considera estos recursos de aprendizaje: