Advertencia Emptor: lo siguiente está muy sesgado en mi propia investigación y visión en el campo del control de calidad. Esto no constituye el consenso general del campo e incluso podría contener cierta autopromoción.
El problema de mostrar un 'hola mundo' de la computación cuántica es que básicamente estamos tan lejos de las computadoras cuánticas como Leibnitz o Babbage de su computadora actual. Si bien sabemos cómo deberían funcionar teóricamente, no existe una forma estándar de construir una computadora cuántica física. Un efecto secundario de eso es que no existe un modelo de programación único de computación cuántica. Libros de texto como Nielsen et al. le mostrará un diagrama de 'circuito cuántico', pero estos están lejos de ser lenguajes de programación formales: se agitan un poco con los detalles, como el control clásico o los resultados de entrada / salida / medición.
Lo que más me ha convencido en mi investigación como científico de la computación en lenguaje de programación, y para transmitir la esencia del control de calidad a otro científico de la computación, es utilizar el modelo de control de calidad más simple que he encontrado que hace todo.
El programa de computación cuántica más simple que he visto que contiene todos los elementos esenciales es un pequeño programa de tres instrucciones en el modelo de programación cuántica más simple que he encontrado. Lo uso como lo haría con un 'hola mundo' para entender los conceptos básicos.
Permítanme dar un resumen rápido y simplificado de The Measurement Calculus de Danos et al. 1 que se basa en la computadora cuántica unidireccional 2 : un qubit se destruye cuando se mide, pero medirlo afecta a todos los demás qubits que se enredaron con él. Tiene algunos beneficios teóricos y prácticos sobre las computadoras cuánticas 'basadas en circuitos', tal como las realiza el chip fotónico, pero esa es una discusión diferente.
Considere una computadora cuántica que tiene solo cinco instrucciones: N, E, M, X y Z. Su "lenguaje ensamblador" es similar a su computadora normal, después de ejecutar una instrucción, pasa a la siguiente instrucción en la secuencia. Cada instrucción toma un identificador de qubit de destino, aquí usamos solo un número y otros argumentos.
N 2 # create a new quantum bit and identify it as '2'
E 1 2 # entangle qubits '1' and '2', qubit 1 already exists and is considered input
M 1 0 # measure qubit '1' with an angle of zero (angle can be anything in [0,2pi]
# qubit '1' is destroyed and the result is either True or False
# operations beyond this point can be dependent on the signal of '1'
X 2 1 # if the signal of qubit '1' is True, execute the Pauli-X operation on qubit '2'
El programa anterior crea así una ancilla, la enreda con el qubit de entrada, mide la entrada y, según el resultado de la medición, realiza una operación en la ancilla. El resultado es que el qubit 2 ahora contiene el estado del qubit 1 después de la operación de Hadamard .
Lo anterior está naturalmente en un nivel tan bajo que no querrás codificarlo a mano. El beneficio del cálculo de medición es que introduce 'patrones', algún tipo de macros componibles que le permiten componer algoritmos más grandes como lo haría con las subrutinas. Empiezas con patrones de 1 instrucción y creces patrones más grandes a partir de ahí.
En lugar de una secuencia de instrucciones similar a un ensamblador, también es común escribir el programa como un gráfico:
input .........
\--> ( E ) ---> (M:0) v
(N) ---> ( ) ------------> (X) ---> output
donde las flechas completas son dependencias qubit y la flecha punteada es una dependencia de 'señal'.
El siguiente es el mismo ejemplo de Hadamard expresado en una pequeña herramienta de programación que imagino que usaría un 'programador cuántico'.
editar: (agregando relación con las computadoras 'clásicas') Las computadoras clásicas siguen siendo realmente eficientes en lo que hacen mejor, por lo que la visión es que las computadoras cuánticas se usarán para descargar ciertos algoritmos, de forma análoga a cómo la computadora actual descarga los gráficos a un GPU Como ha visto anteriormente, la CPU controlaría la computadora cuántica enviándole un flujo de instrucciones y leería los resultados de las mediciones de las 'señales' booleanas. De esta manera, tiene una separación estricta del control clásico por parte de la CPU y el estado cuántico y los efectos en la computadora cuántica.
Por ejemplo, voy a usar mi coprocesador cuántico para calcular un valor booleano o cointoss aleatorio. Las computadoras clásicas son deterministas, por lo que es malo devolver un buen número aleatorio. Sin embargo, las computadoras cuánticas son inherentemente probabilísticas, todo lo que tengo que hacer para obtener un 0 o 1 aleatorio es medir un qubit igualmente equilibrado. La comunicación entre la CPU y 'QPU' se vería así:
qrand() N 1; M 1 0;
==> | CPU | ------------> | QPU | ==> { q1 } , []
start()
| | ------------> | | ==> { } , [q1: 0]
read(q1)
| | ------------> | |
q1: 0
0 | | <----------- | |
<==
¿Dónde { ... }
está la memoria cuántica de la QPU que contiene qubits y [...]
es su memoria clásica (señal) que contiene booleanos?
- Danos y col. El cálculo de la medida. arXiv (2007) vol. ph cuant
- Raussendorf y Briegel. Una computadora cuántica unidireccional. Physical Review Letters (2001) vol. 86 (22) págs. 5188-5191