Skip to main content
IBM Quantum Platform

Explorando a incerteza

Para este módulo do Qiskit in Classrooms, os alunos devem ter um ambiente Python em funcionamento 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 trabalhos em computadores quânticos reais, os alunos precisarão configurar uma conta no IBM Quantum® seguindo as etapas do guia Configurar sua conta IBM Cloud.

Esse módulo foi testado e usou 8 minutos de tempo de QPU. Essa é apenas uma estimativa. Seu uso real pode variar. Dois cálculos demorados são marcados como tal nos comentários do cabeçalho e podem ser realizados em simuladores se os alunos estiverem com pouco tempo de QPU. Com eles removidos, o módulo requer apenas ~30 segundos de tempo de QPU.

# 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 passo a passo do módulo pela Dra. Katie McCormick abaixo, ou clique aqui para assisti-lo em YouTube.



Introdução

Você provavelmente já ouviu falar do princípio da incerteza, mesmo fora de seus cursos de física. Uma reafirmação coloquial comum da incerteza é: "Ao olhar para algo, você o influencia" Isso é certamente verdade. Mas uma maneira mais física de descrever a incerteza é que há certos observáveis físicos que têm uma incompatibilidade que impede que ambos sejam conhecidos simultaneamente com precisão arbitrária. Muitos alunos encontram pela primeira vez o par de variáveis incompatíveis xx e pxp_x, ou seja, a posição ao longo de um eixo chamado eixo xx e o momento linear ao longo dessa direção, respectivamente. Para essas variáveis, a restrição de incerteza é escrita ΔxΔpx2.\Delta x \Delta p_x \geq \frac{\hbar}{2}. Aqui, Δx\Delta x é chamado de "incerteza em xx ", que tem a mesma definição que o desvio padrão em estatística e pode ser definido como Δx=x2x2.\Delta x = \sqrt{\langle x^2 \rangle - \langle x \rangle^2}. Δpx\Delta p_x é definido da mesma forma. Aqui, não vamos derivar essa relação de incerteza; vamos salientar que ela é consistente com nosso entendimento das ondas clássicas. Ou seja, uma onda com uma frequência verdadeiramente perfeita ff e comprimento de onda λ\lambda continuaria indefinidamente como uma senoide perfeita. Em termos de mecânica quântica, isso corresponderia a conhecer perfeitamente o momento de acordo com a hipótese de De Broglie: λ=h/p\lambda = h/p. Mas para saber wherewhere onde uma partícula semelhante a uma onda está localizada, a onda que a descreve deve ter um pico mais acentuado no espaço, como um gaussiano muito estreito, por exemplo. Sabemos que podemos expressar qualquer função contínua, inclusive essas funções de onda com picos acentuados, como uma série de Fourier de funções senoidais com diferentes comprimentos de onda. Mas, à medida que a função de onda atinge um pico mais acentuado (e a posição é mais conhecida), precisaremos de mais termos na série de Fourier, o que significa uma mistura de mais comprimentos de onda (e, portanto, mecanicamente quântica, mais valores de momento).

Em termos mais simples: um estado com um momento bem definido (uma sinusoide perfeita no espaço) tem uma posição muito incerta. Um estado com uma posição bem definida (como uma distribuição delta de Dirac) tem um momento muito incerto.

Há outras variáveis que apresentam essa incompatibilidade. Por exemplo, o spin de uma partícula pode ter uma projeção bem definida ao longo de um eixo, mas não sabemos nada sobre a projeção em um eixo ortogonal. Por exemplo, o estado 0|0\rangle \sim |\uparrow\rangle (para um qubit ou partícula spin-1/2 ) tem uma projeção definida ao longo do eixo zz (de 1 no contexto de um qubit e de /2\hbar/2 no contexto de uma partícula spin-1/2 ). Mas esse estado pode ser escrito como uma superposição de dois estados, cada um dos quais com uma projeção bem definida no eixo xx : 0=12(+x+x)|0\rangle = \frac{1}{\sqrt{2}}(|+\rangle_x+|-\rangle_x) ou, de forma equivalente (10)=12[12(11)+12(11)].\begin{pmatrix} 1 \\ 0\end{pmatrix} = \frac{1}{\sqrt{2}}\left[\frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1\end{pmatrix}+\frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ -1\end{pmatrix}\right]. +x|+\rangle_x tem uma projeção bem definida em xx, assim como x|-\rangle_x. Portanto, se especificarmos a projeção de um estado ao longo do eixo xx, não saberemos a projeção ao longo do eixo zz. E se especificarmos a projeção no eixo zz, não saberemos a projeção ao longo de xx. Há pequenas diferenças quando se discute isso no contexto de spin e em qubits. Mas, de modo geral, os estados próprios das matrizes de Pauli têm uma relação interessante que podemos explorar. Ao longo desta lição, verificaremos experimentalmente nossa intuição sobre a incerteza nessas variáveis incompatíveis e verificaremos se as relações de incerteza se mantêm nos computadores quânticos IBM®.


Verificação simples da intuição

Neste primeiro experimento e em todo o módulo, usaremos uma estrutura para computação quântica conhecida como "padrões Qiskit", que divide os fluxos de trabalho nas seguintes etapas:

  • Etapa 1: mapear entradas clássicas para um problema quântico
  • Etapa 2: otimizar o problema para a execução quântica
  • Etapa 3: Executar usando Qiskit Runtime Primitives
  • Etapa 4: Pós-processamento e análise clássica

Em geral, seguiremos essas etapas, embora nem sempre possamos rotulá-las explicitamente.

Vamos começar carregando alguns pacotes necessários, incluindo as primitivas de tempo de execução. Também selecionaremos o computador quântico menos ocupado disponível para nós.

Há um código abaixo para salvar suas credenciais na primeira utilização. Certifique-se de excluir essas informações do notebook depois de salvá-lo em seu ambiente, para que suas credenciais não sejam compartilhadas acidentalmente quando você compartilhar o notebook. Consulte Configurar sua conta IBM Cloud e Inicializar o serviço em um ambiente não confiável para obter mais orientações.

from numpy import pi

# 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 (
    Batch,
    SamplerV2 as Sampler,
    EstimatorV2 as Estimator,
)

# Use the least busy backend
backend = service.least_busy(min_num_qubits=127)
print(backend.name)

Output:

ibm_sherbrooke

Se um aluno esgotar seu tempo disponível de computação quântica durante a aula, as linhas abaixo podem ser descomentadas e usadas para configurar um simulador que imite parcialmente o comportamento de ruído do computador quântico selecionado acima.

# Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
from qiskit_aer.primitives import SamplerV2, EstimatorV2
from qiskit_aer.noise import NoiseModel

# Generate the noise model from the backend properties
noise_model = NoiseModel.from_backend(backend)

noisy_sampler = SamplerV2(options={"backend_options": {"noise_model": noise_model}})
noisy_estimator = EstimatorV2(options={"backend_options": {"noise_model": noise_model}})

Você deve se lembrar que um estado próprio de um operador, Z, não é um estado próprio de outro operador X. Vamos observar isso agora, experimentalmente, fazendo medições ao longo dos eixos xx e zz. Para a medição ao longo de zz, simplesmente usamos qc.measure (), pois os computadores quânticos IBM são estruturados para medir ao longo de zz. Mas para medir ao longo de xx, precisamos girar o sistema para mover efetivamente o eixo xx até a orientação ao longo da qual medimos. Isso é feito com uma porta Hadamard. Há uma etapa semelhante necessária para medições ao longo de yy. As etapas necessárias estão reunidas aqui por conveniência:

  • Para medir ao longo de zz : qc.measure()
  • Para medir ao longo de xx : qc.h() então qc.measure()
  • Para medir ao longo de yy : qc.sdg(), qc.h(), qc.sentão qc.measure()

Passo 1: Mapear entradas clássicas para um problema quântico

Nesse caso, a etapa de mapeamento é simplesmente expressar as medições e rotações descritas acima em um circuito quântico:

# Step 1: Map

# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)

# Add a first measurement
qc.measure(qr, cr[0])
qc.barrier()

# Change basis so that measurements made on quantum computer which normally tell us about z,
# now tell us about x.
qc.h(qr)

# Add a second measurement
qc.measure(qr, cr[1])

qc.draw("mpl")

Output:

Output of the previous code cell

Etapa 2: Otimizar o problema para execução quântica

Essa etapa pega as operações que queremos realizar e as expressa em termos da funcionalidade de um computador quântico específico. Ele também mapeia nosso problema no layout do computador quântico.

# Step 2: 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(qc)

Etapa 3: Executar usando primitivas de Qiskit Runtime

Podemos usar o sampler para coletar estatísticas sobre as medições. Vamos construir a primitiva Sampler para ser executada em um computador quântico real usando mode = backend. Existem outros modos para outros fluxos de trabalho, e vamos usar um deles a seguir. O Sampler será utilizado chamando seu método run() com uma lista de "pubs" (Blocos Primitivos Unificados). Cada pub contém até três valores que, juntos, definem uma unidade de trabalho de cálculo a ser concluída pelo estimador: circuitos, observáveis e parâmetros. Você também pode fornecer uma lista de circuitos, uma lista de observáveis e uma lista de parâmetros. Para obter mais informações, leia a Visão geral dos PUBs.

Queremos executar em um computador quântico real, de modo que estejamos realizando um experimento de física quântica real. Se você esgotar o tempo alocado em computadores quânticos reais, poderá comentar o código abaixo para o computador quântico e descomentar o código para execução em um simulador.

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


sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs)
res = job.result()

counts = res[0].data.c.get_counts()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_sampler.run([qc_isa])
# res=job.result()
# counts=res[0].data.c.get_counts()

Etapa 4: Pós-processamento

Esse é um caso especialmente simples de pós-processamento, no qual simplesmente visualizamos as contagens.

Observe que o Qiskit ordena qubits, medidas e outros itens listando o item de menor número por último / à direita, uma convenção conhecida como "little-endian". Isso significa que a coluna abaixo rotulada como "10" refere-se a contagens em que a primeira medição produziu um "0" e a segunda medição produziu um "1".

# Step 4: Post-process

from qiskit.visualization import plot_histogram

plot_histogram(counts)

Output:

Output of the previous code cell

Se essa convenção não lhe agradar, você pode usar o site marginal_counts para visualizar os resultados de cada medição separadamente:

from qiskit.result import marginal_counts

plot_histogram(
    marginal_counts(counts, indices=[0]), title="Counts after first measurement"
)

Output:

Output of the previous code cell
plot_histogram(
    marginal_counts(counts, indices=[1]), title="Counts after second measurement"
)

Output:

Output of the previous code cell

Por padrão, os estados no Qiskit são inicializados para o estado 0|0\rangle. Portanto, não é de surpreender que quase todas as primeiras medições tenham resultado em 0|0\rangle. Observe, entretanto, que houve quase uma divisão uniforme na segunda medição (a que fornece informações sobre projeções do estado em xx ). Parece que esse estado que nos dá um resultado muito previsível de medições ao longo de zz nos dá um conjunto muito imprevisível de resultados para medições ao longo de xx. Vamos explorar isso.

O que acontecerá se as medições forem feitas na ordem oposta? Poderíamos começar usando a porta Hadamard para obter estatísticas sobre a probabilidade de 0|0\rangle ser medido em ±x|\pm\rangle_x. Em seguida, para a segunda medição, mudaremos de volta para a base zz usando uma segunda porta Hadamard.

# Step 1:

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)

# Change basis to measure along x.
qc.h(qr)
qc.measure(qr, cr[0])
qc.barrier()

# Change our basis back to z and make a second measurement
qc.h(qr)
qc.measure(qr, cr[1])

qc.draw("mpl")

Output:

Output of the previous code cell
# Step 2: Transpile the circuit for running on a quantum computer

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer

sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs)
res = job.result()
counts = res[0].data.c.get_counts()

# Run the job on the Aer simulator with noise model from real backend
# job = noisy_sampler.run([qc_isa])
# res=job.result()
# counts=res[0].data.c.get_counts()
# Step 4: Post-process
from qiskit.visualization import plot_histogram

plot_histogram(counts)

Output:

Output of the previous code cell

Aqui, parece que temos ainda menos previsibilidade! Anteriormente, pelo menos sabíamos qual seria o resultado da primeira medição; agora temos uma distribuição razoavelmente uniforme em todos os estados possíveis. Não é muito difícil entender por que isso aconteceu. Começamos em 0|0\rangle, que é uma mistura de 50-50 de +x|+\rangle_x e x|-\rangle_x, de acordo com 0=12(+x+x)|0\rangle=\frac{1}{\sqrt{2}}(|+\rangle_x+|-\rangle_x) Portanto, é evidente que deve haver a mesma probabilidade de obter o estado + ou - (mapeado como 0 e 1 no gráfico) para a primeira medição. A medição ao longo de xx colapsa o estado em um estado próprio +x|+\rangle_x ou no estado próprio x|-\rangle_x. Cada um desses estados é uma mistura 50-50 de 0|0\rangle e 1|1\rangle, de acordo com +x=12(0+1)|+\rangle_x = \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle) x=12(01)|-\rangle_x = \frac{1}{\sqrt{2}}(|0\rangle-|1\rangle) Assim, quando o sistema estiver em um estado próprio de xx, é evidente que as medições ao longo de zz produzirão tanto 0|0\rangle quanto 1|1\rangle, e o farão com probabilidade aproximadamente igual. Portanto, nosso primeiro exemplo nos mostrou que alguns estados terão resultados muito previsíveis em algumas medições, mas resultados imprevisíveis em outras medições. O exemplo atual nos mostra que podemos fazer pior do que isso. Há estados que podem nos dar resultados imprevisíveis para ambas as medições, mesmo se tudo o que fizermos for trocar a ordem das medições. Vamos investigar o grau de certeza ou incerteza de uma quantidade em um determinado estado.


Cálculo da incerteza

Podemos quantificar isso usando a incerteza ou a variação. A "incerteza" é geralmente definida como a raiz quadrada da "variância" de uma distribuição. Ou seja, a incerteza de algum observável SS é denotada ΔS\Delta S e é dada por

(ΔS)2(SS)2(ΔS)2=S22SS+S2(ΔS)2=S2S2\begin{aligned} (\Delta S)^2 & \equiv \langle (S - \langle S \rangle)^2 \rangle\\ (\Delta S)^2 & = \langle S^2 - 2 S \langle S \rangle +\langle S \rangle^2 \rangle\\ (\Delta S)^2 & = \langle S^2 \rangle - \langle S \rangle^2 \end{aligned}

No caso das matrizes de Pauli, para as quais S2=IS^2 = I, isso se torna

(ΔS)2=1S2(\Delta S)^2 = 1 - \langle S \rangle^2

Vamos aplicar isso a um exemplo concreto. Vamos começar com o estado ψ=+y=12(1i),|\psi\rangle = |+\rangle_y = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ i \end{pmatrix}, e vamos determinar a incerteza do observável XX nesse estado.

Verifique sua compreensão

Calcule a incerteza de XX no estado +y=+i|+\rangle_y = |+i\rangle, manualmente.

  • ΔX=+iX2+i+iX+i2\Delta X =\sqrt{\langle+i| X^2 |+i\rangle - \langle+i| X |+i\rangle^2}

    No estado em questão, isso resulta:

    ΔX=12(1i)(0110)(0110)12(1i)(12(1i)(0110)12(1i))2ΔX=12(1i)(1001)(1i)(12(1i)(i1))2ΔX=12(1i)(1i)(12(0)))2ΔX=12(2)=1\begin{aligned} \Delta X & =\sqrt{\frac{1}{\sqrt{2}}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i\end{pmatrix} - \left(\frac{1}{\sqrt{2}}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i\end{pmatrix}\right)^2}\\ \Delta X & =\sqrt{\frac{1}{2}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}1 & 0 \\ 0 & 1\end{pmatrix} \begin{pmatrix}1 \\ i\end{pmatrix} - \left(\frac{1}{2}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}i \\ 1\end{pmatrix}\right)^2}\\ \Delta X & =\sqrt{\frac{1}{2}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}1 \\ i\end{pmatrix} - \left(\frac{1}{2}(0))\right)^2}\\ \Delta X & =\sqrt{\frac{1}{2}(2)} = 1 \end{aligned}

Podemos criar um estado inicial arbitrário usando qc.initialize(). Observe que a sintaxe da unidade imaginária aqui é 1j1j.

# Step 1: Map the problem into a quantum circuit

from qiskit.quantum_info import SparsePauliOp
import numpy as np

obs = SparsePauliOp("X")

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Initialize the state
qc.initialize([1, 1j] / np.sqrt(2))

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
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 = noisy_estimator.run([[qc_isa,obs_isa]])
# res=job.result()

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

print(res[0].data.evs)

Output:

-0.02408454165642664

De acordo com nossa equação acima, (ΔX)2=1X2=1(0.0015...)2ΔX=0.999...(\Delta X)^2 = 1 - \langle X \rangle^2 = 1-(0.0015...)^2 \rightarrow \Delta X = 0.999... Vamos continuar com esse mesmo estado, mas encontrar o valor esperado de ZZ, agora:

# Step 1: Map the problem into a quantum circuit

obs = SparsePauliOp("Z")

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Initialize the state to |+>_y
qc.initialize([1, 1j] / np.sqrt(2))


# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
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(pubs)
res = job.result()

# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc_isa,obs_isa]])
# res=job.result()

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

print(res[0].data.evs)

Output:

0.04958271968581247

Poderíamos fazer os mesmos cálculos de antes, mas veríamos que a variação está novamente muito próxima de 1.0. Poderíamos concluir que ΔXΔZ1.0\Delta X \Delta Z \approx 1.0. De fato, isso é aproximadamente correto para o estado que escolhemos. Mas será que podemos fazer melhor? Ou pior?

Lembre-se de que há uma relação de incerteza entre a posição em uma direção, x,x, e o momento na mesma direção, px.p_x.. Para essas variáveis, a forma mais conhecida é provavelmente ΔxΔpx/2\Delta x \Delta p_x \geq \hbar/2 Se isso é tudo o que lembramos, podemos nos sentir tentados a pensar que ΔX\Delta X e ΔZ\Delta Z também poderiam ter esse limite fundamental de incerteza. Talvez seja impossível que o produto ΔXΔZ\Delta X \Delta Z chegue a zero? Vamos tentar em outro estado e ver se isso se mantém. Desta vez, usaremos ψ=12(11).|\psi\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix}.. Vamos ver o que acontece. Observe que, no código abaixo, o estimador pode aceitar dois conjuntos de circuitos e observáveis no mesmo envio de trabalho.

# Step 1: Map the problem into a quantum circuit

obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Z")

# Define registers

qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Initialize the state
qc.initialize([1, 1] / np.sqrt(2))

# Step 2: Transpile the circuit

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

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

with Batch(backend=backend) as batch:
    estimator = Estimator(mode=batch)
    pubs = [(qc_isa, obs1_isa), (qc_isa, obs2_isa)]
    job = estimator.run(pubs)
    res = job.result()
batch.close()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_estimator.run([[qc,obs1],[qc,obs2]])
# res=job.result()

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

print("The expectation value of the first observable is: ", res[0].data.evs)
print("The expectation value of the second observable is: ", res[1].data.evs)

Output:

The expectation value of the first observable is:  1.0011036174126302
The expectation value of the second observable is:  0.0029429797670141016

O valor esperado de XX deve estar próximo de 1.0, mas não deve exceder 1.0. Não se preocupe se ele exceder 1.0 em uma quantidade muito pequena. Isso pode ser atribuído a fatores como ruído e/ou erro de leitura. Embora esse seja um tópico muito importante, podemos ignorá-lo por enquanto.

Obtivemos um valor de expectativa de XX que é muito próximo de 1.0 (correspondendo a uma variação muito baixa para XX ). Isso faz com que o produto das duas variações seja bastante baixo:

ΔXΔZ=1(0.9853)2×1(0.00195)2=0.171.\Delta X \Delta Z = \sqrt{1-(0.9853)^2} \times \sqrt{1-(-0.00195)^2} = 0.171.

Embora não seja exatamente zero, esse valor está ficando pequeno em comparação com os valores próprios dos operadores de Pauli ( ±1\pm 1 ). Bem, você deve se lembrar que a relação de incerteza entre a posição linear e o momento pode ser escrita de forma diferente, usando explicitamente a relação de comutação entre os operadores xx e pxp_x :

ΔxΔpx12[x,px]\Delta x \Delta p_x \geq \frac{1}{2}|\langle [x,p_x] \rangle|

em que

[x,px]=xpxpxx[x,p_x] = xp_x-p_xx

é o comutador de xx e pxp_x.

Essa é a forma que pode ser estendida mais facilmente para os operadores de Pauli. Em geral, para dois operadores AA e BB,

ΔAΔB12[A,B].\Delta A \Delta B \geq \frac{1}{2}|\langle [A,B] \rangle|.

E no caso das matrizes de Pauli XX e ZZ, precisamos de [X,Z][X,Z] para calcular

ΔXΔZ12[X,Z].\Delta X \Delta Z \geq \frac{1}{2}|\langle [X,Z] \rangle|.

Mostramos isso aqui e deixamos cálculos semelhantes para o leitor como um exercício:

[X,Z]=XZZX=(0110)(1001)(1001)(0110)[X,Z] = XZ-ZX = \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix}\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}-\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}\begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} [X,Z]=(0110)(0110)=2(0110)[X,Z] = \begin{pmatrix}0 & -1 \\ 1 & 0\end{pmatrix}-\begin{pmatrix}0 & 1 \\ -1 & 0\end{pmatrix} = 2\begin{pmatrix}0 & -1 \\ 1 & 0\end{pmatrix}

Essa é uma resposta perfeitamente aceitável, mas com mais uma etapa, vemos

[X,Z]=2i(0ii0)=2iY[X,Z] = -2i\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}=-2iY

Assim, nossa relação de incerteza se torna

ΔXΔZY.\Delta X \Delta Z \geq |\langle Y \rangle|.

Verifique sua compreensão

Determine [X,Y][X,Y] e [Y,Z][Y,Z]. Use isso para escrever as relações de incerteza entre XX & YY, e YY & ZZ.

  • [X,Y]=XYYX=(0110)(0ii0)(0ii0)(0110)=2(i00i)=2iZ[X,Y] = XY-YX = \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix}\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}-\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}\begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} = 2 \begin{pmatrix}i & 0 \\ 0 & -i\end{pmatrix}=2iZ[Y,Z]=YZZY=(0ii0)(1001)(1001)(0ii0)=2(0ii0)=2iX[Y,Z] = YZ-ZY = \begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}-\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix} = 2 \begin{pmatrix}0 & i \\ i & 0\end{pmatrix}=2iX

    Combinando com a relação geral de incerteza, temos

    ΔXΔYZ,\Delta X \Delta Y \geq |\langle Z \rangle|,ΔYΔZX.\Delta Y \Delta Z \geq |\langle X \rangle|.

Verifique a consistência

Antes de prosseguir, vamos verificar se isso é consistente com nossa descoberta anterior. Usamos o estado ψ=12(11).|\psi\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix}. E descobrimos que ΔXΔZ=0.171.\Delta X \Delta Z = 0.171. Agora sabemos que esse produto deve ser maior ou igual a

Y=12(11)(0ii0)12(11)|\langle Y \rangle|=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \end{pmatrix}\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix} Y=12(11)(ii)=12(i+i)=0.|\langle Y \rangle| = \frac{1}{2}\begin{pmatrix} 1 & 1 \end{pmatrix}\begin{pmatrix} -i \\ i \end{pmatrix} = \frac{1}{2}(-i+i) = 0.

De fato, ΔXΔZ=0.171Y=0\Delta X \Delta Z = 0.171 \geq |\langle Y \rangle|=0

Use as perguntas abaixo para criar alguma intuição para essas descobertas:

Verifique sua compreensão

Responda os itens a seguir em um conjunto:

(a) Que estados você esperaria que tivessem incerteza zero em XX?

(b) Que estados você esperaria que tivessem incerteza zero em ZZ?

(c) Em que estados você obteria um valor de expectativa zero Y\langle Y \rangle?

(d) As respostas às perguntas acima são consistentes com o caso ΔXΔZY\Delta X \Delta Z \geq |\langle Y \rangle|?

(e) Escreva um código para verificar explicitamente isso usando o estimador.

  • (a) Poderíamos esperar que os estados próprios do operador XX produzissem incerteza zero em XX. De fato, usando ψ=+x,|\psi\rangle = |+\rangle_x,, temos ΔX=1X2=112=0.\Delta X = \sqrt{1-\langle X \rangle^2} = \sqrt{1-1^2} = 0.

    (b) Podemos esperar que os estados próprios do operador ZZ produzam incerteza zero em ZZ. De fato, usando ψ=1,|\psi\rangle = |1\rangle, temos ΔZ=1Z2=1(1)2=0.\Delta Z = \sqrt{1-\langle Z \rangle^2} = \sqrt{1-(-1)^2} = 0.

    (c) Esperamos encontrar Y=0\langle Y \rangle=0 para quaisquer estados que, quando medidos, produzam uma projeção positiva no eixo yy com a mesma frequência que uma projeção negativa. Isso inclui os estados próprios de XX e ZZ.

    (d) Sim. Seria de se esperar um valor muito pequeno para o produto de incertezas ΔXΔZ\Delta X \Delta Z para estados próprios de XX ou ZZ : ΔXΔZ0.\Delta X \Delta Z \approx 0. Isso pode se manter porque também esperamos Y=0\langle Y \rangle=0 para esses mesmos estados. Portanto, a relação de incerteza pode ser satisfeita.

    (e) Um código como o seguinte verificaria isso:

    obs1 = SparsePauliOp.from_list(
        [("X", 1.000)]
    )
    obs2 = SparsePauliOp.from_list(
        [("Y", 1.000)]
    )
    obs3 = SparsePauliOp.from_list(
        [("Z", 1.000)]
    )
    qc = QuantumCircuit(1,1)
    qc.ry(pi/2,0)
    
    job = estimator.run([(qc, [[obs1], [obs2], [obs3]])], precision=0.001)
    res=job.result()

    Onde os resultados retornam todos os valores de expectativa. Para recuperar todos os valores de expectativa e calcular as incertezas, podemos usar:

    xs=res[0].data.evs[0]
    ys=abs(res[0].data.evs[1])
    zs=res[0].data.evs[2]
    
    import math
    prodxz=((1-xs[i]*xs[i])**0.5)*(1-zs[i]*zs[i])**0.5
    

Responda os itens a seguir em um conjunto:

(a) Você consegue pensar em um estado no qual você teria um grande valor de expectativa Y\langle Y \rangle?

(b) Você esperaria que esse mesmo estado tivesse uma incerteza grande ou pequena em XX?

(c) Você esperaria que esse mesmo estado tivesse uma incerteza grande ou pequena em ZZ?

(d) As respostas às perguntas acima são consistentes com o caso ΔXΔZY\Delta X \Delta Z \geq |\langle Y \rangle|?

(e) Escreva um código para verificar explicitamente isso usando o estimador.

  • (a) Esperamos encontrar Y1\langle Y \rangle\approx 1 para o estado próprio de YY : +y|+\rangle_y.

    (b) Podemos esperar que XX tenha uma grande incerteza no estado +y,|+\rangle_y,, pois a medição de XX nesse estado produziria um resultado positivo e negativo com a mesma frequência/probabilidade.

    (c) Podemos esperar que ZZ tenha uma grande incerteza no estado +y,|+\rangle_y,, pois a medição de ZZ nesse estado produziria um resultado positivo e negativo com a mesma frequência/probabilidade.

    (d) Sim. Seria de se esperar um grande valor para o produto das incertezas ΔXΔZ\Delta X \Delta Z para os estados próprios de Y,Y, e para +y,|+\rangle_y, especificamente. Também esperamos Y1\langle Y \rangle\approx 1 para esse mesmo estado. Portanto, tanto Y\langle Y \rangle quanto ΔXΔZ\Delta X \Delta Z são razoavelmente grandes nesse estado, e é plausível que a relação de incerteza possa ser satisfeita novamente.

    (e) Um código como o seguinte verificaria isso:

    obs1 = SparsePauliOp.from_list(
        [("X", 1.000)]
    )
    obs2 = SparsePauliOp.from_list(
        [("Y", 1.000)]
    )
    obs3 = SparsePauliOp.from_list(
        [("Z", 1.000)]
    )
    qc = QuantumCircuit(1,1)
    qc.rx(-pi/2,0)
    
    job = estimator.run([(qc, [[obs1], [obs2], [obs3]])], precision=0.001)
    res=job.result()

    Onde os resultados retornam todos os valores de expectativa. Para recuperar todos os valores de expectativa e calcular as incertezas, podemos usar:

    xs=res[0].data.evs[0]
    ys=abs(res[0].data.evs[1])
    zs=res[0].data.evs[2]
    
    import math
    prodxz=((1-xs[i]*xs[i])**0.5)*(1-zs[i]*zs[i])**0.5
    

Testando relações de incerteza

O teste acima demonstrou apenas a validade da relação de incerteza para uma única escolha de vetor de estado ψ=+x|\psi\rangle = |+\rangle_x. Para nos convencermos de que isso é geralmente consistente com o experimento, devemos realizar cálculos semelhantes usando o estimador para muitas opções do vetor de estado. Vamos começar girando nosso vetor de estado para longe do eixo zz, usando uma porta RY para produzir diferentes estados iniciais usando um parâmetro θ\theta.

# The calculation below uses approximately 3-4 minutes of QPU time.
# Step 1: Map the problem into a quantum circuit

from qiskit.circuit import Parameter
import numpy as np

# Specify observables
obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Y")
obs3 = SparsePauliOp("Z")

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Rotate away from |0>
theta = Parameter("θ")
qc.ry(theta, 0)

params = np.linspace(0, 2, num=21)

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
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

with Batch(backend=backend) as batch:
    estimator = Estimator(mode=batch)
    pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]], [params])]
    job = estimator.run(pubs, precision=0.01)
    res = job.result()

batch.close()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_estimator.run([(qc, [[obs1], [obs2], [obs3]], [params])])
# res=job.result()
# Step 4: Post-processing and classical analysis.
xs = res[0].data.evs[0]
ys = abs(res[0].data.evs[1])
zs = res[0].data.evs[2]

# Calculate uncertainties

delx = []
delz = []
prodxz = []
for i in range(len(xs)):
    delx.append(abs((1 - xs[i] * xs[i])) ** 0.5)
    delz.append(abs((1 - zs[i] * zs[i])) ** 0.5)
    prodxz.append(delx[i] * delz[i])
# Here we can plot the results from this simulation.
import matplotlib.pyplot as plt

plt.plot(params, delx, label=r"$\Delta$ X")
plt.plot(params, ys, label=r"$\langle$ Y $\rangle$")
plt.plot(params, delz, label=r"$\Delta$ Z")
plt.plot(params, prodxz, label=r"$\Delta$X $\Delta$Z")
plt.xlabel(r"$\theta$")
plt.ylabel("Expectation/Uncertainty Values")
plt.legend()
plt.show()

Output:

Output of the previous code cell

Observe que a curva vermelha (ΔXΔZ)(\Delta X \Delta Z) é sempre maior do que a curva laranja Y.\langle Y \rangle.. Às vezes, o produto da incerteza diminui e fica um pouco próximo do limite, outras vezes ele aumenta e fica mais distante do limite, mas sempre obedece à relação de incerteza.

É claro que esse pode não ser o melhor teste da relação de incerteza, pois nosso limite Y\langle Y \rangle é sempre muito próximo de zero. Vamos usar um estado quântico que tenha uma projeção maior nos estados próprios de YY. Especificamente, ainda vamos girar 0|0\rangle para baixo a partir do eixo zz em ângulos variados, mas agora também vamos girar esse estado resultante em torno de zz em algum ângulo, talvez π/4\pi/4, e ver o que acontece.

# The calculation below uses approximately 3-4 minutes of QPU time.
from qiskit.circuit import Parameter
import numpy as np

# Step 1: Map the problem to a quantum circuit

# Specify observables
obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Y")
obs3 = SparsePauliOp("Z")

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Rotate away from |0> along one plane, and then along a transverse direction.
theta = Parameter("θ")
qc.ry(theta, 0)
qc.rz(pi / 4, 0)

params = np.linspace(0, 2, num=21)

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)

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

with Batch(backend=backend) as batch:
    estimator = Estimator(mode=batch)
    pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]], [params])]
    job = estimator.run(pubs, precision=0.01)
    res = job.result()

batch.close()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_estimator.run([(qc, [[obs1], [obs2], [obs3]], [params])])
# res=job.result()
# Step 4: Post-processing and classical analysis.
xs = res[0].data.evs[0]
ys = abs(res[0].data.evs[1])
zs = res[0].data.evs[2]

# Calculate uncertainties

delx = []
delz = []
prodxz = []
for i in range(len(xs)):
    delx.append(abs((1 - xs[i] * xs[i])) ** 0.5)
    delz.append(abs((1 - zs[i] * zs[i])) ** 0.5)
    prodxz.append(delx[i] * delz[i])
# Here we can plot the results from this simulation.
import matplotlib.pyplot as plt

plt.plot(params, delx, label=r"$\Delta$ X")
plt.plot(params, ys, label=r"$\langle$ Y $\rangle$")
plt.plot(params, delz, label=r"$\Delta$ Z")
plt.plot(params, prodxz, label=r"$\Delta$X $\Delta$Z")
plt.xlabel(r"$\theta$")
plt.ylabel("Expectation/Uncertainty Values")
plt.legend()
plt.show()

Output:

Output of the previous code cell

Agora vemos que o limite da incerteza (ΔXΔZ)(\Delta X \Delta Z) está sendo posto à prova! A curva vermelha aproxima-se muito mais da curva laranja do que antes. De fato, na ausência de ruído, a relação de incerteza seria exatamente saturada ( (ΔXΔZ)=Y(\Delta X \Delta Z) = \langle Y \rangle ) em um ponto. Na presença de ruído e erro de leitura, não deve ser surpreendente se uma execução ocasionalmente produzir (ΔXΔZ)(\Delta X \Delta Z) um resultado ligeiramente maior do que Y.\langle Y \rangle. isso. Isso não é uma verdadeira violação da incerteza; é apenas um artefato de erro diferente de zero.

Verifique sua compreensão

Explique como você levaria isso ao limite absoluto, tornando Y\langle Y \rangle o maior possível.

  • Atualmente, o código tem linhas que giram o estado inicial padrão 0|0\rangle, para baixo a partir do eixo zz por algum ângulo parametrizado θ\theta e, em seguida, também em torno do eixo zz por um ângulo π/4,\pi/4, que gira o vetor de estado em parte do caminho até o eixo yy.

    qc.ry(theta,0)

    qc.rz(pi/4,0)

    Poderíamos alterar a rotação em torno de zz de π/4\pi/4 para π/2\pi/2, girando até um estado próprio de YY :

    qc.ry(theta,0)

    qc.rz(pi/2,0)

    Nenhuma outra alteração seria necessária.

Altere o código ou copie-o e implemente essa verificação da relação de incerteza com o valor de expectativa de Y maximizado. A relação de incerteza se mantém?

  • Usaríamos exatamente o código do exemplo acima, com

    qc.rz(pi/2,0)

    trocado para substituir

    qc.rz(pi/4,0).

    A figura resultante deve se parecer com a figura abaixo e, sim, o princípio da incerteza ainda deve ser válido.

    Um gráfico que compara a incerteza com o valor de expectativa máxima do operador Y.

Modifique o código acima para criar uma imagem semelhante, demonstrando que, a partir de medições no computador quântico, o produto ΔXΔY\Delta X \Delta Y se comporta como deveria. Escolha qualquer conjunto de estados que desejar.

  • Usaríamos exatamente o código do exemplo acima e, de cara, poderíamos usar os mesmos resultados acima, apenas usando os valores de expectativa para calcular incertezas diferentes. Por exemplo, poderíamos usar

    xs=res[0].data.evs[0]
    ys=res[0].data.evs[1]
    zs=abs(res[0].data.evs[2])
    import math
    delx = []
    dely = []
    prodxy=[]
    for i in range(len(xs)):
        delx.append((1-xs[i]*xs[i])**0.5)
        dely.append((1-ys[i]*ys[i])**0.5)
        prodxy.append(((1-xs[i]*xs[i])**0.5)*(1-ys[i]*ys[i])**0.5)

    e poderíamos traçar

    import matplotlib.pyplot as plt
    plt.plot(params, delx, label=r'$\Delta$ X')
    plt.plot(params, dely, label=r'$\langle$ Y $\rangle$')
    plt.plot(params, zs, label=r'$\Delta$ Z')
    plt.plot(params, prodxy, label=r'$\Delta$X $\Delta$Z')
    plt.xlabel(r'$\theta$')
    plt.ylabel('Expectation/Uncertainty Values')
    plt.legend()
    plt.show()

Desafio: Escreva um código para analisar vários valores de ϕ\phi, da mesma forma que analisamos vários valores de θ\theta, e faça um gráfico em 3D mostrando que a relação de incerteza nunca é violada. Escolha os observáveis de sua preferência.


Perguntas

Os instrutores podem solicitar versões desses cadernos com chaves de resposta e orientação sobre a colocação em currículos comuns preenchendo esta pesquisa rápida sobre como os cadernos estão sendo usados.

Conceitos críticos:

  • Existem relações de incerteza entre muitos conjuntos de observáveis físicos, incluindo posição e momento linear, e componentes de spin.
  • As matrizes de Pauli não são comutáveis. Esse é um reflexo matemático do fato de que nem todos os componentes do spin podem ser conhecidos/determinados simultaneamente.
  • A computação quântica faz uso intenso dos operadores/matrizes de Pauli, portanto, é útil conhecer a relação de incerteza dos operadores de Pauli, bem como dos operadores de spin intimamente relacionados.
  • Uma fórmula geral para a incerteza de dois operadores AA e BB é ΔAΔB12[A,B].\Delta A \Delta B \geq \frac{1}{2}|\langle [A,B] \rangle|.
  • Um estado próprio a|a\rangle de um determinado operador AA resulta em incerteza nula na observável física associada a esse operador. Mesmo em termos experimentais, ΔA0.\Delta A \approx 0.
  • Um estado próprio a|a\rangle de algum operador AA produzirá uma incerteza maior para um operador BB que não comuta com AA.
  • Os resultados experimentais usando um computador quântico real confirmam a intuição que obtemos das representações matriciais de operadores físicos.

Questões de verdadeiro ou falso:

  1. T/F É possível medir simultaneamente XX e YY, mas não ZZ.
  2. T/F É possível medir simultaneamente XX e ZZ, mas não YY.
  3. T/F Os operadores de posição linear e momento linear não são comutáveis.
  4. T/F IBM computadores quânticos medem ao longo de ZZ por padrão, portanto, é necessário realizar uma rotação para medir em qualquer outra direção.
  5. T/F O circuito abaixo mede efetivamente ZZ e, em seguida, XX.
Um diagrama de circuito mostrando uma medição, uma porta Hadamard e, em seguida, outra medição.

Perguntas do MC:

  1. O diagrama abaixo demonstra qual das seguintes relações de incerteza?

    • a. ΔXΔYZ\Delta X \Delta Y \geq |\langle Z \rangle|
    • b. ΔYΔZX\Delta Y \Delta Z \geq |\langle X \rangle|
    • c. ΔZΔXY\Delta Z \Delta X \geq |\langle Y \rangle|
    • d. Nenhuma das opções acima
Um gráfico que compara a incerteza com o valor de expectativa máxima do operador Y.
  1. Qual das seguintes opções é a sequência padrão para realizar uma medição em xx?

    • a. Somente qc.measure()
    • b. qc.h() então qc.measure()
    • c. qc.h(), qc.h() então qc.measure()
    • d. qc.h(), qc.s, qc.h()então qc.measure()
    • e. qc.sdg(), qc.h(), qc.s then qc.measure()
    • f. qc.sdg(), qc.h(), qc.s, qc.h() then qc.measure()
  2. Qual dos seguintes estados produz o maior valor de expectativa X\langle X \rangle?

    • a. +x|+\rangle_x
    • b. x|-\rangle_x
    • c. +y|+\rangle_y também chamado de +i|+i\rangle
    • d. y|-\rangle_y também chamado de i|-i\rangle
    • e. 0|0\rangle também chamado de |\uparrow\rangle
    • f. 1|1\rangle também chamado de |\downarrow\rangle
  3. Qual dos seguintes estados produz a maior incerteza ΔX\Delta X?

    • a. +x|+\rangle_x
    • b. +y|+\rangle_y também chamado de +i|+i\rangle
    • c. 0|0\rangle também chamado de |\uparrow\rangle
    • d. a e b estão empatados
    • e. b e c estão empatados
    • f. a, b e c estão empatados

Questões para discussão:

  1. Esse conceito de incerteza entra em conflito de alguma forma com a noção de spin como uma seta vetorial no espaço cartesiano? Que tal na esfera de Bloch?

  2. Suponha que você oriente um dispositivo de medição ao longo de uma direção a meio caminho entre os eixos xx e yy. O que acontece? Você pode fazer uma medição nessa direção? Como isso se relaciona com a incerteza em XX e YY?

  3. Que experimentos adicionais você gostaria de fazer para se convencer dos resultados obtidos aqui?

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.