Una guía para principiantes sobre computación cuántica con Python

La Mecánica Cuántica es una teoría fundamental de la física que explica fenómenos a escala microscópica (como átomos y partículas subatómicas). Este “nuevo” campo (1900) se diferencia de la Física Clásica, que describe la naturaleza a escala macroscópica (como cuerpos y máquinas) y no se aplica a nivel cuántico.

La Computación Cuántica es la explotación de las propiedades de la Mecánica Cuántica para realizar cálculos y resolver problemas que una computadora clásica no puede y nunca podrá resolver.

Las computadoras normales hablan el lenguaje del código binario: asignan un patrón de dígitos binarios (1 y 0) a cada carácter e instrucción, y almacenan y procesan esa información en bits. Incluso su código Python se traduce a dígitos binarios cuando se ejecuta en su computadora portátil. Por ejemplo:

La palabra “Hola” → “h”: 01001000 y “i”: 01101001 → 01001000 01101001

Por otro lado, los ordenadores cuánticos procesan información con qubits (bits cuánticos), que pueden ser 0 y 1 al mismo tiempo. Eso hace que las máquinas cuánticas sean dramáticamente más rápidas que las normales para problemas específicos (es decir, cálculos probabilísticos).

Computadoras cuánticas

Las computadoras cuánticas utilizan átomos y electrones, en lugar de los clásicos chips basados ​​en silicio. Como resultado, pueden aprovechar la mecánica cuántica para realizar cálculos mucho más rápido que las máquinas normales. Por ejemplo, 8 bits son suficientes para que una computadora clásica represente cualquier número entre 0 y 255, pero 8 qubits son suficientes para que una computadora cuántica represente todos los números entre 0 y 255 al mismo tiempo. Unos pocos cientos de qubits serían suficientes para representar más números que átomos en el universo.

El cerebro de una computadora cuántica es un pequeño chip qubit hecho de metales o zafiro.

Foto de Niek Doup en Unsplash

Sin embargo, la parte más emblemática es el gran hardware de refrigeración hecho de oro que parece una lámpara de araña colgando dentro de un cilindro de acero: el refrigerador de dilución. Enfría el chip a una temperatura más fría que la del espacio exterior a medida que el calor destruye los estados cuánticos (básicamente, cuanto más frío está, más preciso se vuelve).

Foto de Planet Volumes en Unsplash

Ese es el tipo de arquitectura líder, y se llama qubits superconductores: átomos artificiales creados a partir de circuitos que utilizan superconductores (como el aluminio) que exhiben resistencia eléctrica cero a temperaturas ultrabajas. Una arquitectura alternativa son las trampas de iones (átomos cargados atrapados en campos electromagnéticos en un vacío ultra alto), que es más precisa pero más lenta que la primera.

No existe un recuento público exacto de cuántas computadoras cuánticas existen, pero las estimaciones rondan las 200 en todo el mundo. A día de hoy, los más avanzados son:

Condor de IBM, el mayor recuento de qubits construido hasta ahora (1000 qubits), incluso si eso por sí solo no equivale a un cálculo útil, ya que las tasas de error siguen siendo importantes. Willow de Google (105 qubits), con una buena tasa de error pero aún lejos de ser una informática a gran escala tolerante a fallos. Tempo de IonQ (100 qubits), computadora cuántica con trampas de iones con buenas capacidades pero aún más lenta que las máquinas superconductoras. Helios de Quantinuum (98 qubits) utiliza una arquitectura de trampas de iones con una de las precisiones más altas reportadas en la actualidad. Ankaa de Rigetti Computing (80 qubits). Caídas del túnel de Intel (12 qubits). Aurora de Canadá Xanadu (12 qubits), la primera computadora cuántica fotónica, que utiliza luz en lugar de electrones para procesar información. Majorana de Microsoft, la primera computadora diseñada para escalar a un millón de qubits en un solo chip (pero actualmente tiene 8 qubits). Mini del SpinQ chino, el primer ordenador cuántico portátil de pequeña escala (2 qubits). QPU (Unidad de procesamiento cuántico) de NVIDIA, el primer sistema cuántico acelerado por GPU.

Por el momento, es imposible que una persona normal posea un ordenador cuántico de gran escala, pero se puede acceder a él a través de la nube.

Configuración

En Python, existen varias bibliotecas para trabajar con computadoras cuánticas en todo el mundo:

Qiskit de IBM es el ecosistema de alto nivel más completo para ejecutar programas cuánticos en computadoras cuánticas de IBM, perfecto para principiantes. Cirq de Google, dedicada al control de bajo nivel de su hardware, más adecuado para la investigación. PennyLane de Xanadu se especializa en Quantum Machine Learning, se ejecuta en sus computadoras fotónicas patentadas pero también puede conectarse a otros proveedores. ProjectQ de la Universidad ETH de Zurich, un proyecto de código abierto que intenta convertirse en el principal paquete de propósito general para la computación cuántica.

Para este tutorial, utilizaré Qiskit de IBM ya que es el líder de la industria (pip install qiskit).

El código más básico que podemos escribir es crear un circuito cuántico (entorno para la computación cuántica) con un solo qubit e inicializarlo como 0. Para medir el estado del qubit, necesitamos un vector de estado, que básicamente indica la realidad cuántica actual de su circuito.

de qiskit import QuantumCircuit de qiskit.quantum_info import Statevector q = QuantumCircuit(1,0) #circuito con 1 bit cuántico y 0 bit clásico state = Statevector.from_instruction(q) #medir estado state.probabilities() #imprimir prob%

Es decir: la probabilidad de que el qubit sea 0 (primer elemento) es del 100%, mientras que la probabilidad de que el qubit sea 1 (segundo elemento) es del 0%. Puedes imprimirlo así:

imprimir(f”[q=0 {round(state.probabilities()[0]*100)}%, q=1 {ronda(estado.probabilidades()[1]*100)}%]”)

Visualicemos el estado:

desde qiskit.visualization importar plot_bloch_multivector plot_bloch_multivector(estado, figsize=(3,3))

Como puede ver en la representación 3D del estado cuántico, el qubit está al 100% en 0. Ese era el equivalente cuántico de “hola mundo”, y ahora podemos pasar al equivalente cuántico de “1+1=2”.

Qubits

Los Qubits tienen dos propiedades fundamentales de la Mecánica Cuántica: Superposición y Enredo.

Superposición: los bits clásicos pueden ser 1 o 0, pero nunca ambos. Por el contrario, un qubit puede ser ambas cosas (técnicamente es una combinación lineal de un número infinito de estados entre 1 y 0), y sólo cuando se mide, la superposición colapsa a 1 o 0 y permanece así para siempre. Esto se debe a que el acto de observar una partícula cuántica la obliga a adoptar un estado binario clásico de 1 o 0 (básicamente la historia del gato de Schrödinger que todos conocemos y amamos). Por lo tanto, un qubit tiene una cierta probabilidad de colapsar a 1 o 0.

q = QuantumCircuit(1,0) qh(0) #add Estado de superposición = Statevector.from_instruction(q) print(f”[q=0 {round(state.probabilities()[0]*100)}%, q=1 {ronda(estado.probabilidades()[1]*100)}%]”) plot_bloch_multivector(estado, tamaño de figura=(3,3))

Con la superposición, introdujimos “aleatoriedad”, por lo que el estado del vector está entre 0 y 1. En lugar de una representación vectorial, podemos usar una esfera q donde el tamaño de los puntos es proporcional a la probabilidad del término correspondiente en el estado.

desde qiskit.visualization importar plot_state_qsphere plot_state_qsphere(estado, figsize=(4,4))

El qubit es 0 y 1, con un 50% de probabilidad respectivamente. Pero ¿qué pasa si lo medimos? A veces será un 1 fijo y otras veces un 0 fijo.

resultado, colapsado = state.measure() #La superposición desaparece print(“medido:”, resultado) plot_state_qsphere(collapsed, figsize=(4,4)) #plot estado colapsado

Entrelazamiento: los bits clásicos son independientes entre sí, mientras que los qubits pueden entrelazarse entre sí. Cuando eso sucede, los qubits están siempre correlacionados, sin importar la distancia (a menudo utilizado como metáfora matemática del amor).

q = QuantumCircuit(2,0) #circuito con 2 bits cuánticos y 0 bits clásicos qh([0]) #add Superposición en el primer estado del qubit = Statevector.from_circuit(q) plot_bloch_multivector(state, figsize=(3,3))

Tenemos el primer qubit en Superposición entre 0-1, el segundo en 0, y ahora los voy a Enredar. En consecuencia, si la primera partícula se mide y colapsa a 1 o 0, la segunda partícula también cambiará (no necesariamente al mismo resultado, una puede ser 0 mientras que la otra es 1).

q.cx(control_qubit=0, target_qubit=1) #Estado de enredo = Statevector.from_circuit(q) resultado, colapsado = state.measure([0]) #medir el primer qubit plot_bloch_multivector(contraído, figsize=(3,3))

Como puede ver, el primer qubit que estaba en superposición se midió y se redujo a 1. Al mismo tiempo, el segundo quibit está enredado con el primero, por lo que también ha cambiado.

Conclusión

Este artículo ha sido un tutorial para presentar los conceptos básicos de la Computación Cuántica con Python y Qiskit. Aprendimos a trabajar con qubits y sus 2 propiedades fundamentales: Superposición y Enredo. En el próximo tutorial, usaremos qubits para construir modelos cuánticos.

Código completo para este artículo: GitHub

¡Espero que lo hayas disfrutado! No dude en ponerse en contacto conmigo si tiene preguntas y comentarios o simplemente para compartir sus proyectos interesantes.

👉Conectémonos 👈

(Todas las imágenes son del autor a menos que se indique lo contrario)