La mecánica cuántica es la rama de la física que estudia los sistemas físicos y propiedades a escalas atómicas y subatómicas, así como las propiedades de la radiación de la energía. Surgió a partir de la observación de que los fenómenos físicos a estas escalas parecían no coincidir con las leyes de la física clásica.
El desarrollo de las teorías de la mecánica cuántica comenzó a principios del siglo pasado. A diferencia de la mecánica clásica en la que podemos modelar sistemas físicos a partir de las matemáticas, en la mecánica cuántica debe realizarse un evento físicamente para que se pueda construir el modelo matemático.
Algunos experimentos con electrones mostraron que sus cargas no eran necesariamente puntuales, como se creía hasta el momento, si no que este se podía describir también junto a una serie de ondas que describen su movimiento. Se observó que siempre que se medía el electrón, este se encontraba en un estado diferente al que se había propuesto mediante las ondas, por lo que se le asoció como una interpretación probabilística o incertidumbre en la medición de un experimento cuántico, puesto que el hecho de medirlo realiza cambios en el estado de esta. En este hecho residen las propiedades fundamentales de la mecánica cuántica.
Los postulados de la mecánica cuántica permiten obtener:
También llamada notación Bra-Ket por el nombre de sus elementos denota los estados cuánticos de un sistema.
Los operadores se denotan con una letra representativa con cierto énfasis:
Por tanto, una operación sobre un estado base se describe el operador:
La proyección de un estado sobre su mismo dual se define de la siguiente manera donde el resultado siempre será igual a 1:
Por el contrario, si se realiza la proyección de un estado sobre el dual de uno diferente el resultado siempre será un 0:
Asociado a cualquier sistema físico aislado existe un espacio vectorial complejo con un producto interno definido (Hilbert) o espacio de estados del sistema los cuales quedan definidos por su vector de estado, que es un vector formalizado en el espacio del sistema.
Encontramos dos tipos de estados con los cuales definimos el sistema físico.
Mediante la notación Dirac podemos describir los estados fundamentales de la siguiente manera.
Dónde:
En el ejemplo anterior se muestra la notación para un sistema de dos estados, la notación de los estados base puede definirse como sea conveniente dependiendo el número de estos.
El vector formalizado entonces en nuestro espacio de Hilbert está definido de la siguiente manera:
Por tanto, el vector unitario queda definido de la siguiente manera:
Tiene como principios de funcionamiento dos postulados de la mecánica cuántica mediante la cual se podrían optimizar los procesos informáticos de la computación clásica, dichos postulados se describen a continuación.
Superposición cuántica
Describe que un sistema físico como una partícula se encuentra en todas sus configuraciones posibles (también llamadas estados) simultáneamente, esto solo es posible mientras el sistema se encuentre totalmente aislado y no exista ningún observador que lo mida, según la existencia o ausencia de un observador los estados pueden tener las siguientes propiedades.
Entrelazamiento cuántico
Dos partículas que se generan durante el mismo evento mantienen en el mismo estado y si uno cambia el otro lo hará simultáneamente, adquiriendo el mismo estado que la otra sin necesidad de ninguna conexión física y sin importar la distancia que exista entre ellas.
Estos dos postulados nos permiten proponer un nuevo sistema computacional que funcione aprovechando ciertas ventajas que nos ofrece operar con átomos completos en lugar de impulsos eléctricos como en la computación clásica.
La información entonces no es transportada por medios tangibles como hasta ahora se ha hecho, sino que, aprovechando el entrelazamiento de dos átomos podemos “teletransportar” la información de un lugar a otro si se codifican sus estados superpuestos de una manera conveniente.
Se trata de la unidad fundamental de la computadora cuántica, corresponde análogamente al bit utilizado en la computadora clásica, sin embargo, mientras el bit corresponde a impulsos eléctricos que se interpretan de manera binaria como 1 ó 0, el qubit corresponde a un sistema físico de dos estados base los cuales para tener una representación similar a la de la computación clásica denotamos como:
Viéndolo así podría parecer que no hay diferencia entre ambos, sin embargo, según el principio de superposición podemos encontrar estados base como el siguiente:
Que son válidos más no hay representación de estos estados pues violan las premisas de Bell:
Se asume que estos estados significan que el sistema se encuentra en un estado coherente.
Conforme se entrelacen qubits su representación vectorial crecerá a una razón de 2n donde n es el número de qubits, se escriben obteniendo el producto tensorial de los qubits involucrados.
Es un espacio de Hilbert tridimensional donde se representa un qubit.
Donde un estado se representa como un punto al final un vector.
Cualquier operación que se haga sobre el estado del qubit se representa como una trayectoria en la superficie de la esfera.
Análogo a un circuito lógico clásico, un circuito cuántico se compone de una serie de compuertas cuánticas que operan sobre uno o más qubits.
Su estructura comprende los siguientes elementos:
Escenarios: los circuitos se organizan en escenarios los cuales podemos añadir qubits o transformar aquellos provenientes de escenarios anteriores a través de las compuertas cuánticas
Qubits: Muestran el flujo de la información dentro del circuito existen dos tipos:
Compuertas cuánticas: Es mediante estas que se modifican los estados de los qubits a lo largo del circuito.
El qubit de entrada será el mismo a la salida.
Nos dará el qubit contrario al de entrada equivale a una rotación en el x.
Nos dará como resultado una rotación en el eje “Y”
Equivale a una rotación en el eje “Z” transformando 1en -1 y dejando al 0 intacto.
Representa una rotación sobre los ejes “X” y “Z”.
Deja el estado |0> intacto y al estado|1> le da una rotación en eiθ en la esfera de Bloch.
Estas son las compuertas cuánticas fundamentales puesto que son aquellas con las que operamos un solo qubit, haciendo uso de estas se puede representar cualquier otra operación sin embargo existen compuertas que pueden llegar a operarse con 2 o más qubit’s como es el caso de las compuertas controladas, en estas encontramos dos tipos de qubit’s.
Existen diferentes tipos de compuertas controladas según el algoritmo que se desea implementar, sin embargo, la más común es la CNOT que se describe a continuación.
Cambia el estado del qubit objetivo cuando el de control está en |1>,
Terminales: sirven para indicar lo que se hará en su último escenario cada qubit existen dos casos.
Con todos sus elementos finalmente un circuito lógico se ve de la siguiente manera:
Se trata de una máquina análoga a la computadora clásica capaz de realizar cálculos mediante la operación de qubits con compuertas cuánticas, se define como una colección de qubits capaces de:
Cada qubit es capaz de realizar operaciones independientes a los demás, permitiendo así que exista un paralelismo real en tiempo de ejecución.
Actualmente existen máquinas que operan de la manera propuesta, más no son de propósito general si no específico. La computadora cuántica se ha propuesto como un complemento a la computadora clásica para realizar los cálculos complejos que a esta le serian intratables.
Entre los esfuerzos actuales por desarrollar una computadora cuántica se encuentra la computadora desarrollada por D-wave, IBM-Q.
La interfaz gráfica de usuario del simulador consta de un panel con 5 diferentes áreas que se muestran a continuación:
A continuación, se describen las funcionalidades dentro de cada una de las 5 áreas.
Este menu contiene los elementos necesarios para operar con el editor de codigo, sus elementos son los que se muestran a continuación:
A continuación, se describen los funcionamientos de cada uno de los botones del menu del editor de codigo.
Este botón nos permitirá generar el diagrama descrito en el editor de texto dentro del entorno de desarrollo gráfico, se recomienda utilizar esta función constantemente para verificar que el código escrito corresponda con el circuito que se desea desarrollar, si el codigo está correctamente escrito, veremos la siguiente leyenda en la consola de salidas:
System:
Diagrama generado automáticamente
Y veremos el diagrama generado, por otro lado, si el archivo contiene errores mostrara un mensaje en la consola de salidas indicando la línea donde se encuentra el error junto con una breve descripción de este.
System:
ERROR:
Error: se esperaban un qubits validos (q0, q1, q2...) despues de la
compuerta
controlada en la instruccion 9
Este botón nos permitirá guardar el código que hayamos escrito dentro de un archivo TXT y descargarlo en nuestro equipo, al presionarlo nos dará la opción de darle un nombre al archivo, por default mostrará el nombre codigo.txt. se recomienda anteceder el nombre del codigo previo a este nombre por default para reconocer que se trata del codigo del circuito que estamos generando, si el archivo contiene errores mostrara un mensaje en la consola de salidas indicando la línea donde se encuentra el error junto con una breve descripción de este.
System:
Archivo descargado....
Este botón nos permitirá buscar dentro de un explorador de archivos algún código en formato TXT que hayamos guardado previamente para escribirlo dentro de nuestro editor de texto.
Este botón nos permitirá ejecutar el código generado utilizando las entradas descritas en el campo de ingreso de qubit, es necesario ingresar el valor de cada uno de los qubit’s separados por una coma, estos valores pueden incluir números complejos donde la parte real sea 1 ó 0.
Ejemplo: 1+i
Asi mismo puede admitir números enteros que sean 1 o 0, sí los valores fueron introducidos correctamente podremos ver el resultado de la operación dentro de la consola de salida:
System:
Ejecutando...
System:
(0+i)
System:
El proceso tardó 1
milisegundos.
Por otro lado, sí fueron introducidos incorrectamente en la consola de salida nos dará un error mostrando alguna sugerencia de cómo ingresar los valores de entrada:
System:
Ejecutando...
System:
Error: La entrada 0 debe tener 1 elementos
separados por comas.
Es un campo de texto donde deberemos escribir los valores de los qubit’s separados por coma que operaremos con el botón de ejecución simple de código.
Este botón nos permitirá introducir un conjunto de valores de entrada para el circuito generado y operarlos, la lista deberá contener en cada renglón el conjunto de valores de los qubit’s separados por coma, estos valores pueden incluir números complejos donde la parte real sea 1 ó 0, asi mismo puede admitir números enteros que sean 1 ó 0, ejemplo:
0, 0+i, 0
0, 0, 1
1, 1, 1+i
Sí los valores fueron introducidos correctamente podremos ver el resultado de la operación dentro de la consola de salida:
System:
Ejecutando....
System:
RESULTADO:
(1+0i) (0+0i) (1+0i)
(1+0i) (0+0i) (0+0i)
(0+0i) (1+0i) (0+0i)
System:
El proceso tardó 5 milisegundos.
Asi mismo un archivo con los valores será descargado bajo el nombre “resultado.txt”
Por otro lado, si existe algun error en la lista en la consola de salidas veremos un mensaje que nos avisara del error ofreciendo alguna sugerencia de como corregir la lista de entradas:
System:
Ejecutando....
System:
Error: La entrada 2 debe tener 3 elementos
separados por comas.
Este botón ejecutará un algoritmo que obtendrá un vector con todos los posibles estados de entrada a partir del número de qubit’s existentes en el circuito y posteriormente operará dicho circuito con todos estos valores realizando una descarga de los resultados una vez finalizado el proceso, de no encontrar errores en el código generado nos preguntará el nombre que le queramos dar a la descarga del archivo dando por default el nombre "resultados.txt", se recomienda mantener la palabra resultados y antecederla del nombre del circuito que estamos generando.
Si el resultado es correcto veremos lo siguiente en la consolad de salida:
System:
Ejecutando....
System:
Resultado:
(1+0i) (0+0i) (1+0i)
(1+0i) (0+0i) (0+0i)
(1+0i) (1+0i) (1+0i)
(1+0i) (1+0i) (0+0i)
(0+0i) (0+0i) (0+0i)
(0+0i) (0+0i) (1+0i)
(0+0i) (1+0i) (1+0i)
(0+0i) (1+0i) (0+0i)
System:
El proceso tardó 3 milisegundos.
Se trata de un editor de código en el cual podremos escribir el código correspondiente a nuestro circuito siguiendo las directrices de la interfaz de línea de comandos descrita en el Anexo 2.
Se trata de una ventana donde podremos ver los mensajes del sistema, así como los resultados de las operaciones que estamos realizando.
Se trata de un menu que tiene los elementos necesarios para construir circuitos cuánticos de una forma gráfica.
Este botón nos permitirá añadir una compuerta Pauli X dentro del entorno de desarrollo gráfico, para utilizarla debemos hacer clic sobre ella y una vez hecho esto en nuestro cursor tomará la forma de la compuerta y deberemos arrastrarlo al lugar donde queramos insertar nuestra compuerta dentro del entorno de desarrollo gráfico.
Este botón nos permitirá añadir una compuerta Pauli Y dentro del entorno de desarrollo gráfico, para utilizarla debemos hacer clic sobre ella y una vez hecho esto en nuestro cursor tomará la forma de la compuerta y deberemos arrastrarlo al lugar donde queramos insertar nuestra compuerta dentro del entorno de desarrollo gráfico.
Este botón nos permitirá añadir una compuerta Pauli Z dentro del entorno de desarrollo gráfico, para utilizarla debemos hacer clic sobre ella y una vez hecho esto en nuestro cursor tomará la forma de la compuerta y deberemos arrastrarlo al lugar donde queramos insertar nuestra compuerta dentro del entorno de desarrollo gráfico.
Este botón nos permitirá añadir una compuerta Hadamard dentro del entorno de desarrollo gráfico, para utilizarla debemos hacer clic sobre ella y una vez hecho esto en nuestro cursor tomará la forma de la compuerta y deberemos arrastrarlo al lugar donde queramos insertar nuestra compuerta dentro del entorno de desarrollo gráfico.
Este botón nos permitirá añadir un componente que nos permitirá medir el estado de qubit en cualquier escenario dentro de nuestro circuito dentro del entorno de desarrollo gráfico, para utilizarla debemos hacer clic sobre ella y una vez hecho esto en nuestro cursor tomará la forma de la compuerta y deberemos arrastrarlo al lugar donde queramos insertar nuestra compuerta dentro del entorno de desarrollo gráfico.
Este botón nos permitirá añadir una compuerta cambio de fase dentro del entorno de desarrollo gráfico, para utilizarla debemos hacer clic sobre ella y una vez hecho esto en nuestro cursor tomará la forma de la compuerta y deberemos arrastrarlo al lugar donde queramos insertar nuestra compuerta dentro del entorno de desarrollo gráfico.
Seguido de esta podremos encontrar un campo de texto dónde podremos ingresar un número del cero al 360 que corresponde al número de grados que se requieren para el cálculo de la identidad de Euler.
Esta función nos permitirá añadir qubits de control a una compuerta previamente añadida en nuestro circuito, su uso es en 2 pasos:
Una vez ejecutados estos pasos podremos ver nuestra compuerta enlazada a un qubit de control, cabe mencionar que es posible añadir más de 1 qubit de control a una sola compuerta como se ve en la siguiente ilustración:
Este botón añadirá un qubit en la parte inferior de nuestro circuito.
Este botón eliminara el qubit en la parte inferior de nuestro circuito.
Una vez completado nuestro circuito dentro de un entorno gráfico, es necesario generar el código ya que el simulador lo requiere para poder generar los resultados por lo que una vez diseñado nuestro circuito deberemos presionar este botón para generar automáticamente el código que lo representa previo a su ejecución.
Con este botón podremos descargar una imagen de nuestro circuito una vez generado ya sea a través del botón de generar diagrama o desarrollándolo manualmente, hoy el formato en el que se guardará será PNG y por default tendrá el nombre “clipped”.
Se trata del lienzo donde vamos a diseñar nuestro circuito mediante la inserción hoy de los siguientes elementos:
Asi mismo podremos encontrar ciertas funciones que nos apoyaran a agilizar el diseño de nuestros circuitos
Son las unidades fundamentales de información cuántica y dentro de un circuito se representan como una línea horizontal que puede atravesar todos los escenarios, es sobre de estos sobre los cuales modificamos su valor utilizando las compuertas cuánticas.
Para añadir un qubit a nuestro circuito existen 2 maneras que se describen a continuación:
1. Utilizar el botón para añadir qubit (Q+) del Menu del entorno grafico de desarrollo: Al hacer clic sobre este botón se añadira un nuevo qubit en la parte inferior de nuestro circuito
2. Utilizar el botón para añadir qubit (Q+) del nombre del qubit posterior: Es necesario hacer clic sobre el nombre del qubit (por ejemplo, Q0) posterior al que queremos que aparezca uno nuevo y seleccionar el botón Q+
Se recomienda usar esta función en circuitos que se han desarrollado previamente y sea necesario insertar un qubit en una posición en específico.
Para eliminar un qubit a nuestro circuito existen 2 maneras que se describen a continuación:
1. Utilizar el botón para eliminar un qubit (Q-) del Menu del entorno grafico de desarrollo: Al hacer clic sobre este botón se eliminará el qubit en la parte inferior de nuestro circuito
2. Utilizar el botón para eliminar (🗑️) del nombre del qubit: Es necesario hacer clic sobre el nombre del qubit (por ejemplo, Q1)
Los escenarios corresponden a los instantes de tiempo en los cuales se pueden ejecutar con puertas sobre los qubits, en un circuito se representan como columnas que atraviesan los diferentes qubits de nuestro circuito.
Para añadir un escenario conforme vayamos desarrollando nuestro circuito, el simulador detectará si el último escenario tiene alguna compuerta dentro de algún qubit y de ser así añadirá un escenario nuevo al final.
Para eliminar un escenario es necesario utilizar el botón para eliminar (🗑️) del nombre del escenario: Es necesario hacer clic sobre el nombre del escenario (por ejemplo, S1)
Se trata de los operadores mediante los cuales modificaremos el estado de un qubit, para añadir estos simplemente hay que seleccionar el que queramos del menu del entorno grafico de desarrollo posteriormente hay que dirigirse a la intersección entre el club y el escenario donde queramos que este se encuentre e insertarlo como:
En el caso de la compuerta cambio de fase, previo a agregar la compuerta deberemos indicar a cuántos grados deberá aplicarse la fórmula de Euler dentro del campo de ingreso de fase.
Para eliminar una compuerta hoy debemos hacer clic sobre aquella que queremos que desaparezca y seleccionar el botón para eliminar para eliminar. (🗑️)
Todo circuito se inicializa indicando el número de qubits que tendrá el circuito, esto se hace indicándolo en la primera línea de la siguiente manera:
qubits q#;
Donde el “#” deberá ser sustituido por el número de qubits a utilizar, ejemplo:
qubits 3;
Para utilizar la compuerta Pauli X es necesario utilizar el siguiente comando:
X q#;
Donde el “#” deberá ser sustituido por el número del qubit a utilizar, ejemplo:
X q0;
Para utilizar la compuerta Pauli Y es necesario utilizar el siguiente comando:
Y q#;
Donde el “#” deberá ser sustituido por el número del qubit a utilizar, ejemplo:
Y q0;
Para utilizar la compuerta Pauli Z es necesario utilizar el siguiente comando:
Z q#;
Donde el “#” deberá ser sustituido por el número del qubit a utilizar, ejemplo:
Z q0;
Para utilizar la compuerta Hadamard es necesario utilizar el siguiente comando:
H q#;
Donde el “#” deberá ser sustituido por el número del qubit a utilizar, ejemplo:
H q0;
Para utilizar la compuerta cambio de fase es necesario utilizar el siguiente comando:
Pθ q#;
Donde el “θ” se refiere a un ángulo entre 0 y 360 a donde rotará y el símbolo “#” deberá ser sustituido por el número del qubit a utilizar, ejemplo:
P180 q0;
Para utilizar la compuerta control Pauli X es necesario utilizar el siguiente comando:
CX q# qC qC;
Donde el “#” deberá ser sustituido por el número del qubit objetivo y “C” por el número del qubit de control que se desea emplear pueden usarse tantos qubits de control se deseen, ejemplo:
CX q0 q1 q2;
Para utilizar la compuerta control Pauli Y es necesario utilizar el siguiente comando:
CY q# qC qC;
Donde el “#” deberá ser sustituido por el número del qubit objetivo y “C” por el número del qubit de control que se desea emplear pueden usarse tantos qubits de control se deseen, ejemplo:
CY q0 q1 q2;
Para utilizar la compuerta control Pauli Z es necesario utilizar el siguiente comando:
CZ q# qC qC;
Donde el “#” deberá ser sustituido por el número del qubit objetivo y “C” por el número del qubit de control que se desea emplear pueden usarse tantos qubits de control se deseen, ejemplo:
CZ q0 q1 q2;
Para utilizar la compuerta control Hadamard es necesario utilizar el siguiente comando:
CH q# qC qC;
Donde el “#” deberá ser sustituido por el número del qubit objetivo y “C” por el número del qubit de control que se desea emplear pueden usarse tantos qubits de control se deseen, ejemplo:
CH q0 q1 q2;
Para utilizar la compuerta control cambio de fase es necesario utilizar el siguiente comando:
Pθ q# qC qC;
Donde el “θ” se refiere a un ángulo entre 0 y 360 a donde rotará, el símbolo “#” deberá ser sustituido por el número del qubit a utilizar y “C” por el número del qubit de control que se desea emplear pueden usarse tantos qubits de control se deseen, ejemplo:
CP180 q0 q1 q2;
Para utilizar la medición es necesario utilizar el siguiente comando:
M q#;
Donde el “#” deberá ser sustituido por el número del qubit a utilizar, ejemplo:
M q2;
Para ejecutar el circuito que acabamos de crear existen 3 métodos:
Las cuales podemos encontrar dentro del Menu del editor de codigo.
Para este ejemplo se usó la implicación en su forma Jauch cuyo circuito cuántico es el siguiente:
Su código queda de la siguiente forma:
qubits 3;
X q0;
CX q2 q0;
CX q2 q1;
CX q2 q0 q1;