Cuando pensamos en computación cuántica, normalmente aparecen palabras como qubit, superposición, entrelazamiento o puertas cuánticas.
Pero hay otra pregunta interesante:
¿Cómo se programa una computadora cuántica?
Y, más específicamente:
¿Qué cambia en un lenguaje de programación cuando la máquina que ejecuta nuestros programas es cuántica?
La respuesta es interesante porque no alcanza simplemente con agregar un nuevo tipo de dato llamado Qubit.
La computación cuántica introduce restricciones y conceptos que afectan algunas de las ideas fundamentales de los lenguajes de programación: valores, variables, tipos, copia, efectos, recursos y compilación.
En una computadora clásica, la unidad básica de información es el bit.
Un bit puede tener dos valores: 0 o 1
Podemos imaginar entonces una variable:
x = 0
y posteriormente:
x = 1
Un qubit es diferente.
Su estado puede representarse como:
α|0⟩ + β|1⟩
donde α y β son números complejos llamados amplitudes.
No significa simplemente que el qubit contiene un 0 y un 1.
Significa que su estado cuántico es una combinación de ambos estados posibles.
Las amplitudes deben cumplir:
|α|² + |β|² = 1
Cuando medimos el qubit obtenemos un resultado clásico: 0 o 1
La probabilidad de cada resultado depende de las amplitudes.
Por ejemplo:
1/√2 |0⟩ + 1/√2 |1⟩
produce un 0 o un 1 con igual probabilidad.
Esto ya introduce una diferencia importante para un lenguaje de programación.
Una variable clásica tiene un valor.
Un qubit representa un estado cuántico que puede transformarse y posteriormente medirse.
En un lenguaje clásico estamos acostumbrados a operaciones como:
x = x + 1
o:
x = !x
En un lenguaje cuántico aparecen operaciones como las puertas cuánticas.
Por ejemplo:
X(q)
La puerta X tiene un comportamiento similar al NOT clásico sobre los estados básicos:
|0⟩ → |1⟩
|1⟩ → |0⟩
Otra puerta fundamental es H, la puerta de Hadamard.
Aplicada a |0⟩, produce una superposición:
H(|0⟩) = 1/√2 |0⟩ + 1/√2 |1⟩
Es decir, una operación que en un lenguaje clásico podríamos imaginar como una transformación de un valor, en el mundo cuántico transforma un estado.
Una forma habitual de representar un programa cuántico es mediante un circuito.
Por ejemplo:
q ── H ─────●──── M
│
q ───────────X──── M
Aquí tenemos dos qubits.
Al primero le aplicamos H, después utilizamos ambos en una operación CNOT y finalmente medimos los qubits.
Desde el punto de vista de un lenguaje de programación, esto es bastante interesante.
El programa no solamente describe valores y operaciones. También describe una secuencia de transformaciones sobre estados cuánticos.
Por eso muchos lenguajes y frameworks cuánticos tienen una fuerte relación con la representación de circuitos.
La medición es uno de los conceptos que más claramente rompe nuestras intuiciones clásicas.
Podemos imaginar algo como:
q = |+⟩
donde:
|+⟩ = 1/√2 |0⟩ + 1/√2 |1⟩
Si hacemos: measure(q) obtenemos un resultado clásico: 0 o 1
Pero el proceso de medición también modifica el estado cuántico.
Esto genera una pregunta interesante para el diseño de lenguajes: ¿Qué significa exactamente utilizar nuevamente q después de medirlo?
En un lenguaje clásico, leer una variable normalmente no destruye su valor:
x = 10
print(x)
print(x)
print(x)
En computación cuántica no podemos asumir automáticamente ese comportamiento.
La medición es un efecto que debemos tener en cuenta.
Esta es probablemente una de las diferencias más interesantes desde el punto de vista de los lenguajes de programación.
En un lenguaje clásico podemos hacer:
a = 10
b = a
Tenemos dos valores.
Con un qubit no existe una operación general equivalente a:
q2 = copy(q1)
para copiar arbitrariamente el estado cuántico.
Esto se conoce como el teorema de no clonación cuántica.
No se trata simplemente de que la API de un lenguaje haya decidido prohibir una operación.
Es una propiedad fundamental de la mecánica cuántica.
Y esto tiene consecuencias importantes para el diseño de lenguajes.
Me quedo relargo el post vamos a tener que tener parte 2.
.jpeg)
No hay comentarios.:
Publicar un comentario