Mãos à obra com Qiskit: Hello World - Padrões Qiskit
Neste notebook você percorrerá um fluxo de trabalho de Padrões Qiskit e usará a primitiva Sampler do Qiskit.
Este tutorial envolve parcialmente conteúdo da Documentação IBM Quantum: Hello World.
Links úteis:
- Por favor, crie uma conta no IBM Cloud para acessar a Plataforma IBM Quantum.
- Para quem tem um e-mail universitário: obtenha um código de recurso aqui para estender seu período de avaliação gratuita.
- Para quem não tem um e-mail universitário: instruções para ativar sua conta. Ative completamente sua conta cadastrando um cartão de crédito. Seu cartão de crédito não é cobrado neste processo nem aleatoriamente após o cadastro. Esta ativação permite que você continue acessando seus recursos gratuitos no IBM Cloud e na plataforma IBM Quantum após o término do período de avaliação (30 dias).
- Usaremos uma plataforma baseada em nuvem para configurar um ambiente de codificação. Você pode usar o QBraid ou o Google Colab.
- Após este notebook, examinaremos o protocolo de Teletransporte Quântico.
Mais links - comunidade Qiskit e recursos adicionais de aprendizado:
- Grok sphere
- IBM Quantum Composer
- IBM Quantum Learning
- Aulas da Qiskit Global Summer School 2025
- Certificação Qiskit v2.X
- Programa Qiskit advocate
- Estágios de verão em Quantum
- Qiskit no YouTube
Instalar o Qiskit
Você pode usar um ambiente jupyter lab online (consulte o guia Ambientes de laboratório online) ou instalar o Qiskit localmente.
Siga o guia de instalação do Qiskit Instale o SDK do Qiskit e o cliente Qiskit Runtime para concluir as seguintes etapas:
-
Instale o Qiskit incluindo os pacotes extras de visualização:
pip install qiskit[visualization] -
Instale qiskit-ibm-runtime:
pip install qiskit-ibm-runtime -
Instale jupyter:
pip install jupyterVerifique se a versão do Python que você está usando em seu ambiente é python>=3.10, para garantir que seja compatível com a versão mais recente do Qiskit:
# Added by doQumentation — required packages for this notebook
!pip install -q IPython
from platform import python_version
print(python_version())
3.13.7
Se você precisar atualizar o Python e não souber como fazê-lo, consulte este guia sobre como atualizar o Python dependendo do seu sistema operacional: Como atualizar o Python
%pip install qiskit[visualization]
%pip install qiskit-ibm-runtime
%pip install
%pip install qiskit-aer
zsh:1: no matches found: qiskit[visualization]
Note: you may need to restart the kernel to use updated packages.
Requirement already satisfied: qiskit-ibm-runtime in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (0.43.0)
Requirement already satisfied: requests>=2.19 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.32.5)
Requirement already satisfied: requests-ntlm>=1.1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (1.3.0)
Requirement already satisfied: numpy>=1.13 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.3.3)
Requirement already satisfied: urllib3>=1.21.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.5.0)
Requirement already satisfied: python-dateutil>=2.8.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.9.0.post0)
Requirement already satisfied: ibm-platform-services>=0.22.6 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (0.69.0)
Requirement already satisfied: pydantic>=2.5.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.12.2)
Requirement already satisfied: qiskit>=1.4.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.2.1)
Requirement already satisfied: packaging in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (25.0)
Requirement already satisfied: ibm_cloud_sdk_core<4.0.0,>=3.24.2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from ibm-platform-services>=0.22.6->qiskit-ibm-runtime) (3.24.2)
Requirement already satisfied: PyJWT<3.0.0,>=2.10.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from ibm_cloud_sdk_core<4.0.0,>=3.24.2->ibm-platform-services>=0.22.6->qiskit-ibm-runtime) (2.10.1)
Requirement already satisfied: six>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from python-dateutil>=2.8.0->qiskit-ibm-runtime) (1.17.0)
Requirement already satisfied: charset_normalizer<4,>=2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (3.4.4)
Requirement already satisfied: idna<4,>=2.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (3.11)
Requirement already satisfied: certifi>=2017.4.17 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (2025.10.5)
Requirement already satisfied: annotated-types>=0.6.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (0.7.0)
Requirement already satisfied: pydantic-core==2.41.4 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (2.41.4)
Requirement already satisfied: typing-extensions>=4.14.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (4.15.0)
Requirement already satisfied: typing-inspection>=0.4.2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (0.4.2)
Requirement already satisfied: rustworkx>=0.15.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (0.17.1)
Requirement already satisfied: scipy>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (1.16.2)
Requirement already satisfied: dill>=0.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (0.4.0)
Requirement already satisfied: stevedore>=3.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (5.5.0)
Requirement already satisfied: cryptography>=1.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (46.0.2)
Requirement already satisfied: pyspnego>=0.4.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (0.12.0)
Requirement already satisfied: cffi>=2.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.0.0)
Requirement already satisfied: pycparser in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from cffi>=2.0.0->cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.23)
Note: you may need to restart the kernel to use updated packages.
[31mERROR: You must give at least one requirement to install (see "pip help install")[0m[31m
[0mNote: you may need to restart the kernel to use updated packages.
Requirement already satisfied: qiskit-aer in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (0.17.2)
Requirement already satisfied: qiskit>=1.1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.2.1)
Requirement already satisfied: numpy>=1.16.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.3.3)
Requirement already satisfied: scipy>=1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (1.16.2)
Requirement already satisfied: psutil>=5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (7.1.0)
Requirement already satisfied: python-dateutil>=2.8.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.9.0.post0)
Requirement already satisfied: six>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from python-dateutil>=2.8.0->qiskit-aer) (1.17.0)
Requirement already satisfied: rustworkx>=0.15.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (0.17.1)
Requirement already satisfied: dill>=0.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (0.4.0)
Requirement already satisfied: stevedore>=3.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (5.5.0)
Requirement already satisfied: typing-extensions in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (4.15.0)
Note: you may need to restart the kernel to use updated packages.
Faça as importações necessárias
Vamos fazer as importações necessárias para este tutorial.
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
import qiskit_ibm_runtime
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit.quantum_info import SparsePauliOp
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector, plot_state_qsphere
from IPython.display import display, Latex
Configure sua conta na Plataforma IBM Quantum
Para executar circuitos quânticos em hardware real, você precisará de uma conta no IBM Cloud.
Siga as instruções neste guia Configure sua conta IBM Cloud para concluir as seguintes etapas:
- Configure uma conta IBM Cloud caso ainda não tenha uma.
- Faça login ou crie uma conta na Plataforma IBM Quantum com um IBMid.
- Acesse o painel da Plataforma IBM Quantum, crie seu token de API e copie-o para um local seguro. (Veja a primeira imagem de referência abaixo.)
- Na célula de código que segue as imagens de referência, substitua
deleteThisAndPasteYourAPIKeyHerepela sua chave de API. - Vá para a página Instances no menu principal ☰ e crie sua instância. Se você não fizer parte de uma instituição da Network, escolha o plano open. (Veja a segunda imagem de referência abaixo.)
- Após a criação da instância, copie o código CRN associado a ela. (CRN significa Cloud Resource Names) Talvez seja necessário atualizar para ver a instância.
- Na célula de código que segue as imagens de referência, substitua
deleteThisAndPasteYourCRNHerepelo seu código CRN.
Nota: Trate sua chave de API como você trataria uma senha segura. Consulte o guia Configure sua conta IBM Cloud para obter mais informações sobre o uso da sua chave de API em ambientes seguros e não confiáveis.
#@title personals
your_api_key = "YOUR_API_KEY"
your_crn = "YOUR_CRN"
from qiskit_ibm_runtime import QiskitRuntimeService
# Save your API key to access real devices
your_api_key = your_api_key
your_crn = your_crn
QiskitRuntimeService.save_account(
channel="ibm_cloud",
token=your_api_key,
instance=your_crn,
set_as_default=True,
overwrite=True,
)
Crie e execute um algoritmo quântico simples usando o framework de padrões Qiskit
O framework conceitual de padrões Qiskit pode ser considerado a anatomia de um algoritmo quântico.
As quatro etapas para escrever um programa quântico usando padrões Qiskit são:
-
Mapear o problema para um formato nativo quântico.
-
Otimizar os circuitos e operadores.
-
Executar usando uma função primitiva do Qiskit.
-
Analisar os resultados.
Etapa 1. Mapear o problema para um formato nativo quântico
Em um programa quântico, circuitos quânticos são o formato nativo para representar instruções quânticas, e operadores representam os observáveis a serem medidos. Ao criar um circuito, você normalmente criará um novo objeto QuantumCircuit e, em seguida, adicionará instruções a ele em sequência.
Demonstração: Construindo circuitos quânticos básicos no Qiskit
Vamos tentar construir alguns circuitos simples com Qiskit.
# Simple quantum circuit with two qubits and two classical bits
# Create quantum circuit with 2 qubits and 2 classical bits
qc = QuantumCircuit(2)
# Add gates to your circuit
qc.x(0)
qc.s(1)
# Draw the output using MatPlotLib
qc.draw(output='mpl')
# Quantum circuit with a Quantum Register named 'qr' that has two qubits, and a Classical Register named 'cr' with two classical bits
# Create a quantum register with 2 qubits, register label is 'qr'
qreg = QuantumRegister(2)
# Create a classical register with 2 qubits, register label is 'cr'
creg = ClassicalRegister(2)
# Create a quantum circuit with registers qreg and creg
qc = QuantumCircuit(qreg, creg)
# Add gates to your registers
qc.x(qreg[0])
# Draw the quantum circuit
qc.draw(output='mpl')
Exercício: Construindo circuitos quânticos básicos no Qiskit
Crie um circuito para o estado de Bell
# Create a new circuit with two qubits
qc = QuantumCircuit(2)
# Add a Hadamard gate to qubit 0
qc.h(0)
# Perform a controlled-X gate on qubit 1, controlled by qubit 0
qc.cx(0,1)
# Return a drawing of the circuit using MatPlotLib ("mpl").
qc.draw('mpl')
O estado inicial do circuito quântico é o estado .
O estado final é:
# Use Statevector to fetch the statevector of the circuit
sv = Statevector(qc)
sv.draw(output='latex')
Uma nota sobre numeração de bits no Qiskit
O Qiskit numera os bits em uma string da direita para a esquerda. O SDK do Qiskit usa a numeração de bits LSb 0. Ao exibir ou interpretar uma lista de bits (ou qubits) como uma string, o bit é o bit mais à esquerda e o bit é o bit mais à direita. Isso ocorre porque normalmente escrevemos números com o dígito mais significativo à esquerda e, no Qiskit, o bit é interpretado como o bit mais significativo. Para mais detalhes, consulte o tópico Ordenação de bits no SDK do Qiskit.
#LSB ordering example
qc2 = QuantumCircuit(2)
qc2.x(1)
qc2.draw("mpl")
sv2 = Statevector(qc2)
sv2.draw(output='latex')
Precisamos de portas de medição?
Ao criar circuitos quânticos, você também deve considerar que tipo de dado deseja que seja retornado após a execução. O Qiskit fornece duas maneiras de retornar dados: você pode obter o valor esperado de um observável ou pode obter uma distribuição de probabilidade para um conjunto de qubits que você escolhe medir. Prepare sua carga de trabalho para medir seu circuito de uma dessas duas formas com primitivas Qiskit.
- Primitiva
Sampler- retorna uma distribuição de probabilidade para um conjunto de qubits que você escolhe medir. Ex.:
- Primitiva
Estimator- retorna o valor esperado de um observável. Ex.:
Hoje usaremos o Sampler, então precisamos adicionar portas de medição ao nosso circuito.
# Use measure_all, which adds a barrier, applies measurement gates on all qubits, creates a classical register called `meas`
qc.measure_all()
qc.draw('mpl')
Etapa 2. Otimize os circuitos para o hardware-alvo
Ao executar circuitos em um dispositivo, é importante otimizar o conjunto de instruções que o circuito contém e minimizar a profundidade geral (aproximadamente o número de instruções) do circuito. Isso garante que você obtenha os melhores resultados possíveis ao reduzir os efeitos de erro e ruído. Além disso, as instruções do circuito devem estar em conformidade com a Arquitetura do Conjunto de Instruções (ISA) de um dispositivo backend e devem considerar as portas básicas e a conectividade dos qubits do dispositivo.
O código a seguir instancia um simulador para o qual enviar uma tarefa e transforma o circuito e os observáveis para corresponder à ISA desse backend. Note que usaremos um dispositivo real mais tarde.
# option:
from qiskit_ibm_runtime.fake_provider import FakeTorino
backend = FakeTorino()
print(
f"Name: {backend.name}\n"
f"Version: {backend.version}\n"
f"Native gate set: {backend.operation_names}\n"
)
#to view other properties you can use properties()
# refer to https://docs.quantum.ibm.com/guides/get-qpu-information
Name: fake_torino
Version: 2
Native gate set: ['for_loop', 'delay', 'cz', 'id', 'sx', 'measure', 'reset', 'switch_case', 'if_else', 'rz', 'x']
# Convert to an ISA circuit
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
isa_circuit_sampler = pm.run(qc)
isa_circuit_sampler.draw("mpl", idle_wires=False)

Etapa 3. Execute usando as primitivas Qiskit
Computadores quânticos podem produzir resultados aleatórios, então você normalmente coleta uma amostra das saídas executando o circuito muitas vezes. Você pode estimar o valor do observável usando a classe Estimator. O Sampler pode ser usado para obter dados de um computador quântico. Esses objetos possuem um método run() que executa a seleção de circuitos, observáveis e parâmetros (se aplicável), usando um bloco unificado primitivo (PUB).
# Create a sampler instance using the selected backend
sampler = Sampler(backend)
# Run the sampler primitive on ISA circuit for specified number of shots (1024)
job_sampler = sampler.run([isa_circuit_sampler], shots=1024)
# Save the result of the job
result_sampler = job_sampler.result()
Etapa 4. Pós-processar os resultados
Esta etapa envolve o pós-processamento dos seus resultados. Você pode alimentar esses resultados em outro fluxo de trabalho para análise adicional ou preparar um gráfico dos valores e dados principais. Em geral, esta etapa é específica para o seu problema.
- Para o
Sampler, plotamos a distribuição de probabilidade obtida ao amostrar o circuito quântico tantas vezes quanto os shots que você especificou usandoplot_histogram.
from qiskit.visualization import plot_histogram
counts = result_sampler[0].data.meas.get_counts()
# Note: meas is the default name of the classical register when using measure_all().
# If you specify a classical register, then use the name you assign
# Plot the result
plot_histogram(counts)

Executar um programa em um dispositivo real
Se você quiser executar este código em um dispositivo real, pode usar o seguinte código.
from qiskit_ibm_runtime import QiskitRuntimeService
# View the list of backends you have access to
service = QiskitRuntimeService()
service.backends()
management.get:WARNING:2025-11-03 14:24:36,838: Loading default saved account
[<IBMBackend('ibm_fez')>,
<IBMBackend('ibm_brisbane')>,
<IBMBackend('ibm_torino')>,
<IBMBackend('ibm_marrakesh')>]
# Get backend
backend_real = service.least_busy(simulator=False, operational=True)
#backend_real = service.backend(name="insert_backend_name") # use this if you want to choose a specific backend
sampler = Sampler(backend_real)
pm = generate_preset_pass_manager(backend=backend_real, optimization_level=3)
isa_circuit = pm.run(qc)
job = sampler.run([isa_circuit], shots=1024)
print(job.job_id)
<bound method BasePrimitiveJob.job_id of <RuntimeJobV2('d444lcg7i53s73e4n6tg', 'sampler')>>
result = job.result()
print(
f"Name: {backend_real.name}\n"
f"Version: {backend_real.version}\n"
f"Native gate set: {backend_real.operation_names}\n"
)
Name: ibm_fez
Version: 2
Native gate set: ['delay', 'cz', 'id', 'sx', 'measure', 'reset', 'if_else', 'rz', 'x']
counts = result[0].data.meas.get_counts()
plot_histogram(counts)

Buscando resultados de uma tarefa concluída
A célula abaixo demonstra como você pode buscar resultados de uma tarefa concluída.
service = QiskitRuntimeService()
retrieved_job = service.job('d40mquhsg33c73dhhs00')
result = retrieved_job.result()
counts = result[0].data.meas.get_counts()
plot_histogram(counts)
management.get:WARNING:2025-11-03 14:24:55,135: Loading default saved account
