Categorías
Insights Música

Sonata en Mi menor

Llevo un mes practicando esta pieza, en este arreglo:

No es difícil. Ólafsson le añade al arreglo original para piano, de August Stradal, una sección final en la que dobla el ritmo de la mano derecha. Los puristas del Barroco suelen ser críticos con este tipo de arreglos, pero no es mi problema. La pieza es el segundo movimiento (suele ser un Andante) de la Sonata en Mi menor para órgano de Bach. Esta es una ejecución de la partitura original:

Naturalmente, la primera diferencia tiene que ver con cómo adaptas una pieza para dos manuales y una pedalera para un piano. Hay otra pequeña diferencia: los trinos escritos para el órgano no se tocan siempre en el piano. Cuestión de gusto del intérprete. Al fin y al cabo, la ornamentación es sólo un adorno (excepto en el Aria de las Variaciones Goldberg, en la que es difícil separar la pieza de la ornamentación «a la francesa»).

Categorías
FinTech

Austra

Otro pequeño interludio: si os interesan estas cosas, echad un vistazo a la ayuda online de Austra. Es un lenguaje de expresiones orientado al manejo de series financieras y modelos econométricos. Está todavía en desarrollo, pero ya va tomando forma. Entre otras cosas interesantes, permite usar funciones lambda, y la librería, Austra.Library, utiliza AVX2 para optimizar las operaciones sobre matrices, vectores y series temporales. Hasta 200/300 dimensiones, es generalmente más eficiente que las alternativas, incluso las que usan Intel MKL. A partir de ese punto, naturalmente, Intel MKL es más eficiente. En cualquier caso, tengo la posibilidad de mejorar la implementación para ese volumen de información. Y como última alternativa, puedo incorporar Intel MKL como una opción más; opcional, por supuesto, porque esta librería tiene licencias de pago.

Mi idea es, en el momento en que esté suficientemente maduro, convertir parte del código en open source. Aparte de añadir más algoritmos a la librería básica, quiero dar alternativas al analizador del lenguaje. Ahora mismo, el lenguaje genera árboles de expresiones, que a su vez generan código nativo sobre la marcha. Para una línea de comandos, sin embargo, puede que esto sea excesivo. No voy a destruir el compilador actual, pero quiero subir, antes de abrir el código, un intérprete más modesto que, al mismo tiempo, seguramente será más eficiente para el propósito de la herramienta.

Categorías
Quantum

CNOT

Como no he encontrado una imagen interesante para ilustrar una compuerta CNOT, he puesto el yelmo de Knut, que suena parecido. Sí, a veces las neuronas me patinan.

Compuertas condicionales

El siguiente circuito, extremadamente simple, muestra una compuerta CNOT aplicada al primer y segundo qubit del circuito:

CNOT significa «conditional NOT», una negación condicional, y el parentesco con la negación a secas se evidencia en la simbología asociada: la parte inferior del símbolo es la cruz dentro del círculo que se suele usar para la negación. Se trata de una compuerta que trabaja siempre con dos qubits. Todas las transformaciones que hemos visto hasta ahora sobre dos qubits se creaban componiendo transformaciones sobre un qubit. Con esta compuerta, ya saltamos a transformaciones más complejas.

El papel de una compuerta CNOT consiste en invertir el estado de un qubit de acuerdo con el estado de otro qubit de control. Si el qubit de control vale $0$, el otro bit no se modifica. Si el bit de control es $1$, el otro bit se invierte. En el circuito que acabamos de mostrar, el qubit de control es el menos significativo, y esta es la acción de la compuerta sobre la base del estado:
$$\eqalign{
\operatorname{CNOT}\vert00\rangle&\rightarrow\vert00\rangle\cr
\operatorname{CNOT}\vert01\rangle&\rightarrow\vert11\rangle\cr
\operatorname{CNOT}\vert10\rangle&\rightarrow\vert10\rangle\cr
\operatorname{CNOT}\vert11\rangle&\rightarrow\vert01\rangle
}$$¿Recuerda nuestro truco ninja en la entrada anterior, para calcular rápidamente la acción de una matriz sobre vectores de la base? Cuando una matriz actúa sobre un vector de la base, el resultado se obtiene seleccionando una columna. Eso significa que la primera columna de la matriz tiene que ser el resultado de aplicarla al primer vector de la base, y la última, es el resultado sobre el último vector de la base. Pero yo acabo de enumerar lo que ocurre cuando se aplica CNOT a cada uno de los vectores de la base. Podemos entonces dar ya la representación de CNOT como matriz:

$$\operatorname{CNOT_{LS}} = \pmatrix{1&0&0&0\cr 0&0&0&1\cr 0&0&1&0\cr 0&1&0&0
}$$Para evitar confusiones, he usado el sufijo $ls$ para indicar que esta es la matriz cuando el qubit de control es el menos significativo. Si hacemos que el control lo ejerza el bit más significativo, el de la izquierda, la matriz correspondiente sería:
$$\operatorname{CNOT_{MS}} = \pmatrix{1&0&0&0\cr 0&1&0&0\cr 0&0&0&1\cr 0&0&1&0
}$$¡Compruébelo!

En general, si tenemos una compuerta de un qubit y queremos aplicarla condicionalmente sobre el qubit menos significativo, usando el más significativo como control, la matriz que necesitamos sigue este patrón:

$$\operatorname{CondA} = \pmatrix{I & 0 \cr 0 & A
}$$No hay nada mágico en la fórmula anterior. Si se aplica $\operatorname{CondA}$ a los vectores $\vert00\rangle$ o $\vert01\rangle$, obtenemos el vector original, sin cambios, porque el qubit más significativo de estos dos vectores es $0$. Las dos columnas en las que la matriz original $A$ pinta algo son la tercera y la cuarta, que son los estados de la base con el qubit más significativo a $1$.

The twilight zone

Confieso que me preocupa un poco que en la mayoría de los ejemplos estemos usando matrices con ceros y unos en sus celdas. Puede dar la impresión de que estamos usando valores lógicos, y no es así ni remotamente. Donde estamos viendo un cero, podríamos tener un número complejo arbitrario.

Para compensar esta tendencia, vamos a movernos ahora a la zona «crepuscular». Todos comprendemos sin problemas lo que ocurre cuando el qubit de control es cero o uno: nuestra mente está habituada a trabajar en blanco y negro, ¿no? Pero, ¿qué ocurre si el qubit de control es un gato de Schrödinger? Vamos a diseñar un circuito en el que aplicaremos una transformación de Hadamard precisamente a ese qubit:

En notación algebraica, este circuito se puede escribir así:

$$\operatorname{CNOT_{LS}} \times (I \otimes H)$$¡Mucha atención al orden, que es muy importante! En primer lugar, he puesto la matriz de la condicional a la izquierda de la expresión, aunque es la segunda que se aplica en el circuito. ¿Por qué? Pues porque cuando yo escribo $ABx$ estoy pidiendo que primero se aplique la matriz $B$ al vector $x$, y luego al resultado se le aplique la matriz $A$. Es decir, en $ABx$, la matriz de más a la izquierda es la segunda que se aplica, no la primera.

Por otra parte, escribo $I \otimes H$ porque la matriz de la izquierda es la que corresponde al qubit más significativo, como vimos en la entrada anterior. Hadamard se le aplica sólo al qubit menos significativo, y para completar el circuito, aplicamos la matriz identidad al qubit más significativo.

Ahora calculemos la matriz por partes. Primero, la combinación tensorial de la identidad con Hadamard:

$$I\otimes H = \pmatrix{H&0\cr 0&H} = \frac{1}{\sqrt2}\pmatrix{1&1&0&0\cr1&-1&0&0\cr0&0&1&1\cr0&0&1&-1
}$$La matriz $\operatorname{CNOT}$ que utiliza el qubit menos significativo como control ya la hemos presentado antes. Sólo nos queda multiplicar dos matrices:

$$\frac{1}{\sqrt2}\pmatrix{1&0&0&0\cr 0&0&0&1\cr 0&0&1&0\cr 0&1&0&0} \times \pmatrix{1&1&0&0\cr1&-1&0&0\cr0&0&1&1\cr0&0&1&-1}
$$¿Sabe lo que haría un ninja del álgebra ahora? Sólo calcularía la primera columna del resultado, porque es la que nos importa dado el estado cuántico inicial. Pero como soy buena persona, aquí le dejo la matriz completa del circuito (pero no se fíe de mí, y haga el cálculo por su cuenta):

$$\frac{1}{\sqrt2}\pmatrix{1&1&0&0\cr 0&0&1&-1\cr 0&0&1&1\cr 1&-1&0&0}
$$Como ya hemos dicho, esta matriz tiene que transformar un estado cuántico inicial que es el $\vert00\rangle$, o $\pmatrix{1&0&0&0}^T$ en notación matricial (la $T$ significa que hay que transponer para obtener un vector de columna). El resultado es la primera columna de la matriz de transformación:

$$\frac{1}{\sqrt2}\pmatrix{1\cr0\cr0\cr1}
$$Y este, amigos míos, a pesar de su apariencia inocente, es un estado entrelazado. En concreto, es uno de los estados de Bell, el estado $\vert\Phi^{+}\rangle$. Como dicen en inglés, we’ve got a crazy cookie.

Einstein-Podolski-Rosen

¿Qué ocurre cuando se realiza una medición sobre este estado? Si aplicamos la regla de Born, vemos que podemos obtener solamente uno de dos resultados, $00$ o $11$, de los cuatro resultados posibles. Si obtenemos un $1$ en el bit menos significativo, no tenemos que mirar el más significativo para saber que obligatoriamente es otro $1$.

Si en el diseñador de circuitos de Qiskit creamos este circuito y miramos el panel «Measurement probabilities» veremos este gráfico:

Efectivamente, nos advierte que hay dos posibles lecturas, las antes mencionadas, y que cada una se obtiene en un 50% de los casos.

Categorías
Quantum

Cuatro gatos

Vamos a probar fortuna ahora con un circuito mucho más interesante, que a la larga utilizaremos con cierta frecuencia. Este es el circuito:

Las compuertas $H$, naturalmente, corresponden a transformadas de Hadamard aplicadas a qubits individuales.

SuperHadamard

A modo de recordatorio, esta es la definición de la matriz de Hadamard:

$$H = \frac{1}{\sqrt2} \pmatrix{
1&1\cr 1&-1
}$$El coeficiente $\frac{1}{\sqrt2}$ se incluye para que el determinante de la matriz sea la unidad.

Cuando la transformada de Hadamard se aplica a un qubit que está en el estado inicial $\vert0\rangle$, lo lleva al estado $\vert+\rangle$ de la base de Hadamard, que se expresa en la base computacional como $\frac{1}{\sqrt2}(\vert0\rangle + \vert1\rangle)$. Este es un estado superpuesto, un gato de Schrödinger, que cuando se mide, va a alternar entre ceros y unos con la misma probabilidad. Si nos ponemos solemnes, podríamos decir que acabamos de implementar un generador aleatorio de valores binarios.

¿Qué pasa si tengo dos qubits y le aplico Hadamard a cada uno de ellos? Ya sabemos que para tener una respuesta exacta tenemos que multiplicar tensorialmente dos matrices de Hadamard. Este es el cálculo:

$$\eqalign{
H \otimes H &= \frac{1}{2} \pmatrix{1&1\cr 1&-1} \otimes \pmatrix{1&1\cr 1&-1}\cr
&= \frac{1}{2}\pmatrix{1&1&1&1\cr 1&-1&1&-1\cr 1&1&-1&-1\cr 1&-1&-1&1 }
}$$Ahora queremos saber qué pasa si aplicamos esta matriz al estado inicial del circuito, $\vert00\rangle$:

$$(H\otimes H)\vert00\rangle = \frac{1}{2}\pmatrix{1&1&1&1\cr 1&-1&1&-1\cr 1&1&-1&-1\cr 1&-1&-1&1 } \pmatrix{1\cr0\cr0\cr0} = \frac{1}{2} \pmatrix{1\cr1\cr1\cr1}
$$Vamos a entender mejor el resultado si lo representamos en notación de Dirac:
$$\frac{1}{2}\vert0\rangle + \frac{1}{2}\vert1\rangle + \frac{1}{2}\vert2\rangle + \frac{1}{2}\vert3\rangle
$$Esta es una superposición uniforme de los cuatro vectores de la base de dos qubits. Es decir: un gato de Schrödinger simultáneamente en cuatro estados. También podemos interpretarlo como una superposición uniforme de todos los números enteros del cero al tres.

Si aplicamos una medición a este estado, el resultado puede ser cualquiera de los números del cero al tres, con la misma probabilidad para cada uno de ellos (un cuarto). De vuelta a la solemnidad: hemos programado un generador aleatorio que escupe números del $0$ al $3$.

Los goces de la linealidad

Imaginemos que hemos diseñado un circuito multiqubits, que recibe un número entero de entrada y que hace algún cálculo mágico y genera un valor entero muy interesante por el otro extremo. No voy a complicar la fiesta ahora recordando que ese circuito debe implementar una transformación unitaria. Si lo tuviésemos en cuenta, tendríamos que introducir qubits adicionales para mantener la reversibilidad del circuito. Pero vamos a olvidarnos ahora de ese problema, y aceptemos que tenemos un algoritmo mágico que transforma un número en otro número más interesante.

Supongamos ahora que, en vez de pasarle un número al algoritmo, le pasamos de golpe una superposición uniforme de todos los números representables en el número de qubits de los que disponemos. ¿Qué calculará el algoritmo? Como el «algoritmo» es una matriz, es decir, una transformación lineal, lo que obtendremos es una superposición uniforme de todos los resultados. Es como si hubiésemos aplicado el algoritmo en paralelo a todos los números enteros que podemos representar en nuestro ordenador:

$$A\times \sum_i { \alpha_i \hat{e}_i } = \sum_i { \alpha_i (A\times \hat{e}_i) }
$$Esta propiedad se conoce como paralelismo cuántico, y no es tan útil como parece a primera vista. No lo es porque, cuando midamos, colapsaremos el estado en un único vector propio, y perderemos toda esa información. De todos modos, pronto veremos cómo sacar partido de esta situación.

Algebra lineal, nivel Dios

Termino esta entrada con una nota técnica sobre álgebra lineal, que nos va a ser muy útil para obtener el grado de ninja. A todos nos han contado, en un momento u otro de nuestras vidas, que el mundo está lleno de vectores que pastan por los prados y de matrices cuya obsesión en la vida es transformar cada vector que se le ponga a tiro:

$$Ax$$Vamos a plantearnos esta relación desde otro punto de vista. ¿Y si realmente es el vector quien está actuando sobre la matriz para generar otro vector? Podemos hacerlo, siempre que consideremos que una matriz es una colección de columnas, en vez de una colección de filas, que es la forma más habitual de verlas. Observe cómo un vector parasita a una matriz y genera un vector combinando linealmente las columnas de la misma:

$$\pmatrix{a_1&b_1&c_1\cr a_2&b_2&c_2\cr a_3&b_3&c_3} \pmatrix{x_1\cr x_2\cr x_3} = x_1\pmatrix{a_1\cr a_2\cr a_3} + x_2\pmatrix{b_1\cr b_2\cr b_3} + x_3\pmatrix{c_1\cr c_2\cr c_3}
$$Esta intuición nos sirve, si estamos implementando una librería de matrices con aceleración por hardware, para representar las matrices como vectores de columnas. Lo he probado en C++, usando funciones intrínsecas y, efectivamente, es más eficiente implementar la multiplicación de matrices por vectores usando SIMD como una combinación lineal de las columnas de la matriz. De hecho, el convenio de FORTRAN siempre ha sido almacenar las matrices por columnas, no por filas.

Pero no es esto lo que quiero mostrarle exactamente. Imaginemos que el vector $x$ pertenece a la base. En ese caso, uno de sus componentes será un $1$, y el resto, $0$. Veamos cómo transformaría nuestra matriz de Hadamard de $4\times4$ el estado $\vert10\rangle$:

$$(H\otimes H)\vert10\rangle = \frac{1}{2}\pmatrix{1&1&1&1\cr 1&-1&1&-1\cr 1&1&-1&-1\cr 1&-1&-1&1 } \pmatrix{0\cr0\cr1\cr0} = \frac{1}{2} \pmatrix{1\cr1\cr-1\cr-1}
$$Si observamos bien, vemos que lo que ha hecho el vector es seleccionar directamente la tercera columna de la matriz. ¿Por qué? Pues porque $\vert10\rangle$ es el tercer vector de la base: dos ceros, un uno y otro cero. Una combinación lineal de las columnas, en este caso, va directamente a por la tercera columna.

Esto tiene una segunda consecuencia: ya hemos visto que en un ordenador cuántico, el vector de estado siempre se inicializa con ceros: $\vert000\cdots0\rangle$. Este es el primer vector de la base computacional: un $1$ en el primer componente, seguido de un montón de ceros. ¿Qué le va a hacer este astuto vector a una inocente matriz? ¡Pues seleccionar la primera columna!

Esto es un truco muy útil. Si tenemos una matriz de $2^N\times2^N$ que representa a todo un circuito, en realidad sólo necesitamos las $2^N$ celdas de la primera columna, porque sabemos a ciencia cierta cómo funciona la inicialización del ordenador cuántico.

Categorías
Quantum

Compuertas y circuitos

Tras presentar el estado cuántico de un qubit, vimos las transformaciones unitarias que actuaban sobre dicho estado. Ahora, que ya hemos presentado el estado de un grupo de qubits, tenemos que ver las transformaciones unitarias que nos permitirán manejar su estado.

Compuertas

Cuando se trata de operaciones sobre qubits individuales, no es mayor problema utilizar directamente las matrices en notación de componentes. El vector de estado de un qubit se representa con dos componentes complejos, por lo que las matriz son «simples» matrices complejas de $2\times2$. En cambio, es más pesado tener que listar los componentes de matrices con más dimensiones.

La alternativa, que todo el mundo sigue, es representar las transformaciones mediante compuertas cuánticas y combinar estas compuertas en circuitos. Por supuesto, detrás de todo circuito hay, simple y llanamente, una matriz probablemente enorme que es la que realiza la transformación necesaria antes de la medición. A mí, personalmente, me resulta muchísimo más fácil entender el funcionamiento de un algoritmo calculando las matrices asociadas pero, eso espero, con el tiempo uno llega a familiarizarse con la notación de circuitos y desarrollar la intuición necesaria para ahorrarse unos cuantos pasos. En cualquier caso, intentaré dar las herramientas para pasar de compuertas a matrices y, en el caso de circuitos correspondientes a algoritmos sencillos, del circuito completo a la matriz resultante.

Para el diseño de circuitos y algoritmos, mi recomendación es utilizar Qiskit, de IBM. Qiskit te permite crear una cuenta gratuita, y te da acceso a dos herramientas muy útiles para crear y evaluar circuitos: mediante software gráfico y a través de Python. No soy un entusiasta de Python, pero para este tipo de tareas no duele mucho usarlo. La siguiente imagen muestra parte de la barra de herramientas del editor gráfico, y un circuito muy sencillo con dos qubits, a los cuales se le está aplicando una inversión (la compuerta que parece una cruz) y una medición (la línea inferior representa la salida de bits clásicos del algoritmo):

El objetivo de esta entrada no es ponernos ya a diseñar circuitos: cuando llegue el momento, es preferible mostrar el código en Python. Ahora nos interesa la parte matemática, sobre cómo definir transformaciones que afecten a más de un qubit. Utilizo Qiskit para no tener que dibujar los circuitos a mano.

Hay alternativas a Qiskit. Las principales que conozco son Q#, una iniciativa de Microsoft, e incluso librerías de Matlab. Q# es interesante, pero en estos momentos es una pequeña tragedia hacer que funcione a la primera en Visual Studio. Y Matlab es de pago.

Cómo combinar matrices

Volvamos al circuito que he mostrado antes:
Este circuito muestra dos qubits, $q_0$ y $q_1$. A cada uno de ellos se le aplica una negación: la matriz $X$ que ya hemos visto, que convierte ceros en unos y viceversa, y que Qiskit representa como un círculo con una cruz dentro. Luego se realizan las mediciones. El resultado es muy tonto: obtenemos un $11$ clásico:

  1. Asumimos que cada qubit se inicializa en el estado $\vert0\rangle$. Es decir, el sistema de dos qubits se inicializa en el estado conjunto $\vert00\rangle$.
  2. Cada inversión convierte su qubit al estado $\vert1\rangle$. El sistema queda en un estado puro $\vert11\rangle$.
  3. Por supuesto, al medir obtendremos ese estado, sin ningún tipo de incertidumbre.

Sabemos que la matriz o compuerta $X$ tiene la siguiente representación en notación de componentes:
$$\pmatrix{0&1\cr1&0}
$$La pregunta nuestra es: ¿cómo representamos la matriz que aplica una negación por separado a cada uno de los qubits? En este caso, la intuición podría ayudarnos a determinar el contenido de la matriz, pero vamos a aprovechar que es un ejercicio sencillo para poner a punto la herramienta matemática que necesitaremos para casos más complicados. Esa herramienta es la multiplicación tensorial de matrices (previsible, ¿no?).

Supongamos que tenemos dos matrices $A$ y $B$, y que queremos calcular el producto tensorial de las dos:
$$\pmatrix{a_{11}&a_{12}\cr a_{21}&a_{22}}\otimes\pmatrix{b_{11}&b_{12}\cr b_{21}&b_{22}}
$$La definición de producto tensorial de matrices es un poco engorrosa, pero no es complicada:
$$\pmatrix{
a_{11}\times\pmatrix{b_{11}&b_{12}\cr b_{21}&b_{22}}&
a_{12}\times\pmatrix{b_{11}&b_{12}\cr b_{21}&b_{22}}\cr
a_{21}\times\pmatrix{b_{11}&b_{12}\cr b_{21}&b_{22}}&
a_{22}\times\pmatrix{b_{11}&b_{12}\cr b_{21}&b_{22}}
}$$Simplificando, nos queda esto:
$$\pmatrix{
a_{11}b_{11}&a_{11}b_{12}&a_{12}b_{11}&a_{12}b_{12}\cr
a_{11}b_{21}&a_{11}b_{22}&a_{12}b_{21}&a_{12}b_{22}\cr
a_{21}b_{11}&a_{21}b_{12}&a_{22}b_{11}&a_{22}b_{12}\cr
a_{21}b_{21}&a_{21}b_{22}&a_{22}b_{21}&a_{22}b_{22}
}$$Es muy importante dominar esta técnica. Asegúrese de que comprende de dónde sale cada celda del resultado antes de seguir adelante.

En nuestro ejemplo, queríamos combinar dos matrices $X$:
$$\pmatrix{0&1\cr1&0}\otimes\pmatrix{0&1\cr1&0}
$$En el paso intermedio, obtenemos esto:
$$\pmatrix{
0\times\pmatrix{0&1\cr1&0}&
1\times\pmatrix{0&1\cr1&0}\cr
1\times\pmatrix{0&1\cr1&0}&
0\times\pmatrix{0&1\cr1&0}
}$$Simplificando:
$$\pmatrix{
0&0&0&1\cr
0&0&1&0\cr
0&1&0&0\cr
1&0&0&0
}$$Intuitivamente, el resultado tiene buen aspecto: la matriz $X$ de dos dimensiones parece una matriz con la diagonal invertida, y esta matriz resultado tiene la misma forma. ¿Cómo comprobamos que es correcta? Muy sencillo. La base para dos qubits tiene cuatro vectores, que son $\vert00\rangle,\vert01\rangle,\vert10\rangle,\vert11\rangle$. Estos cuatro vectores, sin embargo, tienen una representación en componentes que puede resultar confusa si no la domina todavía. Vamos a hacer los cálculos y las representaciones explícitos. Para el primer vector de la base:
$$(X\otimes X)\vert00\rangle = \pmatrix{
0&0&0&1\cr
0&0&1&0\cr
0&1&0&0\cr
1&0&0&0
} \times \pmatrix {1\cr0\cr0\cr0} = \pmatrix {0\cr0\cr0\cr1} = \vert11\rangle
$$Para el segundo vector:
$$(X\otimes X)\vert01\rangle = \pmatrix{
0&0&0&1\cr
0&0&1&0\cr
0&1&0&0\cr
1&0&0&0
} \times \pmatrix {0\cr1\cr0\cr0} = \pmatrix {0\cr0\cr1\cr0} = \vert10\rangle
$$Tercer vector:
$$(X\otimes X)\vert10\rangle = \pmatrix{
0&0&0&1\cr
0&0&1&0\cr
0&1&0&0\cr
1&0&0&0
} \times \pmatrix {0\cr0\cr1\cr0} = \pmatrix {0\cr1\cr0\cr0} = \vert01\rangle
$$Y el cuarto vector:
$$(X\otimes X)\vert11\rangle = \pmatrix{
0&1&0&0\cr
1&0&0&0\cr
0&1&0&0\cr
1&0&0&0
} \times \pmatrix {0\cr0\cr0\cr1} = \pmatrix {1\cr0\cr0\cr0} = \vert00\rangle
$$Perdone que haya sido tan pedante y haya escrito explícitamente todos los detalles. La programación, en general, es el reino de los detalles. En este caso, hemos podido comprobar que la matriz combinada invierte los ceros y unos en el estado cuántico combinado.

El orden de los factores

Sin embargo, me he dejado un detalle importante en el tintero: el orden de los qubits. En un estado como $\vert01\rangle$, ¿cuál es el qubit más significativo? ¿Es el $0$ o el $1$? Todo depende del convenio, pero una vez elegido uno, hay que atenerse estrictamente a él. Nuestro convenio será que en $\vert01\rangle$ el bit más significativo es el de la izquierda, es decir, el $0$, y el menos significativo es el de la derecha, el $1$.

Recuerde, además, que $\vert01\rangle$ es realmente $\vert0\rangle\otimes\vert1\rangle$, esto es, un producto tensorial. Esto es muy importante también para combinar correctamente matrices. Nuestro primer ejemplo de producto tensorial fue muy sencillo porque las dos matrices eran idénticas, y no tuvimos que preocuparnos por su orden relativo. Vamos a suponer que nuestro circuito tiene esta otra forma:

Esta vez queremos invertir solamente el qubit menos significativo. Aparentemente, además, sólo tenemos una matriz, pero eso no es del todo cierto. Lo que queremos calcular ahora es la matriz combinada $I\otimes X$, donde $I$ es la matriz identidad.

Observe el orden: primero va la matriz identidad $I$… ¡porque cuando representamos el sistema de dos qubits, hemos elegido que el más significativo sea el de la izquierda! Y la matriz $X$ es entonces el segundo operando. Queremos entonces calcular esto:

$$\pmatrix{1&0\cr0&1}\otimes\pmatrix{0&1\cr1&0}
$$Expandiendo, según la definición de producto tensorial:
$$\pmatrix{
1\times\pmatrix{0&1\cr1&0}&
0\times\pmatrix{0&1\cr1&0}\cr
0\times\pmatrix{0&1\cr1&0}&
1\times\pmatrix{0&1\cr1&0}
}$$Y si simplificamos:
$$\pmatrix{
0&1&0&0\cr
1&0&0&0\cr
0&0&0&1\cr
0&0&1&0
}$$Esto, así de repente, es chino mandarín, y la única manera sensata de comprobar que no nos hemos equivocado es comprobar directamente las transformaciones.
$$(I\otimes X)\vert00\rangle = \pmatrix{
0&1&0&0\cr
1&0&0&0\cr
0&0&0&1\cr
0&0&1&0
} \times \pmatrix {1\cr0\cr0\cr0} = \pmatrix {0\cr1\cr0\cr0} = \vert01\rangle
$$
$$(I\otimes X)\vert01\rangle = \pmatrix{
0&1&0&0\cr
1&0&0&0\cr
0&0&0&1\cr
0&0&1&0
} \times \pmatrix {0\cr1\cr0\cr0} = \pmatrix {1\cr0\cr0\cr0} = \vert00\rangle
$$
$$(I\otimes X)\vert10\rangle = \pmatrix{
0&1&0&0\cr
1&0&0&0\cr
0&0&0&1\cr
0&0&1&0
} \times \pmatrix {0\cr0\cr1\cr0} = \pmatrix {0\cr0\cr0\cr1} = \vert11\rangle
$$
$$(I\otimes X)\vert11\rangle = \pmatrix{
0&1&0&0\cr
1&0&0&0\cr
0&0&0&1\cr
0&0&1&0
} \times \pmatrix {0\cr0\cr0\cr1} = \pmatrix {0\cr0\cr1\cr0} = \vert10\rangle
$$Nuestra matriz, por lo tanto, transforma $00\rightarrow01$, $01\rightarrow00$, $10\rightarrow11$ y $11\rightarrow11$. Esto es, lo que hace es cambiar el estado del bit menos significativo… que era lo que estábamos buscando. Como ejercicio, puede calcular cuál sería la representación en componentes de la matriz $X\otimes I$, que debe invertir el estado del qubit más significativo. Y si quiere adelantarse a la siguiente entrada, pruebe fortuna con $H\otimes H$, donde $H$ es la transformación de Hadamard que ya hemos visto.

Advertencia

Todas las matrices y estados que hemos visto tienen componentes que son o $0$ o $1$. Esto puede llevar a confusión: ese cero es realmente un cero «complejo», y lo mismo se aplica al uno. No pierda de vista, aunque en estos primeros ejemplos no importe mucho, que en vez de ceros y unos, nuestras matrices y vectores pueden contener, y contendrán, números complejos.

Categorías
Quantum

Entrelazamiento

Son dos los fenómenos que hacen de la Mecánica Cuántica una teoría extraña: la superposición y el entrelazamiento. En ambos casos, la explicación más sencilla consiste en mirar las matemáticas.

Superposición

De los dos fenómenos, el más fácil de entender es la superposición, porque es una consecuencia de la linealidad de la ecuación de Schrödinger. Si un sistema puede estar en el estado $\vert\psi\rangle$ y en el estado $\vert\phi\rangle$, teóricamente puede estar también en cualquier estado intermedio $\alpha\vert\psi\rangle + \beta\vert\phi\rangle$. Traducido al mundo de los ordenadores cuánticos: un qubit no sólo puede estar en el estado que nosotros interpretaremos como $0$ y en el estado $1$, sino que puede estar, aunque no lo «veamos» directamente, en cualquier estado situado entre esos dos valores. Por ejemplo, si le aplicamos la transformación de Hadamard a un qubit que está en el estado inicial $\vert0\rangle$, obtenemos el estado mixto $\frac{1}{\sqrt{2}}(\vert0\rangle + \vert1\rangle)$.

Si estamos, por el contrario, en un sistema de $N$ qubits, podemos aplicar una transformada de Hadamard a cada uno de los qubits, y obtendremos una superposición de todos los enteros representables en esos qubits (esto lo veremos en breve). De manera que, si tengo $16$ qubits, puedo tener todos los números del $0$ al $65.535$ representados al mismo tiempo en esos registros. Lo mejor de todo: si le aplico una transformación unitaria a esos $16$ qubits, voy a estar transformando al mismo tiempo los $65.536$ valores posibles, gracias a la linealidad de estas transformaciones. Todo en su momento…

No obstante, lo que estoy diciendo es que matemáticamente es fácil comprender la superposición; no que sea fácil darle un sentido físico a la misma. La superposición es el origen de la famosa paradoja del Gato de Schrödinger, que estaba tanto vivo como muerto hasta el momento en que decidíamos realizar una medición.

Graduum libertatis

Para entender el problema del entrelazamiento, tenemos que comprender cómo funcionan los grados de libertad en un sistema cuántico. Imaginemos una partícula puntual moviéndose dentro de un mundo clásico en tres dimensiones. Un físico describiría la partícula mediante dos vectores: la posición y el impulso de la misma, es decir, la velocidad multiplicada por la masa. Seis componentes.

Ahora supongamos que nuestro universo tiene dos partículas. El físico clásico utilizaría entonces cuatro vectores: dos por cada partícula. En total, doce componentes. Lo que hemos hecho es concatenar dos espacios vectoriales de seis dimensiones. El mundo clásico es así de «sencillo».

$$\mathbb{R}^6 \oplus \mathbb{R}^6 = \mathbb{R}^{12}$$

Pero eso no es lo que hemos hecho al pasar de uno a dos qubits… o mejor, a tres qubits, para evitar confusiones. El estado cuántico de un qubit es $\mathbb{C}^2$, o un espacio proyectivo dentro de éste, si nos ponemos exquisitos. Sin embargo, hemos visto que el estado de dos qubits es $\mathbb{C}^4$, y el de tres qubits, $\mathbb{C}^8$. Aquí no estamos usando la concatenación de espacios vectoriales, sino el (¡ta-dah!) producto tensorial de estos espacios:

$$\mathbb{C}^2 \otimes \mathbb{C}^2 \otimes \mathbb{C}^2 = \mathbb{C}^8$$

Es hora de ponernos serios y explicar qué es eso del…

Producto tensorial de espacios

El producto tensorial de dos espacios vectoriales es un tontería, créame. Supongamos que tenemos un espacio vectorial arbitrario (no necesariamente cuántico) de dimensión $n_1$, con una correspondiente base formada por $n$ vectores, a los que vamos a llamar $e_1, e_2 \cdots e_{n1}$. Ahora vamos a elegir un segundo espacio vectorial… qué narices… voy a multiplicar el espacio consigo mismo, para no tener que inventarme una segunda base. El espacio original se llamaba (se me había olvidado), $V$. No es muy original, pero nos valdrá. Y queremos ver cómo se define el espacio $V \otimes V$.

La idea es definir la base del nuevo espacio como todos los pares posibles de vectores $e_i \otimes e_j$, tal que:

$$i \neq j \rightarrow e_i \otimes e_j \neq e_j \otimes e_i$$

Si el espacio original tenía $n_1$ dimensiones, el espacio producto tiene $n_1 \times n_1$ dimensiones o componentes. Es exactamente lo mismo que vimos en la entrada anterior, pero ahora le ponemos un nombre bonito y una definición más o menos formal.

Nuestro espacio de un qubit tenía dos vectores en la base: $\vert0\rangle$ y $\vert1\rangle$. Por lo tanto, la base de un espacio de dos qubits es la siguiente:

$$\eqalign{
\vert0\rangle \otimes \vert0\rangle &\equiv \vert0\rangle\vert0\rangle \equiv \vert00\rangle \cr
\vert0\rangle \otimes \vert1\rangle &\equiv \vert0\rangle\vert1\rangle \equiv \vert01\rangle \cr
\vert1\rangle \otimes \vert0\rangle &\equiv \vert1\rangle\vert0\rangle \equiv \vert10\rangle \cr
\vert1\rangle \otimes \vert1\rangle &\equiv \vert1\rangle\vert1\rangle \equiv \vert11\rangle}$$

Es decir: lo mismo que ocurría en la entrada anterior, pero ahora tenemos otras dos maneras equivalentes de escribir los vectores de la base.

Toda esta pedantería formal, aclaro, es necesaria para lo que viene a continuación.

Producto tensorial de vectores

Al definir el producto tensorial de dos «espacios» vectoriales, implícitamente definimos también un producto tensorial entre vectores de las bases. Podemos definir un producto tensorial entre «vectores», en vez de espacios, si complementamos el producto tensorial de las bases con el requisito adicional de linealidad. Es decir:

$$\displaylines{(a\vert\phi\rangle + b\vert\psi\rangle) \otimes (c\vert\phi\rangle + d\vert\psi\rangle) \equiv\cr
\quad ac\vert\phi\rangle\vert\phi\rangle + ad\vert\phi\rangle\vert\psi\rangle + bc\vert\psi\rangle\vert\phi\rangle + bd\vert\psi\rangle\vert\psi\rangle}
$$Recuerde que $\vert\phi\rangle\vert\psi\rangle$ es simplemente una abreviatura de $\vert\phi\rangle\otimes\vert\psi\rangle$. Por poner un ejemplo, si multiplicamos uno de los vectores de la base computacional por uno de la base de Hadamard, obtendríamos:

$$\vert0\rangle \otimes \frac{1}{\sqrt 2}(\vert0\rangle + \vert1\rangle) =\frac{1}{\sqrt 2}(\vert00\rangle + \vert01\rangle)
$$Esta operación, en particular, nos permite obtener un vector combinado en el espacio de dos qubits a partir de dos estados independientes en el espacio de un solo qubit.

Ahora sí: entrelazamiento

Supongamos que estamos trabajando con tres qubits:

$$\mathbb{C}^2 \otimes \mathbb{C}^2 \otimes \mathbb{C}^2 = \mathbb{C}^8$$

¿Cuántos números complejos, a bote pronto, necesitamos para representar un estado de este espacio? Si ignoramos la existencia de la equivalencia de fase y el convenio de normalización, necesitaremos ocho números complejos. Si tenemos en cuenta que el espacio de estados es realmente un estado proyectivo, en realidad necesitamos siete números complejos.

Podemos definir algunos estados en $\mathbb{C}^8$ componiendo tensorialmente estados independientes de un qubit. La gran pregunta que tenemos que hacernos es: ¿nos basta esta composición de vectores independientes para generar todos los elementos de $\mathbb{C}^8$? La respuesta es un rotundo no.

Un estado de un qubit se representa mediante dos valores reales o, alternativamente, un valor complejo. Incluso si ignoramos las equivalencias de fase y la normalización, hay sólo dos complejos en cada qubit. Tres qubits, explicados independientemente, nos dan un total bruto de seis valores complejos, que en neto son realmente tres complejos. Ni de broma alcanzamos a cubrir todas las descripciones basadas en siete números complejos que hacen falta para tres qubits. Lo podemos enmarcar en un cuadro y colgarlo en la pared de la oficina:

Hay más estados en un sistema de $N$ qubits que los que se pueden describir especificando estados independientes para cada qubit.

He empezado con el caso de los tres qubits para evitar confusión debida a que $2^2=2+2$. Pero cuando hay dos qubits ocurre lo mismo: tratados independientemente, necesitamos cuatro valores reales, o dos complejos. Tratados en conjunto, necesitamos tres complejos o seis reales.

Si este razonamiento top-down no le convence, probemos uno bottom-up. Consideremos este estado de dos qubits:

$$\frac{1}{\sqrt 2}(\vert00\rangle+\vert11\rangle)$$Le reto a encontrar dos estados de un qubit que, multiplicados tensorialmente, den lugar a este estado de dos qubits. Veamos la definición de producto tensorial de vectores:

$$\displaylines{(a\vert0\rangle + b\vert1\rangle) \otimes (c\vert0\rangle + d\vert1\rangle) \equiv\cr
\quad ac\vert00\rangle + ad\vert01\rangle + bc\vert10\rangle + bd\vert11\rangle}
$$Si queremos que se anulen los estados $01$ y $10$, necesitamos que $ad=bc=0$. Pero cualquier combinación que consiga esto, también conseguirá que se anulen los otros dos términos. La conclusión: no podemos explicar este estado descomponiéndolo en qubits independientes.

Medición entrelazada

¿Qué ocurre si realizamos una medición sobre un estado entrelazado como $\frac{1}{\sqrt 2}(\vert00\rangle+\vert11\rangle)$? Tenemos una combinación lineal de dos de los cuatro vectores propios, o eigenvectors, del espacio de estados. Por lo tanto, la medición no será determinista. Podemos obtener tanto el estado $\vert00\rangle$ como $\vert11\rangle$, y la probabilidad de obtener cualquiera de ellos es la misma.

Lo interesante es que, si obtenemos un $1$ en el primer qubit, no necesitamos mirar el contenido del segundo qubit: por fuerza, tiene que ser otro $1$. Lo mismo ocurre si recibimos un $0$ en uno de los qubits: el otro tendrá el mismo valor. Si estamos pensando en un ordenador cuántico, en el que los qubits están muy cercanos físicamente, esto puede que no nos sorprenda. Pero nadie ha dicho que los qubits tengan que estar uno al lado del otro. Uno de ellos puede estar en la Tierra y el otro en el planeta Raticulín.

Esta es una variante más o menos abstracta de la famosa paradoja de Einstein-Podolsky-Rosen, o paradoja EPR.

Dependencia de la base

¿Hay algo intrínseco en un estado cuántico dado que nos permita asegurar que es un estado superpuesto o entrelazado? Resulta que no: tanto la superposición como el entrelazamiento son fenómenos que dependen de la elección de una base. Por ejemplo, el estado $\frac{1}{\sqrt 2}(\vert00\rangle+\vert11\rangle)$ es un estado entrelazado para mediciones en la base computacional. Pero si vamos a realizar la medición en la llamada base de Bell, para sistemas de dos qubits, el estado anterior es un «estado puro». El truco está en que la base de Bell se define de esta manera:

$$\eqalign{
\vert\Phi^{+}\rangle =& \frac{1}{\sqrt 2}(\vert00\rangle+\vert11\rangle) \cr
\vert\Phi^{-}\rangle =& \frac{1}{\sqrt 2}(\vert00\rangle-\vert11\rangle) \cr
\vert\Psi^{+}\rangle =& \frac{1}{\sqrt 2}(\vert01\rangle+\vert10\rangle) \cr
\vert\Psi^{-}\rangle =& \frac{1}{\sqrt 2}(\vert01\rangle-\vert10\rangle)
}$$No obstante, en la base de Bell también habrá estados entrelazados. En realidad, volveremos a tener más estados entrelazados que estados descomponibles.

Categorías
Quantum

Shave and a haircut

Vamos a generalizar el concepto de estado cuántico y de transformación unitaria a sistemas de más de un qubit. Este es el momento en que los libros entran en un pequeño berenjenal llamado producto tensorial. Nosotros necesitaremos, por supuesto, saber cómo funciona el producto tensorial, pero vamos a introducir el tema de forma gradual y, espero, más intuitiva. Comenzaremos con el estado de un sistema con sólo dos qubits.

Two qubits

Ya sabemos que el estado de un sistema de $N$ qubits es un vector complejo en $\mathbb{C}^{2^N}$, con $2^N$ componentes. Un qubit tiene dos componentes, dos qubits, cuatro; tres qubits tienen ocho componentes y diez, mil veinticuatro. No hay nada sorprendente ni esotérico en que aparezca una exponencial en nuestras cuentas. Diez bits clásicos también dan para representar hasta 1024 valores. Pero es cierto que diez qubits tienen infinitamente más estados internos que su contrapartida clásica, como veremos en breve.

Esto también significa que la base vectorial de un sistema de $N$ qubits tiene $2^N$ vectores. En el caso de un qubit, teníamos una base con dos vectores, los ya familiares $\vert0\rangle$ y $\vert1\rangle$. Con dos qubits, vamos a tener una base de cuatro vectores, y vamos a denominarlos así:

$$\vert00\rangle, \vert01\rangle, \vert10\rangle, \vert11\rangle$$Cualquier estado del sistema de dos qubits, entonces, puede describirse como una combinación lineal de estos cuatro vectores:

$$\vert\psi\rangle = c_{00}\vert00\rangle+c_{01}\vert01\rangle+c_{10}\vert10\rangle+c_{11}\vert11\rangle$$En notación matricial, por ejemplo, el estado $\vert00\rangle$ se representaría:

$$\pmatrix{1\cr 0\cr 0\cr 0}$$Como esta notación consume mucho espacio vertical, a veces representaremos este vector mediante su transpuesta (no su transpuesta conjugada):

$$\pmatrix{1&0&0&0}^T$$Tenemos que tener cuidado en cómo interpretamos la notación matricial. Por ejemplo, el vector $\vert11\rangle$ corresponde a esta matriz:

$$\pmatrix{0\cr 0\cr 0\cr 1}\quad\text{ó}\quad\pmatrix{0&0&0&1}^T$$Para poder usar la notación matricial es necesario acordar un orden en los vectores de la base. Lo que hemos hecho es utilizar implícitamente el llamado orden lexicográfico o de diccionario. El otro detalle a cuidar es el orden de los ceros y unos en vectores como $\vert01\rangle$ y $\vert10\rangle$. Nosotros siempre consideraremos que el primer qubit es el de más a la derecha.

Una forma alternativa de escribir estos vectores de la base es dejándonos de pamplinas, y traduciendo las cadenas de bits a notación decimal:

$$\vert0\rangle, \vert1\rangle, \vert2\rangle, \vert3\rangle$$La desventaja de esta notación es que hace falta tener muy claro el número de qubits en el sistema. Por ejemplo, $\vert3\rangle$ podría significar $\vert11\rangle$ en nuestro sistema de dos qubits, pero también $\vert0011\rangle$ en un ordenador de cuatro. En ocasiones, para evitar esta incertidumbre, escribiremos cosas como $\vert3\rangle_2$ o incluso $\vert3\rangle_N$, para dejar claro el número de qubits del sistema.

Potencias de dos

El número $4$ es bastante engañoso, porque $4 = 2+2 = 2\times2 = 2^2$. ¿Qué tamaño tiene el espacio de estado de un sistema, digamos, de cuatro qubits? El espacio vectorial subyacente es $\mathbb{C}^{2^4}$, es decir, $\mathbb{C}^{16}$, y la base vectorial tendrá $16$ elementos:

$$\displaylines{\vert0\rangle, \vert1\rangle, \vert2\rangle, \vert3\rangle, \vert4\rangle, \vert5\rangle, \vert6\rangle, \vert7\rangle,\cr
\vert8\rangle, \vert9\rangle, \vert \text{A}\rangle, \vert \text{B}\rangle, \vert \text{C}\rangle, \vert \text{D}\rangle, \vert \text{E}\rangle, \vert {F}\rangle}$$Esta vez he abreviado el contenido de los kets usando la notación hexadecimal, pero podía haber usado igualmente notación binaria o decimal, siempre que estuviese claro el contexto.

Lo importante en este punto es tener claro que cualquier espacio de estados en un ordenador cuántico va a tener una base cuyo tamaño es una potencia de dos. Esto importa porque, al diseñar algunos algoritmos como la Transformada Cuántica de Fourier, utilizaremos técnicas como “divide y vencerás”, que funcionan mejor cuando se trabaja sobre potencias de dos.

La insoportable gravedad del ser

Imaginemos que hay que simular un ordenador cuántico mediante un ordenador clásico. Supongamos que queremos simular 100 qubits. ¿Cuán difícil es? $2^{10}$ es $1.024$, pero $2^{100}$ es este monstruo:

$$1.267.650.600.228.229.401.496.703.205.376$$O, en notación científica decimal, 1,267E30. Ese es el número de componentes complejos en un simple estado cuántico. Ahora bien, la programación cuántica tiene una buena parte que consiste en multiplicar matrices o aplicar matrices a un estado cuántico. Calcule por su cuenta el tamaño de una matriz de transformación para un estado cuántico como el descrito.

Los ordenadores cuánticos más grandes en estas fechas tienen unos 50 qubits. $2^{50}$ es aproximadamente un 1 seguido de 15 ceros. Un mega son seis ceros, el giga, nueve y el tera, doce. Necesitamos mil teras para representar el estado cuántico completo. Es decir, un peta.

En la siguiente entrada, intentaré justificar cómo es posible este tipo de monstruosidades, y de paso, le presentaré el formalismo de los productos tensoriales.

Categorías
Quantum

Transformaciones unitarias

Un algoritmo cuántico funciona partiendo de un estado inicial en el que todos los qubits están en el estado $\vert 0\rangle$. A partir de ese punto, el estado se transforma mediante matrices, que se implementan físicamente como circuitos lógicos. El objetivo del algoritmo es llevar el estado cuántico a determinado valor. Entonces se realiza una medición.

La «explicación» anterior no «explica» mucho en este momento, pero necesitaba incluirla para saber en qué parte nos encontramos, y hacia dónde vamos. En esta entrada comenzaremos a ver las transformaciones más sencillas que afectan al estado cuántico: aquellas que solamente afectan un qubit cada vez.

Rotaciones complejas

Sabemos que el estado cuántico es un vector complejo. En el caso de un solo qubit, el vector tiene dos componentes. Veremos más adelante que, para $N$ qubits, tendremos $2^N$ componentes. Es fácil ver que, si queremos transformar estos vectores, necesitamos matrices complejas. Lo importante es qué tipo de matrices nos valen: necesitamos matrices unitarias, que son el equivalente de las rotaciones (matrices ortogonales) en un espacio vectorial complejo.

Matemáticamente, si tenemos una matriz compleja $U$, y llamamos $U^*$ a su transpuesta conjugada (cambiamos filas y columnas e invertimos el signo de las partes imaginarias), entonces la matriz es unitaria si se cumple:
$$UU^* = I$$donde $I$ es la matriz identidad. Es decir: toda matriz unitaria tiene una inversa (que es su transpuesta conjugada, en concreto). Este es un detalle importante: un estado cuántico regido por la ecuación de Schrödinger es simétrico respecto al paso del tiempo. Toda transformación cuántica que no implique una medición tiene que ser reversible.

Una propiedad interesante que tienen las matrices unitarias es que preservan el producto escalar entre dos vectores arbitrarios:

$$\langle U\phi\vert U\psi\rangle = \langle\phi\vert\psi\rangle$$Como el producto escalar es proporcional al ángulo entre dos vectores (ángulos complejos, en este caso), tenemos entonces que las matrices unitarias respetan el ángulo entre vectores. La experiencia en tres dimensiones reales nos dice que las rotaciones, precisamente, son las transformaciones que respetan los ángulos. En particular, si se preserva el producto escalar, también se preservará la longitud de los vectores transformados:

$$\vert\vert U\psi\vert\vert = \vert\vert\psi\vert\vert$$

Matrices de Pauli

Ahora tenemos que aprendernos un pequeño repertorio de matrices que actúan sobre un qubit. Las tres primeras matrices que veremos se conocen como matrices de Pauli, y la forma más fácil de recordarlas es utilizar la esfera de Bloch como recurso mnemotécnico:

Hay tres ejes espaciales en esta representación, y a cada uno de ellos le corresponde una matriz: $X$, $Y$ y $Z$. Cada una de ellas representa una rotación de 180 grados alrededor del eje correspondiente. Ojo: estoy hablando de rotaciones en el espacio de la esfera de Bloch, no en el espacio vectorial complejo.

Por ejemplo, la matriz $X$ gira 180 grados el estado cuántico alrededor del eje $X$. Como da la casualidad de que nuestra base computacional está alineada según el eje $Z$, esta transformación transforma el polo norte, el estado $\vert 0\rangle$, en el polo sur $\vert 1\rangle$ y viceversa. En el espacio vectorial complejo, esto equivale a intercambiar los dos componentes complejos, por lo que no nos debe extrañar que la matriz $X$ se escriba de esta manera en la base computacional:

$$X=\pmatrix{0&1\cr 1&0}$$Machaquemos esta información para estar seguro de entenderla. Imaginemos que el estado cuántico en un momento dado es, en la notación de Dirac:

$$\alpha\vert 0\rangle + \beta\vert 1\rangle$$Si le aplicamos la matriz $X$ a este vector, obtenemos un estado con los componentes intercambiados:

$$\beta\vert 0\rangle + \alpha\vert 1\rangle$$Ahora repitamos el cálculo, pero usando directamente la notación matricial:

$$\pmatrix{0&1\cr 1&0} \times \pmatrix{\alpha\cr\beta} = \pmatrix{\beta\cr\alpha}$$Son dos maneras equivalentes de expresar la misma operación.

¿Qué operación clásica convierte los ceros en unos y viceversa? La negación lógica, por supuesto. Podemos entonces considerar que $X$ es la negación dentro de nuestro repertorio de operaciones cuánticas.

Hemos elegido como negación la rotación alrededor del eje $X$, pero podríamos haber elegido también la rotación alrededor de $Y$. Pero no lo hicimos, porque la representación de $Y$ en la base computacional es un poco más complicada:

$$Y=\pmatrix{0&-i\cr i&0}$$Observe que yo no le estoy explicando que la rotación alrededor del eje $Y$ en el espacio de Bloch se corresponde realmente a la matriz que estoy presentando. No es difícil de demostrar, pero para abreviar, se lo dejo de momento a su cargo. Lo que ahora nos interesa es si de verdad esta forma tan rara con números imaginarios es realmente una negación. En realidad, es equivalente solamente cuando se trata de transformar los polos. Pero cualquier otro vector dará un vector con una fase rotada. Simplemente, vamos a preferir $X$ como forma estándar de negación.

La tercera matriz de Pauli es, naturalmente, la matriz $Z$:

$$Z=\pmatrix{1&0\cr 0&-1}$$Obviamente, si aplicamos una rotación de 180 grados alrededor del eje $Z$ a uno de los polos, nos quedaremos como al principio.

La transformación de Hadamard

Las tres matrices de Pauli sólo nos permiten, de momento, movernos de un polo al otro. ¿Qué tal si quisiéramos mover el estado cuántico al ecuador de la esfera de Bloch? Para eso necesitaremos una de las transformaciones más populares en computación cuántica: la transformación de Hadamard, o de Walsh-Hadamard.

$$H=\frac{1}{\sqrt{2}}\pmatrix{1&1\cr 1&-1}$$Veamos qué efecto tiene esta transformación sobre los vectores de la base computacional:

$$\eqalign{
\frac{1}{\sqrt{2}}\pmatrix{1&1\cr 1&-1}\times\pmatrix{1\cr 0} =& \frac{1}{\sqrt{2}}\pmatrix{1\cr 1} \cr
\frac{1}{\sqrt{2}}\pmatrix{1&1\cr 1&-1}\times\pmatrix{0\cr -1} =& \frac{1}{\sqrt{2}}\pmatrix{1\cr -1}}
$$Utilizando la notación de Dirac:

$$\eqalign{
H\vert 0\rangle =& \frac{1}{\sqrt{2}}(\vert0 \rangle + \vert1 \rangle)\cr
H\vert 1\rangle =& \frac{1}{\sqrt{2}}(\vert0 \rangle – \vert1 \rangle)
}$$O, si recordamos la definición de la base de Hadamard:

$$\eqalign{
H\vert 0\rangle =& \vert+ \rangle\cr
H\vert 1\rangle =& \vert- \rangle
}$$Es decir: la transformación de Hadamard mueve los polos a puntos situados en el ecuador de la esfera de Bloch y alineados con el eje $X$.

Como ejercicio, puede comprobar qué ocurre cuando se le aplica la matriz $X$ a los vectores de la base de Hadamard. No olvide la existencia del fenómeno de la equivalencia de fase: si multiplica los dos componentes por un vector unitario, el estado cuántico que se obtiene es indistinguible del original.

¿Unitarias o hermitianas?

Las cuatro matrices que hemos visto comparten una característica que, aunque no tiene mayor importancia, puede provocar confusión. Las hemos presentado aquí porque son matrices unitarias. Por ejemplo, se cumple que:

$$X^* X = I$$Pero al mismo tiempo, ¡las cuatro matrices son hermitianas o auto-adjuntas! Esto es:

$$X^* = X$$… y, por lo tanto:

$$XX = I$$Recuerde que los operadores hermitianos, en Mecánica Cuántica, se utilizan para definir observables, al ser operadores con valores propios siempre reales. Esto tiene alguna importancia en Física. Pero en Computación Cuántica casi siempre utilizaremos la base computacional, y la coincidencia no tiene mayor consecuencia. Sólo la menciono para no confundir el concepto de operador unitario con el de operador hermitiano.

Categorías
Quantum

La esfera de Bloch

Hemos quedado en que el estado de un qubit necesita dos números complejos para representarse. Pero cada número complejo tiene una parte real y otra imaginaria, por lo que en total tenemos cuatro valores reales para cada qubit. ¿Son imprescindibles todo? Parece que no, porque ya conocemos la condición de normalización: $\alpha\alpha^* +\beta\beta^*=1$. Con esta condición, podríamos utilizar solamente tres valores reales, y deducir el cuarto a partir de la normalización.

Equivalencia de fase

En realidad, el estado de un qubit aislado puede representarse con solamente dos números reales. Insisto:

  • El estado de un qubit aislado puede representarse con dos números reales.

Pongo el énfasis en el aislamiento del qubit: cuando tengamos sistemas de más de un qubit, tendremos que volver a la representación con tres valores reales, por culpa del entrelazamiento. Pero en lo que sigue, asumiremos que estamos tratando con un solo qubit suficientemente aislado del resto del universo.

¿De dónde sale la redundancia adicional? Pues del mismo hecho de que estamos tratando en realidad con lo que los matemáticos llaman un espacio proyectivo. A la Naturaleza no le interesan los vectores complejos individuales, sino clases de equivalencia dentro de ese espacio vectorial. Una de esas clases de equivalencia viene dada por la posibilidad de multiplicar un vector complejo por una «fase global». La fase recibe ese nombre de la representación de un número complejo en coordenadas polares:
$$x + iy \equiv \rho\cos\theta + i\rho\sin\theta
$$Haciendo uso de la fórmula de Euler, podemos simplificar la identidad anterior de esta manera:
$$x + iy \equiv \rho e^{i\theta}
$$Al radio $\rho$ se le llama, entre muchos otros nombres, la magnitud, módulo o valor absoluto del número complejo. Al ángulo $\theta$ se le conoce como fase o argumento. Nos quedaremos con «fase».

La idea de la equivalencia de fase es que podemos multiplicar cualquier estado cuántico por una cantidad de la forma $e^{i\phi}$ sin que la multiplicación tenga consecuencias observables. Supongamos que tenemos un estado $\pmatrix{\alpha\cr\beta}$. Si las amplitudes están normalizadas, al realizar una medición tendremos una probabilidad $\alpha\alpha^* $ de medir el estado $\vert 0\rangle$, y $\beta\beta^* $ de medir $\vert 0\rangle$. Si sustituimos $\alpha$ por $\alpha e^{i\phi}$ la primera probabilidad será $\alpha e^{i\phi}(\alpha e^{i\phi})^* $, es decir, $\alpha\alpha^* e^{i\phi}e^{-i\phi}$.

Puede que no vea a la primera, si no ha usado números recientemente, por qué uno de los exponentes cambia su signo. Recuerde que estamos calculando la conjugada de la fase, y que la conjugada sólo cambia el signo de la parte imaginaria. Como la parte imaginaria, según la fórmula de Euler, es $i$ multiplicada por un seno, al invertir el signo del ángulo, invertimos la parte imaginaria. La parte real es un coseno, por lo que el cambio de signo no le afecta. Al final, encontraremos que $\alpha\alpha^* e^{i\phi}e^{-i\phi}$ es igual a $\alpha\alpha^* $, ¡que es exactamente la probabilidad antes de la multiplicación por una fase!

Coordenadas polares

Para aprovechar esta equivalencia, vamos a describir explícitamente un estado con sus amplitudes en coordenadas polares:
$$
\pmatrix{\alpha\cr\beta} = \pmatrix{\vert\alpha\vert e^{i\phi_\alpha}\cr\vert\beta\vert e^{i\phi_\beta}}
$$¿Qué tal si multiplicamos ambas amplitudes por la fase inversa a la fase original de $\alpha$, es decir, por $e^{-i\phi_\alpha}$?
$$
\pmatrix{\alpha\cr\beta} \cong \pmatrix{\vert\alpha\vert\cr\vert\beta\vert e^{i(\phi_\beta – \phi_\alpha)}} =
\pmatrix{\vert\alpha\vert\cr\vert\beta\vert e^{i\phi}}
$$Con esta multiplicación, hemos conseguido que la primera amplitud sea directamente un número real, aunque la segunda amplitud siga siendo un complejo. Pero sabemos, además, que las amplitudes están normalizadas. Por lo tanto, podemos permitirnos sustituir $\vert\alpha\vert$ por $\cos\frac{\theta}{2}$ y $\vert\beta\vert$ por $\sqrt{1 – \vert\alpha\vert^2}$… es decir, por $\sin\frac{\theta}{2}$. He elegido usar $\frac{\theta}{2}$ en vez de $\theta$ directamente por motivos geométricos que veremos enseguida. Con todo esto, hemos conseguido representar el estado de cualquier qubit aislado de la siguiente manera:
$$
\cos\frac{\theta}{2}\vert 0\rangle + e^{i\phi}\sin\frac{\theta}{2}\vert 1\rangle
$$Es decir, para representar un qubit sólo necesitaremos dos valores reales, $\theta$ y $\phi$, que podemos interpretar como dos ángulos dentro de los siguientes rangos:
$$
\eqalign{
\theta\in& [0, \pi]\cr
\phi\in& [0, 2\pi]
}
$$Si recuerda algo de geometría analítica, estos dos ángulos más un radio forman un sistema de coordenadas polares en el espacio tridimensional.

La esfera de Bloch

Podemos, por lo tanto, representar visualmente el estado cuántico de un qubit aislado como un punto dentro de una esfera de radio unitario, como en la siguiente imagen:

En esta representación, la coordenada $\theta$ es la latitud, relativa al polo norte (no al ecuador), y $\phi$ es la longitud, tomando como punto de partida el eje $X$. Hay un problema con las coordenadas polares, en general, que también aparece aquí: la longitud en el polo norte y en el polo sur no está definida. Eso no es un problema, en la práctica.

¿Dónde caen los dos vectores de la base computacional? Pues resulta que $\vert 0\rangle$ es el punto $\lbrace\theta=0, \phi=0\rbrace$, precisamente el polo norte, y $\vert 1\rangle$ es $\lbrace\theta=\pi, \phi=0\rbrace$, el polo sur. He puesto que $\phi$ es cero en estos dos puntos, pero da igual lo que pongamos.

¿Recordáis que en la entrada sobre mediciones, llamamos $M_Z$ al operador de medición de la base computacional? Ahora ya puedo explicar de dónde sale la $Z$: la base computacional se representa como puntos antípodas orientados a lo largo del eje $Z$. En general, cualquier par de puntos antípodas sobre la esfera corresponden a vectores de una posible base. Esto es: serían siempre vectores de longitud unitaria perpendiculares entre sí.

Cabe preguntarse entonces si los puntos antípodas orientados a lo largo del eje $X$ y del eje $Y$ tienen alguna aplicación, o al menos, algún nombre especial. Y sí, tienen ambas cosas:
$$
\eqalign{
\vert+\rangle =& \lbrace\theta=\frac{\pi}{2}, \phi=0\rbrace\quad\text{eje X} \cr
\vert-\rangle =& \lbrace\theta=\frac{\pi}{2}, \phi=\pi\rbrace \cr
\vert i\rangle =& \lbrace\theta=\frac{\pi}{2}, \phi=\frac{\pi}{2}\rbrace\quad\text{eje Y} \cr
\vert-i\rangle =& \lbrace\theta=\frac{\pi}{2}, \phi=\frac{3\pi}{2}\rbrace}
$$En especial, la base orientada a lo largo del eje $X$ en la esfera de Bloch se conoce como base de Hadamard, y es muy importante en los algoritmos cuánticos. En la base computacional, los vectores de la base de Hadamard son:
$$
\eqalign{
\vert+\rangle =& \frac{1}{\sqrt{2}}(\vert 0\rangle + \vert 1\rangle) \cr
\vert-\rangle =& \frac{1}{\sqrt{2}}(\vert 0\rangle – \vert 1\rangle)
}
$$

Categorías
Quantum

Historia de un qubit

Veamos ahora cómo representar un qubit utilizando la menor redundancia posible. Sabemos que el estado de un qubit es, por definición, un vector en $\mathbb{C}^2$. Eso significa que necesitamos dos componentes complejos para representar su estado. Por motivos histórico, se suele usar la letra $\psi$ para denotar el estado cuántico. Por lo tanto y resumiendo:
$$\displaylines{
\vert\psi\rangle = \alpha\vert 0\rangle + \beta\vert 1\rangle \cr
\alpha, \beta \in \mathbb{C}}
$$A los componentes complejos del estado cuántico se les suele llamar amplitudes, como recuerdo de que en la metodología original de Schrödinger, $\psi$ se conoce como «función de onda».

Observad que, sin decir nada, he hecho que los componentes vayan automáticamente asociados a la base formada por los vectores $\vert 0\rangle$ y $\vert 1\rangle$. Los componentes de un vector siempre tienen que referirse a una base concreta, y la base universalmente utilizada en Quantum Computing es la base anterior, conocida como «base computacional». Estos dos vectores son especiales porque son los vectores propios, o eigenvectors, del operador de medición que transforma un qubit en un bit clásico.

Ahora bien, ya he mencionado que, en realidad, el estado cuántico es un rayo dentro del espacio vectorial complejo. Es decir, todos los estados que apuntan en la misma dirección son físicamente equivalentes. Por convenio, y para simplificar la forma de calcular, nos interesa elegir el vector dentro del rayo cuya longitud es la unidad. Por lo tanto, vamos a exigir que nuestras amplitudes cumplan con esta condición adicional:
$$\alpha\alpha^* +\beta\beta^*=1$$No olvidemos, ni por un momento, que tanto $\alpha$ como $\beta$ son números complejos. Por este motivo, no elevamos simplemente al cuadrado cada amplitud, sino que tenemos que multiplicarlas por sus valores conjugados, si queremos que la suma de los cuadrados de las amplitudes sea un valor real.

Notación matricial

Hay programadores ninjas que se buscan directamente la vida con la notación de Dirac y pueden hacer todos los cálculos necesarios directamente con ella. La mayoría de los mortales, en cambio, lo vemos todo más claro si utilizamos la notación matricial de toda la vida. ¡Ojo!, de momento estamos tratando con vectores, y las matrices cuadradas propiamente dichas aparecerán en breve, pero en esta notación, un vector puede representarse como una matriz vertical, de dos filas y una columna:
$$\vert\psi\rangle = \pmatrix{\alpha \cr \beta}$$La ventaja de esta notación es que nos permite omitir la base: implícitamente, se refiere a la base computacional. Por lo tanto, es una notación mucho más compacta. Otra ventaja es que nos permite entender por otra vía de qué va todo ese rollo de los bras, los kets y eso del «espacio vectorial dual». Hemos visto, por ejemplo, que un ket es una matriz vertical. Resulta, entonces, que un bra es simplemente una matriz horizontal:
$$\langle\psi\vert = \pmatrix{\alpha^* & \beta^* }$$Por supuesto, para pasar del ket al bra hemos tenido que conjugar las amplitudes. Con esta notación, además, el producto escalar se calcula muy fácilmente:
$$\eqalign{
\langle\psi\vert\psi\rangle =& \pmatrix{\alpha \cr \beta} \times \pmatrix{\alpha^* & \beta^* } \cr
=& \pmatrix{ \alpha\alpha^* +\beta\beta^* }
}$$Aquí tenemos que recordar las reglas del álgebra lineal: si multiplicamos una matriz $m\times n$ por otra $n\times p$, el resultado es una matriz $m\times p$. Nosotros hemos multiplicado una matriz $1 \times 2$ por una $2\times 1$, por lo que el resultado es una matriz de $1\times 1$. Una sola celda, es decir, un escalar o valor numérico a secas.

El cero no es cero-cero

A esta parte le pongo un subtítulo separado porque es importante. ¿Cómo se representan, usando componentes, los dos vectores de la base computacional?
$$\vert 0\rangle \equiv \pmatrix{1 \cr 0}\quad\vert 1\rangle \equiv \pmatrix{0 \cr 1}$$Esto es extremadamente simple, pero la experiencia personal me dice que es fácil confundirse y creer que el vector del estado $\vert 0\rangle$ tiene sus componentes a cero.

De hecho, el vector $\pmatrix{0 \cr 0}$ no es un estado cuántico correcto.