Computação Quântica —Algoritmo de número aleatório

Victor Galhardo Sponchiado
CQ em Português
Published in
5 min readMay 1, 2021

Seu primeiro programa em computação quântica!

Olááá, caso nunca tenha ouvido falar em computação quântica, recomendo que leia rapidamente estes 3 artigos para se familiarizar:
- 10 fatos em 10 dias, computação quântica, por Victor Sponchiado
- Introdução à computação quântica, por Cláudio Monteiro
- Portas lógicas quânticas, por Filipe Chagas

Como já sabe, os algoritmos quânticos seguem uma lógica própria, embasando-se em portas quânticas e circuitos, porém é possível combinar computação clássica e assim fazer algoritmos mistos.

Para nosso exemplo, vamos utilizar a linguagem de programação Python e o framework Qiskit, criado pela IBM.
A IBM possui uma plataforma na qual é possível modelar circuitos quânticos, escrever algoritmos em “notebooks”, e nos permite rodar os códigos em computadores quânticos reais.

Vamos lá!
Primeiramente abra a plataforma da IBM, faça uma conta ou utilize uma rede social sua.

Após o login, veja na lateral superior esquerda um botão quadrado para abrir as aplicações que estão disponíveis.

Vamos utilizar o Quantum Lab para abrir um notebook e programarmos. Abra-o e clique em novo arquivo.
A própria plataforma já trás algumas linhas escritas, porém apague todas e vamos por partes. Primeiramente digite print(‘Hello Quantum World!!’) e aperte shift + enter para rodar. =)

IBM Quantum Lab

Para criarmos uma programa que gere números aleatórios iremos utilizar principalmente a porta Hadamard, que eleva o qbit ao estado sobreposto e após sua medição ele colapsa em 0 ou 1. Para iniciarmos o circuito precisamos importar o Qiskit, é com ele que trabalharemos, e para importar é fácil, digite: from qiskit import *
O Cláudio Monteiro fez um artigo que explica mais sobre o Qiskit(aqui), caso tenha interesse.

Utilize a classe QuantumCircuit, onde indicaremos qual a quantidade de qbits que queremos e quantos bits clássicos, os bits clássicos serão utilizados para receber as medições. Após vamos aplicar a porta Hadamard em todos os qbits criados com o código circuit.h().

IBM Quantum Lab

— Legal Victor, mas você ainda não falou qual a lógica que será utilizada..
Certo, faremos o seguinte: Sabemos que se aplicarmos a porta Hadarmad em um qbit e após realizarmos uma medição ele vai colapsar para 0 ou 1 com 50% de chances para cada, logo, podemos nos aproveitar e juntar todos os resultados em um só, onde teremos no caso acima (criamos um circuito com qbits) um conjunto de 5 números de zeros e uns misturados, com isso, se pensarmos que esse conjunto é um número escrito em binário é só converte-lo para decimal.
Ex: Caso o resultado seja 01011, a conversão para decimal fica 11.

http://blog.novaeletronica.com.br/img/tabela-Decimal-para-Bin%C3%A1rios.jpg

Até aqui tranquilo? Bora continuar.

O Qiskit vem com ferramentas de simulações para executar os códigos em nossos computadores clássicos, para isso temos que chamar as funções e executar a simulação, além disso é necessário realizar medições no qbits com o código circuit.measure(). Após a simulação recebemos o resultado e convertemos para decimal.

IBM Quantum Lab

Ta, mas aí você pode falar “ah.. mas assim não consigo passar um valor máximo para o número aleatório…Isso aí depende do número de qbits que você criar…”, é, você tem razão. Vamos aprimorar alguns pontos do código.

Primeiro, vamos transformar tudo em uma função e atribuir o argumento máximo, além, precisamos transformar o número máximo em quantidade de qbits necessários para ter esse número. Se ficou confuso, aqui temos um exemplo:
Digamos que o valor máximo seja 10.000, que em binário é 10011100010000, um total de 14 caracteres, neste caso precisaríamos criar um circuito com 14 qbits. Para fazer a transformação do decimal(maximo) para binário e medir seu tamanho em caracteres utilizaremos esse código: len(bin(10000)[2:]). Aqui surge um outro porém, caso um daqueles zeros fosse 1 o valor seria maior que 10.000, logo, precisamos colocar uma condição para somente retornar a resposta caso o valor seja menor ou igual ao máximo.
Chega de enrolação, aqui está o código chamando a função com máximo de 10.000.

IBM Quantum Lab
:)

Caso queira rodar esse código em um dos computadores quânticos da IBM é simples, basta carregar sua conta IBMQ.load_account(), alterar o beckend da simulação, escolher qual o computador quântico vai rodar seu algoritmo e carregamos o monitor de trabalho para acompanhar o andamento com o job_monitor.

Na plataforma da IBM:

Assim terminamos nosso gerador de números aleatórios quântico! Ah, e esse foi o resultado para um máximos de 15.000:

Caso você não utilize o ambiente da IBM, é necessário que instale o Qiskit e que pegue sua autenticação pra fazer o IBMQ.load.account().

Sei que não falei em detalhes sobre o código, nem expliquei as estruturas do Python e do Qiskit, mas caso você tenha interesse ou dúvidas eu estou a disposição, é só me achar em uma das redes sociais.

Arquivos no GitHub.

Espero que tenha gostado e até a próxima.
Abraços
Victor Sponchiado

--

--