O “Hello World” da computação quântica
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).
Um estado Bell pode ser gerado com uma porta Hadamard e uma porta Controlled-NOT, como mostra a figura a seguir:
Este circuito quântico pode ser representado algebricamente da seguinte forma:
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:
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.