Artículos técnicos

Artículos técnicos de tus amigos de Oracle y la comunidad de desarrolladores.

El impacto de la computación cuántica en el desarrollo de software

En los últimos años y meses, el interés por la computación cuántica ha aumentado. De forma regular, hay nuevos informes de institutos de investigación, empresas o gobiernos sobre los avances en este campo. Al mismo tiempo, artículos con antecedentes menos técnicos hablan de las posibles consecuencias de la computación cuántica, que van desde romper la mayoría de las técnicas de cifrado actuales hasta una solución para todas las enfermedades hasta completar la IA general. Sin embargo, no todas las expectativas son igualmente realistas.

Como desarrollador de software realista y descendente, puede preguntarse dónde dibujar la línea entre hechos y ficción y cómo la computación cuántica afectará el desarrollo de software en el futuro.

Claramente, estamos muchos años lejos del hardware listo para la producción para la computación cuántica. Sin embargo, los principios generales están claros ahora y las abstracciones permiten a los desarrolladores crear aplicaciones que aprovechen la computación cuántica mediante simuladores.

¿No es Quantum Computing simplemente dándonos más poder a la CPU?

El desarrollo de software tradicional, utilizando computadoras clásicas, traduce un lenguaje de programación de alto nivel (por ejemplo, Java) a operaciones realizadas en un gran número de transistores (hardware).

El diagrama simplificado de la Figura 1 muestra el flujo de este proceso: el código fuente Java se compila en un código de byte independiente de la plataforma, que se traduce al código de máquina específico de la plataforma. Esto permite que el código Java funcione en diferentes sistemas operativos y arquitecturas. El código de máquina aprovecha una serie de operaciones básicas (puertas) que actúan en la memoria. El componente principal de hardware para conseguirlo es el transistor bien conocido.

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

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

Las mejoras en el rendimiento de las últimas décadas se han visto impulsadas principalmente por las ventajas de la tecnología de hardware. El tamaño de un solo transistor se ha reducido drásticamente, y más transistores por milímetro cuadrado permiten más memoria o más potencia de procesamiento.

La computación cuántica es disruptiva, ya que no utiliza un transistor clásico como el bloque de construcción básico; utiliza qubits, que vamos a discutir en breve.

No solo los bloques de construcción básicos son diferentes, las puertas también son diferentes. Por lo tanto, la pila mostrada en la Figura 1 no se aplica a la computación cuántica.

¿Quantum Computing destruye toda la pila hasta el nivel de Java?

La respuesta corta es "no realmente". Hay un consenso creciente entre los científicos de que las computadoras cuánticas son particularmente buenas para algunos problemas, mientras que las computadoras clásicas son las mejores para otros problemas. Eso debería sonar un timbre: vemos lo mismo con GPU frente a CPU. Aunque las GPU también utilizan transistores, su funcionamiento es diferente al de las CPU. Sin embargo, muchas aplicaciones en un lenguaje de alto nivel aprovechan tanto una CPU como una GPU bajo el capó. Las GPU son muy buenas para el procesamiento de vectores y varias aplicaciones y bibliotecas separan el trabajo de la CPU del trabajo de la GPU.

Por ejemplo, este es el caso si utiliza JavaFX o Deeplearning4j. Si utiliza JavaFX para crear una aplicación que tenga una interfaz de usuario, solo utilizará el código Java (y puede que FXML declare la interfaz de usuario). Cuando es necesario presentar la escena de JavaFX en una pantalla, las implantaciones internas de JavaFX utilizarán fragmentos y texturas y hablarán directamente con los controladores de bajo nivel de las GPU, como se muestra en la figura 2. Como consecuencia, no tiene que preocuparse de qué parte del código es más adecuada para la CPU y qué parte es adecuada para la GPU.

Figura 2. Los delegados de JavaFX trabajan en GPU y en CPU.

Figura 2. Los delegados de JavaFX trabajan en GPU y en CPU.

Como muestra la figura 2, el código de implantación de los delegados de JavaFX funciona en la GPU y en la CPU. Aunque esto está oculto para el desarrollador (no está expuesto en la API), algunos conocimientos sobre la GPU a menudo son útiles para crear aplicaciones JavaFX con más rendimiento.

Si utiliza Deeplearning4j, se está aplicando un enfoque similar. Deeplearning4j tiene una serie de implantaciones para realizar las operaciones de vector y matriz necesarias, y algunas de ellas utilizan GPU. Sin embargo, como desarrollador final, su código no depende de si va a utilizar energía de CPU o de GPU.

Parece que las computadoras cuánticas serán excelentes en la solución de problemas que normalmente requieren recursos que escalan exponencialmente con el tamaño del problema y son, por lo tanto, difíciles o prácticamente imposibles de resolver usando computadoras clásicas. Una de las posibilidades que están discutiendo los expertos es una forma híbrida de ejecución: una aplicación típica de extremo a extremo contiene código clásico que se ejecuta en una CPU, y también puede contener código cuántico.

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

Hoy en día, el hardware para computadoras cuánticas sigue siendo extremadamente experimental. Aunque las grandes empresas y, probablemente, algunos gobiernos están trabajando en prototipos, todavía no están ampliamente disponibles. Pero incluso cuando estarán disponibles, podría haber diferentes formas:

  • Un coprocesador cuántico se puede integrar con la CPU en un sistema.
  • Las tareas cuánticas se pueden delegar a los sistemas de nube cuántica.

Aunque hay una gran incertidumbre sobre las implicaciones prácticas, existe un consenso cada vez mayor sobre el aspecto del código cuántico. En el nivel más bajo, esto significa que los bloques básicos se pueden describir: qubit y quantum gates. Y como consecuencia, se pueden construir simuladores cuánticos que implementen el comportamiento esperado.

Un simulador cuántico es, por lo tanto, una herramienta perfecta para ser utilizada durante el desarrollo. Los resultados que produce deben ser los mismos que los resultados en un ordenador cuántico de hardware real, pero el simulador será mucho más lento, ya que los efectos cuánticos que aceleran el hardware cuántico deben simularse utilizando el software clásico.

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

A menudo es relevante comparar la computación clásica con la computación cuántica. En la computación clásica, tenemos bits y gates.

Un bit puede contener un solo dígito de información y su valor es 0 o 1. Una puerta actúa sobre uno o más bits, y puede manipular esos bits. Por ejemplo, la puerta NOT, mostrada en lafigura 3, cambiará el valor de un bit. Si la entrada es 0, la salida de la puerta NOT es 1 y viceversa.

Figura 3. NO puerta.

Figura 3. NO puerta.

En computación cuántica, tenemos equivalentes para bits y puertas. El equivalente cuántico de un bit es un qubit. El valor de un qubit puede ser 0 o 1, similar a un bit clásico, pero también puede estar en una denominada superposición. Este es un concepto difícil de imaginar que nos dice que el qubit está en el estado 0 y el estado 1 al mismo tiempo.

Cuando un qubit está en una superposición, suvalor es una combinación lineal del estado 0 y el estado 1. Podemos escribir esto como se muestra en la Figura 4:

Figura 4. Ecuación para cuando un qubit está en superposición.

Figura 4. Ecuación para cuando un qubit está en superposición.

Tenga en cuenta que las comillas se suelen escribir en la notación de socket, donde el nombre de la variable está entre un símbolo "|" y un símbolo ">".

La expresión de la figura 4 indica que el qubit x está en una superposición del estado |0> y el estado |1>. Esto no significa que esté en el estado |0> O en el estado |1>; no sabemos su estado actual.

Es realmente en ambos estados simultáneamente, y puede ser manipulado como tal. Una vez que medimos el qubit, estará en un solo estado, ya sea |0> o |1>. En la expresión anterior, hay una limitación adicional que a^2 + b^2 = 1.

Los valores de a y b están enlazados a probabilidades: hay una probabilidad a^2 de que, cuando se mide, el qubit |x> contendrá el valor |0>, y hay una probabilidad b^2 de que, cuando se mide, el qubit |x> contendrá el valor |1>.

Hay una fuerte limitación en la alegría de la computación cuántica: una vez que se mide un qubit, toda la información sobre la superposición potencial en la que se encontraba se pierde. El qubit será 0 o 1.

Durante los cálculos, un bit en una superposición puede ser tanto 0 como 1 (con diferentes probabilidades). Si tenemos dos qubits, estos pueden representar cuatro estados (00, 01, 10 y 11), de nuevo con diferentes probabilidades. Esto conduce al poder real de los ordenadores cuánticos. Con ocho bits clásicos, puede representar exactamente un número entre 0 y 255. Los ocho bits serán 0 o 1. Con ocho qubits, podemos representar todos los números entre 0 y 255 simultáneamente.

¿Cuál es el beneficio de la superposición si solo se puede medir un solo estado?

En muchos casos, un algoritmo tiene un resultado simple (por ejemplo, "sí" o "no"), pero requiere muchos cálculos paralelos. Al mantener los qubits en una superposición durante los cálculos, es posible tener en cuenta todas las diferentes opciones a la vez. En lugar de realizar evaluaciones para cada combinación única, un equipo cuántico puede ejecutar un algoritmo en todas las opciones en un solo paso.

Un paso importante en muchos algoritmos cuánticos es entonces enlazar el resultado del algoritmo a una medición que dé un resultado significativo. Esto se hace a menudo aprovechando la interferencia: Los resultados interesantes se interfieren constructivamente entre sí, mientras que los resultados no interesantes se cancelan entre sí por interferencia destructiva.

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

Al igual que las puertas clásicas manipulan bits, las puertas cuánticas manipulan los qubits. Algunas puertas cuánticas se asemejan a las puertas clásicas, por ejemplo, la puerta Pauli-X trae un qubit del estado a|0> + b|1> al estado b|0| + a|1>, que es similar a una puerta NOT clásica. De hecho, cuando a = 1 y b = 0, el qubit está originalmente en el estado |0>. Después de aplicar la puerta Pauli-X, este bit tendrá el estado |1>, como se muestra en la figura 5.

Figura 5. Resultados de la aplicación de la puerta Pauli-X.

Figura 5. Resultados de la aplicación de la puerta Pauli-X.

Una puerta muy interesante es la puerta de Hadamard. Esta puerta llevará un qubit que esté en el estado |0> a una superposición: 1/sqrt(2)* (|0> + |1>), como se muestra en la figura 6.

Figura 6. Resultados de la aplicación de la puerta de Hadamard.

Figura 6. Resultados de la aplicación de la puerta de Hadamard.

Después de aplicar una puerta de Hadamard a un qubit y medir el qubit, hay un 50% de probabilidad de que el qubit tenga un valor 0 y un 50% de probabilidad de que tenga un valor 1. Si el qubit no se mide, permanece en una superposición hasta que se mide.

¿Cómo es posible todo esto?

Si realmente quieres saber la respuesta a esa pregunta, se requiere un profundo conocimiento de la física cuántica. Pero afortunadamente, no es necesario entender la teoría detrás de esto. Aunque la idea de superposición puede sonar contraintuitiva, se debe subrayar que esto es exactamente cómo se comportan las partículas más elementales en la naturaleza. Por lo tanto, la computación cuántica está mucho más cerca de la realidad física de la naturaleza de lo que usted podría pensar.

¿Debo esperar unos años para empezar a ver la informática cuántica?

Si lo haces, serás tarde en el juego. En teoría, es posible desarrollar primero hardware y luego pasar a la capa de software y averiguar qué se puede lograr. Sin embargo, los conceptos son más o menos claros, lo que permite que los simuladores cuánticos se escriban en idiomas populares, incluidos Java, C#, Python y otros.

Estos simuladores pueden utilizarse para trabajar en algoritmos cuánticos. Aunque esos algoritmos no tendrán las mejoras de rendimiento que se obtendrán cuando se utilice hardware cuántico real, su funcionalidad debe ser la misma.

Por lo tanto, si trabaja ahora en su algoritmo cuántico, tendrá tiempo de crearlo y mejorarlo, y podrá ejecutarlo cuando el hardware esté listo.

Los algoritmos cuánticos requieren una mentalidad diferente del algoritmo clásico. Las personas muy inteligentes comenzaron a desarrollar algoritmos cuánticos en el último siglo, y ahora se publica un número creciente de algoritmos, incluidos algoritmos para factorizar enteros, listas de búsqueda, gestionar la optimización de rutas y mucho más.

Hay otras razones por las que puede que desee involucrarse en la computación cuántica hoy en día. Los sistemas de software de las grandes compañías no suelen refactorizarse durante la noche. Sin embargo, una de las cosas que serán sacudidas por la computación cuántica es el cifrado que se basa en la teoría de que es casi imposible para las computadoras clásicas factorizar grandes enteros en primos.

Aunque puede tardar muchos años antes de que las computadoras cuánticas sean lo suficientemente grandes como para hacer que la factorización de enteros sea fácilmente solvente, ya que los desarrolladores de software sabemos que también tardan muchos años en cambiar los sistemas y hacer que utilicen tecnologías más seguras.

¿Cómo puedo obtener más información sobre el uso de algoritmos cuánticos en Java?

Puede descargar y utilizar Strange, un simulador de computadora cuántica de Java de código abierto. Con Strange, puede simular un algoritmo cuántico creando una serie de qubits y aplicando una serie de puertas cuánticas a ellos.

Como ejemplo muy sencillo, vamos a crear dos qubits, q[0] y q[1], que inicialmente tienen el valor de estado 0. A continuación, aplicamos dos puertas simples a cadauna de las dos cubits, que se pueden representar gráficamentecomo se muestra en la Figura 7.

El primer qubit se encontrará primero con una puerta Pauli-X, seguida de una puerta Hadamard. La puerta Pauli-X la llevará de |0> a |1> y la puerta Hadamard la llevará a la superposición, con las mismas probabilidades para |0> y |1>. Como consecuencia, si ejecutamos el circuito 1.000 veces, cuando medimos el primer qubit al final del circuito, esperamos, en promedio, encontrar que tiene un valor 0 500 veces y un valor 1 500 veces.

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

Figura 7. Ejemplo de algoritmo cuántico que podemos simular utilizando Strange.

Figura 7. Ejemplo de algoritmo cuántico que podemos simular utilizando Strange.

Podemos crear un programa cuántico simple usando Strange que verificará nuestro pensamiento.



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, creamos un programa cuántico con dos qubits:



Program p = new Program(2);

Se aplican dos pasos en este programa. En el primer paso, aplicamos una puerta Pauli-X a q[0]. No aplicamos una puerta a q[1], lo que significa implícitamente que le aplicamos la puerta de identidad. Añada este paso al programa:



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

A continuación, creamos el segundo paso, en el que aplicamos una puerta Hadamard a q[0] y una puerta Pauli-X a q[1], y agregamos ese paso al programa:



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

Ahora que nuestro programa está listo, queremos ejecutarlo. Strange incluye un simulador cuántico incorporado, pero también puede utilizar un servicio en la nube para ejecutar programas en un entorno en la nube (por ejemplo, en Oracle Cloud).

En la siguiente muestra, utilizamos el simulador simple incorporado, 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), se imprimen las probabilidades. A continuación, medimos los qubits e imprimimos el valor:



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

Si ejecuta esta aplicación, verá la siguiente salida:



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

Tenga en cuenta que el valor medido para el primer qubit también puede ser 0, como esperábamos.

Si ejecuta esto varias veces, el valor medido del primer qubit dará, en promedio, la misma cantidad de 0s que 1s.

¿Y eso es todo lo que hay que saber sobre la informática cuántica?

Lejos de ello. No hemos tocado una serie de conceptos importantes, como el entrelazado, lo que permite las interacciones entre los qubits, incluso si están físicamente lejos unos de otros. No discutimos ninguno de los algoritmos cuánticos conocidos, incluido el algoritmo de Shor, que permite la factorización de enteros en primos. Además, ignoramos una serie de hechos matemáticos y físicos, por ejemplo, el hecho de que en una superposición |x> = a|0> + b|1>, tanto a como b pueden ser números complejos.

Pero el objetivo básico de este artículo es darte una idea sobre los conceptos básicos de la computación cuántica y cómo encaja en tu futuro desarrollo de software.

Acerca del autor

Johan Vos (@johanvos) comenzó a trabajar con Java en 1995. Fue parte del equipo de Blackdown y trasladó Java a Linux. Su principal objetivo es utilizar Java integral, combinando sistemas backend y dispositivos móviles/embebidos. Recibió un premio Duke's Choice en 2014 por su trabajo en JavaFX en dispositivos móviles. En 2015, cofundó Gluon, que permite a las empresas crear aplicaciones cliente Java móviles aprovechando la infraestructura de backend existente. Gluon recibió un premio Duke's Choice en 2015. Es el colead de OpenJFX y el líder del proyecto de OpenJDK Mobile. Vos es un campeón de Java, miembro del grupo de usuarios de Java belga (BeJUG) y de los grupos de dirección de Devoxx, y es miembro de JCP. Es autor principal del libro Pro JavaFX 8, y ha sido orador en numerosas conferencias sobre Java.

Último contenido

Explora y descubre nuestros últimos tutoriales

Funciones sin servidor

Las funciones sin servidor forman parte de una evolución de la computación en la nube que ha ayudado a las organizaciones a liberar de muchas de las restricciones de la gestión de infraestructura y recursos.

¿Qué es una cadena de bloques?

En términos generales, una cadena de bloques es un libro mayor de transacciones inmutable, que se mantiene dentro de una red distribuida de nodos de igual a igual (p2p). Básicamente, las cadenas de bloques sirven como una forma descentralizada de almacenar información.

OCI CLI

La CLI es una herramienta de huella reducida que se puede usar sola o con la consola para realizar las tareas de Oracle Cloud Infrastructure. La CLI proporciona la misma funcionalidad básica que la consola, además de comandos adicionales.