Advertência Emptor: o seguinte é fortemente tendencioso em minha própria pesquisa e visão no campo do CQ. Isso não constitui o consenso geral do campo e pode até conter alguma autopromoção.
O problema de mostrar um “olá mundo” da computação quântica é que estamos basicamente tão longe dos computadores quânticos quanto Leibnitz ou Babbage do seu computador atual. Embora saibamos como eles devem operar teoricamente, não existe uma maneira padrão de realmente construir um computador quântico físico. Um efeito colateral disso é que não existe um modelo único de programação da computação quântica. Livros didáticos como Nielsen et al. mostrará um diagrama de 'circuito quântico', mas esses estão longe de serem linguagens de programação formais: eles acenam um pouco com os detalhes, como controle clássico ou lidam com resultados de entrada / saída / medição.
O que me serviu melhor em minha pesquisa como cientista da computação em linguagem de programação, e para transmitir o entusiasmo do CQ a outros cientistas da computação, é usar o modelo mais simples de CQ que já deparei.
O programa mais simples de computação quântica que vi que contém todos os elementos essenciais é um pequeno programa de três instruções no modelo de programação quântica mais simples que já encontrei. Eu o uso como se fosse um 'olá mundo' para transmitir o básico.
Permitam-me apresentar um resumo simplificado e rápido do The Measurement Calculus, de Danos et al. 1 que se baseia é baseado no computador quântico unidirecional 2 : um qubit é destruído quando medido, mas medi-lo afeta todos os outros qubits que foram emaranhados com ele. Ele tem alguns benefícios teóricos e práticos sobre os computadores quânticos 'baseados em circuito', conforme realizado pelo chip fotônico, mas essa é uma discussão diferente.
Considere um computador quântico que tenha apenas cinco instruções: N, E, M, X e Z. Sua "linguagem assembly" é semelhante ao seu computador comum, depois de executar uma instrução, ela passa para a próxima instrução na sequência. Cada instrução usa um identificador de qubit alvo, usamos apenas um número aqui e outros 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'
O programa acima cria uma ancilla, entrelaça-a com o qubit de entrada, mede a entrada e, dependendo do resultado da medição, executa uma operação na ancilla. O resultado é que o qubit 2 agora contém o estado do qubit 1 após a operação do Hadamard .
O acima é naturalmente em um nível tão baixo que você não gostaria de codificá-lo manualmente. O benefício do cálculo de medição é que ele introduz 'padrões', algum tipo de macros composíveis que permitem compor algoritmos maiores, como faria com as sub-rotinas. Você começa com padrões de 1 instrução e cresce padrões maiores a partir daí.
Em vez de uma sequência de instruções do tipo assembler, também é comum escrever o programa como um gráfico:
input .........
\--> ( E ) ---> (M:0) v
(N) ---> ( ) ------------> (X) ---> output
onde setas completas são dependências de qubit e a seta pontilhada é uma dependência de 'sinal'.
A seguir, é apresentado o mesmo exemplo do Hadamard, expresso em uma pequena ferramenta de programação, como eu imaginaria que um 'programador quântico' usaria.
edit: (adicionando relação com computadores 'clássicos') Os computadores clássicos ainda são realmente eficientes no que fazem de melhor e, portanto, a visão é que os computadores quânticos serão usados para descarregar certos algoritmos, de forma análoga a como o computador atual transfere gráficos para um computador. GPU. Como você viu acima, a CPU controlaria o computador quântico enviando a ele um fluxo de instruções e lendo novamente os resultados da medição dos 'sinais' booleanos. Dessa forma, você tem uma separação estrita do controle clássico pela CPU e pelo estado quântico e pelos efeitos no computador quântico.
Por exemplo, vou usar meu co-processador quântico para calcular um booleano aleatório ou cointoss. Os computadores clássicos são determinísticos; portanto, é ruim retornar um bom número aleatório. Computadores quânticos são inerentemente probabilísticos, tudo o que preciso fazer para obter um 0 ou 1 aleatório é medir um qubit igualmente equilibrado. A comunicação entre a CPU e o 'QPU' seria assim:
qrand() N 1; M 1 0;
==> | CPU | ------------> | QPU | ==> { q1 } , []
start()
| | ------------> | | ==> { } , [q1: 0]
read(q1)
| | ------------> | |
q1: 0
0 | | <----------- | |
<==
Onde { ... }
está a memória quântica do QPU contendo qubits e [...]
sua memória clássica (sinal) contendo booleanos.
- Danos et al. O cálculo de medição. arXiv (2007) vol. quant-ph
- Raussendorf e Briegel. Um computador quântico unidirecional. Physical Review Letters (2001) vol. 86 (22) pp. 5188-5191