Implementação com Qiskit
Nesta seção, vamos explorar algumas implementações em Qiskit dos conceitos apresentados nesta aula. Se você quiser executar essas implementações por conta própria — o que é altamente recomendado —, consulte a página Instalar o Qiskit na Documentação do IBM Quantum para obter detalhes sobre como configurar o Qiskit.
É importante entender que o Qiskit está em desenvolvimento contínuo e tem como foco principal maximizar o desempenho dos computadores quânticos que opera, os quais também continuam evoluindo. Por isso, o Qiskit está sujeito a mudanças que podem ocasionalmente tornar código obsoleto (deprecação). Tendo isso em mente, sempre executaremos os seguintes comandos antes de apresentar exemplos de código Qiskit neste curso, para que fique claro qual versão do Qiskit foi utilizada. A partir do Qiskit v1.0, esta é uma forma simples de verificar qual versão do Qiskit está instalada atualmente.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
from qiskit import __version__
print(__version__)
2.2.3
Se você estiver executando isso em um ambiente Python baseado em nuvem, pode ser necessário instalar alguns dos seguintes pacotes:
#!pip install qiskit
#!pip install jupyter
#!pip install sympy
#!pip install matplotlib
#!pip install pylatexenc
Vetores e matrizes em Python
O Qiskit utiliza a linguagem de programação Python, portanto, antes de falar sobre o Qiskit especificamente, pode ser útil revisar brevemente os cálculos com matrizes e vetores em Python.
Em Python, cálculos com matrizes e vetores podem ser realizados usando a classe array da biblioteca NumPy, que oferece funcionalidades para diversas computações numéricas e científicas.
O código a seguir carrega essa biblioteca, define dois vetores coluna, ket0 e ket1, correspondentes aos vetores de estado quântico e e então imprime a média deles.
import numpy as np
ket0 = np.array([[1], [0]])
ket1 = np.array([[0], [1]])
print(ket0 / 2 + ket1 / 2)
[[0.5]
[0.5]]
Também podemos usar array para criar matrizes que representem operações.
M1 = np.array([[1, 1], [0, 0]])
M2 = np.array([[1, 0], [0, 1]])
M = M1 / 2 + M2 / 2
print(M)
[[1. 0.5]
[0. 0.5]]
Note que todo o código dentro de uma determinada aula neste curso deve ser executado sequencialmente.
Portanto, não é necessário importar o NumPy novamente aqui, pois ele já foi importado anteriormente.
A multiplicação de matrizes, incluindo a multiplicação matriz-vetor como caso especial, pode ser realizada usando a função matmul do NumPy.
print(M1 @ ket1)
print(M1 @ M2)
print(M @ M)
[[1]
[0]]
[[1 1]
[0 0]]
[[1. 0.75]
[0. 0.25]]
Essa formatação de saída deixa a desejar visualmente.
Uma solução, para situações que exigem algo mais apresentável, é usar a função array_to_latex do Qiskit, do módulo qiskit.visualization.
Note que, no código a seguir, estamos usando a função genérica display do Python.
Em contraste, o comportamento específico de print pode variar dependendo do que está sendo impresso, como ocorre com arrays definidos pelo NumPy.
from qiskit.visualization import array_to_latex
display(array_to_latex(M1 @ ket1))
display(array_to_latex(M1 @ M2))
display(array_to_latex(M @ M))