Cómo escribir un programa cuántico en 10 líneas de código (para principiantes)

Construye un dado de 8 lados que se ejecuta en una computadora cuántica

(Divulgación: soy gerente de producto en Rigetti Quantum Computing. Estamos contratando).

Cuando me presentaron por primera vez a la computación cuántica, la sola idea de las computadoras cuánticas era alucinante; Parecía más ciencia ficción que realidad.

Pero, ¿qué pasaría si te dijera que hoy en día existen computadoras cuánticas reales y que ya puedes escribir programas en ellas en la nube?

El procesador cuántico de 8 qubits de Rigetti

Usando el kit de desarrollo de software de Rigetti, Forest, y su biblioteca pyQuil basada en Python, lo guiaré a través de un ejemplo de cómo hacerlo en solo 10 líneas de código.

Específicamente, construiremos un dado cuántico de 8 lados que genere un resultado aleatorio. Aquí está nuestro programa:

quantum_dice.py

Algún contexto: soy gerente de producto en Rigetti y estamos construyendo computadoras cuánticas a las que cualquiera puede acceder a través de la nube.

Hoy en día, ya hay miles de desarrolladores, investigadores y organizaciones que utilizan Forest SDK, con más de 60 millones de trabajos ejecutados hasta la fecha.

Se están desarrollando aplicaciones a corto plazo para resolver algunos de los problemas más complejos del mundo, como simular moléculas que conducen al descubrimiento de nuevos materiales y productos farmacéuticos, diseñar catalizadores para ayudar a construir tecnologías de baterías de próxima generación y resolver problemas complejos de optimización para lograr nuevos avances en aprendizaje automático e inteligencia artificial.

En esta publicación, te presentaré los conceptos básicos de la computación cuántica, demostraré por qué son útiles y te mostraré lo fácil que es comenzar a construir programas cuánticos.

Empecemos.

Configuración e instalación

Primero, deberá registrarse aquí para obtener una clave API gratuita para Forest. Una vez registrado, recibirá su clave API en unos minutos por correo electrónico.

Mientras espera, verifique que tenga instalado Python v3.x (puede ejecutar python --version en su terminal para verificar qué versión tiene).

Si aún no tiene Python, o si tiene una versión 2.x anterior, le recomiendo descargar e instalar la distribución Anaconda Python aquí.

Una vez que tenga la versión correcta de Python, deberá instalar pyQuil:

conda install -c rigetti pyquil

Alternativamente, también puede instalar pip pyquil, aunque algunos usuarios han experimentado problemas con este método, por lo que recomendamos usar conda.

Importar pyQuil

Ahora que instaló pyQuil, abra su editor de código o gire un cuaderno Jupyter y cree un nuevo archivo llamado quantum_dice.py.

En la parte superior del archivo, importaremos lo siguiente:

del programa de importación pyquil.quil
desde pyquil.api importar QVMConnection
de pyquil.gates import H
de importación de functools reducir
qvm = QVMConnection ()

Esto es lo que hemos importado:

  1. Los programas cuánticos se escriben en Forest utilizando el objeto Program, que acepta la lógica principal de nuestra aplicación.
  2. QVMConnection nos permite conectarnos a una máquina virtual cuántica (QVM), un poderoso simulador de 26 qubits de una computadora cuántica. El QVM es ideal para pruebas y desarrollo, y hacia el final de esta publicación, le mostraré cómo reemplazar el QVM con una conexión API a la computadora cuántica real.
  3. H es la puerta de Hadamard. Si no está familiarizado con la puerta Hadamard, no se preocupe. Por ahora, todo lo que necesitamos saber es que aplicará un estado cuántico que nos ayuda a aleatorizar el lanzamiento de los dados. Volveré a esto a continuación con más detalle.
  4. reducir no es parte de pyQuil, pero es una función de uso común en Python para realizar bucles y cálculos iterativos. Específicamente, esto nos ayudará a formatear el resultado final de nuestros dados lanzados en un valor entero entre 1 y 8.

Qubits, superposición y puertas cuánticas

Antes de continuar, introduzcamos rápidamente algunos conceptos de computación cuántica.

En las computadoras clásicas (por ejemplo, nuestras computadoras portátiles, teléfonos, etc.), todas las interacciones e información que generamos finalmente se compilan en una serie de bits binarios: 0 o 1. Los bits son los bloques de construcción fundamentales de las computadoras.

En computación cuántica, tenemos bits cuánticos, o qubits. Lo que hace que los qubits sean únicos es que no son binarios, lo que significa que pueden estar en un estado de 0, 1 o en un estado intermedio especial conocido como superposición. Mientras está en superposición, un qubit es simultáneamente 0 y 1. Cuando medimos el qubit, colapsa fuera de su estado cuántico y devuelve 0 o 1.

Considere esta analogía: una pelota comienza como roja o azul (su estado inicial). Ponemos esa bola dentro de una caja cerrada, y mientras está dentro de la caja, la bola usa algunas propiedades cuánticas para cambiar su color a púrpura, una combinación intermedia de rojo y azul (es decir, superposición). Cuando abrimos este cuadro para observar la bola púrpura, de repente cambia su color nuevamente y solo vemos una bola roja o azul.

Utilizamos puertas cuánticas para ayudar a cambiar el estado de nuestros qubits y controlarlos mientras están en superposición. Estas son operaciones cuánticas que son análogas a las puertas lógicas booleanas clásicas (por ejemplo, NOT, AND, XOR, etc.), pero que tienen características adicionales porque son cuánticas.

Por ejemplo, la compuerta quantumX cambia el estado de un qubit de 0 a 1. La compuerta Hadamard, la compuerta H, coloca un qubit en superposición y genera una probabilidad aleatoria de 50/50 de medir 0 o 1. Usando pyQuil, simplemente podemos importar Estas puertas en nuestro programa.

Creando los dados de 8 lados con bits cuánticos

Para ilustrar cómo funciona esto, volvamos a nuestro programa de dados cuánticos.

dados = Programa (H (0), H (1), H (2))

Aquí estamos usando la puerta H, o la puerta Hadamard, que importamos anteriormente. Primero, pasamos un solo qubit: H (0). En pyQuil, los qubits se indexan a partir de 0, 1, 2, etc. Repetimos esto para dos qubits más: H (1), H (2).

Ahora tenemos tres qubits: cada uno en superposición y cada uno con una probabilidad aleatoria de devolver 0 o 1 cuando se miden.

Esto nos da un total de 8 resultados posibles (2 * 2 * 2 = 2³), que representarán cada lado de nuestros dados cuánticos:

  • [0, 0, 0] Los tres qubits están en estado 0
  • [0, 0, 1] Los dos primeros qubits están en el estado 0, el tercero en el estado 1
  • [0, 1, 1] El primer qubit está en el estado 0, el segundo y el tercero en el estado 1
  • [1, 1, 1] ...
  • [1, 1, 0]
  • [1, 0, 1]
  • [1, 0, 0]
  • [0, 1, 0]

Es posible que haya notado que cada qubit adicional que agreguemos a nuestro programa duplicará el número de lados en nuestros dados. Entonces, un cuarto qubit crearía un dado de 16 lados; cinco qubits generarían un dado de 32 lados; y así.

Esto ayuda a demostrar uno de los principios fundamentales que hacen que la computación cuántica sea tan poderosa: la potencia de la computación cuántica escala exponencialmente con qubits (es decir, N qubits = 2 ^ N bits). Solo necesitábamos tres qubits para generar 8 resultados potenciales.

Tirando los dados

Ahora que tenemos 8 resultados igualmente aleatorios, necesitamos generar un solo resultado, es decir, lanzar los dados.

Pongamos nombre a esta función roll_dice:

# Mide los qubits para obtener un resultado, es decir, tira los dados
roll_dice = dice.measure_all ()

En un entorno cuántico, tomar una medida hace que un qubit se colapse por superposición. Entonces, cuando llamamos al método measure.all (), cada uno de nuestros qubits se colapsa en un estado aleatorio de 0 o 1. Efectivamente, nuestra medición genera una "tirada de dados" aleatoria.

Para ver lo que sucede debajo del capó, puede imprimir la función roll_dice. Verás que se está generando un conjunto de instrucciones tipo ensamblaje:

print (roll_dice)
# Salida:
H 0
H 1
H 2
MEDIDA 0 [0]
MEDIDA 1 [1]
MEDIDA 2 [2]

Estas instrucciones están escritas en un lenguaje llamado Quil (Quantum Instruction Language), una capa de compilación que conecta los programas pyQuil con el backend de computación cuántica. Puede obtener más información sobre el diseño y la arquitectura de Quil aquí, y consultar los documentos sobre cómo puede personalizarlo utilizando la API aquí.

Volviendo a nuestra función roll_dice, la ejecutamos ejecutándola con QVM:

# Ejecute el programa ejecutándolo con QVM
resultado = qvm.run (roll_dice)

Un resultado de ejemplo que generaríamos al ejecutar esta función es [[0,1,0]]. La lista interna representa el estado final de nuestros tres qubits, una de las 8 posibilidades enumeradas anteriormente (es decir, el resultado de nuestra tirada de dados).

Finalmente, formateemos el resultado en un valor de dados legible entre 1 y 8. Usaremos la función de reducción que importamos anteriormente para ayudarnos a convertir nuestro resultado de una lista de tres estados de qubit a un solo entero (lea cómo funciona reduce) .

dice_value = reduce (lambda x, y: 2 * x + y, resultado [0], 0) + 1
print ("Tu tirada cuántica de dados regresó:", dice_value)

¡Eso es! Ejecute su archivo quantum_dice.py para probarlo.

Pasar de QVM a QPU

Para resumir, hemos simulado con éxito un dado de 8 lados en una computadora cuántica usando la máquina virtual cuántica de Rigetti.

Ahora, veamos cómo podemos hacer esto en la computadora cuántica real.

Laboratorio de fabricación de Rigetti en Fremont, CA

Las unidades de procesamiento cuántico (QPU) de Rigetti, o chips cuánticos, se fabrican en nuestro laboratorio en Fremont, CA, y luego se cablean e integran en un refrigerador de dilución en Berkeley, CA, donde está disponible sobre la nube.

Actualmente, el chip Agave de 8 qubits (8Q-Agave) está activo y disponible para que te conectes usando la API de Forest. Puede solicitar acceso a la QPU aquí. Su acceso se programará para una ventana de tiempo dedicada.

Una vez que haya recibido acceso, simplemente puede reemplazar su conexión al QVM con una conexión al QPU en unas pocas líneas de código:

Elimine la conexión previa al QVM:

# Elimina esto
desde pyquil.api importar QVMConnection
...
qvm = QVMConnection ()
....
resultado = qvm.run (roll_dice)

Y conéctese a la QPU:

desde pyquil.api importar QPUConnection
...
qpu = QPUConnection ('8Q-Agave')
...
resultado = qpu.run (roll_dice)

Próximos pasos y enlaces útiles

Introdujimos cómo funcionan los qubits, la superposición y las puertas cuánticas en la programación cuántica, y creamos un programa cuántico en solo 10 líneas de código. También demostramos el poder de escala exponencial de las computadoras cuánticas (N qubits = 2 ^ N bits).

Como un desafío para el próximo paso en su viaje de programación cuántica, ¿cómo construiría un dado cuántico con un número N generalizado de lados?

Nos encantaría que probaras el desafío y publicaras una publicación sobre cómo lo hiciste. Además, únase a nuestra comunidad Slack para conectarse con otros que exploran la computación cuántica y Forest, así como con nuestro equipo en Rigetti.

Algunos miembros del equipo de Rigetti y nuestras computadoras cuánticas en Berkeley, CA

Finalmente, aquí hay algunos recursos recomendados que he encontrado útiles para comenzar con la computación cuántica:

Libros:

  • Computación cuántica e información cuántica por Michael Neilsen e Isaac Chuang. Libro más comúnmente recomendado para principiantes. Consejo: no te obsesiones con el Capítulo 1.
  • Computación cuántica explicada por David McMahon. Un suplemento útil para el libro anterior, en particular para explicar los conceptos de álgebra lineal con más detalle.

Videos de Youtube:

  • Computación cuántica para los determinados: serie de YouTube de Michael Nielsen. Complemento útil para su libro mencionado anteriormente.
  • Esencia de álgebra lineal: serie de YouTube que revisa conceptos de álgebra lineal con visualizaciones útiles.

Podcasts / Charlas:

  • Podcast a16z: Computación cuántica, ahora y después con Chad Rigetti y Chris Dixon
  • Podcast a16z: El atlas de la nube para la computación cuántica real con Jeff Cordova, Vijay Pande y Sonal Chokshi
  • Y Combinator Podcast: John Preskill sobre computación cuántica
  • Conoce a meQuanics: episodios semanales con investigadores activos, líderes y empresarios en computación cuántica
  • Programación de las primeras computadoras cuánticas del mundo usando Forest: Presentación de Will Zeng, Jefe de Servicios de Cloud Quantum en Rigetti

Nota: Otro beneficio importante de la computación cuántica que demostramos en este ejemplo es el uso de computadoras cuánticas para la generación de números aleatorios. Si bien esta es una operación simple que ya hacemos hoy, la amenaza de poder realizar ingeniería inversa o manipular estas técnicas hace que muchos de los sistemas criptográficos actuales sean vulnerables. Con la computación cuántica, esta aleatorización se realiza y se oculta por naturaleza en el mundo cuántico. Esto no solo ayuda a generar una aleatoriedad real, sino que también protege la operación de aleatorización de cualquier intento de observarla o interceptarla, ya que esto perturbaría y colapsaría el entorno cuántico.

Gracias a Will Zeng, Lauren Rugani y Nima Alidoust por sus comentarios y ediciones.