Introducción a la programación cuántica


https://bit.ly/2SpbZKR
me

Salvador de la Puente González

https://salvadelapuente.com

https://github.com/delapuente

https://delapuente.github.io/presentations/

## Índice * El futuro * El presente * Circuitos cuánticos * Programación cuántica * Números grandes
> La computación cuántica el uso de las propiedades de la mecánica cuántica para la aceleración en la resolución de problemas computables.
## El futuro
![Problem classes](./imgs/problem-classes.jpg) Parece que la computación cuántica es más poderosa que la computación clásica pero **no lo hemos probado**.
![Install a domain-specific library](imgs/install-acqua.png) En el futuro utilizaremos librerías específicas de dominio como CUDA u OpenCV.
```python from qiskit_acqua import Operator, run_algorithm from qiskit_acqua.input import get_input_instance pauli_dict = { 'paulis': [ {"coeff": {"imag": 0.0, "real": -1.052373245772859}, "label": "II"}, {"coeff": {"imag": 0.0, "real": 0.39793742484318045}, "label": "ZI"}, {"coeff": {"imag": 0.0, "real": -0.39793742484318045}, "label": "ZZ"}, {"coeff": {"imag": 0.0, "real": 0.18093119978423156}, "label": "XX"} ] } algo_input = get_input_instance('EnergyInput') algo_input.qubit_op = Operator.load_from_dict(pauli_dict) params = { 'algorithm': {'name': 'VQE'}, 'optimizer': {'name': 'SPSA'}, 'variational_form': {'name': 'RY', 'depth': 5}, 'backend': {'name': 'local_qasm_simulator'} } result = run_algorithm(params, algo_input) print(result['energy']) ``` Y utilizaremos los algoritmos que vienen con ella.
![Nine dots puzzle solved with 1 line](imgs/nine-dots-1.gif) El aspecto creativo consistirá en reformular problemas clásicos...
![Nine dots puzzle solved with 1 line](imgs/nine-dots-2.gif) ...en términos de **algoritmos cuánticos**.
![Toxic science](imgs/toxic-science.jpg) ¡Añade tu augurio distópico favorito aquí!
Referencias: * [A Short Guide to Hard Problems](https://www.quantamagazine.org/a-short-guide-to-hard-problems-20180716/) * [Finally, a Problem That Only Quantum Computers Will Ever Be Able to Solve](https://www.quantamagazine.org/finally-a-problem-that-only-quantum-computers-will-ever-be-able-to-solve-20180621/) * [9 Dots Puzzle SOLVED (using just 1 line!)](https://youtu.be/LaMqV-E0vWM?t=50) * [Qiskit Acqua](https://www.qiskit.org/acqua) * [How to measure a molecule’s energy using a quantum computer ](https://www.ibm.com/blogs/research/2017/09/quantum-molecule/)
## El presente
> The name Quantum Advantage means that in certain key and real application areas we’ll be able to say, (...) that quantum computing provides significant processing time or memory use advantages.
¿2020? ¿2025? ¿Y mientras?
* [IBM Qiskit](https://github.com/Qiskit/) es una API en Python para contruir algoritmos cuánticos y ejecutarlos en **dispositivos reales** o simuladores. * [Microsoft Q#](https://docs.microsoft.com/en-us/quantum/quantum-qr-intro?view=qsharp-preview) es un lenguaje de **alto nivel** para expresar algoritmos cuánticos. * [Quirk](https://algassert.com/quirk) es un simulador online. **Basta con un navegador** con WebGl.
Datos (desalentadores) de los procesadores cuánticos actuales: * 100 micro-segundos de [coherencia](https://en.wikipedia.org/wiki/Quantum_decoherence) (tiempo de ejecución). * Puesta a punto de milisegundos; productividad del 10%. * Temperatura de operación de [3 mK](https://en.wikipedia.org/wiki/Absolute_zero). * Del orden de ¡miles! de cúbits extra por cada cúbit lógico libre de error.
Referencias * [Quantum Ready now, Quantum Advantage tomorrow](https://medium.com/@rssutor/quantum-ready-now-quantum-advantage-tomorrow-14739a28c6f5) * [Qiskit and its Fundamental Elements](https://medium.com/qiskit/qiskit-and-its-fundamental-elements-bcd7ead80492) * [My Quantum Circuit Simulator: Quirk](http://algassert.com/2016/05/22/quirk.html) * [Quantum Error Correction for Beginners](https://arxiv.org/pdf/0905.2794.pdf)
## Circuitos cuánticos
![Procesador cuántico al completo](imgs/procesador-cuantico.png) El procesador cuántico al completo.
![Arquitectura Von Neumann](imgs/von-neumann.png) Un procesador cuántico **no sigue una arquitectura de Von Neumann**.
![Chip de 7 cúbits](imgs/7-qubit-chip.png) Un procesador cuántico está formado por cúbits que **son memoria y ALU**, a la vez.
![El generador de microondas](imgs/microwave-rack.jpg) Unos generadores de microondas manipulan los cúbits.
![Compositor de IBM Q Experience](imgs/composer.png) Construir circuitos cuánticos se parece a componer partituras.
[Quirk](https://algassert.com/quirk) es un compositor y simulador para navegador muy **cómodo de usar** y potente.
![Pesos de los cúbits en el simulador](imgs/bit-weights.png) ¡Ojo! En el simulador, los cúbits superiores son los **menos significativos**. Es decir, **los de más a la derecha** en las representaciones binarias.
### Cúbits y superposición
![Únicos dos estados de un bit](imgs/bit-alternate.gif) Un bit clásico puede prepararse en uno de dos estados `0` o `1`. Al leerse, se obtendrá, **con toda seguridad**, el valor en el que se ha preparado.
![Probabilidad 50/50 de obtener 0 ó 1](imgs/qubit-alternate.gif) Un cúbit puede prepararse de muchas maneras, de forma que podemos **controlar la probabilidad** de que al leerse obtengamos `0` o `1`.
![Probabilidad 66/33 de obtener 0 ó 1](imgs/qubit-alternate-2-1.gif) Por ejemplo para que haya el **doble de probabilidad de leer `0`, que de leer `1`**.
A este efecto se le llama **superposición de estados**.
Cúbit a 0 Hadamard gate Cúbit en superposición

Para poner un cúbit en superposición, al 50%, utilizamos la puerta de Hadamard.

### Ejercicios 1. Prepara un cúbit para que sea 1 al ~66% (combina puertas X) 2. Prepara un cúbit para que sea 1 al 50% sin usar la puerta H 3. ¿Qué pasa si pones dos puerta H seguidas? 4. Combina algunas puertas X y luego vuelve a aplicarlas en orden inverso. ¿Qué pasa? 5. Prepara un cúbit para que sea 1 al 100%
### Estados y entrelazamiento
![Histograma en el que toda la probabilidad está en 00](imgs/histogram-00.png) Si tenemos dos cúbits a `0`, el histograma de probabilidad tiene esta pinta.
![Una puerta Hadamard en el cúbit de menor peso, el de más arriba](imgs/circuit-1-hadamard.png) Tras añadir una puerta `Hadamard` al cúbit de menor peso...
### Ejercicios 1. Trata de predecir qué le pasa al histograma. 2. Situa una medida _chance_ sobre un cúbit y extiéndela para cubrir 2 cúbits y ver el histograma para 4 estados. 3. Reproduce el circuito y comprueba el resultado con el simulador.
![Estado al 50% de probabilidad entre 00 y 01](imgs/histogram-50.gif) ...se produce un **reparto de la probabilidad**.
![Otra puerta Hadamard en el cúbit de mayor peso, el de más abajo](imgs/circuit-2-hadamard.png) Si añadimos otra puerta `Hadamard` al otro cúbit...
### Ejercicios 1. Trata de predecir de nuevo qué le pasa al histograma. 2. Comprueba el resultado con el simulador.
![Ambos cúbits en superposición suponen un 25% de probabilidad para cada resultado](imgs/histogram-25.gif) ...se produce otro reparto de probabilidad.
![Secuencia de cambios de estado posibles](imgs/all-states-sequence.gif) La combinación de puertas anterior produce esta secuencia de cambios de estado.
![Una puerta Hadamard en el cúbit de menor peso, el de más arriba](imgs/circuit-1-hadamard.png) Pero volvamos un momento al ejemplo anterior, con una sola puerta.
![Intercambio de las columnas 01 y 11](imgs/histogram-swap.gif) Las puertas cuánticas pueden intercambiar las columnas del histograma.
![Una puerta CNOT en el cúbit de menor peso, controla el de mayor peso](imgs/circuit-bell.png) En particular, la puerta `CNOT` correlaciona dos cúbits de forma que **si la entrada de control es `1`, la entrada objetivo se invierte**.
### Ejercicios 1. Razona qué le pasa al histograma. 2. Compruébalo en el simulador.
![Secuencia de cambios estado tras la correlación](imgs/bell-sequence.gif) Esto anula algunos cambios de estado.
A este fenómeno lo llamamos **entrelazamiento**.
### Ejercicios Comienza con un circuito en blanco. 1. Usando 3 cúbits, (2 de entrada y uno de salida), implementa la puerta XOR a base de puertas CNOT. Compruébalo con la ayuda de puertas X para pasar por los 4 estados de la entrada. 2. Ahora aplica puertas H a los cúbit de entrada para comprobar todas las entradas a la vez.
### Ejercicios Comienza con un circuito en blanco. 3. "Dibuja" una puerta [TOFFOLI](https://i.ytimg.com/vi/bX64dYEH_YI/maxresdefault.jpg). ¿Qué función hace esta puerta? 4. Prueba a dibujar una puerta CNOT con un "punto blanco". ¿Qué ocurre? 5. ¿Podrías crear un circuito que reconociera el número 6 (3 cúbits de entrada y otro de salida que valga 1 sólo si los de entrada tienen el patrón 110)?
### Amplitudes, fase e interferencia
Algunas operaciones no alteran el histograma de manera perceptible.
![Circuito en superposición con cambio de fase](imgs/circuit-hadamard-z.png) La puerta `Z`, en particular, **invierte la fase cuando el cúbit vale uno**.
![La secuencia completa con cambio de fase](imgs/phase-inversion-sequence.gif) Podría decirse que cambia la "dirección" del estado. Pero ello no basta para alterar la probabilidad.
A este efecto lo llamamos **cambio de fase**.
El cambio de fase no se puede observar en el histograma de probabilidad...
![El cambio de fase invierte el signo de la amplitud en los estados 10 y 11](imgs/histogram-phase.gif) ...pero sí en el **histograma de amplitudes**.
La **probabilidad es el cuadrado de la amplitud**: * Si la amplitud es `1/sqr(2)`, la probabilidad es `50%`. * Si la amplitud es `-1/sqr(2)`, la probabilidad es `50%`.
![Fenómenos de interferencia](imgs/interference.gif) Gracias al cambio de signo, podemos **combinar (sumar/restar) columnas del histograma** de forma que algunas posibilidades se anulen y otras se refuercen.
A este efecto lo llamamos **interferencia**.
### Las mates
![El vector de estados](imgs/state-vector.png) El histograma de amplitudes se representa como un **vector** columna.
![La matrix de CNOT](imgs/cnot-gate-matrix.png) Las puertas son **matrices unitarias** con tantas filas como posibilidades.
![Aplicar la puerta CNOT es multiplicar su matriz por el vector de estados](imgs/mult.gif) Aplicar una puerta es **multiplicar** la matriz con el vector.
![El resultado es otro vector de estados](imgs/result-state-vector.png) Aplicar una puerta es **multiplicar** la matriz con el vector.

Los elementos de la matriz son
números complejos

### Ejercicios Partiendo de un circuito en blanco. 1. Pon una puerta H en el cúbit q0. 2. Haz click en el botón "Make gate" y proporciona la matriz que implementa la puerta CNOT (sección central). ¡Desactiva la opción "ensure unitary"! 3. Proporciona la matriz de la puerta CNOT "con punto blanco". 4. Introduce una matriz con más de un 1 por fila y comprueba como **NO** es unitaria.
Referencias: * [Essence of Linear Algebra](https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab) * [Quantum Computing Expert Explains One Concept in 5 Levels of Difficulty | WIRED](https://www.youtube.com/watch?v=OWJCfOvochA) * [Quantum Computing for Computer Scientist](https://www.youtube.com/watch?v=F_Riqjdh2oM) * [How to fold a Julia Fractal](http://acko.net/blog/how-to-fold-a-julia-fractal/)
Recapitulando I: * La unidad operativa del procesador cuántico es el cúbit. * Un cúbit se puede preparar de forma que se lea con resultado `0` o `1`, a una determinada probabilidad. * Algunas puertas cambian estas probabilidades: **superposición**. * Otras correlaccionan unos cúbits con otros: **entrelazamiento**.
Recapitulando II: * La amplitud describe un estado cuántico. * La **probabilidad es el cuadrado de la amplitud**. * Algunas puertas pueden cambiar el signo de la amplitud de un suceso. * Y otras pueden combinar la amplitud de distintos sucesos: **interferencia.**
## Programación cuántica
### ¡Recordatorio! ![Pesos de los cúbits en el simulador](imgs/bit-weights.png) ¡Ojo! En el simulador, los cúbits superiores son los **menos significativos**. Es decir, **los de más a la derecha** en las representaciones binarias.
### El sumador con acarreo
``` A S I1 I0 --------- 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 ``` La tabla de verdad del sumador con acarreo, con las salidas primero.
Nuestro objetivo es, partiendo de este histograma: ![Histograma para los cúbits de entrada en superposición](imgs/histogram-source.png)
Llegar a este: ![Histograma para las combinaciones del sumador con acarreo](imgs/histogram-target.png)
**Ejercicio**: implementa el sumador con acarreo.
### El algoritmo de Grover
![Identificar el elemento a buscar](imgs/tagging.png) Primero identificamos el elemento que queremos buscar.
![Cambiar la fase del elemento, bajando la media](imgs/tagging-2.png) Cambiamos su fase.
![Invertir sobre la media](imgs/inversion-over-average.png) Realizamos la inversión sobre la media.
``` D3 D2 D1 D0 N2 N1 N0 --------------------- 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 ``` La tabla de verdad del multiplicador por dos, con las salidas al principio.
### Ejercicios: 1. Implementa el multiplicador por dos (mediante desplazamiento). 2. Da con la matriz de la inversión sobre la media. ¿Es unitario?
``` nuevo_valor = media - (valor - media) nuevo_valor = -valor + 2 * media v' = -I * v + 2 * media media = P * v P <=> matriz constante 1/N = 1/8 v' = -I * v + 2 * P * v v' = (-I + 2 * P) * v |--PUERTA--| ```
``` -1+2/8,2/8,2/8,2/8,2/8,2/8,2/8,2/8, 2/8,-1+2/8,2/8,2/8,2/8,2/8,2/8,2/8, 2/8,2/8,-1+2/8,2/8,2/8,2/8,2/8,2/8, 2/8,2/8,2/8,-1+2/8,2/8,2/8,2/8,2/8, 2/8,2/8,2/8,2/8,-1+2/8,2/8,2/8,2/8, 2/8,2/8,2/8,2/8,2/8,-1+2/8,2/8,2/8, 2/8,2/8,2/8,2/8,2/8,2/8,-1+2/8,2/8, 2/8,2/8,2/8,2/8,2/8,2/8,2/8,-1+2/8, ``` La matriz de difusión puede descomponerse en puertas cuánticas básicas.
## Números grandes
```python def grover(input_width, hash, reference): for input in binary_combinations(input_width): spawn(i => { if hash(i) == reference: print('The answer is ' + i) }, input) ``` Este programa resuelve el problema de la búsqueda desestructurada en, prácticamente, un paso.
``` 1 000 000 000 000 000 000 000 000 | | | | | | MIPS para un i7 | | | | Un año de uso contínuo | | Un millón de años de uso contínuo ``` Para 10 caracteres, es necesario recorrer una lista de `2^80` elementos. Un `1` y `24` ceros detrás.
![Cray Titan](imgs/titan.jpg) x 10.000 M ([yobibyte](https://en.wikipedia.org/wiki/Yobibyte)) La función `binary_combinations` devuelve una lista de `2^80` elementos de 10 bytes.
![Circuito clásico para la búsqueda desestructurada](imgs/destructured-search.png) Este circuito resuelve el problema de la búsqueda desestructurada en un sólo paso.
Para 10 caracteres necesitaríamos replicar el circuito `2^80` veces. Suponiendo 1M de circuitos completos en 1 milímetro cuadrado.
![Península Ibérica x 2](imgs/iberian-peninsula.jpg)
x 2
Al final, el **exponencial sale por alguna parte**. Bien en tiempo, bien en espacio.
La mecánica cuántica (a veces) "pliega" este exponencial y lo confina en un **polinomio razonable...** ...[a veces no](https://en.wikipedia.org/wiki/Lattice-based_cryptography).
> Si piensas que entiendes la mecánica cuántica, es que no la has entendido. [Richard Feynman](https://en.wikipedia.org/wiki/Richard_Feynman)