
Cuando empiezas a estudiar computación cuántica, tarde o temprano aparecen expresiones como , o . Si vienes del desarrollo de software, como es mi caso, es posible que la primera impresión sea que hemos abandonado la programación para entrar de golpe en el terreno de las matemáticas, y si eres como yo, olvidaste por completos hasta lo básico del álgebra lineal que estudiaste en el instituto o posteriormente en la universidad, y quizá esto sea al desalentador y una pequeña barrera que muchos no superan al entrar en esta disciplina de la computación cuántica.
Mi propósito con este artículo de desmitificar el álgebra lineal que describe los circuitos cuánticos de modo que comprobarás que es más fácil de lo que parece, tan solo hay que desempolvar algunos conocimientos de matemáticas preuniversitarias.
La notación de Dirac, también conocida como notación bra-ket, es esencialmente un lenguaje compacto para trabajar con vectores, vectores duales (que llamaremos brakets) y productos internos. Detrás de símbolos que al comienzo pueden parecer extraños hay, por tanto, conceptos de álgebra lineal, pero como vamos a ver, es bastante sencillo de comprender.
Esto es importante porque la computación cuántica está construida precisamente sobre ese lenguaje matemático, y cuando programes con librerías como Qiskit, te va a hacer falta comprender bien esta notación.
No obstante, podemos aprender a crear circuitos con Qiskit y ejecutar puertas cuánticas sin dominar toda la teoría que existe detrás hasta el mínimo detalle, del mismo modo que podemos empezar a programar sin conocer en profundidad cómo funciona un compilador. Sin embargo, si queremos comprender qué hacen realmente los algoritmos cuánticos, la notación de Dirac termina siendo una herramienta difícil de evitar.
Salvando las distancias, es el equivalente a la lógica booleana en la implementación de puertas lógicas en computación clásica (operaciones AND, XOR, etc.).
Un ket no es más que un vector
Comencemos por el símbolo que encontrarás continuamente:
Se lee «ket psi» y representa un vector de estado perteneciente a un espacio vectorial complejo (lo que quiere decir que sus elementos son números complejos). En computación cuántica, ese vector contiene la información necesaria para describir el estado de un sistema cuántico.
Para un único cúbit, los dos estados de la base computacional se escriben como:
Si has trabajado alguna vez con vectores, ya conoces por tanto la idea que se esconde detrás de los kets. Lo que cambia es la notación, que, como veremos, simplica enormemente trabajar con circuitos y algoritmos cuánticos.
Un cúbit, además, no tiene por qué encontrarse únicamente en uno de esos dos estados. Puede estar en una combinación lineal de ambos:
, con y
Una combinación lineal consiste en multiplicar varios vectores por unos coeficientes y sumarlos.
Los coeficientes y son amplitudes de probabilidad (esto viene de la mecánica cuántica). Al medir el cúbit en la base computacional, la regla de Born asigna las probabilidades y a obtener respectivamente los resultados y .
Conviene detenerse aquí un momento. El estado cuántico no es una lista clásica de probabilidades. Las amplitudes pueden ser números complejos y sus fases relativas participan en fenómenos como la interferencia. Esta diferencia es una de las razones por las que el álgebra lineal compleja aparece continuamente cuando estudiamos algoritmos cuánticos, puesto que un número complejo tiene una representación polar que incluye precisamente esa fase relativa de la que hablamos; sé que no soy muy preciso, y que seguramente un matemático podría hacer muchas puntualizaciones a esta descripción :-)
Del ket al bra
Dirac introdujo una segunda pieza de notación:
Se lee «bra psi». Si el ket se representa mediante un vector columna, su bra asociado es el traspuesto conjugado de ese vector:
El asterisco representa el complejo conjugado. Esta operación puede parecer un detalle formal, pero hace posible definir correctamente el producto interno cuando trabajamos con espacios vectoriales complejos.
Y aquí aparece el juego de palabras que da nombre a la notación: un bra y un ket juntos forman un bracket.
Traspuesto conjugado
El traspuesto conjugado de un vector o matriz se obtiene realizando dos operaciones:
- Transponer: intercambiar las filas por las columnas.
- Conjugar: sustituir cada número complejo por su conjugado, por ejemplo, .
Por ejemplo, dado el estado:
su traspuesto conjugado es:
En computación cuántica, esta operación permite pasar de un ket a su bra . Se representa mediante el símbolo (daga) y también se denomina adjunto hermítico:
El producto interno
Tomemos dos estados y . Podemos calcular:
Esto es un producto interno y su resultado es un escalar complejo. Nos proporciona información sobre la relación entre ambos vectores.
Por ejemplo:
, mientras que
Por eso decimos que y son estados ortogonales y normalizados. Forman una base ortonormal del espacio de estados de un cúbit. Por propiedades de la mecácnica cuántica, se tiene que cumplir que la base que describe el estado cuántico tenga que ser ortonormal.
También podemos comprobar la normalización de un estado mediante:
Si sustituimos , recuperamos precisamente la condición anterior:
Es decir, la notación es compacta, pero debajo seguimos haciendo álgebra lineal.
El producto exterior
Si invertimos el orden obtenemos algo distinto:
Ahora el resultado no es un número, sino un operador lineal, que en una base elegida podemos representar mediante una matriz.
Un ejemplo especialmente útil es:
Este operador es el proyector sobre el estado . De forma análoga, proyecta sobre . Los proyectores aparecen de manera natural al describir matemáticamente las mediciones cuánticas.
Obsérvese la diferencia porque es fácil confundir ambas operaciones al principio:
es un escalar, mientras que
es un operador.
Varios cúbits y el producto tensorial
Hasta ahora hemos trabajado con un cúbit, pero los algoritmos cuánticos interesantes utilizan registros de varios cúbits. La operación que permite componer sus espacios de estados es el producto tensorial.
Dos cúbits en los estados y forman el estado:
En forma vectorial:
Para cúbits, el espacio de estados tiene dimensión . Esta es una propiedad matemática fundamental para comprender por qué la descripción clásica explícita del estado completo crece exponencialmente con el número de cúbits. Pero cuidado: de aquí no se deduce que cualquier algoritmo cuántico proporcione automáticamente una aceleración exponencial. La ventaja depende del problema, del algoritmo y del modelo de computación considerado.
El producto tensorial permite también expresar estados que no pueden escribirse como producto de estados individuales. Por ejemplo, uno de los estados de Bell es:
Este es un estado entrelazado: no puede factorizarse como . La notación de Dirac consigue expresarlo de un modo extraordinariamente compacto.
Las puertas cuánticas, en esencia, operaciones son álgebra lineal
Una puerta cuántica ideal sobre un sistema cerrado se modela mediante un operador unitario. Si representa una puerta y el estado inicial, la evolución se escribe sencillamente como:
Tomemos la puerta de Hadamard:
Aplicada al estado :
Aquí se empieza a apreciar de verdad la utilidad de la notación. En lugar de arrastrar matrices y vectores columna durante toda una explicación, algo muy engorroso tan pronto tenemos varios cúbits, podemos concentrarnos en la transformación del estado.
Lo mismo ocurre con secuencias completas de puertas. Si aplicamos primero y después , escribimos:
Ya se comprueba aquí la utildad de la notación, ¿verdad?
Para alguien acostumbrado a programar, podemos pensar en ello como una composición o secuencia de transformaciones, pero con una diferencia importante: las operaciones cuánticas unitarias obedecen restricciones matemáticas específicas y por lo general, el orden de las operaciones importa.
Por qué la notación de Dirac ayuda a comprender los algoritmos cuánticos
Muchos algoritmos cuánticos pueden entenderse siguiendo la evolución de un estado a través de varias transformaciones. La notación de Dirac permite describir esa evolución sin perder de vista la estructura matemática.
En algoritmos como Deutsch-Jozsa, Grover o la estimación de fase aparecen continuamente superposiciones, cambios de base, productos tensoriales, fases y transformaciones unitarias. Limitarse a observar un circuito dibujado puede mostrarnos qué puertas se ejecutan; seguir además sus estados con notación de Dirac ayuda a comprender qué transformación matemática está produciendo el circuito.
Esta distinción me parece útil para quienes llegamos desde la programación. Las SDK cuánticas nos permiten construir circuitos relativamente pronto, pero saber escribir una puerta Hadamard en una línea de código no equivale todavía a comprender qué está ocurriendo en el espacio de estados ni qué sucede cuando se ejecuta realmente en un computador cuántico real. Para dar ese siguiente paso necesitamos algo de álgebra lineal y un lenguaje adecuado para expresarla. Ese lenguaje es, precisamente, la notación de Dirac, y, como hemos visto, no parece tan complicado.
Lo que conviene recordar
No hace falta memorizar un catálogo enorme de símbolos para empezar. Si tuviese que quedarme con un núcleo mínimo, sería este:
- es un ket, un vector de estado.
- es su bra, el vector dual obtenido mediante trasposición conjugada.
- es un producto interno y produce un escalar.
- es un producto exterior y produce un operador.
- permite componer sistemas mediante el producto tensorial.
- Una puerta cuántica ideal se representa mediante un operador unitario y transforma estados como .
- La condición expresa que el estado está normalizado.
Con estas ideas ya podemos leer una parte importante de la formulación matemática utilizada en computación cuántica sin que cada expresión parezca escrita en un idioma extraño.
Para terminar
La notación de Dirac no es una capa matemática añadida innecesariamente a la computación cuántica. Es una forma concisa de expresar el álgebra lineal que describe sus estados y transformaciones.
Mi recomendación para un programador que empieza no sería estudiar la notación de manera aislada hasta memorizarla, sino utilizarla. Escribe y su vector equivalente, aplica una Hadamard de las dos formas, calcula algún producto interno, combina dos cúbits y comprueba cómo crece el vector de estado. En cuanto haces unas cuantas operaciones a mano, muchos símbolos dejan de parecer abstractos.
Y entonces ocurre algo interesante: los circuitos cuánticos comienzan a verse de otro modo. Ya no son solamente una sucesión de puertas, sino transformaciones sobre vectores en un espacio complejo. Es en ese punto donde la notación de Dirac comienza a convertirse en una herramienta para razonar sobre algoritmos cuánticos y no únicamente en una forma particular de escribir matemáticas.