Moedas Quânticas — um módulo sobre superposição e interferência
Para este módulo do Qiskit em Salas de Aula, os estudantes precisam ter um ambiente Python funcional com os seguintes pacotes instalados:
qiskitv2.1.0 ou mais recenteqiskit-ibm-runtimev0.40.1 ou mais recenteqiskit-aerv0.17.0 ou mais recenteqiskit.visualizationnumpypylatexenc
Para configurar e instalar os pacotes acima, consulte o guia Instalar o Qiskit. Para executar jobs em computadores quânticos reais, os estudantes precisarão criar uma conta no IBM Quantum® seguindo os passos do guia Configure sua conta IBM Cloud.
Este módulo foi testado e utilizou 47 segundos de tempo de QPU. Isso é apenas uma estimativa. O uso real pode variar.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
Assista ao guia do módulo pela Dra. Katie McCormick abaixo, ou clique aqui para assistir no YouTube.
Introdução
Neste módulo, vamos explorar um dos princípios fundamentais da teoria quântica: a superposição. Em nossa experiência cotidiana, os objetos sempre têm características definidas. Sua localização, tamanho, forma, cor — tudo sobre eles — é determinado e certo, mesmo que nós, os observadores, ainda não os tenhamos medido. No mundo quântico, isso não é necessariamente o caso. Um objeto quântico pode estar em algo chamado "superposição" de múltiplos estados classicamente permitidos. Quando a superposição é medida, ela vai aleatoriamente "colapsar" para um desses estados.
De certa forma, medir um estado de superposição é como jogar uma moeda: não há como saber com antecedência de que lado ela vai cair. Esse indeterminismo fundamental é um aspecto desconfortável da mecânica quântica com o qual até Einstein teve dificuldade. Ele disse, em sua famosa frase, "Deus não joga dados" sobre esse acaso. Mas, como veremos, Deus de fato joga dados — e também joga moedas.
Vamos pensar no lançamento de uma moeda clássica como uma analogia para a medição de um estado de superposição. E — ao brincar com uma "moeda quântica" usando o Qiskit e um qubit em um processador quântico da IBM® — rapidamente descobriremos os limites dessa analogia.
Moeda clássica
Vamos começar com uma moeda clássica. Jogue uma moeda para o alto, e ela vai cair com a cara para cima ou para baixo, com 50% de chance para cada lado. Embora, em princípio, fosse possível calcular de que lado a moeda vai cair se você conhecesse as condições iniciais exatas da moeda e a força/torque do lançamento, na prática, não há como saber a priori de que lado ela vai cair. É por isso que usamos o lançamento de moeda como exemplo canônico de um estado probabilístico clássico, onde o resultado é essencialmente aleatório. Podemos escrever o estado da moeda antes de ela cair para refletir essa probabilidade 50/50:
Aqui, os dois termos representam os dois resultados possíveis do lançamento, e seus coeficientes representam as probabilidades de cada um dos resultados. Note que, tipicamente, o "" (conhecido como "ket") é usado para representar um estado quântico, mas aqui estamos falando de um estado probabilístico clássico. Consulte a Lição 1: Sistemas Individuais no curso Fundamentos de Informação Quântica para aprender mais sobre como representamos informação clássica e quântica.
Se lançarmos uma moeda 1000 vezes e registrarmos o número de vezes que ela cai com a cara para cima ou para baixo, obteríamos algo assim:
# import necessary packages:
import numpy as np
import matplotlib.pyplot as plt
import random
nflips = 1000
fliplist = [random.randint(0, 1) for f in range(nflips)]
# bar plots using get_gaussian_probs function
plt.hist(fliplist)
plt.show()
Moeda quântica
Podemos criar um estado probabilístico similar usando um qubit em nosso computador quântico. Assim como o lançamento de moeda, um qubit também pode ser medido em dois estados possíveis: e . Criamos o estado probabilístico de "superposição" partindo do estado e então aplicando algo chamado de porta Hadamard ao qubit. Isso o coloca em uma superposição igual de e . Note que, embora esse estado de superposição possa parecer e se comportar como a moeda à primeira vista, logo veremos que há muito mais nele do que isso. O objetivo deste módulo é mostrar que uma superposição não é o mesmo que um lançamento de moeda clássico.
Assim, como o qubit está em uma superposição igual de 0 e 1, quando medimos o qubit, há 50% de chance de medirmos e 50% de chance de medirmos . Escrevemos esse estado de forma um pouco diferente do caso probabilístico clássico, por razões que ficarão claras mais adiante:
Aqui, as probabilidades de medir cada um dos dois estados não são mais iguais aos coeficientes, como era o caso no estado probabilístico clássico acima. Em vez disso, é o quadrado dos coeficientes que nos dá as probabilidades, e cada um desses coeficientes pode agora ser complexo, o que significa que pode ter partes real e imaginária.
Apesar dessas diferenças, porém, o resultado de medir esse estado é essencialmente o mesmo que lançar uma moeda.
from qiskit import QuantumCircuit
qcoin = QuantumCircuit(1)
qcoin.h(0)
qcoin.measure_all()
qcoin.draw("mpl")
Portanto, na prática, aplicar a porta Hadamard é o análogo a lançar uma moeda. E, assim como lançamos a moeda 1000 vezes para observar as estatísticas de ela cair com a cara para cima ou para baixo, podemos fazer algo similar no Qiskit com nossa "moeda quântica". Podemos usar uma primitiva do Qiskit chamada Sampler, que repetirá um circuito várias vezes para amostrar as estatísticas do estado resultante.
Primeiro, carregamos o serviço Qiskit Runtime e as primitivas, depois selecionamos um backend no qual executar o circuito.
Há um código abaixo para salvar suas credenciais no primeiro uso. Certifique-se de excluir essas informações do notebook após salvá-las em seu ambiente, para que suas credenciais não sejam compartilhadas acidentalmente ao compartilhar o notebook. Consulte Configure sua conta IBM Cloud e Inicialize o serviço em um ambiente não confiável para mais orientações.
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform', instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')
# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import (
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)
# Use the least busy backend
backend = service.least_busy()
print(backend.name)
ibm_kingston
Se você não tiver mais tempo disponível em sua conta, também pode optar por executar isso em um simulador. Basta descomentar o código e executar a célula abaixo para fazê-lo:
## Use a local simulator
# from qiskit_aer import AerSimulator
## Generate a simulator that mimics the real quantum system
# backend_sim = AerSimulator.from_backend(backend)
## Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
# from qiskit.primitives import BackendSamplerV2
# sampler_sim = BackendSamplerV2(backend = backend_sim)
# from qiskit.primitives import BackendEstimatorV2
# estimator_sim = BackendEstimatorV2(backend = backend_sim)
## Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin)
## Execute
# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analysis
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Com 1000 amostras do circuito acima, obtemos algo praticamente idêntico ao histograma da moeda clássica, salvo alguma flutuação estatística.
Além de amostrar as estatísticas da moeda quântica, também podemos usar outra primitiva do Qiskit chamada Estimator para medir o chamado valor esperado de um observável do estado. Para ilustrar o que é esse valor esperado, vamos usar a moeda clássica como exemplo. Digamos que você esteja usando a moeda para apostar: toda vez que você lança a moeda e ela cai com a "cara para cima", você ganha um real. Mas toda vez que ela cai com a "cara para baixo", você perde um real. Se você quiser saber quanto dinheiro espera ganhar por lançamento (o valor esperado do observável "dinheiro"), você calcularia:
Como é igualmente provável que você ganhe um real ou perca um real, o valor esperado é $0.
De forma similar, com um estado quântico, podemos calcular o valor esperado do observável "Z", onde Z é a matriz de Pauli com valores +1 e -1 associados aos estados e , respectivamente.
from qiskit.quantum_info import Pauli
qcoin = QuantumCircuit(1)
qcoin.h(0)
# for Estimator, we do not apply the measurement to the circuit
<qiskit.circuit.instructionset.InstructionSet at 0x136df1ba0>
## Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
obs = Pauli("Z")
qc_isa = pm.run(qcoin)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
## Execute
# On real hardware:
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# On a simulator:
# job = estimator_sim.run([[qc_isa, obs_isa]])
# res=job.result()
print(res[0].data.evs)
-0.014799284701239441
Obtemos um valor esperado de 0, como esperado (hah). Essa é outra forma de confirmar que, de fato, há probabilidade igual de medir 0 e 1, e aparentemente se comporta como um lançamento de moeda.
Neste ponto, a "moeda quântica" parece exatamente igual à moeda clássica. Mas na próxima seção, faremos alguns experimentos que revelarão as diferenças fundamentais entre as duas.
O quantum revelado: um experimento em três dimensões
Vamos fazer um experimento mental: imagine que você joga uma moeda no ar e, em vez de deixá-la cair no chão, tem a coordenação para bater palmas quando ela passa entre suas mãos e prendê-la entre as palmas. Agora, em vez de a moeda ficar com a cara para cima ou para baixo, ela fica com a cara para a esquerda ou para a direita.
Verifique seu entendimento
Leia a(s) pergunta(s) abaixo, pense na sua resposta e clique no triângulo para revelar a solução.
Qual é a probabilidade de cada um desses resultados, cara para a esquerda ou cara para a direita?
Resposta:
A probabilidade ainda será 50-50. Não deve importar ao longo de qual dimensão você escolhe medir o resultado do lançamento da moeda.
Esperamos que você tenha respondido que a probabilidade de encontrar a cara para a esquerda ou para a direita ainda é 50-50. A dimensão ao longo da qual o lançamento da moeda é medido não deve afetar a probabilidade dos resultados.
Mas como as coisas seriam diferentes para a nossa moeda quântica? Vamos verificar.
Podemos criar nossa superposição quântica da mesma forma que fizemos antes, com uma porta Hadamard. Para medir "cara para a esquerda ou para a direita" em nossa moeda quântica, podemos fazer o que fizemos com a moeda clássica: medir ao longo de um eixo diferente. Nossas medições padrão no computador quântico são ao longo do eixo vertical, assim como a medição usual de "cara para cima ou para baixo" da moeda clássica. Mas também podemos perguntar à nossa moeda quântica se ela está com a cara para a esquerda ou para a direita — ou, equivalentemente, se ela está nos estados ou , que apontam ao longo do eixo . O Sampler amostra apenas na base de medição Z, mas podemos usar o Estimator para nos fornecer o valor esperado de X. Os valores de X são +1 e -1 para os estados ou , respectivamente.
Verifique seu entendimento
Leia a pergunta abaixo, pense na sua resposta e clique no triângulo para revelar a solução.
Se a moeda quântica se comportasse como a moeda clássica neste caso, teríamos uma probabilidade 50-50 de medir o estado em e . Que valor esperado de X esperaríamos que o Estimator retornasse, se esse fosse o caso?
Estimator retornasse, se esse fosse o caso?Resposta:
Quando aplicamos X ao estado , obtemos o valor +1 e ao estado obtemos -1, portanto, se tivéssemos uma distribuição 50-50, obteríamos um valor esperado de 0.
# Step 1: map problem
qcoin_lr = QuantumCircuit(1)
qcoin_lr.h(0)
obs = Pauli("X")
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_lr)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# Run the job on the Aer simulator with noise model from real backend
# job = estimator_sim.run([[qc_isa,obs_isa]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print(res[0].data.evs)
0.9985207100591716
O valor esperado de X para este estado é 1. Portanto, não há uma probabilidade 50-50 de medir e .
Verifique seu entendimento
Leia a(s) pergunta(s) abaixo, pense na sua resposta e clique no triângulo para revelar a solução.
O que esse valor esperado nos diz sobre o estado ? Quais são as probabilidades de medir e nessa base X?
Resposta:
Como o valor esperado é igual ao valor de X para o estado , isso significa que temos 100% de probabilidade de medir o estado ao medir ao longo de X.
O que está acontecendo aqui? Parece que nossa moeda quântica pode ter resultados aleatórios e probabilísticos ao longo de uma dimensão, mas resultados perfeitamente previsíveis ao longo de outra. Seria como lançar uma moeda e garantir que, toda vez que fosse pega pressionando-a entre as duas mãos, ela acabaria com a cara voltada para a direita.
A fase quântica
A principal diferença da moeda quântica é que ela possui uma qualidade que a moeda clássica não tem. Lembre-se de que, em um estado probabilístico clássico,
cada coeficiente é simplesmente um número real e positivo que representa a probabilidade de medir um determinado estado. Em um estado quântico,
os coeficientes são complexos, portanto contêm uma parte real e uma parte imaginária. Cada coeficiente pode ser expresso como um vetor bidimensional no plano complexo, com magnitude e ângulo que ele faz com o eixo real:

Chamamos de fase. A fase nos diz como dois termos em um estado quântico irão interferir, ou seja, como eles se somarão ou se cancelarão como ondas. Se duas ondas estão em fase uma com a outra — com seus picos e vales alinhados —, elas se combinarão para formar uma onda duas vezes mais alta. Chamamos isso de interferência construtiva. Se estiverem fora de fase, ou seja, com o pico de uma alinhado com o vale da outra e vice-versa, elas interferem de forma destrutiva e se cancelam completamente.
Como ondas, os estados quânticos também podem se somar construtiva ou destrutivamente. Isso pode ser mais difícil de perceber porque muitas vezes não estamos falando de uma onda real no espaço físico. No caso dos nossos qubits, a interferência acontece no espaço de informação abstrato dos qubits. Observe também que, como apenas a fase relativa entre as duas ondas importa para como elas irão interferir — ou seja, a diferença nas fases dos dois coeficientes —, normalmente aplicamos uma fase global de ao estado inteiro, de modo que seja puramente real e a fase relativa seja inteiramente capturada em .
Para ver como a fase pode causar interferência em nossa moeda quântica, vamos tentar aplicar o Hadamard duas vezes em vez de apenas uma. Classicamente, isso não faria nenhum sentido — se aplicar o Hadamard é equivalente a lançar uma moeda, então você não pode lançar uma moeda que já está girando. Mas vamos ver o que acontece com a moeda quântica:
qcoin_0 = QuantumCircuit(1)
qcoin_0.h(0)
qcoin_0.h(0)
qcoin_0.measure_all()
qcoin_0.draw("mpl")
Agora, antes de usarmos o Sampler para medir o estado resultante, vamos pensar em como esse qubit será transformado por cada porta. Ele começa, como de costume, em . Em seguida, o primeiro Hadamard transforma o estado em superposição, como já vimos:
Nesse caso, ambos os coeficientes são totalmente reais e positivos, o que significa que a fase é .
O segundo Hadamard é então aplicado a cada parte do estado de superposição separadamente. Já sabemos como o Hadamard transforma o estado . Mas e o ?
Isso é, novamente, uma superposição igual de 0 e 1, semelhante a lançar uma moeda, mas o coeficiente deste estado na frente de tem uma fase de para lhe dar o sinal negativo.
Verifique seu entendimento
Leia a pergunta abaixo, pense na sua resposta e clique no triângulo para revelar a solução.
Calcule o estado resultante após aplicar o segundo Hadamard. Ou seja, calcule: . Observe que é distributivo, portanto podemos aplicá-lo a cada um dos termos individualmente.
Resposta: