Empieza a utilizar Qiskit en el aula
Para este módulo de Qiskit en las aulas, los estudiantes deben tener un entorno Python en funcionamiento con los siguientes paquetes instalados:
qiskitv2.1.0 o más recienteqiskit-ibm-runtimev0.40.1 o más recienteqiskit-aerv0.17.0 o más recienteqiskit.visualizationnumpypylatexenc
Para configurar e instalar los paquetes anteriores, consulta la guía Instalar Qiskit. Para ejecutar trabajos en ordenadores cuánticos reales, los estudiantes deberán crear una cuenta en IBM Quantum® siguiendo los pasos de la guía Configure su cuenta en IBM Cloud®.
Este módulo fue probado y utilizó 2 segundos de tiempo QPU en un procesador Heron v2. Esto es sólo una estimación. Su uso real puede variar.
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'Introducción
En los módulos de Qiskit en el aula, tendrás la oportunidad de utilizar un ordenador cuántico para explorar diversos conceptos de campos afines a la informática cuántica, como la mecánica cuántica, la informática, la química, etc. Este módulo sirve como prerrequisito para los demás: introduce los fundamentos de la computación cuántica y cómo utilizar Qiskit para ejecutar circuitos cuánticos.
Primero le explicaremos brevemente cómo funciona un ordenador clásico y después le mostraremos cómo se adaptan estos conceptos al paradigma de la computación cuántica. Por último, te mostraremos cómo unir estos conceptos para construir y ejecutar tu primer circuito cuántico.
Ordenadores clásicos
Es probable que conozca los fundamentos del funcionamiento de los ordenadores clásicos, pero aquí destacaremos algunas de las características clave para poder establecer una comparación con los ordenadores cuánticos.
Las unidades básicas de información: bits
Los ordenadores clásicos procesan información clásica, y la unidad fundamental de la información clásica es el bit. Un solo bit puede almacenar la respuesta a una pregunta "sí/no". Solemos representar los dos estados binarios de un bit como "0" y "1".
Revisión de números binarios
Combinar bits permite almacenar más información. Por ejemplo, si quieres almacenar un número del 0 al 15, podrías hacerlo con cuatro bits de la siguiente manera:
| 0 = 0000 | 4 = 0100 | 8 = 1000 | 12 = 1100 |
| 1 = 0001 | 5 = 0101 | 9 = 1001 | 13 = 1101 |
| 2 = 0010 | 6 = 0110 | 10 = 1010 | 14 = 1110 |
| 3 = 0011 | 7 = 0111 | 11 = 1011 | 15 = 1111 |
En general, para pasar de un número binario de bits a un número familiar, base-10, se multiplica el bit menos significativo (más a la derecha) por , el siguiente bit a la izquierda por , luego el siguiente por , y así sucesivamente, hasta llegar al más significativo (bit más a la izquierda), que se multiplica .
Esto significa que bits pueden estar en uno de los estados posibles.
Comprueba tu comprensión
¿Cuántos bits necesitarías para representar el número 86? Escribe la cadena de bits que codifica este número en binario.
Recuerde que bits le permite representar los números a , por lo que utilizando seis bits llegaríamos hasta . Eso no es suficiente. Añadimos un bit más para llegar a . Ahora descompongamos 86 en potencias de 2:
Operaciones fundamentales: puertas
Ahora bien, un ordenador necesita poder hacer algo con los bits para, bueno, computar. Las puertas binarias son las operaciones que forman los bloques de construcción fundamentales de todos los algoritmos y códigos más complicados.
Puerta de un solo bit:
NO
Cuando sólo tienes un bit, sólo hay una forma de transformar su estado: cambiar el estado de 0 a 1 o de 1 a 0. A esto lo llamamos la puerta "NO". El efecto de esta puerta -y del resto de puertas que veremos a continuación- puede representarse en una "tabla de verdad", con columnas para los estados de entrada y salida de los qubits. La tabla de verdad de la puerta NOT es:
Entrada | Resultado |
|---|---|
| 0 | 1 |
| 1 | 0 |
Puertas multibit:
Y
AND es una puerta de dos bits que toma dos bits de entrada y emite un único bit. La salida es 1 si los dos bits de entrada son 1 y 0 en caso contrario:
Entrada | Resultado |
|---|---|
| 00 | 0 |
| 01 | 0 |
| 10 | 0 |
| 5 | 1 |
O
OR es otra puerta de dos bits con un único bit de salida. Sale 1 si cualquiera de los bits es 1:
Entrada | Resultado |
|---|---|
| 00 | 0 |
| 01 | 1 |
| 10 | 1 |
| 5 | 1 |
XO
XOR significa "OR exclusivo" y es como la puerta OR, pero da como resultado 1 si sólo uno de los bits de entrada es 1. La salida es 0 si ambos son 1 o ambos son 0:
Entrada | Resultado |
|---|---|
| 00 | 0 |
| 01 | 1 |
| 10 | 1 |
| 5 | 0 |
Medidas:
Normalmente, cuando se aprende informática clásica, no se presta mucha atención al proceso de lectura del estado de los bits. Esto se debe a que no es muy complejo desde una perspectiva conceptual. Puedes medir los bits en cualquier momento antes, durante o después de un cálculo, y no afecta al resultado. Este no es el caso de la computación cuántica, como veremos a continuación.
Circuitos:
Combinando las puertas anteriores, puedes hacer cualquier tipo de operación que quieras en un ordenador. Veamos un ejemplo sencillo: Utilizando las puertas AND y XOR, puedes construir el circuito de media escalera, que calcula la suma de dos bits. Esto se representa en un diagrama de circuito lógico, donde los hilos representan los bits y las puertas que operan sobre los bits se muestran como símbolos en los hilos correspondientes:
Así, los dos bits se copian y pasan por una puerta AND y una puerta XOR. El resultado de la puerta XOR es el "bit de suma" (S), que permanece en el lugar de los unos del número binario, y el resultado de la puerta AND es el "bit de acarreo" (C), que es el valor del siguiente dígito más significativo del número binario. Aquí está la tabla de verdad:
Suma ( ) | Carry ( ) | ||
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
Comprueba tu comprensión
Comprueba que la tabla de verdad anterior da la solución correcta para un circuito sumador. Es decir, para cada una de las cuatro opciones de A y B, verifica que .
Ordenadores cuánticos
Bits qubits
Al igual que los bits son las unidades fundamentales de la información clásica, los bits cuánticos, o "qubits", son las unidades fundamentales de la información cuántica. Al igual que el bit clásico, el estado de un qubit puede ser 0 o 1, que normalmente denotamos como y . Pero a diferencia del bit clásico, un bit cuántico también puede estar en una superposición de los estados y al mismo tiempo. En general, un qubit puede estar en cualquier estado de la forma:
donde y son amplitudes complejas con .
La fase cuántica
Dado que y son complejos, cada uno de ellos puede escribirse como , donde se denomina fase. Si multiplicamos todo el estado por el mismo factor de fase global, nada cambia físicamente: es lo que se denomina fase global, y no tiene consecuencias observables.
Por esta razón, es convencional "factorizar" , dando:
donde es la fase relativa del estado cuántico, que sí tiene consecuencias observables.
Esta fase desempeña un papel muy importante en la computación cuántica, y explorarás sus diversas consecuencias en los siguientes módulos de Qiskit en el Aula.
Múltiples qubits
Mientras que el estado de múltiples bits podría expresarse simplemente como una cadena de 0s y 1s, el estado de múltiples qubits se complica un poco más debido a los principios de superposición y entrelazamiento.
Recordemos que los bits de pueden estar en uno de los posibles estados que van desde los números binarios 000...000 a 111...111. Pero ahora, gracias al principio de superposición, los qubits de pueden estar en superposición de todos estos estados a la vez
Esto puede expresarse como
donde, como en el caso clásico, el estado corresponde al estado en el que cada qubit se encuentra en la combinación correcta de 0s y 1s para producir el número binario . Son los llamados "estados base computacionales" del sistema cuántico. Por ejemplo, un estado de tres qubits puede escribirse como una superposición de sus ocho estados base computacionales:
Cada qubit del sistema se denota con un índice que va de a . La convención es leer los estados de los qubits de derecha a izquierda, de modo que el estado del qubit es el más a la derecha y el estado del qubit es el más a la izquierda. Esto se conoce como notación "little-endian", y puede parecer contraintuitivo al principio, ya que estamos acostumbrados a leer de izquierda a derecha.
Comprueba tu comprensión
A primera vista, puede parecer contradictorio ordenar los qubits de derecha a izquierda, como en la notación little-endian, pero en realidad es algo muy lógico Explique por qué. (Recuerde nuestra discusión anterior sobre la conversión de números binarios a base-10 )
Si ordenamos los qubits de derecha a izquierda, de forma que el qubit 0 sea el más a la derecha y el qubit N-1 el más a la izquierda, es lógico asociar el qubit con el bit menos significativo, que se multiplica por y el qubit con el bit más significativo, que se multiplica por .
Entrelazamiento
Como ya hemos dicho, otra característica clave de los qubits es que pueden entrelazarse entre sí. Tomemos un ejemplo de un estado de dos qubits, donde y :
Así, el estado del qubit 0 puede ser o con igual probabilidad, y lo mismo con el estado del qubit 1. Pero estas probabilidades ya no son independientes entre sí. Si encontramos que el estado del qubit 0 es , entonces sabemos que el qubit 1 también estará en . Esto es cierto sin importar la distancia entre uno y otro, por lo que el acto de medir un estado enredado se denomina a veces "espeluznante acción a distancia"
El enredo también puede adoptar otras formas. Por ejemplo, el Estado
produce resultados opuestos cada vez: si se mide un qubit , se garantiza que el otro se encuentra en el estado .
Comprueba tu comprensión
¿Está el estado enredado? ¿Por qué sí o por qué no?
No está enredado. Aunque los resultados son siempre los mismos cuando se miden ambos qubits, esto se debe únicamente a que cada qubit está siempre fijo en el estado . En realidad, el resultado de la medición de un qubit no depende del otro, sino que ambos están siempre en .
En general, si se puede describir el estado de cada qubit por separado y luego multiplicarlos juntos así:
Entonces se conoce como "estado producto" y no está enredado.
Notación vectorial
A menudo resulta útil utilizar vectores y matrices para ver cómo se transforma el estado cuántico bajo diferentes operaciones. En esta representación, nuestros estados cuánticos serán vectores, y nuestras puertas cuánticas (de las que hablaremos en la siguiente sección) serán matrices que transforman los vectores.
Para un único qubit, se elige la forma vectorial de los estados: De este modo, un estado arbitrario puede escribirse como
Para un estado general, -qubit, necesitaremos un vector -dimensional, con estados base ordenados como es de esperar, en valor binario ascendente:
Con esta elección de notación vectorial en mente, podemos introducir nuestras puertas cuánticas necesarias, sus efectos sobre los estados cuánticos y sus formas matriciales.
Comprueba tu comprensión
Existen cuatro estados base computacionales para un sistema de dos qubits. Escribe cada una de ellas en notaciones ket y vectoriales.
Puertas cuánticas « »
Al igual que las puertas clásicas como NOT, AND, OR y XOR pueden combinarse para construir circuitos clásicos arbitrarios, las puertas cuánticas desempeñan el mismo papel en la computación cuántica. Como los qubits tienen características mecánicas cuánticas adicionales, las puertas cuánticas son correspondientemente más ricas. Aunque todavía podemos describir su acción sobre la base de los estados y con una tabla de verdad, esto no captura toda la imagen. Para las puertas cuánticas, suele ser más natural utilizar una representación matricial, ya que también actúan sobre superposiciones de estados base.
A continuación presentaremos las puertas cuánticas más comunes y cómo transforman los qubits con los que interactúan. Cuando proceda, las relacionaremos con las puertas clásicas conocidas.
Puertas de un solo qubit
puerta : Es el equivalente cuántico de una operación NOT. Su tabla de verdad es idéntica a la de la puerta NOT clásica:
Entrada | Resultado |
|---|---|
Y la representación matricial:
En Qiskit, crear un circuito con una puerta tiene este aspecto:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")Output:
En este diagrama de circuito tan sencillo, el qubit está representado por un cable, la línea horizontal negra, y la puerta aparece como un recuadro en ese cable.
Puerta de Hadamard: Crea un estado de superposición. Tabla de verdad:
Entrada | Resultado |
|---|---|
Representación matricial:
Un circuito con una puerta Hadamard se realiza de la siguiente manera:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")Output:
puerta : Añade un desfase de al estado :
Entrada | Resultado |
|---|---|
En Qiskit, crear un circuito con una puerta tiene este aspecto:
qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")Output:
puerta : Añade un desfase de al estado :
Entrada | Resultado |
|---|---|
En Qiskit, crear un circuito con una puerta tiene este aspecto:
qc = QuantumCircuit(1)
qc.t(0)
qc.draw("mpl")Output:
Puertas multi-qubit
Las puertas de dos qubits pueden parecerse a las puertas clásicas de dos bits, pero con una salvedad importante: todas las puertas cuánticas deben ser reversibles. En términos de álgebra lineal, esto significa que se representan mediante matrices unitarias. Así, dos qubits de entrada siempre se corresponden con dos qubits de salida, y la operación puede, en principio, deshacerse. Esto contrasta con las puertas clásicas que hemos visto antes, como AND u OR, que pierden información y son irreversibles: dada una salida, no se puede determinar de forma única la entrada.
Puerta CNOT (Controlled-NOT): Los dos qubits de entrada se denominan qubits "control" y "objetivo". El qubit de control permanece inalterado, pero su estado dicta lo que ocurre con el qubit objetivo. Si el qubit de control está en el estado , entonces se aplica una puerta a ese objetivo; si el estado del qubit de control es , entonces no se realiza ningún cambio. En la notación siguiente, supongamos que el qubit (el qubit situado más a la derecha) es el control, y el qubit (el qubit situado más a la izquierda) es el objetivo. A continuación, la notación utilizada es
Entrada | Resultado |
|---|---|
Así, la matriz que representa esta acción es:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")Output:
Este es el primer diagrama de circuito que vemos con dos qubits, que están representados por los dos cables. La puerta CNOT se implementa entre los dos qubits, con como control y como objetivo.
Comprueba tu comprensión
La mayoría de las puertas tienen la misma forma de matriz en Qiskit que en cualquier otro sitio. Pero la puerta CNOT actúa sobre dos qubits, por lo que de repente las convenciones de ordenación de los qubits se convierten en un problema. Los textos que ordenan qubits mostrarán una forma de matriz diferente para sus puertas CNOT. Verificar por multiplicación explícita de matrices que la matriz CNOT anterior tiene la acción correcta sobre el estado
Puerta SWAP: Esta puerta intercambia los estados de dos qubits. Tabla de verdad:
Entrada | Resultado |
|---|---|
Así, la matriz que representa esta acción es:
qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.draw("mpl")Output:
En realidad, la puerta SWAP puede construirse a partir de tres CNOT. Para ver cómo, podemos decompose() la puerta con Qiskit:
qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.decompose().draw("mpl")Output:
Aquí vemos por primera vez cómo se muestran múltiples puertas en un diagrama de circuito. Lo leemos de izquierda a derecha, por lo que la puerta situada más a la izquierda se aplica primero.
Comprueba tu comprensión
Compruebe que la combinación de CNOTs anterior da como resultado una puerta SWAP. Puedes hacerlo con la multiplicación de matrices o con cualquier otro método.
Con multiplicación de matrices:
Utilizar una tabla de verdad para ver cómo cambian los estados con cada CNOT. En la última columna, los estados deben ser equivalentes a la columna "salida" de la tabla verdadero-falso SWAP:
EntradaCNOT(A,B)CNOT(B,A)CNOT(A,B)
Puerta de Toffoli (o "controlada-controlada-NOT" (CCNOT)): Se trata de una puerta de tres qubits. Puede que el nombre "controlado-controlado-NOT" ya le indique cómo funciona: hay dos qubits de control y un qubit objetivo, y el estado del qubit objetivo se invierte sólo si ambos qubits de control están en el estado . Mantenemos la convención de ordenación que utilizamos con el CNOT:
Así que la tabla de verdad es:
Entrada | Resultado |
|---|---|
Y la matriz que representa esta acción es:
qc = QuantumCircuit(3)
qc.ccx(0, 1, 2)
qc.draw("mpl")Output:
La puerta de Toffoli también puede descomponerse en CNOT, junto con otras puertas. Sin embargo, es significativamente más complicada que la descomposición de la puerta SWAP, por lo que se dejará como ejercicio opcional al final del módulo explorar y verificar esta descomposición.
Mediciones
Las mediciones desempeñan un papel especial en la computación cuántica, que no tiene análogo en la computación clásica. Mientras que en la computación clásica se pueden comprobar los bits en cualquier momento del algoritmo, en la computación cuántica hay que ser muy selectivo a la hora de mirar los qubits, ya que la medición colapsa su estado y destruye la superposición que confiere a los qubits su complejidad computacional.
En particular, dado un estado cuántico de -bit , una medición colapsará el estado a una de las funciones base con una probabilidad igual a .
Pero este efecto destructivo de una medida no siempre es un obstáculo. De hecho, es un recurso clave en determinados algoritmos y protocolos, como la teletransportación cuántica y la distribución cuántica de claves.
En Qiskit, cuando se realiza una medición, se envía a un registro clásico donde se almacena como un bit clásico. La creación de un circuito con una medida tiene este aspecto:
qc = QuantumCircuit(
1, 1
) # the second number is the number of classical bits in the circuit
qc.measure(0, 0)
qc.draw("mpl")Output:
Circuitos
Ahora que ya sabemos cómo funcionan los qubits, las puertas y las mediciones, ¡vamos a crear y ejecutar nuestro propio circuito cuántico! Para ello, tendremos que presentarte un útil flujo de trabajo llamado patrones Qiskit.
Marco de patrones Qiskit
El marco de patrones Qiskit es un procedimiento general para abordar y resolver problemas con un ordenador cuántico. Consta de cuatro pasos:
- Mapeando nuestro problema a circuitos y operadores cuánticos
- Optimización del circuito para el hardware de destino
- Ejecución en el hardware de destino
- Tratamiento posterior de los resultados
Para ilustrar estos pasos, implementaremos una versión cuántica del circuito de media escalera comentado anteriormente.
1. Cartografía
El circuito sumador clásico utiliza una puerta XOR y una puerta AND para calcular los bits de suma y acarreo, respectivamente. Podemos adaptar estas puertas al contexto cuántico para hacer el sumador medio cuántico. En primer lugar, recordando que las puertas cuánticas son reversibles, no podemos simplemente sobrescribir las entradas. En su lugar, introducimos dos qubits auxiliares inicializados en para almacenar las salidas de suma y acarreo. Así, nuestro estado cuántico completo estará formado por los qubits y , y los qubits suma y acarreo, que etiquetaremos y :
Ahora necesitamos puertas cuánticas que hagan lo mismo que las puertas XOR y AND en el circuito clásico.
SUMA:
Para el XOR, aplicamos dos CNOTs, cada uno con qubits de control y y qubit objetivo para ambos. Si y son diferentes, una de las puertas CNOT cambiará al estado . Si y son ambos , entonces no le pasa nada a y permanece en el estado . Si y son ambos , entonces el estado de cambiará dos veces, devolviéndolo al estado .
Llevar:
Para el bit de acarreo, necesitamos algo que funcione como la clásica puerta AND.
Comprueba tu comprensión
Repasa las puertas de las que hemos hablado para ver si adivinas qué puerta cuántica utilizaremos en lugar de la puerta AND clásica:
¡Es la puerta Toffoli! Recuerde, la puerta Toffoli, o controlada-controlada-no, cambia el estado objetivo si y sólo si el qubit de control 0 Y el qubit de control 1 son ambos . Por lo tanto, si el qubit objetivo comienza en el estado , entonces tiene la misma acción que la puerta AND.
Así que ya tenemos todos los ingredientes que necesitamos para hacer el circuito cuántico:
# qubits: a, b, sum, carry
qc = QuantumCircuit(4)
# Choose values for A and B:
a = 0
b = 0
# Prepare A and B qubits according to selected values:
if a:
qc.x(0)
if b:
qc.x(1)
# XOR (sum) into qubit 2
qc.cx(0, 2)
qc.cx(1, 2)
# AND (carry) into qubit 3
qc.ccx(0, 1, 3) # a AND b
# measure
qc.measure_all()
qc.draw("mpl")Output:
Arriba está el diagrama del circuito de media escalera cuántica. Como se ha mencionado anteriormente, los hilos representan qubits a ordenados de arriba a abajo, y el registro de bits clásico es el hilo inferior de doble línea. Luego, leyendo de izquierda a derecha, vemos cómo se aplican las puertas a cada qubit viendo dónde aparecen las casillas en los cables correspondientes. Por último, al final se muestran las mediciones. Las mediciones colapsan los estados de los qubits en valores definidos o , y los resultados se envían a un registro clásico.
Una sutileza: aunque el esquema del circuito está dibujado de izquierda a derecha, al escribir la expresión matricial correspondiente debemos leerlo de derecha a izquierda. Esto se debe a que en la multiplicación de matrices, el operador más cercano al vector de estado actúa primero. Así, por ejemplo, el circuito anterior (ignorando las medidas) se escribiría como:
2. Optimización:
A continuación, tenemos que optimizar el circuito para que funcione en el hardware cuántico. Esta optimización se consigue mediante el transpilador, que traduce el circuito abstracto mostrado anteriormente en instrucciones que el ordenador cuántico entenderá. Asigna los qubits lógicos anteriores a qubits físicos reales en el procesador y reescribe las puertas en términos de su propio conjunto nativo de puertas que han sido optimizadas para funcionar en el ordenador cuántico. Por último, el transpilador también implementa algo llamado "supresión y mitigación de errores" para intentar minimizar el efecto de los errores en el resultado. Esto no es tan importante para nuestro circuito tan simple, pero si continúas en tu viaje por la computación cuántica para ejecutar circuitos más complicados, pronto verás el valor de la supresión y mitigación de errores. Si quieres saber más sobre esto, consulta el curso de Olivia Lane, Quantum Computing in Practice.
En primer lugar, cargamos los paquetes necesarios para comunicarnos con los ordenadores cuánticos de IBM® y seleccionamos un backend en el que ejecutarlo. Podemos elegir el backend menos ocupado o seleccionar un backend específico cuyas propiedades conozcamos.
A continuación encontrará un código para guardar sus credenciales la primera vez que las utilice. Asegúrate de borrar esta información del cuaderno después de guardarlo en tu entorno, para que tus credenciales no se compartan accidentalmente cuando compartas el cuaderno. Consulte Configurar su cuenta IBM Cloud e Inicializar el servicio en un entorno no fiable para obtener más orientación.
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load the Qiskit Runtime service
# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform',
# instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')
# Load saved credentials
service = QiskitRuntimeService()
# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)Output:
ibm_fez
Ahora, utilizamos el transpilador para optimizar el circuito. Podemos elegir el nivel de optimización de 0 (sin optimización) a 3 (máxima optimización). Para ver lo que implica cada nivel, visite la guía de niveles de optimización del transpilador Set. El circuito resultante tendrá un aspecto significativamente diferente del circuito lógico que hicimos en nuestro paso de mapeo.
# Transpile the circuit and optimize for running on the quantum computer selected
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
qc_isa.draw("mpl")Output:
Un "muestreador" es una primitiva diseñada para muestrear los posibles estados resultantes de un circuito cuántico y recopilar estadísticas sobre qué estados podrían medirse y con qué probabilidad. Aquí importamos el muestrario Qiskit Runtime :
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)Si ha agotado el tiempo asignado a los ordenadores cuánticos reales o si no dispone de conexión a Internet, puede que prefiera utilizar un simulador. Para ello, ejecute la celda siguiente y descomente la línea asociada en el paso "Ejecutar".
# Load the backend sampler
from qiskit.primitives import BackendSamplerV2
# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
noise_model = NoiseModel.from_backend(backend)
# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)3. Ejecución
Después de preparar el circuito, ¡ya podemos ejecutarlo en el ordenador cuántico!
job = sampler.run([qc_isa], shots=100)
# job = sampler_sim.run([qc_isa]) # uncomment if you want to run on a simulator
res = job.result()
counts = res[0].data.meas.get_counts()4. Postprocesamiento
Ahora ya podemos ver los resultados Visualizaremos un histograma de las 100 muestras del circuito.
from qiskit.visualization import plot_histogram
print("counts = ", counts)
plot_histogram(counts)Output:
counts = {'0000': 90, '0100': 4, '1100': 3, '0010': 3}
El histograma anterior muestra los resultados de las mediciones de los cuatro qubits al final del circuito. Un ordenador cuántico ideal con ruido cero habría medido los qubits para que tuvieran los mismos valores cada vez, pero en realidad, el ruido hará que algunas de las ejecuciones produzcan errores.
Comprueba tu comprensión
Utilizando la cadena de bits con el mayor número de conteos como sus valores para , , , y , verifique que el circuito sumador cuántico funcionó.
Tenemos que comprobar que . Recuerda que el orden de la cadena de bits sigue la notación little-endian, por lo que se lee
CSBA.En el histograma anterior, vemos que la cadena de bits
0000es la dominante.
Vuelve atrás y cambia los valores de y por y y repite los pasos de los patrones Qiskit para volver a ejecutar el circuito. Comprueba que el circuito sumador vuelve a funcionar.
Debería obtener un histograma en el que la cadena de bits dominante fuera
1011:
Una de las características añadidas de la semiescala cuántica sobre la semiescala clásica es que puede funcionar con entradas cuánticas. Es decir, puede "sumar" los qubits y aunque estén en estados de superposición. En la sección de Preguntas de Desafío, se te pedirá que prepares los qubits en superposiciones y veas lo que ocurre
Conclusión
Este módulo ha sido diseñado para proporcionarle una sólida comprensión de los principios básicos de la computación cuántica comparándola con la computación clásica. Hemos visto el circuito clásico de media escalera y luego te hemos mostrado cómo adaptar el circuito para que funcione con qubits en un ordenador cuántico. Ya estás listo para explorar los demás módulos de Qiskit en el aula
Conceptos fundamentales:
- A diferencia de los bits clásicos, que sólo pueden tomar los valores 0 y 1, los qubits también pueden estar en estados de superposición tanto de 0 como de 1.
- Múltiples qubits pueden estar en superposición sobre las cadenas de bits clásicamente permitidas, denominadas estados de base computacional.
- Se pueden entrelazar varios qubits de modo que el estado de uno dependa del estado del otro.
- La convención Qiskit es utilizar la notación little-endian, que coloca el qubit menos significativo, , en la posición más a la derecha y el qubit más significativo, , más a la izquierda.
- Las puertas cuánticas son operaciones reversibles que se representan mediante matrices unitarias que actúan sobre los vectores de estado cuántico. En esta notación, la matriz más cercana al vector (que está más a la derecha) actúa primero.
- Las mediciones colapsan un estado de superposición cuántica en uno de sus estados permitidos clásicamente, con probabilidad igual al cuadrado de la amplitud del estado base computacional correspondiente en la superposición.
- Los circuitos cuánticos suelen representarse mediante diagramas de circuitos cuánticos, en los que los qubits se representan como hilos horizontales y las puertas cuánticas aparecen a lo largo de estos hilos de izquierda a derecha.
- Para ejecutar un circuito cuántico, utilizamos los cuatro pasos del flujo de trabajo de los patrones Qiskit : Mapear, Optimizar, Ejecutar, Post-procesar.
Preguntas
Preguntas de verdadero/falso
-
En un ordenador clásico, un bit sólo puede contener el valor 0 ó 1.
-
El entrelazamiento significa que el estado de un qubit es independiente del estado de otro.
-
Las puertas cuánticas suelen ser operaciones irreversibles.
-
La convención Qiskit coloca el qubit menos significativo, , en la posición más a la izquierda.
-
La medición de un estado cuántico siempre da exactamente el mismo resultado si se repite muchas veces.
-
La puerta de Hadamard crea superposición en un único qubit.
-
Los circuitos cuánticos pueden incluir operaciones de medición que colapsen el estado de superposición en uno de los estados permitidos clásicamente.
-
El número de estados clásicos posibles para bits es .
-
Las probabilidades de resultado de las mediciones cuánticas vienen dadas por las amplitudes al cuadrado de los estados base clásicamente medibles.
Preguntas de respuesta corta
-
¿Cuáles son las principales diferencias entre un bit y un qubit?
-
¿Qué le ocurre a un estado cuántico cuando se mide?
-
¿Por qué utilizamos la notación little-endian en Qiskit?
-
¿Cuáles son los cuatro pasos del flujo de trabajo de los patrones Qiskit?
Preguntas de desafío:
-
En el módulo, sólo utilizamos el sumador para añadir estados permitidos clásicamente para y . ¡Pero también podemos preparar y en superposiciones! Cambia el código para preparar cada qubit en una superposición igual de 0 y 1, luego ejecuta el nuevo circuito y obtén un nuevo histograma. ¿Qué ves? Explica lo que está ocurriendo.
-
Descomposición de la puerta de Toffoli. Utilice
decompose()para mostrar cómo se descompone la puerta de Toffoli en puertas de uno y dos qubits, y luego verifique esta construcción con la multiplicación de matrices. Tenga en cuenta que, aunque los diagramas de circuitos se leen de izquierda a derecha, las matrices se aplican a los estados cuánticos de derecha a izquierda