Skip to main content
IBM Quantum Platform

Transformada de Fourier cuántica

Para este módulo de Qiskit en las aulas, los estudiantes deben tener un entorno Python en funcionamiento con los siguientes paquetes instalados:

  • qiskit v2.1.0 o más reciente
  • qiskit-ibm-runtime v0.40.1 o más reciente
  • qiskit-aer v0.17.0 o más reciente
  • qiskit.visualization
  • numpy
  • pylatexenc

Para configurar e instalar los paquetes anteriores, consulta la guía Instalar Qiskit. Para ejecutar trabajos en ordenadores cuánticos reales, los estudiantes deberán crear una cuenta en IBM Quantum® siguiendo los pasos de la guía Configure su cuenta en IBM Cloud.

Este módulo fue probado y utilizó 13 segundos de tiempo QPU. Se trata de una estimación de buena fe; su uso real puede 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'

Introducción

La transformada de Fourier es una herramienta omnipresente con aplicaciones en matemáticas, física, procesamiento de señales, compresión de datos y otros innumerables campos. Una versión cuántica de la transformada de Fourier, acertadamente denominada transformada cuántica de Fourier, constituye la base de algunos de los algoritmos cuánticos más importantes.

Hoy, tras un recordatorio de la transformada de Fourier clásica, hablaremos de cómo implementar la transformada de Fourier cuántica en un ordenador cuántico. A continuación, hablaremos de una de las aplicaciones de la transformada cuántica de Fourier a un algoritmo llamado algoritmo de estimación de fase. La estimación cuántica de fase es una subrutina del famoso algoritmo de factorización de Shor, al que a veces se hace referencia como la "joya de la corona" de la computación cuántica. Este módulo se basa en otro módulo sobre el algoritmo de Shor, pero también puede utilizarse de forma independiente. La transformada cuántica de Fourier es un algoritmo fascinante y útil por derecho propio


La transformada de Fourier clásica

Antes de pasar a la transformada cuántica de Fourier, recordemos la versión clásica. La transformada de Fourier es un método de transformación de una "base" a otra. Se puede pensar en dos bases como diferentes perspectivas del mismo problema: ambas son formas válidas de expresar una función, pero una u otra pueden ser más esclarecedoras, dependiendo del problema que se trate. Algunos ejemplos de pares de bases que se conectan mediante la transformada de Fourier son la posición y el momento, y el tiempo y la frecuencia.

Veamos un ejemplo de cómo la transformada de Fourier puede ayudarnos a averiguar qué nota está tocando un instrumento basándonos en su forma de onda de audio. Normalmente, vemos las formas de onda representadas en base temporal, es decir, la amplitud de la onda se expresa en función del tiempo.

Señal sinusoidal única trazada en función del tiempo.

Podemos transformar de Fourier esta forma de onda para pasar de la base temporal a la base frecuencial:

Espectro de frecuencia de la forma de onda de audio. Un pico nítido y claro a 260 Hz.

En la base de frecuencia, podemos ver fácilmente un pico claro en torno a 260 Hz. ¡Eso es un do central!

Ahora bien, es posible que haya podido determinar que se estaba tocando un Do central sin utilizar una transformada de Fourier, pero ¿qué ocurre si se tocan varias notas a la vez? Entonces, la forma de onda se complica cuando la trazamos en base temporal:

Gráfico de desplazamiento en función del tiempo de múltiples ondas sinusoidales a la vez, creando un patrón periódico más complicado.

Pero el espectro de frecuencias identifica claramente tres picos:

Espectro de frecuencias de la forma de onda de audio anterior. Tres picos aproximadamente a 260 Hz, 330 Hz y 392 Hz. El último pico es muy débil, pero visible.

Se trataba de un acorde de Do mayor, tocando las notas Do, Mi y Sol.

Este tipo de análisis de Fourier puede ayudarnos a extraer los componentes de frecuencia de cualquier tipo de señal complicada.

Transformada discreta de Fourier

La transformada de Fourier es útil para numerosas aplicaciones de tratamiento de señales. Pero en la mayoría de estas aplicaciones del mundo real (incluido el ejemplo de la música que hemos utilizado antes), queremos transformar un conjunto discreto de puntos de datos NN, no una función continua. En este caso, utilizamos la transformada discreta de Fourier. La transformada discreta de Fourier (DFT) actúa sobre un vector (x0,...,xN1)(x_0, ..., x_{N-1}) y lo mapea al vector (y0,...,yN1)(y_0, ..., y_{N-1}) según la fórmula:

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

donde tomamos ωNjk=e2πijkN\omega_N^{jk} = e^{2\pi i \frac{jk}{N}}. (Tenga en cuenta que hay otras convenciones que tienen un signo menos en el exponencial, así que tenga cuidado cuando vea la DFT en la naturaleza) Recordemos que e2πijkNe^{2\pi i \frac{jk}{N}} es una función periódica, con período Nk\frac{N}{k}. Por tanto, al multiplicar por esta función, la transformada de Fourier es esencialmente una forma de descomponer la función (discreta) {xj}\{x_{j}\} en una combinación lineal de sus funciones periódicas constituyentes, cada una con periodo Nk\frac{N}{k}.


La transformada de Fourier cuántica

Ya hemos visto cómo se utiliza la transformada de Fourier para representar una función como combinación lineal de un nuevo conjunto de las llamadas "funciones base" Las transformaciones de base también se realizan regularmente en los estados qubit. Por ejemplo, el estado de un único qubit ψ|\psi\rangle puede expresarse en la base computacional ψ=c00+c11|\psi\rangle = c_0 |0\rangle + c_1 |1\rangle, con estados de base 0|0\rangle y 1|1\rangle, o en la base XX ψ=c+++c|\psi\rangle = c_+ |+\rangle + c_- |-\rangle con estados de base +=12(0+1)|+\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |1\rangle) y =12(01)|-\rangle = \frac{1}{\sqrt{2}} (|0\rangle - |1\rangle). Ambas son igualmente válidas, pero una puede ser más natural que la otra, dependiendo del tipo de problema que se intente resolver.

Los estados Qubit también pueden expresarse en la base de Fourier, donde un estado se expresa en términos de una combinación lineal de los estados de la base de Fourier ϕy|\phi_y\rangle, en lugar de los estados habituales de la base computacional, x|x\rangle. Para ello, es necesario aplicar una transformada cuá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

con ωNyx=e2πiyxN\omega_N^{yx} = e^{\frac{2\pi i y x}{N}} como arriba, y NN es el número de estados básicos en su sistema cuántico. Tenga en cuenta que, dado que ahora estamos trabajando con qubits, mm qubits le da 2m2^m estados básicos, por lo que N=2mN=2^m. Aquí, los estados básicos se escriben como un solo número x|x\rangle donde xx varía de 00 a N1N-1, pero es más habitual ver los estados básicos expresados como 00...00|00...00\rangle, 00...01|00...01\rangle, 00...11|00...11\rangle,..., 11...11|11...11\rangle, donde cada dígito binario representa el estado del qubit 0 a m1m-1, de derecha a izquierda. Hay una forma fácil de convertir estos estados binarios en un solo número: ¡simplemente trátalos como números binarios! Por lo tanto, 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, y así sucesivamente, hasta 11...11=2m1=N1|11...11\rangle = |2^m -1\rangle = |N-1\rangle.

Desarrollar la intuición para los estados básicos de Fourier

Así pues, acabamos de repasar qué son los estados base computacionales y cómo se ordenan: son el conjunto de estados en los que cada qubit está en 00 o 11, y los ordenamos desde el estado en el que todos los qubits están en 00, 00...00|00...00\rangle, hasta el estado en el que todos están en 11, 11...11|11...11\rangle.

Pero, ¿cómo dar sentido a los estados de la base de Fourier? Todos los estados de la base de Fourier son superposiciones iguales de todos los estados de la base computacional, pero cada estado difiere del otro en la periodicidad en la fase de los componentes. Para entenderlo más concretamente, veamos los cuatro estados de la base de Fourier de un sistema de dos qubits. El estado de Fourier más bajo es aquel cuya fase no varía en absoluto:

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

Podemos visualizar este estado trazando la amplitud compleja de cada uno de los términos. La línea roja guía al ojo para mostrarle cómo la fase de esta amplitud serpentea por el plano complejo en función del estado base de cálculo. Para ϕ0|\phi_0\rangle, la fase permanece constante:

Gráfico de barras de la amplitud compleja (plano x-y) de cada estado base de cálculo (eje z) para phi_0. Todos son reales, por lo que las barras apuntan a +1 en el eje x

El siguiente estado de la base de Fourier es aquel cuyas fases de los componentes giran de 00 a 2π2\pi una sola 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)

Y podemos ver esta sinuosidad en el gráfico de la amplitud compleja frente al estado base computacional:

Gráfico de barras de la amplitud compleja (plano x-y) de cada estado base de cálculo (eje z) para phi_1. La línea roja muestra cómo la fase compleja se acumula de tal manera que serpentea alrededor de 2\pi una vez al pasar por todos los estados de la base de cálculo.

Así, cada estado tiene una fase que es 2π/42\pi/4 radianes mayor que el estado que le precede cuando se ordenan de la forma estándar, ya que en este ejemplo tenemos cuatro estados base ( N=4N=4 ). El siguiente estado base gira de 0 a 2 π\pi dos veces:

ϕ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 de la amplitud compleja (plano x-y) de cada estado base de cálculo (eje z) para phi_2. La línea roja muestra cómo la fase compleja se acumula de tal manera que serpentea alrededor de 2\pi dos veces a medida que se recorren todos los estados de la base de cálculo.

Por último, la componente de Fourier más alta es la que varía más rápidamente de fase. Para nuestro ejemplo con dos qubits, es aquel cuyas fases dan tres vueltas de 0 a 2π2\pi :

ϕ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 de la amplitud compleja (plano x-y) de cada estado base de cálculo (eje z) para phi_3. La línea roja muestra cómo la fase compleja se acumula de tal forma que serpentea alrededor de 2\pi tres veces a medida que se recorren todos los estados base computacionales.

En general, para un estado de qubit e mm, habrá e 2m2^m es estados de base de Fourier, cuya frecuencia en la variación de fase varía desde constante, para ϕ0|\phi_0\rangle, hasta rápidamente variable para ϕ2m1|\phi_{2^m-1}\rangle, completando 2m12^m-1 vueltas alrededor de 2π2\pi sobre la superposición de estados. Por lo tanto, cuando tomamos una QFT de un estado cuántico, esencialmente estamos haciendo el mismo análisis básico que hicimos para la forma de onda musical en la introducción. Estamos determinando los componentes de frecuencia de Fourier que contribuyen a crear el estado cuántico de interés.

Prueba algunos ejemplos de QFT

Intentemos seguir construyendo nuestra intuición para la transformada cuántica de Fourier haciendo un estado en la base computacional, y luego viendo qué ocurre cuando le aplicamos la QFT. Por ahora, nos limitaremos a tratar la QFT como una caja negra que aplicamos utilizando la QFTGate de la biblioteca de circuitos Qiskit. Más adelante veremos cómo se implementa.

Comenzamos cargando los paquetes necesarios y seleccionando un dispositivo en el que ejecutar nuestro 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

Si no tienes tiempo disponible en tu cuenta o quieres utilizar un simulador por cualquier motivo, puedes ejecutar la celda que aparece a continuación para configurar un simulador que imitará el dispositivo cuántico que seleccionamos anteriormente:

# 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

En primer lugar, vamos a intentar transformar un único estado de base computacional. Empezaremos creando un estado computacional aleatorio:

# 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

Ahora, transformemos este estado en Fourier con 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 puede ver, medimos las poblaciones de cada estado para que sean más o menos iguales, más o menos algo de ruido experimental y estadístico. Por tanto, si se toma la QFT de un único estado base computacional, el resultado es una superposición igual de todos los estados. Si está familiarizado con las transformadas de Fourier, probablemente esto no le sorprenda. Un principio básico que puede ayudarnos a establecer una conexión intuitiva entre una función y su transformada de Fourier es que la anchura de una función es inversamente proporcional a la anchura de su transformada de Fourier. Así, algo que está muy localizado en el tiempo, por ejemplo, como un pulso muy corto, requerirá una amplia gama de frecuencias para generar ese pulso. Esa señal será muy amplia en el espacio de Fourier.

Este hecho está relacionado con la incertidumbre cuántica El principio de incertidumbre de Heisenberg suele enunciarse como ΔxΔp/2\Delta x \Delta p \ge \hbar / 2 . Así, si la incertidumbre en xx ( Δx\Delta x ) es pequeña, la incertidumbre en el momento ( Δp\Delta p ) debe ser grande, y viceversa. Resulta que la transformación de la base de posición xx a la base de momento pp se realiza mediante una transformada de Fourier.

Nota: Ten en cuenta que estamos midiendo poblaciones en cada uno de los estados base, por lo que estamos perdiendo información sobre las fases relativas entre las distintas partes de la superposición. Así, mientras que la QFT de cualquier estado base computacional dará como resultado la misma dispersión uniforme de la población en todos los estados base, las fases no serán necesariamente las mismas.

Dos estados de base computacional

Veamos ahora qué ocurre cuando preparamos una superposición de estados de base computacional. ¿Cómo crees que será la transformada de Fourier en este caso?

Elijamos la superposición:

ψ=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

Ahora, transformemos este estado en Fourier con 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 puede ser un poco más sorprendente. Parece que la QFT del estado ψ=12(0+N/2)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) es una superposición de todos los estados de la base par. Pero si pensamos de nuevo en nuestra visualización de cada estado base ϕy|\phi_y\rangle, y en cómo la fase de cada componente gira alrededor de 2π2\pi yy veces, entonces la razón por la que obtenemos este resultado puede quedar clara.

Comprueba tu comprensión

Utilizando la pista anterior, explica por qué es previsible el resultado que obtuvimos para la teoría cuántica de campos de un campo de tipo « ψ=12(0+N/2)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) ».

  • El estado original tiene una fase relativa de 0 (o un múltiplo entero de 2π2\pi ) entre las dos partes de la superposición. Así, sabemos que este estado tiene componentes de Fourier cuyas fases también coinciden de esa manera: las que tienen desplazamiento de fase 0 entre el término |0000> y el término |1000>. Cada estado de la base de Fourier ϕy|\phi_y\rangle se compone de términos cuya fase se acumula a un ritmo de 2πy/N2\pi y/N, lo que significa que, ordenados de la forma habitual, cada término de la superposición tiene una fase de 2πy/N2\pi y/N mayor que el término anterior. Así, en el punto medio N/2N/2, queremos que la fase 2πy/NN/22\pi y/N * N/2 sea un múltiplo entero de 2π2\pi. Esto ocurre cuando yy es par.

¿Qué superposición de estados computacional correspondería a una teoría cuántica de campos con picos en cada número binario impar?

  • Si se tomara la QFT del estado ψ=0N/2\psi = |0\rangle - |N/2\rangle, entonces se verían picos en cada estado binario impar.


Desglosar el algoritmo QFT

Ahora que hemos adquirido más intuición sobre la relación entre los estados de los qubits en la base computacional y la base de Fourier, profundicemos en el algoritmo QFT en sí. En otras palabras, ¿qué puertas implementamos realmente en el ordenador cuántico para lograr esta transformación?

Empecemos poco a poco, con un solo qubit. Entonces, eso significa que tendremos dos estados base. QFT 2_2 transforma los estados de base computacional 0|0\rangle y 1|1\rangle en estados de base de Fourier ϕ0\phi_0 y ϕ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)

Comprueba tu comprensión

Utiliza la ecuación de la teoría cuántica de campos de la sección anterior para verificar estos dos estados de base de Fourier mencionados anteriormente.

  • La fórmula general de QFT es:

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

    Para un único qubit ( n=1n=1 ), N=2n=2N=2^n=2, y ωNxy=e2πiyx2\omega_N^{xy} = e^{2\pi i \frac {y x}{2}}. Así pues, tenemos

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

Echa un vistazo a esas dos ecuaciones. Es posible que ya conozcas una puerta cuántica que puede utilizarse para aplicar esta transformación. Es decir, existe una puerta que transforma los estados de base computacional 0|0\rangle y 1|1\rangle en los respectivos estados de base de Fourier ϕ0|\phi_0\rangle y ϕ1|\phi_1\rangle. ¡Es una puerta Hadamard! Esto queda aún más claro si introducimos una representación matricial de la operación 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

Si no estás familiarizado con esta notación para expresar un operador cuántico, ¡no pasa nada! Es una forma de representar una matriz N×NN \times N, donde xx y yy indexan las columnas y filas de la matriz, de 00 a N1N-1, y ωNxy\omega_N^{xy} es el valor de esa entrada concreta. Así, la entrada de la columna 0 y la fila 2, por ejemplo, sería ωN0,2=e2πi0×2N=1\omega_N^{0,2} = e^{2 \pi i \frac{0 \times 2}{N}} = 1.

En esta representación, cada uno de los estados base computacionales se asocia a uno de los vectores 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}.

Si desea conocer más a fondo esta representación, consulte la lección de John Watrous sobre sistemas múltiples en el curso Fundamentos de la información cuántica.

Intentemos construir la matriz para QFT 4_4. Utilizando la fórmula anterior, encontramos 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 esta matriz en un ordenador cuántico, tendremos que averiguar qué combinación de puertas aplicadas a qué qubits nos dará una transformación unitaria que coincida con la matriz anterior. Ya conocemos una de las puertas que serán necesarias: la Hadamard. Otra puerta que necesitaremos es la puerta de fase controlada, que aplica una fase relativa α\alpha al estado del qubit objetivo, siempre que el qubit de control esté en el estado 1|1\rangle. En forma de matriz esto se ve así:

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}

Dado que sólo se cambia el estado 11|11\rangle, en realidad no importa qué qubit se considera el "control" y cuál es el "objetivo" El resultado será el mismo en ambos casos.

Por último, también necesitaremos algunas puertas SWAP. Una puerta SWAP intercambia los estados de dos qubits. Eso parece:

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}

El procedimiento para construir un circuito QFT 2m_{2^m} en qubits mm es iterativo - primero se aplica la QFT 2m1_{2^{m-1}} a los qubits 11 a m1m-1, luego se añaden algunas puertas entre el qubit 00 y los otros qubits m1m-1. Pero para aplicar la QFT 2m1_{2^{m-1}}, primero hay que aplicar la QFT 2m2_{2^{m-2}} a los qubits 2 a m1m-1, y luego añadir algunas puertas entre el qubit 1 y los qubits restantes 22 a m1m-1. Es como una muñeca rusa anidada: cada muñeca añade un factor de dos en la dimensión del circuito QFT, con la muñeca más pequeña en el centro, siendo QFT 2_2, o la puerta de Hadamard.

Para meter un muñeco dentro del siguiente de mayor tamaño, aumentando así la dimensión de la QFT en un factor de dos, se sigue siempre el mismo procedimiento:

  1. En primer lugar, aplique la QFT 2m1_{2^{m-1}} a los qubits de la parte inferior m1m-1. Esta es tu "muñeca más pequeña" del juego de muñecas rusas que pronto meterás dentro de la siguiente muñeca más grande.
  2. Utilice el qubit siguiente como control y aplique puertas de fase controlada a cada uno de los qubits inferiores m1m-1, con fases a los estados de base estándar de cada uno de los qubits restantes m1m-1.
  3. Realiza un Hadamard en el mismo qubit superior que se utilizó como control en las puertas de fase.
  4. Utiliza las puertas SWAP para permutar el orden de los qubits de modo que el bit menos significativo (superior) se convierta en el más significativo (inferior), y todos los demás se desplacen uno hacia arriba.

Ya hemos estado utilizando la función QFTGate de la librería de circuitos Qiskit, pero ahora vamos a echar un vistazo al interior de algunas de estas puertas QFT para verificar el procedimiento anterior. Podemos hacerlo con 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

Así que, esperemos que a partir de las cuatro primeras QFT puedas empezar a ver cómo cada una está anidada dentro de la siguiente más grande. Sin embargo, te habrás dado cuenta de que algunas de las puertas de fase no son exactamente como se indica en el procedimiento que hemos descrito anteriormente, y los SWAPs no aparecen después de cada subrutina, sino que se encuentran al final de la QFT completa. Esto nos ahorra puertas innecesarias, que harían que el circuito tardara más y fuera más propenso a errores. En lugar de implementar el SWAP después de cada muñeca anidada, el circuito realiza un seguimiento de dónde debería estar cada estado de qubit y ajusta los qubits a los que está aplicando las puertas de fase en consecuencia. Luego, un último conjunto de SWAPs al final pone todo en su sitio.


Aplicar el QFT: Estimación de fase

Veamos cómo puede utilizarse la QFT para resolver un problema útil en computación cuántica. El cálculo de la transformada cuántica de Fourier inversa es un paso necesario en un algoritmo conocido como Estimación Cuántica de Fase (QPE), que es a su vez una subrutina en muchos otros algoritmos, incluida la "joya de la corona" de los algoritmos cuánticos, el algoritmo de factorización de Shor.

El objetivo del QPE es estimar los valores propios de un operador unitario. Los operadores unitarios son omnipresentes en la computación cuántica y, a menudo, encontrar los valores propios de sus vectores propios asociados es un paso necesario en un algoritmo más amplio. Dependiendo del problema, un valor propio puede representar una energía de un Hamiltoniano en un problema de tipo simulación, puede ayudarnos a encontrar factores primos de un número en el algoritmo de Shor o puede contener otra información esencial. QPE es una de las subrutinas más importantes y utilizadas en computación cuántica.

¿Qué tiene esto que ver con la transformada cuántica de Fourier? Bien, como recordarás, cualquier valor propio λ\lambda de un operador unitario tiene una magnitud λ=1|\lambda| = 1. Así que podemos escribir cada valor propio como un número complejo con magnitud uno:

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

donde θ\theta es un número real entre 0 y 1. Si desea más información sobre matrices unitarias, consulte la lección de John Watrous sobre el tema en Fundamentos de la información cuántica.

Nótese que λ\lambda es periódica en θ\theta. Esto ya podría sugerirte que una QFT podría estar implicada, puesto que vimos lo útiles que son las QFT para analizar funciones periódicas. A continuación, recorreremos el algoritmo y veremos con precisión cómo entra en juego la QFT.

Cómo funciona QPE

En primer lugar, empezaremos con el algoritmo QPE más sencillo, que estima aproximadamente la fase con un solo dígito binario de precisión. En otras palabras, este algoritmo puede distinguir entre θ=0\theta = 0 y θ=1/2\theta = 1/2, pero no puede hacerlo mejor. Aquí está el diagrama del circuito:

Diagrama de circuito del algoritmo QPE para un único qubit de datos. Se aplica un Hadamard al qubit de datos. A continuación, el algoritmo utiliza otro qubit ayudante, sobre el que se aplica una puerta controlada-U, con el qubit de datos como control. Tras otro Hadamard en el qubit 0, se miden los qubits.

Los qubits se preparan en el estado π0=ψ0|\pi_0\rangle = |\psi\rangle|0\rangle, donde el qubit 00 está en el estado 0|0\rangle y los qubits restantes están en el estado ψ|\psi\rangle, que es un estado propio de UU. Después del primer Hadamard, el estado de los qubits pasa a ser:

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

La siguiente puerta es una puerta "controlada- UU ". Esto aplica la operación unitaria UU a los qubits inferiores que están en el estado ψ|\psi\rangle si el qubit 0 está en el estado 1|1\rangle, pero no hace nada a ψ|\psi\rangle si el qubit 0 está en el estado 0|0\rangle. Esto transforma los qubits al 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 extraño acaba de suceder: la puerta controlada- UU sólo utiliza el qubit 00 como qubit de control, por lo que se podría pensar que esta puerta no cambiaría el estado del qubit 0 en absoluto. Pero de alguna manera, ¡lo hace! Aunque la operación se haya aplicado a los qubits inferiores, el efecto global de la puerta es cambiar la fase del qubit 00. Esto se conoce como "mecanismo de retroceso de fase" y se utiliza en muchos algoritmos cuánticos, incluidos los algoritmos de Deutsch-Josza y Grover. Si desea obtener más información sobre el mecanismo phase-kickback, consulte la lección de John Watrous sobre Algoritmos cuánticos de consulta en Fundamentos de los algoritmos cuánticos.

Después del retroceso de fase, aplicamos un Hadamard más al qubit 00, lo que da como resultado el 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)

Así, cuando midamos el qubit 00 al final, mediremos 0|0\rangle con un 100% de certeza si θ=0\theta = 0 y mediremos 1|1\rangle con un 100% de certeza si θ=12\theta = \frac{1}{2} (y si nuestro ordenador cuántico es perfecto, sin ruido). Si θ\theta es algo distinto de esto, la medición final es sólo probabilística y sólo nos dice una parte.

QPE con mayor precisión: más qubits

Podemos ampliar este sencillo concepto a un algoritmo más complicado con una precisión arbitraria. Si en lugar de utilizar sólo el qubit 00 para medir la fase, utilizamos mm qubits 00 a m1m-1, y entonces podremos estimar la fase con mm bits de precisión. Veamos cómo funciona:

Esquema del algoritmo QPE para múltiples qubits. Los Hadamards se aplican a los qubits de datos 0 a m-1. A continuación, se aplica una serie de compuertas controladas-U a los m qubits ayudantes. Por último, se aplica una QFT inversa a los qubits y se miden.

Este circuito QPE más preciso comienza igual que la versión de un solo bit: Se aplican Hadamards a los primeros mm qubits, y los qubits restantes se preparan en el estado ψ|\psi\rangle, creando el 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)

Ahora se aplican los unitarios controlados. Qubit 00 es el control para el mismo unitario UU que antes. Pero ahora, el qubit 11 es el control para el unitario U2U^2, que es simplemente UU aplicado dos veces. Así, el valor propio de U2U^2 es e22πiθe^{2*2\pi i \theta}. En general, cada qubit kk desde 0 hasta m1m-1 será el control del unitario U2kU^{2^k}. Esto significa que cada uno de estos qubits experimentará un retroceso de fase de e2k2πiθe^{2^k*2\pi i \theta}. Esto resulta en el 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)

Esto puede reescribirse como una suma sobre los estados base computacionales:

π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

¿Le suena la suma? ¡Es un QFT! Recordemos la ecuación de una transformada cuá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

Entonces, si la fase θ=y/2m\theta = y/2^m para algún entero yy entre 00 y 2m12^m-1, entonces tomando la QFT inversa de este estado resultará en el estado:

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

y de y|y\rangle, podemos deducir θ\theta.

Sin embargo, si θ/2m\theta/2^m no es un múltiplo entero, la QFT inversa sólo aproximará θ\theta. Lo bien que se aproxime a θ\theta será probabilístico, lo que significa que no siempre obtendremos la mejor aproximación, pero estará bastante cerca, y cuantos más qubits mm utilices, mejor será la aproximación que obtengas. Para saber cómo cuantificar esta aproximación de θ\theta, consulte la lección de John Watrous sobre Estimación de fase y factorización en Fundamentos de algoritmos cuánticos.

Conclusión

Este módulo ofreció una visión general de lo que es una QFT, cómo se implementa en un ordenador cuántico y lo útil que puede ser para resolver problemas. Ya le dimos una idea de su utilidad cuando vimos cómo puede utilizarse en la estimación cuántica de fase para conocer los valores propios de una matriz unitaria.

Conceptos fundamentales

  • La transformada cuántica de Fourier es el análogo cuántico de la transformada discreta de Fourier.
  • La QFT es un ejemplo de transformación de bases.
  • El procedimiento de estimación cuántica de fase se basa en el mecanismo de retroceso de fase de las operaciones unitarias controladas, así como en una QFT inversa.
  • QFT y QPE son subrutinas ampliamente utilizadas en numerosos algoritmos cuánticos.

Preguntas

True/False

  1. T/F La transformada cuántica de Fourier es el análogo cuántico de la transformada discreta de Fourier (DFT) clásica.
  2. T/F QFT puede implementarse utilizando sólo puertas Hadamard y CNOT.
  3. T/F La QFT es un componente clave del algoritmo de Shor.
  4. T/F La salida de la Estimación Cuántica de Fase es un estado cuántico que representa el vector propio del operador.
  5. T/F QPE requiere el uso de la transformada cuántica de Fourier inversa (QFT ^\dag ).
  6. T/F En QPE, si la fase ϕ\phi es representable exactamente con nn bits, el algoritmo da el resultado correcto con probabilidad 1.

Respuestas breves

  1. ¿Cuántos qubits se necesitan para realizar una QFT en un sistema con 2n2^n puntos de datos?
  2. ¿Se puede utilizar la QFT en un estado que no sea un estado base de cálculo? Si es así, ¿qué ocurre?
  3. ¿Cómo afecta el número de qubits de control utilizados en QPE a la resolución de la estimación de fase resultante?

Problemas

  1. Utilice la multiplicación de matrices para verificar que los pasos del algoritmo QFT dan como resultado la 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}

(¡No hace falta que lo hagas a mano!)

Problemas desafiantes

  1. Hacer un estado de cuatro qubits que sea una superposición igual de todas las bases computacionales impares: ψ=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. A continuación, realice una QFT en el estado. ¿Cuál es el estado resultante? Explica por qué tu resultado tiene sentido, utilizando tus conocimientos de las transformadas de Fourier.
¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.