Cómo la computación cuántica puede afectar el desarrollo de software

Hola a todos!

Durante los últimos seis meses, la editorial ha estado trabajando activamente en el tema de la computación cuántica y su aplicabilidad práctica. Durante mucho tiempo no fue posible encontrar un artículo digno de traducción sobre este interesante tema, hasta que apareció un artículo en el blog de Oracle. La publicación servirá como una excelente introducción al software, hardware y problemas de ciencias puramente naturales de este nuevo paradigma, por lo que la lectura es imprescindible.



En los últimos meses y años, el interés en la computación cuántica ha crecido significativamente. Constantemente aparecen nuevos materiales de institutos de investigación, empresas u organizaciones gubernamentales, que informan sobre logros importantes en esta área. Al mismo tiempo, los artículos con una base técnica más débil discuten las posibles consecuencias de la computación cuántica, y los pronósticos van desde la piratería de las técnicas de cifrado más modernas hasta las promesas de curar todas las enfermedades y completar el trabajo para crear una IA completa. Sin embargo, no todas estas expectativas son igualmente realistas.

Si eres un programador sobrio practicante, entonces te estarás preguntando dónde está la línea entre los hechos y la ficción en estos cálculos, y cómo la computación cuántica afectará el desarrollo de software en el futuro.

Naturalmente, quedan muchos años antes de la creación de hardware de trabajo para la computación cuántica. Sin embargo, los principios generales de este paradigma ya se entienden hoy, existen abstracciones que permiten a los desarrolladores crear aplicaciones en las que las posibilidades de la computación cuántica se realizan mediante simuladores.

¿La computación cuántica se reduce a otra ganancia de CPU?


El desarrollo de software tradicional utilizando computadoras clásicas implica traducir un lenguaje de programación de alto nivel (como Java) en operaciones realizadas en una gran cantidad de transistores (hardware).

En la Figura 1, este proceso se esquematiza en su forma más simple: el código fuente de Java se compila en código de bytes independiente de la plataforma, que, a su vez, se traduce en código de máquina específico de la plataforma. El código de máquina utiliza una serie de operaciones simples (puertas) realizadas en la memoria. El principal componente de hardware utilizado para este propósito es el conocido transistor.



Fig. 1. Traducción de un lenguaje de programación de alto nivel a operaciones realizadas en transistores .

El aumento de la productividad alcanzado en los últimos años se ha logrado principalmente debido a la mejora de las tecnologías de hardware. Los tamaños de un solo transistor han disminuido drásticamente, y cuantos más transistores pueda colocar en cada milímetro cuadrado, más memoria y potencia de procesamiento tendrá la computadora.

La computación cuántica es una tecnología disruptiva, porque aquí las unidades de computación más simples no son transistores clásicos, sino qubits, de los cuales hablaremos a continuación.

El punto no es solo en las diferencias de estos elementos primarios, sino también en un dispositivo diferente de válvulas. Por lo tanto, la pila con la fig. 1 en computación cuántica no es aplicable.

¿La computación cuántica romperá toda la pila de arriba al nivel de Java?


En resumen: "no realmente". Los científicos están paulatinamente de acuerdo en que las computadoras cuánticas serán especialmente buenas para resolver problemas específicos, mientras que otros problemas se resolverán de manera más racional usando las computadoras tradicionales. Suena familiar, ¿verdad? Se observa una situación similar al comparar la GPU y la CPU. Si bien los transistores también se usan en la GPU, en principio difieren de la CPU, sin embargo, muchas aplicaciones escritas en un lenguaje de alto nivel utilizan las capacidades de la CPU y la GPU bajo el capó. Las GPU son muy buenas para el procesamiento de vectores, y en muchas aplicaciones y bibliotecas el trabajo de la CPU y la GPU se diferencia.

Por ejemplo, esta es exactamente la situación cuando se utiliza JavaFX o Deeplearning4j. Si está escribiendo una aplicación de interfaz de usuario utilizando JavaFX, solo trabaja con código Java (quizás también FXML para declarar una interfaz de usuario). Cuando la escena JavaFX necesita mostrarse en la pantalla, las implementaciones JavaFX internas usan sombreadores y texturas para esto, contactando directamente a los controladores de GPU de bajo nivel, como se muestra en la Figura 2. Por lo tanto, no tiene que preocuparse sobre qué parte del código está mejor adaptada para trabajar con la CPU y cuáles con GPU



Fig. 2. JavaFX delega el trabajo de la GPU y la CPU.

Como se muestra en la fig. 2, el código de implementación JavaFX delega el trabajo pasándolo a la GPU y la CPU. Aunque estas operaciones están ocultas para el desarrollador (no se proporciona a través de la API), cierto conocimiento de la GPU a menudo es útil cuando necesita desarrollar aplicaciones JavaFX más potentes.

Cuando se usa Deeplearning4j, se desarrolla una situación similar. Deeplearning4j tiene varias implementaciones para realizar las operaciones de matriz y vector requeridas, y algunas de ellas usan GPU. Sin embargo, no le importa como desarrollador final qué capacidades utilizará su código: CPU o GPU.

Parece que las computadoras cuánticas harán un excelente trabajo resolviendo problemas que, como regla, aumentan exponencialmente a medida que crece el volumen del problema y, por lo tanto, difícilmente se pueden resolver o casi no se pueden resolver usando computadoras clásicas. En particular, los expertos hablan de una realización híbrida: una aplicación típica de extremo a extremo contiene código clásico que se ejecuta en la CPU, pero también puede contener código cuántico.

¿Cómo puede un sistema ejecutar código cuántico?


Hoy, el hardware para computadoras cuánticas sigue siendo extremadamente experimental. Si bien las grandes corporaciones y, presumiblemente, algunos estados se dedican al desarrollo de prototipos, dicha tecnología no está ampliamente disponible. Pero, cuando aparece, su forma puede ser diferente:

  • Se puede integrar un coprocesador cuántico con la CPU en el sistema.
  • Los problemas cuánticos se pueden delegar a los sistemas cuánticos de nubes.

Aunque sigue habiendo una enorme incertidumbre acerca de los antecedentes prácticos de tales decisiones, estamos cada vez más de acuerdo en cómo debería verse un código cuántico. En el nivel más bajo deben estar los siguientes ladrillos: qubits y puertas cuánticas . En base a ellos, puede crear simuladores cuánticos que implementen el comportamiento esperado.

Por lo tanto, un simulador cuántico es una herramienta ideal para tal desarrollo.
Los resultados que brindan deben ser casi los mismos que se obtendrían en el equipo real de una computadora cuántica, pero el simulador funciona mucho más lento, ya que los efectos cuánticos que aceleran los equipos cuánticos deben simularse con el software tradicional.

¿Cuáles son los componentes básicos de la computación cuántica?


A menudo es importante comparar los cálculos clásicos con los cuánticos. En informática clásica, tenemos bits y puertas.

Un bit contiene un solo bit de información, y su valor puede ser 0 o 1.
Una válvula actúa sobre uno o más bits y puede operar sobre ellos. Por ejemplo, la válvula NOT, que se muestra en la Figura 3, invierte el valor de un bit. Si la entrada es 0, entonces la salida de la puerta NOT será 1 y viceversa.



Fig. 3. NO válvula

En computación cuántica, tenemos bits y puertas equivalentes. El equivalente cuántico de un bit es qubit. El valor de un qubit puede ser igual a 0 o 1, como un bit clásico, sin embargo, también puede estar en la llamada superposición. Este es un concepto complejo, según el cual un qubit puede estar simultáneamente en ambos estados: 0 y 1.

Cuando un qubit está en superposición, su valor es una combinación lineal de los estados 0 y 1. Esto se puede escribir como se muestra en la Fig. 4:



Fig. 4. Igualdad donde el qubit está en superposición.

Nota: los qubits a menudo se escriben en notación de corchetes , donde el nombre de la variable se coloca entre los caracteres "|" y ">".

La expresión en la Fig. 4 informa que qubit x está en una superposición de estados | 0> y | 1>. Esto no significa que esté en el estado | 0> O en el estado | 1>; Esto significa que no conocemos su estado actual.

De hecho, está en ambos estados simultáneamente, y de esta forma puede ser manipulado. Sin embargo, cuando medimos el qubit, estará en un estado, ya sea | 0> o | 1>. Hay otra restricción en la expresión anterior: a ^ 2 + b ^ 2 = 1.
Los valores de ayb son probabilísticos: existe una probabilidad a ^ 2 de que, cuando medimos el qubit | x>, contendrá el valor | 0>, y la probabilidad b ^ 2 de que el qubit medido contendrá el valor | 1>.

Hay un importante factor limitante que rompe las alegrías de la computación cuántica: después de medir un qubit, se pierde toda la información sobre la superposición potencial en la que se encontraba. El valor qubit puede ser 0 o 1.

En los cálculos, un qubit en superposición puede corresponder a 0 y 1 al mismo tiempo (con diferentes probabilidades). Si tenemos dos qubits, entonces se pueden usar para representar cuatro estados (00, 01, 10 y 11), nuevamente, con diferentes probabilidades. Aquí llegamos a la esencia del poder de las computadoras cuánticas. Con ocho bits clásicos, puede representar exactamente un número en el rango de 0 a 255. Los valores de cada uno de los ocho bits serán 0 o 1. Con ocho qubits, puede representar simultáneamente todos los números del 0 al 255.

¿De qué sirve la superposición si solo puede medir un estado?


A menudo, el resultado del algoritmo es simple (sí o no), pero para llegar a él, se requiere mucha computación paralela. Manteniendo qubits en superposición durante los cálculos, puede tener en cuenta de inmediato cualquier opción diferente. Sin cumplir con las decisiones para cada combinación individual, una computadora cuántica puede calcular todas las opciones en un solo paso.
Luego, en muchos algoritmos cuánticos, comienza la siguiente etapa importante: conectar el resultado del algoritmo con una medición que dé un resultado significativo. A menudo, se tiene en cuenta la interferencia: los resultados interesantes se superponen estructuralmente entre sí, mientras que los que no son interesantes se cancelan entre sí (interferencia destructiva).

¿Cómo se puede "transformar" un qubit en un estado de superposición?


Así como las puertas clásicas manipulan bits, las puertas cuánticas manipulan qubits. Algunas puertas cuánticas se parecen a las clásicas; por ejemplo, la puerta Pauli-X transfiere el qubit del estado a | 0> + b | 1> al estado b | 0 | + a | 1>, que es similar al principio de la puerta NO clásica. De hecho, cuando a = 1 yb = 0, el qubit estaba inicialmente en el estado | 0>. Después de la acción de la válvula Pauli-X, este qubit entrará en el estado | 1>, como se muestra en la Fig. 5)



Fig. 5. El resultado del uso de la válvula Pauli-X.

En este contexto, la válvula Hadamard es muy interesante. Pone el qubit en el estado | 0>: 1 / sqrt (2) * (| 0> + | 1>) en una superposición, como se muestra en la Fig. 6)



Fig. 6. El resultado de aplicar la válvula Hadamard.

Después de aplicar la válvula Hadamard a un qubit y medir el qubit, existe una probabilidad del 50% de que el valor del qubit sea 0 y del 50% de que el valor del qubit sea 1. Hasta que se mida el qubit, permanece en un estado de superposición .

¿Cómo es todo esto posible?


Si está realmente interesado en la respuesta a esta pregunta, tendrá que estudiar la física cuántica en detalle. Pero, afortunadamente, no es necesario comprender toda la base teórica de estos fenómenos. Si bien el fenómeno de superposición puede parecer incomprensible, es importante enfatizar que son estas propiedades las características de las partículas elementales en la naturaleza. Por lo tanto, la computación cuántica está mucho más cerca de lo básico de la realidad física de lo que parece a primera vista.

¿Debería esperar unos años y luego observar más de cerca la computación cuántica?


No En este caso, llegarás tarde. Es teóricamente posible desarrollar primero hardware, y luego proceder al estudio del nivel de software y ver qué se puede lograr con él. Sin embargo, todos los conceptos ya son más o menos claros, y ya es posible escribir simuladores cuánticos en lenguajes populares, incluidos Java, C #, Python y otros.
Entonces estos simuladores se pueden usar para trabajar en algoritmos cuánticos. Aunque estos algoritmos no proporcionarán un aumento de rendimiento tal que se pueda lograr con su ayuda cuando trabajen en equipos cuánticos reales, deberían estar funcionalmente completos.

Por lo tanto, si actualmente está desarrollando un algoritmo cuántico, entonces tiene tiempo para mejorarlo y puede iniciarlo cuando aparezca un equipo cuántico en el acceso.

Los algoritmos cuánticos requieren un enfoque intelectual diferente al de los clásicos. Destacados científicos comenzaron a desarrollar algoritmos cuánticos en el siglo pasado, y ahora se publican más y más artículos que describen tales algoritmos, incluidos los de multiplicación de enteros, búsqueda de listas, trabajo de optimización de rutas y mucho más.

Hay otras razones por las cuales podría valer la pena hacer computación cuántica hoy. Refactorizar un sistema de software en una gran empresa moderna no es una de esas cosas que se pueden hacer de la noche a la mañana. Sin embargo, una de las áreas en las que la computación cuántica hará una verdadera revolución es el cifrado; después de todo, todo se basa en la teoría de que en una computadora clásica es prácticamente imposible descomponer un número entero grande en factores primos.

Aunque pueden pasar muchos años antes de que las computadoras cuánticas se vuelvan lo suficientemente grandes como para resolver fácilmente el problema de la factorización de enteros, los desarrolladores saben que lleva muchos años cambiar los sistemas e introducir tecnologías nuevas y más seguras en ellos.

¿Cómo puedo aprender a trabajar con algoritmos cuánticos en Java?


Puede descargar y dominar Strange , el simulador de computadora cuántica de código abierto en Java. Strange le permite simular un algoritmo cuántico creando una serie de qubits y aplicando varias puertas cuánticas a ellos.

Como ejemplo simple, creemos dos qubits, q [0] y q [1], de modo que inicialmente ambos estén en estado 0. Luego aplicamos dos puertas simples a cada uno de los qubits, de modo que gráficamente esta operación corresponde a la fig. 7)

El primer qubit irá primero a la válvula Pauli-X y luego a la válvula Hadamard. La válvula Pauli-X lo traducirá del estado | 0 & gt a | 1 & gt, y la válvula Hadamard lo traducirá a una superposición con iguales probabilidades | 0 & gt y | 1 & gt. Por lo tanto, si completamos la secuencia completa 1000 veces y medimos el primer qubit 1000 veces al final de este ciclo, entonces, en promedio, podemos esperar que en 500 casos tendrá un valor de 0 y en 500 casos tendrá un valor de 1.

El segundo qubit es aún más simple. Comenzamos con la puerta de identidad, que no cambia el comportamiento del qubit, y luego la pasamos a la puerta Pauli-X, cambiando su valor de 0 a 1.



Fig. 7. Un ejemplo de un algoritmo cuántico que se puede simular usando Strange.

Para asegurarse de que nuestro razonamiento sea correcto, puede crear un programa cuántico simple usando Strange.

public static void main(String[] args) { Program p = new Program(2); Step s = new Step(); s.addGate(new X(0)); p.addStep(s); Step t = new Step(); t.addGate(new Hadamard(0)); t.addGate(new X(1)); p.addStep(t); SimpleQuantumExecutionEnvironment sqee = new SimpleQuantumExecutionEnvironment(); Result res = sqee.runProgram(p); Qubit[] qubits = res.getQubits(); Arrays.asList(qubits).forEach(q -> System.out.println("qubit with probability on 1 = "+q.getProbability()+", measured it gives "+ q.measure())); } 

En esta aplicación, se crea un programa cuántico con dos qubits:

  Program p = new Program(2); 

Como parte de este programa, pasamos por dos etapas. En el primer paso, aplique la válvula Pauli-X a q [0]. No aplicamos la válvula a q [1], lo que implica que funcionará con la válvula de identidad. Agregue este paso al programa:

  Step s = new Step(); s.addGate(new X(0)); p.addStep(s); 

Luego pasamos a la segunda etapa, donde aplicamos la válvula Hadamard a q [0] y la válvula Pauli-X a q [1]; agregue este paso al programa:

  Step t = new Step(); t.addGate(new Hadamard(0)); t.addGate(new X(1)); p.addStep(t); 

Entonces, nuestro programa está listo. Ahora hagámoslo. Un extraño simulador está integrado en Strange, sin embargo, Strange también puede usar un servicio en la nube para ejecutar programas en algún tipo de nube, por ejemplo, en Oracle Cloud .

En el siguiente ejemplo, usamos un simulador integrado simple, ejecutamos el programa y obtenemos los qubits resultantes:

  SimpleQuantumExecutionEnvironment sqee = new SimpleQuantumExecutionEnvironment(); Result res = sqee.runProgram(p); Qubit[] qubits = res.getQubits(); 

Antes de medir los qubits (y perder toda la información), mostramos las probabilidades. Ahora mida los qubits y mire los valores:

 Arrays.asList(qubits).forEach(q -> System.out.println("qubit with probability on 1 = "+q.getProbability()+", measured it gives "+ q.measure())); 

Al ejecutar esta aplicación, obtenemos el siguiente resultado:

qubit with probability on 1 = 0.50, measured it gives 1
qubit with probability on 1 = 1, measured it gives 1

Tenga en cuenta: para el primer qubit, el valor 0 también se puede medir, como esperábamos.
Si ejecuta este programa muchas veces, el valor del primer qubit en promedio será 0 en la mitad de los casos y 1 en la mitad de los casos.

¿Es eso todo lo que necesitas saber sobre computación cuántica?


Por supuesto que no. Aquí no tocamos una serie de conceptos importantes, en particular, no discutimos las complejidades que aseguran la interacción entre dos qubits, incluso si físicamente están muy lejos el uno del otro. No hablamos sobre los algoritmos cuánticos más famosos, entre ellos el algoritmo Shore, que permite descomponer enteros en factores primos. También ignoramos una serie de hechos matemáticos y físicos, en particular, no tomamos en cuenta que en la superposición | x> = a | 0> + b | 1>, ambos números, a y b, pueden ser complejos.

Sin embargo, el objetivo principal de este artículo era darle la impresión de la computación cuántica y comprender cómo encajan en el futuro del desarrollo de software.

Source: https://habr.com/ru/post/450480/


All Articles