Pular para o conteúdo principal

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:

  • qiskit v2.1.0 ou mais recente
  • qiskit-ibm-runtime v0.40.1 ou mais recente
  • qiskit-aer v0.17.0 ou mais recente
  • qiskit.visualization
  • numpy
  • pylatexenc

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:

S(coin)=12up+12downS(coin) = \frac{1}{2}|up\rangle + \frac{1}{2}|down\rangle

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 "|\rangle" (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()

Output of the previous code cell

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: 0|0\rangle e 1|1\rangle. Criamos o estado probabilístico de "superposição" partindo do estado 0|0\rangle e então aplicando algo chamado de porta Hadamard ao qubit. Isso o coloca em uma superposição igual de 0|0\rangle e 1|1\rangle. 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 0|0\rangle e 50% de chance de medirmos 1|1\rangle. Escrevemos esse estado de forma um pouco diferente do caso probabilístico clássico, por razões que ficarão claras mais adiante:

ψ=120+121|\psi\rangle = \frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle

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")

Output of the previous code cell

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)

Output of the previous code cell

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:

E(money)=12(+1 dollar)+12(1 dollar)=0 dollarsE(money) = \frac{1}{2} (+ \text{1 dollar}) + \frac{1}{2} (- \text{1 dollar}) = \text{0 dollars}

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 0|0\rangle e 1|1\rangle, respectivamente.

ψZψ=120Z0+121Z1=12(+1)+12(1)=0\langle \psi|Z|\psi \rangle = \frac{1}{2} \langle 0 | Z | 0 \rangle + \frac{1}{2} \langle 1 | Z | 1 \rangle = \frac{1}{2} (+1) + \frac{1}{2}(-1) = 0
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 +|+\rangle ou |-\rangle, que apontam ao longo do eixo xx. 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 +|+\rangle ou |-\rangle, 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 +|+\rangle e |-\rangle. Que valor esperado de X esperaríamos que o Estimator retornasse, se esse fosse o caso?

Resposta:

Quando aplicamos X ao estado +|+\rangle, obtemos o valor +1 e ao estado |-\rangle 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 +|+\rangle e |-\rangle.

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 ψ|\psi\rangle? Quais são as probabilidades de medir +|+\rangle e |-\rangle nessa base X?

Resposta:

Como o valor esperado é igual ao valor de X para o estado +|+\rangle, isso significa que temos 100% de probabilidade de medir o estado +|+\rangle 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,

S(coin)=c1up+c2downS(coin) = c_1|up\rangle + c_2|down\rangle

cada coeficiente é simplesmente um número real e positivo que representa a probabilidade de medir um determinado estado. Em um estado quântico,

ψ=c10+c21|\psi\rangle = c_1 |0\rangle + c_2 |1\rangle

os coeficientes são complexos, portanto contêm uma parte real e uma parte imaginária. Cada coeficiente cic_i pode ser expresso como um vetor bidimensional no plano complexo, com magnitude ci|c_i| e ângulo ϕi\phi_i que ele faz com o eixo real:

ci=cieiϕi.c_i = |c_i| e^{i \phi_i}.

A circle in a complex plane. The quantum state is represented as an arrow of length 1 that can rotate to point to any point on the circle. The horizontal component of the arrow is its real amplitude, and the vertical is its complex amplitude.

Chamamos ϕi\phi_i 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 Δϕ=ϕ2ϕ1\Delta \phi = \phi_2 - \phi_1 dos dois coeficientes —, normalmente aplicamos uma fase global de ϕ1-\phi_1 ao estado inteiro, de modo que c1c_1 seja puramente real e a fase relativa seja inteiramente capturada em c2c_2.

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")

Output of the previous code cell

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 0|0\rangle. Em seguida, o primeiro Hadamard transforma o estado em superposição, como já vimos:

H0=120+121.H|0\rangle = \frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle.

Nesse caso, ambos os coeficientes são totalmente reais e positivos, o que significa que a fase é ϕ=0\phi=0.

O segundo Hadamard é então aplicado a cada parte do estado de superposição separadamente. Já sabemos como o Hadamard transforma o estado 0|0\rangle. Mas e o 1|1\rangle?

H1=120121H|1\rangle = \frac{1}{\sqrt{2}} |0\rangle - \frac{1}{\sqrt{2}} |1\rangle

Isso é, novamente, uma superposição igual de 0 e 1, semelhante a lançar uma moeda, mas o coeficiente deste estado na frente de 1|1\rangle tem uma fase de ϕ=π\phi = \pi 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: H(120+121)H(\frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle). Observe que HH é distributivo, portanto podemos aplicá-lo a cada um dos termos individualmente.

Resposta:

H(120+121)=12H0+12H1=12[(0+1)+(01)]=0H(\frac{1}{\sqrt{2}} |0\rangle + \frac{1}{\sqrt{2}} |1\rangle) = \frac{1}{\sqrt{2}} H|0\rangle + \frac{1}{\sqrt{2}} H|1\rangle = \frac{1}{2} [(|0\rangle + |1\rangle) + (|0\rangle - |1\rangle)] = |0\rangle

Agora vamos verificar nossa previsão com o Sampler.

## Transpile

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qcoin_0)

## 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()

## Analyze
plot_histogram(counts)

Output of the previous code cell

O segundo Hadamard cancelou o primeiro e retornamos ao estado 0 de onde começamos! Isso ocorre porque o Hadamard transforma os estados 0|0\rangle e 1|1\rangle em estados semelhantes, mas com fases opostas. Após o segundo Hadamard, vemos que os termos 0|0\rangle interferem de forma construtiva, mas os termos 1|1\rangle interferem de forma destrutiva e se cancelam mutuamente.

Vamos explorar mais: podemos mudar a fase usando uma porta "PHASE". Então, agora vamos aplicar um Hadamard para criar a superposição, aplicar um deslocamento de fase de π\pi radianos e, em seguida, aplicar o segundo Hadamard:

qcoin_pi = QuantumCircuit(1)
qcoin_pi.h(0)
qcoin_pi.p(np.pi, 0)
qcoin_pi.h(0)
qcoin_pi.measure_all()

qcoin_pi.draw("mpl")

Output of the previous code cell

## Transpile

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qcoin_pi)

## 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()

## Analyze
plot_histogram(counts)

Output of the previous code cell

E agora o qubit é medido no estado 1 em vez de 0.

Portanto, mesmo com esses poucos experimentos simples, você já pode ver a diferença drástica que essa fase pode fazer em um circuito quântico. Ela pode ser sutil e difícil de perceber no início. Em nosso primeiro experimento, onde simplesmente lançamos nossa moeda quântica com uma porta Hadamard e medimos o resultado do lançamento, nada revelou o efeito da fase. Só quando aprofundamos a análise descobrimos a diferença que uma fase pode fazer. Ela pode fazer com que a mesma porta quântica tenha literalmente o efeito oposto em um qubit.

Tente você mesmo:

Edite o bloco de código abaixo para mudar a fase de forma que o segundo Hadamard crie um estado de superposição com probabilidades de 25% e 75% de encontrar o estado em 0|0\rangle e 1|1\rangle, respectivamente. Verifique sua resposta com matemática.

qcoin_phase = QuantumCircuit(1)
qcoin_phase.h(0)
# replace "x" below with a phase from 0 to 2*np.pi (this cell won't run if you leave x)
# qcoin_phase.rz(x, 0)
qcoin_phase.h(0)
qcoin_phase.measure_all()

## Transpile

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qcoin_phase)

## 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()

## Analyze
plot_histogram(counts)

Output of the previous code cell

Uma analogia melhor com a moeda usando a porta NOT\sqrt{\text{NOT}}

Até agora aprendemos que o ato de lançar uma moeda é bem diferente de criar um estado de superposição. Existe uma analogia melhor com uma moeda que capture mais dos fenômenos semelhantes à superposição? Sim. Existe.

Vamos fazer outro experimento mental com uma moeda. Imagine a moeda em cima da mesa, com a cara para cima. Para virá-la com a cara para baixo, podemos simplesmente girá-la. Isso é o equivalente computacional de uma porta "NOT".

Digamos que queremos construir uma operação que, se aplicada duas vezes, seja equivalente à porta NOT. Ou seja, queremos uma "raiz quadrada do NOT", ou NOT\sqrt{\text{NOT}}. Podemos fazer isso considerando como a porta NOT é fisicamente implementada na moeda: é apenas uma rotação de 180 graus em torno, por exemplo, do eixo x. Portanto, se girarmos a moeda apenas 90 graus em torno do eixo x, isso seria equivalente a uma porta NOT\sqrt{\text{NOT}}.

Imagine que, após aplicar a porta NOT\sqrt{\text{NOT}}, queremos perguntar se a moeda está com a cara para cima ou para baixo. Ela não está em nenhum dos dois — está de pé na borda em relação ao eixo vertical. Mas agora, vamos redefinir nossa "medição" da moeda como sendo: primeiro, colapsar a moeda ao longo do eixo de medição (pressionando-a com a mão para que fique deitada) e, segundo, verificar se está com a cara para cima ou para baixo.

Se realizarmos essa "medição" na moeda de pé na borda, ela "colapsará" para cara para cima e cara para baixo com igual probabilidade. Assim como no lançamento de uma moeda, em princípio, a direção para a qual a moeda cai pode ser prevista com base nas condições iniciais da moeda e em como exatamente a força da nossa mão é aplicada para "colapsá-la". Mas, na prática, deve ser difícil prever qual lado ficará para cima, portanto é essencialmente aleatório.

Na verdade, podemos medir essa moeda ao longo de três eixos diferentes: xx, yy e zz. Vemos que a borda da moeda aponta ao longo de xx e zz, portanto a medição nessas direções requer "colapsar" a moeda — logo, ao longo desses eixos, haverá resultados aleatórios com probabilidade 50:50 de medir cara para cima e cara para baixo. Mas ao longo do eixo yy, ela já está deitada, com a cara voltada para a direção -y. Podemos chamar isso de "cara para frente."

Portanto, enquanto as medições em x e z produziram resultados aleatórios, a medição em y sempre produzirá o mesmo resultado! Se você se lembrar do experimento de "lançamento da moeda quântica" da seção anterior, isso é semelhante ao comportamento da moeda quântica. Ela foi medida como 0 ou 1 com probabilidade 50/50 na direção z, mas sempre como +|+\rangle e nunca como |-\rangle ao longo de X. Isso sugere que talvez uma moeda parada na borda seja uma forma melhor de visualizar um estado de superposição de um qubit do que uma moeda girando sem controle no ar.

Vamos usar o Qiskit para ver se nossa "moeda quântica" se comporta da mesma forma que nossa moeda clássica quando uma porta NOT\sqrt{\text{NOT}} é aplicada. Vamos aplicar NOT\sqrt{\text{NOT}} a um qubit partindo de 0|0\rangle e, em seguida, usar o Estimator para verificar o valor esperado dos três observáveis X, Y e Z.

qcoin_sx = QuantumCircuit(1)
qcoin_sx.sx(0)

qcoin_sx.draw("mpl")

Output of the previous code cell

obs1 = Pauli("X")
obs2 = Pauli("Y")
obs3 = Pauli("Z")

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_sx)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
obs3_isa = obs3.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

estimator = Estimator(mode=backend)
pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]])]
job = estimator.run(pubs)
res = job.result()

# Run the job on the Aer simulator with noise model from real backend
# pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]])]
# job = estimator_sim.run(pubs)
# res=job.result()

# Step 4: Return the result in classical form, and analyze.

print(res[0].data.evs)
[[-0.01234492]
[-1.00388865]
[ 0.00740695]]

Os valores esperados são 0, -1 e 0 para X, Y e Z, respectivamente.

Verifique seu entendimento

Leia a pergunta abaixo, pense na sua resposta e clique no triângulo para revelar a solução.

Dados os valores esperados, quais são as probabilidades de medir a moeda quântica como cara para cima/baixo (ou para a esquerda/direita ou para frente/trás) para cada um dos 3 eixos de medição?

Resposta:

Há uma probabilidade 50/50 de medir qualquer estado ao longo de X e Z, e o estado é sempre medido na direção -y ao longo de Y.

Esse é o mesmo resultado que obtivemos no nosso experimento mental aplicando uma rotação de 90 graus do "NOT\sqrt{\text{NOT}}" na moeda clássica. Na verdade, existe uma analogia precisa entre a moeda e o estado do qubit agora. Podemos visualizar o estado do qubit como um vetor apontando na direção da cara em uma moeda, normal à superfície da moeda. Assim, cara para cima, ou o estado 0|0\rangle em uma moeda quântica, é equivalente a um vetor apontando diretamente para cima; cara para baixo, ou 1|1\rangle, aponta diretamente para baixo. Qualquer superposição igual de 0|0\rangle e 1|1\rangle aponta horizontalmente. A fase do estado determina a direção horizontal exata — a direção para a qual ele aponta ao longo do equador é igual à direção para a qual o coeficiente c2c_2 aponta no plano complexo.

Agora, toda porta que vimos neste notebook pode ser visualizada como uma rotação (ou série de rotações) da moeda/vetor.

  • NOT: 180 graus em torno do eixo x

  • NOT\sqrt{\text{NOT}}: 90 graus em torno do eixo x

  • PHASE: rotação de ϕ\phi em torno do eixo z

  • Hadamard: Esta é um pouco mais complicada. Inicialmente a comparamos a lançar uma moeda, fazendo-a girar sem controle no ar. Mas o Hadamard é na verdade uma rotação controlada e determinística da moeda, como as outras portas. O Hadamard é executado girando 90 graus em torno do eixo y, depois 180 graus em torno do eixo x.

Portanto, não há nada de aleatório em um estado de superposição quântica ou em qualquer uma das operações padrão que realizamos no qubit. Cada operação é determinística e reversível. A única vez que a aleatoriedade entra em jogo é quando decidimos medir o estado quântico.

O estado do qubit como vetor de Bloch

Esse vetor que aponta na direção da "cara" da moeda é conhecido como "vetor de Bloch". Formalmente, um estado arbitrário de qubit (isolado) pode ser representado por um vetor que fica na superfície de uma esfera de raio 1 com coordenadas (r,θ,ϕ)(r, \theta, \phi). Escrito em termos dessas coordenadas, o estado do qubit é:

ψ=cosθ20+eiϕsinθ21|\psi\rangle = \cos{\frac{\theta}{2}} |0\rangle + e^{i \phi} \sin{\frac{\theta}{2}} |1\rangle

A diagram of the Bloch sphere. The quantum state is a vector in three dimensions. Since it can point in any direction, the quantum state can be specified using polar angles theta and phi to locate a point on a spherical surphace. Agora vamos verificar com o Qiskit como o vetor de Bloch muda quando aplicamos várias portas ao nosso qubit partindo do estado 0|0\rangle.

NOT

from qiskit.visualization import plot_bloch_multivector

qnot = QuantumCircuit(1)
qnot.x(0)

plot_bloch_multivector(qnot)

Output of the previous code cell

NOT\sqrt{\text{NOT}}

qsqrtnot = QuantumCircuit(1)
qsqrtnot.sx(0)

plot_bloch_multivector(qsqrtnot)

Output of the previous code cell

PHASE (ϕ=π\phi = \pi)

qphase = QuantumCircuit(1)
qphase.p(np.pi, 0)

plot_bloch_multivector(qphase)

Output of the previous code cell

Hadamard

qhadamard = QuantumCircuit(1)
qhadamard.h(0)

plot_bloch_multivector(qhadamard)

Output of the previous code cell

Conclusão — o que é um estado de superposição?

Começamos este módulo comparando a aleatoriedade de medir um estado de superposição quântica a um lançamento de moeda. Comparamos a "porta Hadamard" que produz uma superposição quântica ao ato de lançar uma moeda. Mas, por meio de uma série de experimentos, aprendemos que existem diferenças fundamentais entre um lançamento de moeda clássico e uma superposição quântica.

Aprendemos que, na verdade, não há nada de "aleatório" em um qubit em estado de superposição. É como uma moeda parada no espaço tridimensional. Na verdade, uma moeda que é livre para girar em 3 dimensões é uma analogia muito próxima de uma forma particular de visualizar o estado quântico de um qubit, chamada de vetor de Bloch. As portas quânticas giram essa moeda/vetor de Bloch de forma determinística e reversível. É somente quando medimos o qubit que qualquer aleatoriedade é introduzida. Comparamos esse processo de medição a achatar a moeda para que ela fique plana na direção do eixo de medição.

Se um estado quântico está ou não em superposição é uma questão de perspectiva. Como você provavelmente já encontrou antes, somos livres para escolher nosso sistema de coordenadas — xx, yy e zz podem apontar ao longo de quaisquer três direções ortogonais. Então, se temos uma superposição de 0 e 1 em um sistema de coordenadas, podemos definir um novo sistema de coordenadas — ou, equivalentemente, uma nova "base de medição" — no qual o estado aponta puramente na direção +z+z e, portanto, não está em um estado de superposição. Então, quando dizemos que um qubit está em superposição, também devemos responder à pergunta: "superposição de quê?"

Você pode sair deste módulo com a impressão de que acabamos de remover todo o mistério da mecânica quântica. Afinal, um dos aspectos supostamente "mais estranhos", o estado de superposição de um qubit, é na verdade tão simples quanto um vetor tridimensional. Mas tenha em mente que a moeda ainda é apenas uma analogia, e mesmo o vetor de Bloch é apenas uma ferramenta de visualização para calcular probabilidades de resultados de medição. Não podemos dizer o que um estado quântico está realmente fazendo antes de ser medido. Porque verificar isso exige uma medição!

Discutiremos esse dilema de qual é a natureza "verdadeira" de um estado quântico e como o fenômeno quântico do entrelaçamento pode nos ajudar a elucidar isso no módulo da Desigualdade de Bell.

Questões

Os instrutores podem solicitar versões desses notebooks com gabaritos e orientações sobre a inserção em currículos comuns preenchendo esta pesquisa rápida sobre como os notebooks estão sendo utilizados.

Conceitos fundamentais:

  • Embora a medição de um qubit em superposição seja probabilística, como o lançamento de uma moeda, o próprio estado de superposição se comporta de forma diferente de uma moeda em lançamento.
  • Uma diferença principal entre uma distribuição de probabilidade clássica e uma superposição é que a superposição tem coerência de fase, o que lhe permite interferir construtiva ou destrutivamente.
  • O estado de um único qubit isolado pode ser visualizado como um ponto na chamada "esfera de Bloch", onde as amplitudes relativas dos componentes 0|0\rangle e 1|1\rangle determinam o ângulo polar θ\theta e as fases relativas entre os dois componentes determinam o ângulo azimutal ϕ\phi.
  • Todas as portas quânticas de um único qubit podem ser vistas como rotações do vetor nessa esfera.

Questões V/F:

  1. V/F Uma superposição quântica é basicamente a mesma coisa que um evento probabilístico na física clássica, como o lançamento de uma moeda.

  2. V/F O comprimento do vetor de Bloch que descreve o estado de um único qubit isolado é sempre 1.

  3. V/F As portas quânticas de um único qubit não alteram o comprimento do vetor de Bloch.

Questões de múltipla escolha:

  1. Selecione o vetor de Bloch correto que representa o estado Ψ=130+eiπ/4231|\Psi\rangle = \sqrt{\frac{1}{3}}|0\rangle + e^{i \pi / 4} \sqrt{\frac{2}{3}}|1\rangle:

Four Bloch spheres are shown. The vector points nearly along +x in option a, halfway between +x and +y and slightly below the xy plane in option b, between +x and -y, and slightly above the xy plane in option c, and along -x in option d.

  1. A esfera de Bloch descreve o seguinte de um qubit: (selecione tudo que se aplica)

    a. amplitude

    b. entrelaçamento com outros qubits

    c. fase

    d. cor

    e. probabilidade dos resultados de medição

Questões para discussão:

  1. Por que o estado de um qubit pode ser visualizado na esfera de Bloch, mas a distribuição de probabilidade de um lançamento de moeda não pode?

  2. Por que uma moeda girando no ar não é a melhor analogia para um estado de superposição quântica? Que aspecto das superposições não é capturado nessa analogia?

Problemas desafio:

  1. Use o Qiskit para criar um circuito que transforme o estado 0|0\rangle no estado 320+12ei5π61\frac{\sqrt{3}}{2}|0\rangle + \frac{1}{2}e^{i \frac{5\pi}{6}}|1\rangle