Skip to main content
IBM Quantum Platform

Transformação de Fourier quântica

Para este módulo do Qiskit in Classrooms, os alunos devem ter um ambiente de trabalho Python 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 site IBM Quantum® seguindo as etapas do guia Configurar sua conta IBM Cloud.

Esse módulo foi testado e usou 13 segundos de tempo de QPU. Essa é uma estimativa de boa-fé; seu uso real pode variar.

# 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'

Introdução

A transformada de Fourier é uma ferramenta onipresente com aplicações em matemática, física, processamento de sinais, compactação de dados e inúmeros outros campos. Uma versão quântica da transformada de Fourier, apropriadamente chamada de transformada quântica de Fourier, forma a base de alguns dos algoritmos quânticos mais importantes.

Hoje, depois de relembrarmos a transformada de Fourier clássica, falaremos sobre como implementamos a transformada de Fourier quântica em um computador quântico. Em seguida, discutiremos uma das aplicações da transformada quântica de Fourier em um algoritmo chamado algoritmo de estimativa de fase. A estimativa de fase quântica é uma sub-rotina do famoso algoritmo de fatoração de Shor, que às vezes é chamado de "joia da coroa" da computação quântica. Este módulo se baseia em outro módulo sobre o algoritmo do Shor, mas também foi criado para ser autônomo. A transformada quântica de Fourier é um algoritmo fascinante e útil por si só!


A transformada clássica de Fourier

Antes de entrarmos na transformada quântica de Fourier, vamos primeiro nos lembrar da versão clássica. A transformada de Fourier é um método de transformação de uma "base" para outra. Você pode pensar em duas bases como perspectivas diferentes do mesmo problema - ambas são formas válidas de expressar uma função, mas uma ou outra pode ser mais esclarecedora, dependendo do problema em questão. Alguns exemplos de pares de bases que são conectados pela transformada de Fourier são posição e momento, e tempo e frequência.

Vejamos um exemplo de como a transformada de Fourier pode nos ajudar a descobrir que nota um instrumento está tocando com base em sua forma de onda de áudio. Normalmente, vemos as formas de onda representadas na base de tempo, ou seja, a amplitude da onda é expressa como uma função do tempo.

Sinal senoidal único plotado como uma função do tempo.

Podemos transformar essa forma de onda em Fourier para passar da base de tempo para a base de frequência:

Espectro de frequência da forma de onda de áudio. Um pico nítido e claro em 260 Hz.

Na base de frequência, podemos ver facilmente um pico claro em cerca de 260 Hz. Isso é um dó médio!

Agora, você pode ter conseguido determinar que um dó médio estava sendo tocado sem o uso de uma transformada de Fourier, mas e se várias notas forem tocadas ao mesmo tempo? Em seguida, a forma de onda se torna mais complicada quando a plotamos na base de tempo:

Gráfico de deslocamento versus tempo de várias ondas senoidais ao mesmo tempo, criando um padrão periódico mais complicado.

Mas o espectro de frequência identifica claramente três picos:

Espectro de frequência da forma de onda de áudio acima. Três picos em aproximadamente 260 Hz, 330 Hz e 392 Hz. O último pico é muito fraco, mas visível.

Esse foi um acorde de dó maior, tocando as notas dó, mi e sol.

Esse tipo de análise de Fourier pode nos ajudar a extrair os componentes de frequência de qualquer tipo de sinal complicado.

Transformada discreta de Fourier

A transformada de Fourier é útil para várias aplicações de processamento de sinais. Mas na maioria desses aplicativos do mundo real (incluindo o exemplo de música que usamos acima), queremos transformar um conjunto discreto de NN pontos de dados - não uma função contínua. Nesse caso, usamos a transformada discreta de Fourier. A transformada discreta de Fourier (DFT) atua em um vetor (x0,...,xN1)(x_0, ..., x_{N-1}) e o mapeia para o vetor (y0,...,yN1)(y_0, ..., y_{N-1}) de acordo com a fórmula:

yk=1Nj=0N1xjωNjky_k = \frac{1}{\sqrt{N}}\sum_{j=0}^{N-1}x_j\omega_N^{jk}

onde tomamos ωNjk=e2πijkN\omega_N^{jk} = e^{2\pi i \frac{jk}{N}}. (Observe que há outras convenções que têm um sinal de menos no exponencial, portanto, tenha cuidado ao ver a DFT na natureza) Lembre-se de que e2πijkNe^{2\pi i \frac{jk}{N}} é uma função periódica, com período Nk\frac{N}{k}. Portanto, ao multiplicar por essa função, a transformada de Fourier é essencialmente uma forma de decompor a função (discreta) {xj}\{x_{j}\} em uma combinação linear de suas funções periódicas constituintes, cada uma com período Nk\frac{N}{k}.


A transformada de Fourier quântica

Agora, vimos como a transformada de Fourier é usada para representar uma função como uma combinação linear de um novo conjunto das chamadas "funções de base" As transformações de base também são feitas regularmente em estados de qubit. Por exemplo, o estado de um único qubit ψ|\psi\rangle pode ser expresso na base computacional ψ=c00+c11|\psi\rangle = c_0 |0\rangle + c_1 |1\rangle, com os estados da base 0|0\rangle e 1|1\rangle, ou na base XX ψ=c+++c|\psi\rangle = c_+ |+\rangle + c_- |-\rangle com os estados da base +=12(0+1)|+\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |1\rangle) e =12(01)|-\rangle = \frac{1}{\sqrt{2}} (|0\rangle - |1\rangle). Ambas são igualmente válidas, mas uma pode ser mais natural do que a outra, dependendo do tipo de problema que você está tentando resolver.

Os estados de Qubit também podem ser expressos na base de Fourier, em que um estado é expresso em termos de uma combinação linear dos estados da base de Fourier ϕy|\phi_y\rangle, em vez dos estados usuais da base computacional, x|x\rangle. Para fazer isso, você precisa aplicar uma transformada quântica de Fourier (QFT):

ϕy=1Nx=0N1ωNyxx | \phi_y \rangle = \frac{1}{\sqrt{N}}\sum_{x=0}^{N-1}\omega_N^{y x} \vert x \rangle

com ωNyx=e2πiyxN\omega_N^{yx} = e^{\frac{2\pi i y x}{N}} como acima, e NN é o número de estados básicos no seu sistema quântico. Observe que, como estamos trabalhando com qubits agora, mm qubits fornece 2m2^m estados básicos, portanto N=2mN=2^m. Aqui, os estados básicos são escritos como um único número x|x\rangle, onde xx varia de 00 a N1N-1, mas é mais comum ver os estados básicos expressos como 00...00|00...00\rangle, 00...01|00...01\rangle, 00...11|00...11\rangle,..., 11...11|11...11\rangle, onde cada dígito binário representa o estado do qubit 0 a m1m-1, da direita para a esquerda. Existe uma maneira fácil de converter esses estados binários em um único número: basta tratá-los como números binários! Portanto, 00...00=0|00...00\rangle = |0\rangle, 00...01=1|00...01\rangle = |1\rangle, 00...10=2|00...10\rangle = |2\rangle, 00...11=3|00...11\rangle = |3\rangle e assim por diante, até 11...11=2m1=N1|11...11\rangle = |2^m -1\rangle = |N-1\rangle.

Desenvolva a intuição para os estados básicos de Fourier

Portanto, acabamos de explicar o que são os estados da base computacional e como eles são ordenados: são o conjunto de estados em que cada qubit está em 00 ou 11, e os ordenamos a partir do estado em que todos os qubits são 00, 00...00|00...00\rangle, até o estado em que todos são 11, 11...11|11...11\rangle.

Mas como podemos entender os estados da base de Fourier? Todos os estados da base de Fourier são superposições iguais de todos os estados da base computacional, mas cada estado difere do outro na periodicidade da fase dos componentes. Para entender isso de forma mais concreta, vamos dar uma olhada nos quatro estados da base de Fourier de um sistema de dois qubits. O estado de Fourier mais baixo é aquele cuja fase não varia de forma alguma:

ϕ0=12(00+01+10+11)|\phi_0\rangle = \frac{1}{2} (|00\rangle + |01\rangle + |10\rangle + |11\rangle)

Podemos visualizar esse estado traçando a amplitude complexa de cada um dos termos. A linha vermelha guia o olho para mostrar como a fase dessa amplitude gira em torno do plano complexo como uma função do estado da base computacional. Para ϕ0|\phi_0\rangle, a fase permanece constante:

Gráfico de barras da amplitude complexa (plano x-y) para cada estado da base computacional (eixo z) para phi_0. Todos eles são reais e, portanto, as barras apontam para +1 no eixo x

O próximo estado da base de Fourier é aquele cujas fases dos componentes variam de 00 a 2π2\pi apenas uma vez:

ϕ1=12(00+eiπ/201+eiπ10+e3iπ/211)=12(00+i0110i11)|\phi_1\rangle = \frac{1}{2} (|00\rangle + e^{i\pi/2}|01\rangle + e^{i\pi}|10\rangle + e^{3i\pi/2}|11\rangle) = \frac{1}{2}(|00\rangle + i|01\rangle - |10\rangle - i|11\rangle)

E podemos ver esse enrolamento no gráfico da amplitude complexa em relação ao estado da base computacional:

Gráfico de barras da amplitude complexa (plano x-y) para cada estado da base computacional (eixo z) para phi_1. A linha vermelha mostra como a fase complexa se acumula de tal forma que ela gira em torno de 2\pi uma vez à medida que você passa por todos os estados da base computacional.

Portanto, cada estado tem uma fase que é 2π/42\pi/4 radianos mais alta do que o estado anterior quando ordenado da maneira padrão, já que neste exemplo temos quatro estados básicos ( N=4N=4 ). O próximo estado da base vai de 0 a 2 π\pi duas vezes:

ϕ2=12(00+eiπ01+e2iπ10+e3iπ11)=12(0001+1011)|\phi_2\rangle = \frac{1}{2} (|00\rangle + e^{i\pi}|01\rangle + e^{2i\pi}|10\rangle + e^{3i\pi}|11\rangle) = \frac{1}{2} (|00\rangle - |01\rangle + |10\rangle - |11\rangle)

Gráfico de barras da amplitude complexa (plano x-y) para cada estado da base computacional (eixo z) para phi_2. A linha vermelha mostra como a fase complexa se acumula de tal forma que gira em torno de 2\pi duas vezes à medida que você passa por todos os estados da base computacional.

Por fim, o componente de Fourier mais alto é aquele com a fase de variação mais rápida. Em nosso exemplo com dois qubits, é aquele cujas fases variam de 0 a 2π2\pi três vezes:

ϕ3=12(00+e3iπ/201+e6iπ/210+e9iπ/211)=12(00i0110+i11)|\phi_3\rangle = \frac{1}{2} (|00\rangle + e^{3i\pi/2}|01\rangle + e^{6i\pi/2}|10\rangle + e^{9i\pi/2}|11\rangle) = \frac{1}{2} (|00\rangle - i|01\rangle - |10\rangle + i|11\rangle)

Gráfico de barras da amplitude complexa (plano x-y) para cada estado da base computacional (eixo z) para phi_3. A linha vermelha mostra como a fase complexa se acumula de tal forma que ela gira em torno de 2\pi três vezes à medida que você passa por todos os estados da base computacional.

Em geral, para um estado de qubit mm, haverá um 2m2^m e estados de base de Fourier, cuja variação de fase varia de constante, para ϕ0|\phi_0\rangle, a rapidamente variável para ϕ2m1|\phi_{2^m-1}\rangle, completando 2m12^m-1 voltas em torno de 2π2\pi sobre a superposição de estados. Portanto, quando fazemos uma QFT de um estado quântico, estamos essencialmente fazendo a mesma análise básica que fizemos para a forma de onda musical na introdução. Estamos determinando os componentes de frequência de Fourier que contribuem para criar o estado quântico de interesse.

Experimente alguns exemplos de QFTs

Vamos tentar continuar a construir nossa intuição para a transformada quântica de Fourier criando um estado na base computacional e, em seguida, vendo o que acontece quando aplicamos a QFT a ele. Por enquanto, trataremos o QFT apenas como uma caixa preta que aplicamos usando o site QFTGate da biblioteca de circuitos Qiskit. Mais tarde, daremos uma olhada nos bastidores para ver como isso é implementado.

Começamos carregando os pacotes necessários e selecionando um dispositivo para executar nosso circuito:

import numpy as np
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.circuit.library import QFTGate
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService

# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler

service = QiskitRuntimeService()

# Use the least busy backend
# backend = service.least_busy(operational=True, simulator=False, min_num_qubits = 127)
backend = service.backend("ibm_pinguino2")

print(backend.name)

Output:

ibm_pinguino2

Se você não tiver tempo disponível em sua conta ou quiser usar um simulador por qualquer motivo, poderá executar a célula abaixo para configurar um simulador que imitará o dispositivo quântico que selecionamos acima:

# Load the backend sampler
from qiskit.primitives import BackendSamplerV2

# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel

noise_model = NoiseModel.from_backend(backend)

# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
from qiskit.providers.fake_provider import GenericBackendV2

backend_gen = GenericBackendV2(num_qubits=18)
sampler_gen = BackendSamplerV2(backend=backend_gen)

Estado de base computacional único

Primeiro, vamos tentar transformar um único estado de base computacional. Começaremos criando um estado computacional aleatório:

# Step 1: Map

qubits = 4
N = 2**qubits


qc = QuantumCircuit(qubits)

# flip state of random qubits to put in a random single computational basis state
for i in range(1, qubits):
    if np.random.randint(0, 2):
        qc.x(i)


# make a copy of the above circuit. (to be used when we apply the QFT in next part)
qc_qft = qc.copy()


qc.measure_all()
qc.draw("mpl")

Output:

Output of the previous code cell
# 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)

# Step 3: Run the job on a real quantum computer OR try fake backend

sampler = Sampler(mode=backend)
pubs = [qc_isa]

# Run the job on real quantum device

job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()

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

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

# Step 4: Post-Process
plot_histogram(counts)

Output:

Output of the previous code cell

Agora, vamos fazer a transformação de Fourier desse estado com QFTGate:

# Step 1: Map

qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")

Output:

Output of the previous code cell
# 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_qft)

# Step 3: Run the job on a real quantum computer - try fake backend

sampler = Sampler(mode=backend)
pubs = [qc_isa]

# Run the job on real quantum device

job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()

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

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

# Step 4: Post-Process
plot_histogram(counts)

Output:

Output of the previous code cell

Como você pode ver, medimos as populações de cada estado para que sejam mais ou menos iguais, com ou sem algum ruído experimental e estatístico. Portanto, se você pegar a QFT de um único estado da base computacional, o resultado será uma superposição igual de todos os estados. Se você estiver familiarizado com as transformadas de Fourier, isso provavelmente não o surpreenderá. Um princípio básico que pode nos ajudar a criar uma conexão intuitiva entre uma função e sua transformada de Fourier é que a largura de uma função é inversamente proporcional à largura de sua transformada de Fourier. Portanto, algo que é muito localizado no tempo, por exemplo, como um pulso muito curto, exigirá uma ampla gama de frequências para gerar esse pulso. Esse sinal será muito amplo no espaço de Fourier.

Na verdade, esse fato está relacionado à incerteza quântica! O princípio da incerteza de Heisenberg é normalmente declarado como ΔxΔp/2\Delta x \Delta p \ge \hbar / 2 . Portanto, se a incerteza em xx ( Δx\Delta x ) for pequena, a incerteza no momento ( Δp\Delta p ) deve ser grande e vice-versa. Acontece que a transformação da base de posição xx para a base de momento pp é realizada por meio de uma transformada de Fourier.

Observação: lembre-se de que estamos medindo as populações em cada um dos estados da base, portanto, estamos perdendo informações sobre as fases relativas entre as várias partes da superposição. Portanto, embora o QFT de qualquer estado de base computacional único produza a mesma distribuição uniforme na população em todos os estados de base, as fases não serão necessariamente as mesmas.

Dois estados de base computacional

Agora, vamos ver o que acontece quando preparamos uma superposição de estados da base computacional. Como você acha que será a transformada de Fourier nesse caso?

Vamos escolher a superposição:

ψ=12(0+N/2)=12(000...0+100...0)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) = \frac{1}{\sqrt{2}} (|000...0\rangle + |100...0\rangle)

# Step 1: Map
qubits = 4
N = 2**qubits


qc = QuantumCircuit(qubits)

# To make this state, we just need to apply a Hadamard to the last qubit

qc.h(qubits - 1)


qc_qft = qc.copy()


qc.measure_all()

qc.draw("mpl")

Output:

Output of the previous code cell
# First, let's go through steps 2-4 for the first circuit, qc

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

# Step 3: Run the job on a real quantum computer - try fake backend

sampler = Sampler(mode=backend)
pubs = [qc_isa]

# Run the job on real quantum device

job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()

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

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

# Step 4: Post-process
plot_histogram(counts)

Output:

Output of the previous code cell

Agora, vamos fazer a transformação de Fourier desse estado com QFTGate:

# Step 1: Map

qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")

Output:

Output of the previous code cell
# 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_qft)

# Step 3: Run the job on a real quantum computer OR try fake backend

sampler = Sampler(mode=backend)
pubs = [qc_isa]

# Run the job on real quantum device

job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()

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

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

# Step 4: Post-process
plot_histogram(counts)

Output:

Output of the previous code cell

Esta pode ser um pouco mais surpreendente. Parece que o QFT do estado ψ=12(0+N/2)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) é uma superposição de todos os estados de base uniforme. Mas se pensarmos em nossa visualização de cada estado da base ϕy|\phi_y\rangle e em como a fase de cada componente gira em torno de 2π2\pi yy vezes, então o motivo pelo qual chegamos a esse resultado pode ficar claro.

Verifique sua compreensão

Usando a dica acima, explique por que o resultado que obtivemos para a Teoria Quântica dos Campos (QFT) de um ψ=12(0+N/2)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) o é o esperado.

  • O estado original tem uma fase relativa de 0 (ou um múltiplo inteiro de 2π2\pi ) entre as duas partes da superposição. Portanto, sabemos que esse estado tem componentes de Fourier cujas fases também coincidem dessa forma: aqueles que têm 0 de mudança de fase entre o termo |0000> e o termo |1000>. Cada estado da base de Fourier ϕy|\phi_y\rangle é composto de termos cuja fase se acumula a uma taxa de 2πy/N2\pi y/N, o que significa que, quando ordenado da maneira usual, cada termo na superposição tem uma fase de 2πy/N2\pi y/N maior do que o termo anterior. Portanto, na metade do caminho N/2N/2, queremos que a fase 2πy/NN/22\pi y/N * N/2 seja um múltiplo inteiro de 2π2\pi. Isso acontece quando yy é par.

Que superposição de estados computacionais corresponderia a uma Teoria Quântica dos Campos com picos em todos os números binários ímpares?

  • Se você pegar o QFT do estado ψ=0N/2\psi = |0\rangle - |N/2\rangle, verá picos em todos os estados com números binários ímpares.


Analise o algoritmo QFT

Agora que adquirimos mais intuição sobre a relação entre os estados do qubit na base computacional e na base de Fourier, vamos nos aprofundar no próprio algoritmo QFT. Em outras palavras, quais portas realmente implementamos no computador quântico para realizar essa transformação?

Vamos começar com um único qubit. Portanto, isso significa que teremos dois estados-base. A QFT 2_2 transforma os estados da base computacional 0|0\rangle e 1|1\rangle em estados da base de Fourier ϕ0\phi_0 e ϕ1\phi_1 :

ϕ0=12(0+1)|\phi_0\rangle = \frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)

ϕ1=12(01)|\phi_1\rangle = \frac{1}{\sqrt{2}}(|0\rangle - |1\rangle)

Verifique sua compreensão

Use a equação da Teoria Quântica dos Campos (QFT) apresentada na seção anterior para verificar esses dois estados de base de Fourier acima.

  • A fórmula geral da QFT é:

    ϕy=1Nx=0N1ωNyxx | \phi_y \rangle = \frac{1}{\sqrt{N}}\sum_{x=0}^{N-1}\omega_N^{y x} \vert x \rangle

    Para um único qubit ( n=1n=1 ), N=2n=2N=2^n=2, e ωNxy=e2πiyx2\omega_N^{xy} = e^{2\pi i \frac {y x}{2}}. Portanto, temos

    ϕ0=12(e2πi0×020+e2πi0×121)=12(0+1) | \phi_0 \rangle = \frac{1}{\sqrt{2}}(e^{2\pi i \frac {0 \times 0}{2}}|0\rangle + e^{2\pi i \frac {0 \times 1}{2}}|1\rangle) = \frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)

    ϕ1=12(e2πi1×020+e2πi1×121)=12(01) | \phi_1 \rangle = \frac{1}{\sqrt{2}}(e^{2\pi i \frac {1 \times 0}{2}}|0\rangle + e^{2\pi i \frac {1 \times 1}{2}}|1\rangle) = \frac{1}{\sqrt{2}}(|0\rangle - |1\rangle)

Dê uma olhada nessas duas equações. Talvez você já conheça uma porta quântica que pode ser usada para implementar essa transformação. Ou seja, há uma porta que transforma os estados da base computacional 0|0\rangle e 1|1\rangle nos respectivos estados da base de Fourier ϕ0|\phi_0\rangle e ϕ1|\phi_1\rangle. É uma porta Hadamard! Isso fica ainda mais claro se introduzirmos uma representação matricial da operação QFT N_N :

QFTN=1Nx=0N1y=0N1ωNxyxy \text{QFT}_N = \frac{1}{\sqrt{N}} \sum_{x=0}^{N-1} \sum_{y=0}^{N-1} \omega_N^{xy} \vert x \rangle \langle y \vert

Se você não estiver familiarizado com essa notação para expressar um operador quântico, não tem problema! É uma forma de representar uma matriz N×NN \times N, em que xx e yy indexam as colunas e as linhas da matriz, de 00 a N1N-1, e ωNxy\omega_N^{xy} é o valor dessa entrada específica. Portanto, a entrada na 0ª coluna e na 2ª linha, por exemplo, seria apenas ωN0,2=e2πi0×2N=1\omega_N^{0,2} = e^{2 \pi i \frac{0 \times 2}{N}} = 1.

Nessa representação, cada um dos estados da base computacional está associado a um dos vetores da base:

(100),1=(010),N1=(001).\begin{pmatrix} 1 \\ 0 \\ \vdots \\ 0 \end{pmatrix}, |1\rangle = \begin{pmatrix} 0 \\ 1 \\ \vdots \\ 0 \end{pmatrix}, |N-1\rangle = \begin{pmatrix} 0 \\ 0 \\ \vdots \\ 1 \end{pmatrix}.

Se você quiser saber mais sobre essa representação, consulte a lição de John Watrous sobre sistemas múltiplos no curso Noções básicas de informação quântica.

Vamos tentar construir a matriz para QFT 4_4. Usando a fórmula acima, descobrimos que

QFT4=12(11111i1i11111i1i)\text{QFT}_4 = \frac{1}{2} \begin{pmatrix} 1 & 1 & 1 & 1 \\ 1 & i & -1 & -i \\ 1 & -1 & 1 & -1 \\ 1 & -i & -1 & i \\ \end{pmatrix}

Para implementar essa matriz em um computador quântico, precisaremos descobrir qual combinação de portas aplicadas a quais qubits nos dará uma transformação unitária que corresponda à matriz acima. Já conhecemos um dos portões que serão necessários: o Hadamard. Outra porta de que precisaremos é a porta de fase controlada, que aplica uma fase relativa α\alpha ao estado do qubit de destino, desde que o qubit de controle esteja no estado 1|1\rangle. Na forma de matriz, isso se parece com:

CPα=(100001000010000eiα)\text{CP}_\alpha = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & e^{i\alpha} \\ \end{pmatrix}

Como apenas o estado 11|11\rangle é alterado, na verdade não importa qual qubit é considerado o "controle" e qual é o "alvo" O resultado será o mesmo de qualquer maneira.

Por fim, também precisaremos de alguns portões SWAP. Uma porta SWAP troca os estados de dois qubits. Parece que sim:

SWAPα=(1000001001000001)\text{SWAP}_\alpha = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

O procedimento para construir um circuito QFT 2m_{2^m} nos qubits mm é iterativo: primeiro, você aplica a QFT 2m1_{2^{m-1}} aos qubits 11 a m1m-1 e, em seguida, adiciona algumas portas entre o qubit 00 e os outros qubits m1m-1. Mas para aplicar a QFT 2m1_{2^{m-1}}, primeiro você precisa aplicar a QFT 2m2_{2^{m-2}} aos qubits 2 a m1m-1 e, em seguida, adicionar algumas portas entre o qubit 1 e os qubits restantes 22 a m1m-1. É como um ninho de bonecas russo: cada boneca acrescenta um fator de dois na dimensão do circuito QFT, com a menor boneca no centro, sendo a QFT 2_2, ou a porta Hadamard.

Para colocar uma boneca dentro da boneca de tamanho maior seguinte, aumentando assim a dimensão do QFT por um fator de dois, você sempre segue o mesmo procedimento:

  1. Primeiro, aplique a QFT 2m1_{2^{m-1}} aos qubits m1m-1 mais baixos. Essa é a sua "boneca menor" do conjunto de bonecas russas que você colocará dentro da próxima boneca maior.
  2. Use o próximo qubit acima como controle e aplique portas de fase controladas a cada um dos m1m-1 qubits inferiores, com fases para os estados de base padrão de cada um dos m1m-1 qubits restantes.
  3. Execute um Hadamard no mesmo qubit superior que foi usado como controle nas portas de fase.
  4. Use as portas SWAP para alterar a ordem dos qubits de modo que o bit menos significativo (superior) se torne o bit mais significativo (inferior) e todos os outros sejam deslocados para cima em um.

Já usamos a função QFTGate da biblioteca de circuitos do Qiskit, mas agora vamos dar uma olhada em algumas dessas portas QFT para verificar o procedimento acima. Podemos fazer isso com decompose().

qc = QuantumCircuit(1)
qc.compose(QFTGate(1), inplace=True)
qc.decompose().draw("mpl")

Output:

Output of the previous code cell
qc = QuantumCircuit(2)
qc.compose(QFTGate(2), inplace=True)
qc.decompose().draw("mpl")

Output:

Output of the previous code cell
qc = QuantumCircuit(3)
qc.compose(QFTGate(3), inplace=True)
qc.decompose().draw("mpl")

Output:

Output of the previous code cell
qc = QuantumCircuit(4)
qc.compose(QFTGate(4), inplace=True)
qc.decompose().draw("mpl")

Output:

Output of the previous code cell

Portanto, esperamos que, a partir dos quatro primeiros QFTs, você possa começar a ver como cada um deles está aninhado dentro do próximo maior. Você deve ter notado, no entanto, que algumas das portas de fase não são exatamente como prescritas no procedimento que descrevemos acima, e os SWAPs não aparecem após cada sub-rotina, mas apenas no final do QFT completo. Isso nos poupa de portas desnecessárias, o que faria com que o circuito demorasse mais e fosse mais propenso a erros. Em vez de implementar o SWAP após cada boneco aninhado, o circuito mantém o controle de onde cada estado de qubit deve estar e ajusta os qubits aos quais está aplicando as portas de fase de acordo. Em seguida, um conjunto final de SWAPs no final coloca tudo em seu devido lugar.


Aplique o QFT: Estimativa de fase

Vamos ver como a QFT pode ser usada para resolver um problema útil na computação quântica. O cálculo da transformada quântica inversa de Fourier é uma etapa necessária em um algoritmo conhecido como Estimativa de Fase Quântica (QPE), que é, por sua vez, uma sub-rotina em muitos outros algoritmos, incluindo a "joia da coroa" dos algoritmos quânticos, o algoritmo de fatoração de Shor.

O objetivo do QPE é estimar os valores próprios de um operador unitário. Os operadores unitários são onipresentes na computação quântica e, muitas vezes, encontrar os valores próprios de seus vetores próprios associados é uma etapa necessária em um algoritmo maior. Dependendo do problema, um valor próprio pode representar uma energia de um Hamiltoniano em um problema do tipo simulação, pode nos ajudar a encontrar fatores primos de um número no algoritmo de Shor ou pode conter outras informações essenciais. O QPE é uma das subrotinas mais importantes e amplamente usadas na computação quântica.

Então, o que isso tem a ver com uma transformada quântica de Fourier? Bem, como você deve se lembrar, qualquer valor próprio λ\lambda de um operador unitário tem uma magnitude λ=1|\lambda| = 1. Portanto, podemos escrever cada valor próprio como um número complexo com magnitude um:

λ=e2πiθ\lambda = e^{2\pi i \theta}

em que θ\theta é um número real entre 0 e 1. Se você quiser mais informações sobre matrizes unitárias, veja a lição de John Watrous sobre o assunto em Noções básicas de informação quântica.

Observe que λ\lambda é periódico em θ\theta. Isso já pode lhe sugerir que uma QFT pode estar envolvida, pois vimos como as QFTs são úteis para analisar funções periódicas. A seguir, examinaremos o algoritmo e veremos exatamente como a QFT entra em ação.

Como funciona o QPE

Primeiro, começaremos com o algoritmo QPE mais simples, que estima aproximadamente a fase com um único dígito binário de precisão. Em outras palavras, esse algoritmo pode distinguir entre θ=0\theta = 0 e θ=1/2\theta = 1/2, mas não pode fazer melhor do que isso. Aqui está o diagrama do circuito:

Diagrama de circuito do algoritmo QPE para um único qubit de dados. Um Hadamard é aplicado ao qubit de dados. Em seguida, o algoritmo usa outro qubit auxiliar, no qual é aplicada uma porta U controlada, com o qubit de dados como controle. Depois de outro Hadamard no qubit 0, os qubits são medidos.

Os qubits são preparados no estado π0=ψ0|\pi_0\rangle = |\psi\rangle|0\rangle, em que o qubit 00 está no estado 0|0\rangle e os qubits restantes estão no estado ψ|\psi\rangle, que é um estado próprio de UU. Após o primeiro Hadamard, o estado do qubit se torna:

π1=12ψ(0+1)|\pi_1\rangle = \frac{1}{\sqrt{2}}|\psi\rangle (|0\rangle + |1\rangle)

O próximo portão é um portão "controlado - UU ". Isso aplica a operação unitária UU aos qubits inferiores que estão no estado ψ|\psi\rangle se o qubit 0 estiver no estado 1|1\rangle, mas não faz nada para ψ|\psi\rangle se o qubit 0 estiver no estado 0|0\rangle. Isso transforma os qubits no estado:

π2=12(ψ0+e2πiθψ1)|\pi_2\rangle = \frac{1}{\sqrt{2}}( |\psi\rangle|0\rangle + e^{2\pi i \theta}|\psi\rangle|1\rangle) =12ψ(0+e2πiθ1)= \frac{1}{\sqrt{2}}|\psi\rangle (|0\rangle + e^{2\pi i \theta}|1\rangle)

Algo estranho acabou de acontecer: a porta controlled- UU usa apenas o qubit 00 como qubit de controle, portanto, pode-se pensar que essa porta não alteraria o estado do qubit 0. Mas, de alguma forma, isso acontece! Embora a operação tenha sido aplicada aos qubits inferiores, o efeito geral da porta é alterar a fase do qubit 00. Isso é conhecido como "mecanismo de retrocesso de fase" e é usado em muitos algoritmos quânticos, incluindo os algoritmos de Deutsch-Josza e Grover. Se você quiser saber mais sobre o mecanismo de phase-kickback, consulte a lição de John Watrous sobre algoritmos de consulta quântica em Fundamentos de algoritmos quânticos.

Após a fase-kickback, aplicamos mais um Hadamard ao qubit 00, o que resulta no estado:

π3=ψ(1+e2πiθ20+1e2πiθ21)=ψ(cos(πθ)0isin(πθ)1)|\pi_3\rangle = |\psi\rangle ( \frac{1+e^{2\pi i \theta}}{2} |0\rangle + \frac{1 - e^{2\pi i \theta}}{2}|1\rangle) = |\psi\rangle ( \cos(\pi\theta) |0\rangle - i \sin(\pi\theta)|1\rangle)

Portanto, quando medirmos o qubit 00 no final, mediremos 0|0\rangle com 100% de certeza se for θ=0\theta = 0 e mediremos 1|1\rangle com 100% de certeza se for θ=12\theta = \frac{1}{2} (e se nosso computador quântico for perfeito, sem ruído). Se θ\theta for algo diferente disso, a medição final será apenas probabilística e nos dirá apenas uma parte.

QPE com mais precisão: mais qubits

Podemos estender esse conceito simples a um algoritmo mais complicado com precisão arbitrária. Se, em vez de usar apenas o qubit 00 para medir a fase, usarmos os qubits mm 00 a m1m-1, poderemos estimar a fase com mm bits de precisão. Vamos ver como isso funciona:

Diagrama de circuito do algoritmo QPE para vários qubits. Os Hadamards são aplicados aos qubits de dados de 0 a m-1. Em seguida, uma série de portas controladas-U é aplicada aos m qubits auxiliares. Por fim, uma QFT inversa é aplicada aos qubits e eles são medidos.

Esse circuito QPE mais preciso começa da mesma forma que a versão de bit único: Hadamards são aplicados aos primeiros mm qubits, e os qubits restantes são preparados no estado ψ|\psi\rangle, criando o estado:

π1=12m/2ψ(0+1)(0+1)...(0+1)|\pi_1\rangle = \frac{1}{2^{m/2}}|\psi\rangle(|0\rangle+|1\rangle)(|0\rangle+|1\rangle)...(|0\rangle+|1\rangle)

Agora, os unitários controlados são aplicados. O Qubit 00 é o controle para o mesmo UU unitário de antes. Mas agora, o qubit 11 é o controle para o unitário U2U^2, que é simplesmente UU aplicado duas vezes. Portanto, o autovalor de U2U^2 é e22πiθe^{2*2\pi i \theta}. Em geral, cada qubit kk de 0 a m1m-1 será o controle do unitário U2kU^{2^k}. Isso significa que cada um desses qubits sofrerá um retorno de fase de e2k2πiθe^{2^k*2\pi i \theta}. Isso resulta no estado:

π2=ψ12m/2(0+e2m12πiθ1)(0+e2m22πiθ1)...(0+e2πiθ1)|\pi_2\rangle = |\psi\rangle \otimes \frac{1}{2^{m/2}} (|0\rangle+e^{2^{m-1}2\pi i \theta}|1\rangle)(|0\rangle+e^{2^{m-2}2\pi i \theta}|1\rangle)...(|0\rangle+e^{2\pi i \theta}|1\rangle)

Isso pode ser reescrito como uma soma dos estados da base computacional:

π2=ψ12m/2k=02m1e2πikθk|\pi_2\rangle = |\psi\rangle \otimes \frac{1}{2^{m/2}} \sum_{k=0}^{2^{m}-1} e^{2\pi i k \theta} |k\rangle

A soma parece familiar? É um QFT! Lembre-se da equação de uma transformada quântica de Fourier:

QFT2my=12mx=02m1ω2myxx \text{QFT}_{2^m}| y \rangle = \frac{1}{\sqrt{2^m}}\sum_{x=0}^{2^m-1}\omega_{2^m}^{y x} \vert x \rangle

Portanto, se a fase θ=y/2m\theta = y/2^m para algum número inteiro yy entre 00 e 2m12^m-1, então a QFT inversa desse estado resultará no estado:

π3=ψy|\pi_3\rangle = |\psi\rangle \otimes |y\rangle

e a partir de y|y\rangle, podemos deduzir θ\theta.

No entanto, se θ/2m\theta/2^m não for um múltiplo inteiro, a aplicação da QFT inversa apenas aproximará θ\theta. O grau de aproximação de θ\theta será probabilístico, o que significa que nem sempre obteremos a melhor aproximação, mas ela será bem próxima, e quanto mais qubits mm você usar, melhor será a aproximação. Para saber como quantificar essa aproximação de θ\theta, confira a lição de John Watrous sobre Estimativa de fase e fatoração em Fundamentos de algoritmos quânticos.

Conclusão

Este módulo apresentou uma visão geral do que é um QFT, como ele é implementado em um computador quântico e como ele pode ser útil na solução de problemas. Demos a você uma amostra de sua utilidade quando vimos como ele pode ser usado na estimativa de fase quântica para aprender sobre os valores próprios de uma matriz unitária.

Conceitos críticos

  • A Transformada Quântica de Fourier é o análogo quântico da Transformada Discreta de Fourier.
  • A QFT é um exemplo de uma transformação de base.
  • O procedimento de estimativa de fase quântica se baseia no mecanismo de retrocesso de fase das operações unitárias controladas, bem como em uma QFT inversa.
  • A QFT e a QPE são sub-rotinas amplamente usadas em vários algoritmos quânticos.

Perguntas

Verdadeiro/Falso

  1. T/F A transformada quântica de Fourier é o análogo quântico da transformada clássica discreta de Fourier (DFT).
  2. O T/F QFT pode ser implementado usando apenas portas Hadamard e CNOT.
  3. T/F A QFT é um componente essencial do algoritmo de Shor.
  4. T/F O resultado da Estimativa de Fase Quântica é um estado quântico que representa o vetor próprio do operador.
  5. T/F O QPE requer o uso da Transformada Quântica de Fourier inversa (QFT ^\dag ).
  6. T/F No QPE, se a fase ϕ\phi for exatamente representável com nn bits, o algoritmo fornecerá o resultado correto com probabilidade 1.

Respostas curtas

  1. Quantos qubits são necessários para realizar um QFT em um sistema com 2n2^n pontos de dados?
  2. A QFT pode ser usada em um estado que não seja um estado de base computacional? Em caso afirmativo, o que acontece?
  3. Como o número de qubits de controle usados no QPE afeta a resolução da estimativa de fase resultante?

Problemas

  1. Use a multiplicação de matrizes para verificar se as etapas do algoritmo QFT de fato resultam na matriz QFT4\text{QFT}_4 :
QFT4=12(11111i1i11111i1i)\text{QFT}_4 = \frac{1}{2} \begin{pmatrix} 1 & 1 & 1 & 1 \\ 1 & i & -1 & -i \\ 1 & -1 & 1 & -1 \\ 1 & -i & -1 & i \\ \end{pmatrix}

(Não é necessário fazer isso à mão!)

Problemas desafiadores

  1. Crie um estado de quatro qubits que seja uma superposição igual de todas as bases computacionais ímpares: ψ=0001+0011+0101+0111+1001+1011+1101+1111|\psi\rangle = |0001\rangle + |0011\rangle + |0101\rangle + |0111\rangle +|1001\rangle +|1011\rangle +|1101\rangle +|1111\rangle. Em seguida, execute uma QFT no estado. Qual é o estado resultante? Explique por que seu resultado faz sentido, usando seu conhecimento de transformadas de Fourier.
Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.