O “Hello World” da computação quântica

Filipe Chagas Ferraz
CQ em Português
Published in
4 min readJan 26, 2023

Nos artigos anteriores da CQ em Português (Qubits e Portas Lógicas Quânticas), foram apresentados alguns conceitos básicos e teóricos de computação quântica. Neste artigo, partiremos para uma abordagem mais prática, porém igualmente básica, com a linguagem Python e o SDK Qiskit. O exercício prático que aqui será lecionado é a geração de um estado Bell, que, como já explicado no artigo sobre qubits, é um estado de dois qubits emaranhados (Eq. 1).

Eq. 1 — Definição de um estado Bell

Um estado Bell pode ser gerado com uma porta Hadamard e uma porta Controlled-NOT, como mostra a figura a seguir:

Fig. 1 — Circuito quântico que gera o estado Bell

Este circuito quântico pode ser representado algebricamente da seguinte forma:

Eq. 2 — Representação algébrica reduzida do circuito quântico da fig. 1

onde Cx corresponde à porta Controlled-NOT, H corresponde à porta Hadamard e I corresponde a uma matrix identidade 2x2.

Implementação e simulação do circuito quântico da fig. 1 com Qiskit

Qiskit é, atualmente, uma das principais ferramentas de desenvolvimento para computação quântica. Este poderoso SDK contém recursos para manipulação, transpilação, simulação e execução de algoritmos quânticos, além de incluir uma grande coleção de “helpers” para a implementação de algoritmos quânticos e híbridos de otimização, machine learning, aritmética, química, etc.

Qiskit é multiplataforma e seu processo de instalação é bastante simples, basta digitar “pip install qiskit” no terminal.

Primeiro passo — importação do Qiskit

Utilize o comando “import qiskit” para fazer com que os recursos da biblioteca Qiskit sejam carregados.

import qiskit

Segundo passo — criação dos registradores

Para esta prática, é necessário criar um registrador quântico de 2 qubits e um registrador clássico de 2 bits. Isto pode ser feito com o seguinte trecho de código:

qr = qiskit.QuantumRegister(2)
cr = qiskit.ClassicalRegister(2)

Terceiro passo — construção do circuito quântico

Para construir o circuito quântico apresentado na fig. 1, é necessário, primeiro, criar um objeto QuantumCircuit com os dois registradores inclusos.

qc = qiskit.QuantumCircuit(qr, cr)

Após criar o objeto QuantumCircuit, utilize os métodos h e cx para adicionar as portas Hadamard e Controlled-NOT ao circuito.

qc.h(qr[0]) #Adiciona uma porta Hadamard sobre o qubit 0
qc.cx(qr[0], qr[1]) #Adiciona uma porta Controlled-NOT com o qubit 0 como controle e o qubit 1 como alvo

Para completar a construção do circuito, é necessário adicionar portas de medição. Estas portas são responsáveis por medir o estado do registrador quântico e armazenar o resultado no registrador clássico (lembre-se do que foi dito sobre colapso de estado quântico no artigo sobre qubits). Para adicionar estas portas, utilize o método measure.

qc.measure(qr, cr)

É possível visualizar o circuito construído com o método draw. Caso tenha a biblioteca matplotlib instalada, utilize o seguinte trecho de código:

import matplotlib.pyplot as plt

qc.draw(output='mpl')
plt.show()

O resultado é esta figura:

Fig. 2 — Circuito construído com Qiskit

Quarto passo — simulação

O SDK Qiskit possui um simulador chamado Aer. Há um pequeno conjunto de métodos de simulação disponíveis no Aer, cada um com suas vantagens e desvantagens. Para esta prática, escolhi o método statevector.

Para carregar o simulador, utilize a seguinte linha de código:

sim = qiskit.Aer.get_backend('aer_simulator_statevector')

Para executar a simulação, utilize o método run do simulador. Este método irá retornar um objeto AerJob.

job = sim.run(qc, shots=1024)

Observe que há um argumento “shots” no método run. Este argumento especifica a quantidade de vezes que o circuito quântico é executado.

Para obter os resultados da simulação, utilize o método result da classe AerJob. Este método retorna um objeto Result contendo várias informações sobre a simulação.

res = job.result()

Para obter as medições do estado final do circuito quântico, utilize o método get_counts da classe Result. Este método retorna um dict contendo as bit-strings obtidas na simulação, cada uma com a respectiva frequência.

counts = res.get_counts()

print(counts)
#Saída: {'00': 530, '11': 494}

Observe que, nesta simulação, a sequência de bits “00” foi obtida 530 vezes e a sequência “11” foi obtida 494 vezes.

Utilizando a biblioteca Matplotlib (já importada) e a função plot_histogram do Qiskit, é possível transformar este dict em um histograma.

from qiskit.tools.visualization import plot_histogram

plot_histogram(counts)
plt.show()

O resultado é a seguinte figura:

Interpretação do resultado

O estado Bell é formado por uma combinação linear de dois estados puros: |00> e |11>. Teoricamente, as probabilidades do estado Bell colapsar em |00> e |11> são iguais, ou seja, ambas 1/2. Na simulação, as frequências relativas obtidas foram 530/1024=0.52 e 494/1024=0.48. Pela lei dos grandes números, quanto maior for a quantidade de shots de simulação, mais próximas de 1/2 serão estas frequências relativas obtidas. No entanto, vale ressaltar que o método de simulação statevector é ideal, ou seja, não considera o ruído de um computador quântico real.

--

--

Filipe Chagas Ferraz
CQ em Português

Brasil, Cuiabá-MT; engenheiro de computação pela Universidade Federal de Mato Grosso; professor e pesquisador. https://github.com/FilipeChagasDev