Como a computação quântica pode afetar o desenvolvimento de software

Olá pessoal!

Nos últimos seis meses, a editora vem trabalhando ativamente no tópico da computação quântica e sua aplicabilidade prática. Por um longo tempo, não foi possível encontrar um artigo digno de tradução sobre esse interessante tópico, até que esse artigo apareceu no blog da Oracle. A publicação servirá como uma excelente introdução aos problemas de software, hardware e ciências puramente naturais desse novo paradigma, portanto a leitura é uma obrigação.



Nos últimos meses e anos, o interesse pela computação quântica aumentou significativamente. Novos materiais estão aparecendo constantemente de institutos de pesquisa, empresas ou organizações governamentais, informando sobre os avanços nessa área. Ao mesmo tempo, artigos com uma base técnica mais fraca discutem as possíveis conseqüências da computação quântica, e as previsões variam desde as mais modernas técnicas de criptografia até promessas para curar todas as doenças e concluir o trabalho de criação de uma IA de pleno direito. No entanto, nem todas essas expectativas são igualmente realistas.

Se você é um programador sóbrio, pode estar se perguntando onde está a linha entre fatos e ficção nesses cálculos e como a computação quântica afetará o desenvolvimento de software no futuro.

Naturalmente, ainda restam muitos anos para a criação de hardware funcional para a computação quântica. No entanto, os princípios gerais desse paradigma já são entendidos hoje, existem abstrações que permitem aos desenvolvedores criar aplicativos nas quais as possibilidades da computação quântica são realizadas usando simuladores.

A computação quântica é reduzida para outro ganho de CPU?


O desenvolvimento tradicional de software usando computadores clássicos envolve a conversão de uma linguagem de programação de alto nível (por exemplo, Java) em operações executadas em um grande número de transistores (de hardware).

Na Figura 1, esse processo é esquematizado em sua forma mais simples: o código-fonte Java é compilado no código de bytes independente da plataforma, que, por sua vez, é traduzido no código de máquina específico da plataforma. O código da máquina usa várias operações simples (portas) executadas na memória. O principal componente de hardware usado para esse fim é o transistor conhecido.



Fig. 1. Tradução de uma linguagem de programação de alto nível em operações realizadas em transistores .

O aumento de produtividade alcançado nos últimos anos foi alcançado principalmente devido à melhoria das tecnologias de hardware. Os tamanhos de um único transistor diminuíram drasticamente e, quanto mais transistores você pode colocar em cada milímetro quadrado, mais memória e poder de processamento o computador terá.

A computação quântica é uma tecnologia disruptiva, porque aqui as unidades de computação mais simples não são transistores clássicos, mas qubits, sobre os quais falaremos abaixo.

O ponto não está apenas nas diferenças desses elementos primários, mas também em um dispositivo diferente de válvulas. Assim, a pilha com a fig. 1 na computação quântica não é aplicável.

A computação quântica quebrará toda a pilha acima no nível Java?


Em suma - "não realmente". Os cientistas estão gradualmente concordando que os computadores quânticos serão especialmente bons para resolver problemas específicos, enquanto outros serão resolvidos de maneira mais racional usando computadores tradicionais. Parece familiar, certo? Uma situação semelhante é observada ao comparar a GPU e a CPU. Embora os transistores também sejam usados ​​na GPU, eles diferem em princípio da CPU, mas muitos aplicativos escritos em uma linguagem de alto nível usam os recursos da CPU e da GPU sob o capô. As GPUs são muito boas para o processamento de vetores e, em muitos aplicativos e bibliotecas, o trabalho da CPU e da GPU é diferenciado.

Por exemplo, esta é exatamente a situação ao usar JavaFX ou Deeplearning4j. Se você estiver escrevendo um aplicativo de interface com o usuário usando JavaFX, você trabalha apenas com código Java (talvez também FXML para declarar uma interface com o usuário). Quando uma cena JavaFX precisa ser exibida na tela, as implementações internas do JavaFX usam shaders e texturas para isso, entrando em contato diretamente com os drivers de GPU de baixo nível, conforme mostrado na Figura 2. Portanto, você não precisa se preocupar com qual parte do código está melhor adaptada para trabalhar com a CPU e qual com GPU.



Fig. 2. O JavaFX delega o trabalho da GPU e da CPU.

Como mostrado na fig. 2, o código de implementação JavaFX delega o trabalho passando-o para a GPU e a CPU. Embora essas operações estejam ocultas do desenvolvedor (não fornecidas por meio da API), certos conhecimentos da GPU geralmente são úteis quando você precisa desenvolver aplicativos JavaFX mais poderosos.

Ao usar o Deeplearning4j, uma situação semelhante se desenvolve. O Deeplearning4j possui várias implementações para executar as operações vetoriais e matriciais necessárias, e algumas delas usam GPUs. No entanto, não importa para você, como desenvolvedor final, quais as capacidades que seu código usará - CPU ou GPU.

Parece que os computadores quânticos farão um excelente trabalho na solução de problemas que, em regra, aumentam exponencialmente à medida que o volume do problema aumenta e, portanto, dificilmente podem ser resolvidos ou quase insolúveis usando computadores clássicos. Especialmente, os especialistas falam sobre uma modalidade híbrida: um aplicativo de ponta a ponta típico contém código clássico que é executado na CPU, mas também pode conter código quântico.

Como um sistema pode executar código quântico?


Hoje, o hardware para computadores quânticos ainda é extremamente experimental. Enquanto grandes empresas e, presumivelmente, alguns estados estão envolvidos no desenvolvimento de protótipos, essa tecnologia não está amplamente disponível. Mas, quando aparece, sua forma pode ser diferente:

  • Um coprocessador quântico pode ser integrado à CPU no sistema.
  • Problemas quânticos podem ser delegados a sistemas de nuvem quântica.

Embora exista uma enorme incerteza sobre o contexto prático de tais decisões, estamos cada vez mais concordando com a aparência de um código quântico. No nível mais baixo devem estar os seguintes tijolos: qubits e portões quânticos . Com base neles, você pode criar simuladores quânticos que implementam o comportamento esperado.

Portanto, um simulador quântico é uma ferramenta ideal para esse desenvolvimento.
Os resultados que eles fornecem devem ser quase os mesmos que seriam obtidos em equipamentos reais de um computador quântico - mas o simulador funciona muito mais devagar, pois os efeitos quânticos que aceleram o equipamento quântico precisam ser simulados usando o software tradicional.

Quais são os componentes básicos da computação quântica?


Muitas vezes, é importante comparar os cálculos clássicos com os quânticos. Na computação clássica, temos bits e portas.

Um bit contém um único bit de informação e seu valor pode ser 0 ou 1.
Uma válvula atua em um ou mais bits e pode operar sobre eles. Por exemplo, a válvula NOT, mostrada na Figura 3, inverte o valor de um bit. Se a entrada for 0, a saída do gate NOT será 1 e vice-versa.



Fig. 3. válvula NÃO

Na computação quântica, temos bits e portas equivalentes. O equivalente quântico de um bit é qubit. O valor de um qubit pode ser igual a 0 ou 1, como um bit clássico, no entanto, também pode estar na chamada superposição. Este é um conceito complexo, segundo o qual um qubit pode estar simultaneamente em ambos os estados: 0 e 1.

Quando um qubit está em superposição, seu valor é uma combinação linear dos estados 0 e 1. Isso pode ser escrito como mostrado na Fig. 4:



Fig. 4. Igualdade onde o qubit está em superposição.

Nota: os qubits geralmente são escritos em notação de colchete , onde o nome da variável é colocado entre os caracteres "|" e ">".

A expressão na Fig. 4 relata que o qubit x está em uma superposição de estados | 0> e | 1>. Isso não significa que ele esteja no estado | 0> OR no estado | 1>; isso significa que seu estado atual não é conhecido por nós.

De fato, ele está nos dois estados ao mesmo tempo e, dessa forma, pode ser manipulado. No entanto, quando medimos o qubit, ele estará em um estado, | 0> ou | 1>. Há outra restrição na expressão acima: a ^ 2 + b ^ 2 = 1.
Os valores de aeb são probabilísticos: existe uma probabilidade a ^ 2 de que, quando medirmos o qubit | x>, ele conterá o valor | 0>, e a probabilidade b ^ 2 de que o qubit medido conterá o valor | 1>.

Há um importante fator limitante que interrompe as alegrias da computação quântica: depois que um qubit é medido, todas as informações sobre a possível superposição na qual ele estava localizado são perdidas. O valor do qubit pode ser 0 ou 1.

Nos cálculos, um qubit em superposição pode corresponder a 0 e 1 ao mesmo tempo (com probabilidades diferentes). Se tivermos dois qubits, eles poderão ser usados ​​para representar quatro estados (00, 01, 10 e 11), novamente, com probabilidades diferentes. Aqui chegamos à essência do poder dos computadores quânticos. Tendo oito bits clássicos, você pode representar exatamente um número no intervalo de 0 a 255. Os valores de cada um dos oito bits serão 0 ou 1. Com oito qubits, você pode representar simultaneamente todos os números de 0 a 255.

Para que serve a superposição se você pode medir apenas um estado?


Muitas vezes, o resultado do algoritmo é simples (sim ou não), mas para chegar a ele, é necessária muita computação paralela. Mantendo qubits em superposição durante os cálculos, você pode levar imediatamente em conta muitas opções diferentes. Sem tomar decisões para cada combinação individual, um computador quântico pode calcular todas as opções em uma única etapa.
Então, em muitos algoritmos quânticos, o próximo estágio importante começa: conectar o resultado do algoritmo a uma medida que fornece um resultado significativo. Freqüentemente, a interferência é levada em consideração: resultados interessantes são sobrepostos estruturalmente uns aos outros, enquanto os desinteressantes se anulam (interferência destrutiva).

Como se pode "transformar" um qubit em um estado de superposição?


Assim como os portões clássicos manipulam bits, os portões quânticos manipulam qubits. Alguns portões quânticos se assemelham aos clássicos; por exemplo, o portão Pauli-X transfere o qubit do estado a | 0> + b | 1> para o estado b | 0 | + a | 1>, que é semelhante ao princípio do portão NOT clássico. De fato, quando a = 1 eb = 0, o qubit estava inicialmente no estado | 0>. Após a ação da válvula Pauli-X, esse qubit entrará no estado | 1>, como mostra a Fig. 5)



Fig. 5. O resultado do uso da válvula Pauli-X.

Nesse contexto, a válvula Hadamard é muito interessante. Ele coloca o qubit no estado | 0>: 1 / sqrt (2) * (| 0> + | 1>) em uma superposição, como mostra a Fig. 6



Fig. 6. O resultado da aplicação da válvula Hadamard.

Depois de aplicar a válvula Hadamard a um qubit e medir o qubit, há uma probabilidade de 50% de que o valor do qubit seja 0 e 50% de que o valor do qubit seja 1. Até que o qubit seja medido, ele permanece em um estado de superposição .

Como tudo isso é possível?


Se você está realmente interessado na resposta a essa pergunta, terá que estudar a física quântica em detalhes. Felizmente, porém, não é necessário entender toda a base teórica desses fenômenos. Embora o fenômeno da superposição possa parecer incompreensível, é importante enfatizar que são essas propriedades que são características das partículas elementares da natureza. Portanto, a computação quântica está muito mais próxima do básico da realidade física do que parece à primeira vista.

Devo esperar alguns anos e depois examinar mais de perto a computação quântica?


Não. Nesse caso, você se atrasará. Teoricamente, é possível primeiro desenvolver o hardware e, em seguida, prosseguir com o estudo do nível do software e ver o que pode ser alcançado com ele. No entanto, todos os conceitos já são mais ou menos claros e já é possível escrever simuladores quânticos em linguagens populares, incluindo Java, C #, Python e outros.
Então esses simuladores podem ser usados ​​para trabalhar em algoritmos quânticos. Embora esses algoritmos não proporcionem um aumento de desempenho que seja possível com sua ajuda ao trabalhar em equipamentos quânticos reais, eles devem estar funcionalmente completamente completos.

Portanto, se você está atualmente desenvolvendo um algoritmo quântico, tem tempo para aprimorá-lo e pode iniciá-lo quando o equipamento quântico aparecer no acesso.

Os algoritmos quânticos exigem uma abordagem intelectual diferente da clássica. Cientistas proeminentes começaram a desenvolver algoritmos quânticos no século passado, e agora mais e mais artigos são publicados descrevendo esses algoritmos, incluindo aqueles para multiplicação de números inteiros, pesquisa de lista, trabalho de otimização de caminho e muito mais.

Existem outras razões pelas quais vale a pena fazer a computação quântica hoje. Refatorar um sistema de software em uma grande empresa moderna não é uma daquelas coisas que podem ser feitas da noite para o dia. No entanto, uma das áreas em que a computação quântica fará uma verdadeira revolução é a criptografia; afinal, tudo se baseia na teoria de que em um computador clássico é praticamente impossível decompor um número inteiro grande em fatores primos.

Embora possa demorar muitos anos até que os computadores quânticos se tornem grandes o suficiente para resolver facilmente o problema da fatoração inteira, os desenvolvedores sabem que leva muitos anos para mudar de sistema e introduzir novas tecnologias mais seguras.

Como posso aprender a trabalhar com algoritmos quânticos em Java?


Você pode baixar e dominar o Strange , o simulador quântico de código aberto em Java. Estranho permite simular um algoritmo quântico criando uma série de qubits e aplicando várias portas quânticas a eles.

Como exemplo simples, vamos criar dois qubits, q [0] e q [1], para que ambos estejam inicialmente no estado 0. Em seguida, aplicamos dois portões simples para cada um dos qubits, para que graficamente essa operação corresponda à fig. 7)

O primeiro qubit irá primeiro para a válvula Pauli-X e depois para a válvula Hadamard. A válvula Pauli-X a converterá do estado | 0 & gt para | 1 & gt, e a válvula Hadamard a converterá em uma superposição com probabilidades iguais | 0 & gt e | 1 & gt. Portanto, se concluirmos toda a sequência 1000 vezes e medirmos o primeiro qubit 1000 vezes no final deste ciclo, então, em média, podemos esperar que em 500 casos ela tenha um valor 0 e em 500 casos tenha um valor 1.

O segundo qubit é ainda mais simples. Começamos com o portão de identidade, que não altera o comportamento do qubit, e depois o passamos para o portão Pauli-X, alterando seu valor de 0 para 1.



Fig. 7. Um exemplo de algoritmo quântico que pode ser simulado usando Strange.

Para garantir que nosso raciocínio esteja correto, você pode criar um programa quântico simples usando Strange.

public static void main(String[] args) { Program p = new Program(2); Step s = new Step(); s.addGate(new X(0)); p.addStep(s); Step t = new Step(); t.addGate(new Hadamard(0)); t.addGate(new X(1)); p.addStep(t); SimpleQuantumExecutionEnvironment sqee = new SimpleQuantumExecutionEnvironment(); Result res = sqee.runProgram(p); Qubit[] qubits = res.getQubits(); Arrays.asList(qubits).forEach(q -> System.out.println("qubit with probability on 1 = "+q.getProbability()+", measured it gives "+ q.measure())); } 

Nesta aplicação, um programa quântico com dois qubits é criado:

  Program p = new Program(2); 

Como parte deste programa, passamos por duas etapas. Na primeira etapa, aplique a válvula Pauli-X em q [0]. Não aplicamos a válvula em q [1] e, portanto, implicamos que ela funcionará com a válvula de identidade. Adicione esta etapa ao programa:

  Step s = new Step(); s.addGate(new X(0)); p.addStep(s); 

Passamos então para o segundo estágio, onde aplicamos a válvula Hadamard em q [0] e a válvula Pauli-X em q [1]; adicione esta etapa ao programa:

  Step t = new Step(); t.addGate(new Hadamard(0)); t.addGate(new X(1)); p.addStep(t); 

Então, nosso programa está pronto. Agora vamos fazer. Um simulador quântico é incorporado ao Strange; no entanto, o Strange também pode usar um serviço de nuvem para executar programas em algum tipo de nuvem, por exemplo, no Oracle Cloud .

No exemplo a seguir, usamos um simulador embutido simples, executamos o programa e obtemos os qubits resultantes:

  SimpleQuantumExecutionEnvironment sqee = new SimpleQuantumExecutionEnvironment(); Result res = sqee.runProgram(p); Qubit[] qubits = res.getQubits(); 

Antes de medir os qubits (e perder todas as informações), exibimos as probabilidades. Agora meça os qubits e observe os valores:

 Arrays.asList(qubits).forEach(q -> System.out.println("qubit with probability on 1 = "+q.getProbability()+", measured it gives "+ q.measure())); 

Executando este aplicativo, obtemos a seguinte saída:

qubit with probability on 1 = 0.50, measured it gives 1
qubit with probability on 1 = 1, measured it gives 1

Atenção: para o primeiro qubit, o valor 0 também pode ser medido, como esperávamos.
Se você executar esse programa várias vezes, o valor do primeiro qubit, em média, será 0 na metade dos casos e 1 na metade dos casos.

É tudo o que você precisa saber sobre computação quântica?


Claro que não. Aqui não abordamos uma série de conceitos importantes, em particular, não discutimos os meandros que garantem a interação entre dois qubits, mesmo que fisicamente eles estejam muito distantes um do outro. Não falamos sobre os algoritmos quânticos mais famosos, entre eles o algoritmo Shore, que permite decompor números inteiros em fatores primos. Também ignoramos vários fatos matemáticos e físicos, em particular, que não levavam em conta que na superposição | x> = a | 0> + b | 1>, ambos os números, aeb podem ser complexos.

No entanto, o principal objetivo deste artigo foi dar a impressão de computação quântica e entender como eles se encaixam no futuro do desenvolvimento de software.

Source: https://habr.com/ru/post/pt450480/


All Articles