Transformada de Fourier cuántica
Para este módulo de Qiskit en el aula, los estudiantes deben tener un entorno de Python funcional con los siguientes paquetes instalados:
qiskitv2.1.0 o más recienteqiskit-ibm-runtimev0.40.1 o más recienteqiskit-aerv0.17.0 o más recienteqiskit.visualizationnumpypylatexenc
Para configurar e instalar los paquetes anteriores, consulta la guía Instalar Qiskit. Para poder ejecutar trabajos en computadoras cuánticas reales, los estudiantes necesitarán crear una cuenta en IBM Quantum® siguiendo los pasos de la guía Configura tu cuenta de IBM Cloud.
Este módulo fue probado y utilizó 13 segundos de tiempo de QPU. Esta es una estimación de buena fe; tu uso real puede variar.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
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 un sinfín de otros campos. Una versión cuántica de la transformada de Fourier, acertadamente llamada transformada de Fourier cuántica, constituye la base de algunos de los algoritmos cuánticos más importantes.
Hoy, tras repasar brevemente la transformada de Fourier clásica, hablaremos de cómo implementamos la transformada de Fourier cuántica en una computadora cuántica. Luego, analizaremos una de las aplicaciones de la transformada de Fourier cuántica a un algoritmo llamado algoritmo de estimación de fase. La estimación de fase cuántica es una subrutina del famoso algoritmo de factorización de Shor, que a veces se describe como la "joya de la corona" de la computación cuántica. Este módulo sirve de preparación para otro módulo dedicado por completo al algoritmo de Shor, aunque también está pensado para ser independiente. ¡La transformada de Fourier cuántica es un algoritmo fascinante y útil por derecho propio!
La transformada de Fourier clásica
Antes de adentrarnos en la transformada de Fourier cuántica, recordemos la versión clásica. La transformada de Fourier es un método para pasar de una llamada "base" a otra. Puedes pensar en dos bases como dos perspectivas diferentes del mismo problema: ambas son formas válidas de expresar una función, pero una u otra puede resultar más esclarecedora según el problema en cuestión. Algunos ejemplos de pares de bases relacionadas por la transformada de Fourier son posición y momento, y tiempo y frecuencia.
Veamos un ejemplo de cómo la transformada de Fourier puede ayudarnos a determinar qué nota está tocando un instrumento a partir de su forma de onda de audio. Normalmente, vemos las formas de onda representadas en la base temporal, es decir, la amplitud de la onda se expresa como función del tiempo.

Podemos aplicar la transformada de Fourier a esta forma de onda para pasar de la base temporal a la base de frecuencias:

En la base de frecuencias, podemos ver claramente un pico en torno a 260 Hz. ¡Es un Do central!
Ahora bien, quizás habrías podido determinar que se estaba tocando un Do central sin necesidad de la transformada de Fourier, pero ¿qué ocurre si se tocan varias notas a la vez? Entonces la forma de onda se vuelve más complicada cuando la representamos en la base temporal:

Pero el espectro de frecuencias identifica claramente tres picos:

Ese era 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 de Fourier discreta
La transformada de Fourier es útil para multitud de aplicaciones de procesamiento de señales. Pero en la mayoría de estas aplicaciones del mundo real (incluido el ejemplo musical que utilizamos anteriormente), queremos transformar un conjunto discreto de puntos de datos, no una función continua. En este caso, usamos la transformada de Fourier discreta. La transformada de Fourier discreta (DFT) actúa sobre un vector y lo asigna al vector según la fórmula:
donde tomamos . (Ten en cuenta que existen otras convenciones que incluyen un signo negativo en el exponente, así que presta atención cuando veas la DFT en otros contextos.) Recuerda que es una función periódica con periodo . Por tanto, al multiplicar por esta función, la transformada de Fourier es esencialmente una forma de descomponer la función (discreta) en una combinación lineal de sus funciones periódicas constituyentes, cada una con periodo .
La transformada de Fourier cuántica
Así pues, hemos visto cómo la transformada de Fourier se utiliza para representar una función como combinación lineal de un nuevo conjunto de llamadas "funciones de base". Las transformaciones de base también se aplican regularmente a estados de qubits. Por ejemplo, el estado de un único qubit puede expresarse en la base computacional , con estados base y , o en la base con estados base y . Ambas son igualmente válidas, pero una puede resultar más natural que la otra según el tipo de problema que estés tratando de resolver.
Los estados de 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 base de Fourier , en lugar de los estados base computacionales habituales . Para ello, debes aplicar una transformada de Fourier cuántica (QFT):
con como antes, y es el número de estados base en tu sistema cuántico. Ten en cuenta que, como ahora trabajamos con qubits, qubits te proporcionan estados base, por lo que . Aquí, los estados base se escriben como un único número donde va de a , aunque es más habitual ver los estados base expresados como , , , ..., , donde cada dígito binario representa el estado del qubit 0 al , de derecha a izquierda. Hay una forma sencilla de convertir estos estados binarios a un único número: ¡simplemente trátalos como números binarios! Así, , , , , y así sucesivamente hasta .
Desarrolla la intuición sobre los estados base de Fourier
Acabamos de repasar qué son los estados base computacionales y cómo se ordenan: son el conjunto de estados donde cada qubit está en o , y los ordenamos desde el estado en que todos los qubits son , , hasta el estado en que todos son , .
¿Pero cómo podemos interpretar los estados base de Fourier? Todos los estados base de Fourier son superposiciones iguales de todos los estados base computacionales, pero cada estado difiere de los demás en la periodicidad de la fase de sus componentes. Para entenderlo de forma más concreta, examinemos los cuatro estados 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:
Podemos visualizar este estado representando la amplitud compleja de cada uno de los términos. La línea roja sirve de guía visual para mostrar cómo la fase de esta amplitud gira alrededor del plano complejo en función del estado base computacional. Para , la fase permanece constante:

El siguiente estado base de Fourier es aquel cuyas fases de los componentes giran desde hasta exactamente una vez:
Y podemos ver este giro en el gráfico de amplitud compleja frente al estado base computacional:

Así, cada estado tiene una fase radianes mayor que el estado anterior cuando se ordenan de la forma estándar, ya que en este ejemplo tenemos cuatro estados base (). El siguiente estado base gira de 0 a dos veces:

Por último, el componente de Fourier más alto es el que tiene la fase de variación más rápida. En nuestro ejemplo con dos qubits, es el cuyas fases giran de 0 a tres veces:

En general, para un estado de qubits, habrá estados base de Fourier, cuya frecuencia de variación de fase va desde constante, para , hasta de variación rápida para , completando vueltas alrededor de a lo largo de la superposición de estados. Por tanto, cuando aplicamos la QFT a un estado cuántico, en esencia estamos haciendo el mismo análisis básico que hicimos con la forma de onda musical en la introducción: determinamos los componentes de frecuencia de Fourier que contribuyen a crear el estado cuántico de interés.
Prueba algunos ejemplos de QFT
Continuemos desarrollando nuestra intuición sobre la transformada de Fourier cuántica preparando un estado en la base computacional y observando qué ocurre cuando le aplicamos la QFT. Por ahora, trataremos la QFT como una caja negra que aplicamos usando QFTGate de la biblioteca de circuitos de Qiskit. Más adelante, echaremos un vistazo bajo el capó para ver cómo está implementada.
Empezamos 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)
ibm_pinguino2
Si no tienes tiempo disponible en tu cuenta o quieres usar un simulador por cualquier motivo, puedes ejecutar la celda siguiente para configurar un simulador que imite 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)
Un único estado base computacional
Primero, intentemos transformar un único estado base computacional. Empezamos 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")
# 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)
Ahora, apliquemos la transformada de Fourier a este estado con QFTGate:
# Step 1: Map
qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")
# 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)
Como puedes ver, medimos las poblaciones de cada estado de forma más o menos igual, salvo algo de ruido experimental y estadístico. Por tanto, si aplicas la QFT a un único estado base computacional, el resultado es una superposición igual de todos los estados. Si estás familiarizado con las transformadas de Fourier, esto probablemente no te sorprende. Un principio básico que puede ayudarnos a construir una conexión intuitiva entre una función y su transformada de Fourier es que el ancho de una función es inversamente proporcional al ancho de su transformada de Fourier. Así, algo que está muy localizado en el tiempo, como un pulso muy corto, requiere una amplia gama de frecuencias para generarse. Esa señal será muy amplia en el espacio de Fourier.
Este hecho está en realidad relacionado con la incertidumbre cuántica. El principio de incertidumbre de Heisenberg se enuncia típicamente como . Por tanto, si la incertidumbre en () es pequeña, la incertidumbre en el momento () debe ser grande, y viceversa. Resulta que la transformación desde la base de posición a la base de momento 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. Por tanto, aunque la QFT de cualquier estado base computacional individual produce la misma distribución uniforme de población sobre todos los estados base, las fases no tienen por qué ser necesariamente iguales.
Dos estados base computacionales
Ahora veamos qué ocurre cuando preparamos una superposición de estados base computacionales. ¿Cómo crees que será la transformada de Fourier en este caso?
Elijamos la superposición:
# 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")
# 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)
Ahora, apliquemos la transformada de Fourier a este estado con QFTGate:
# Step 1: Map
qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")
# 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)
Este resultado puede ser un poco más sorprendente. Parece que la QFT del estado es una superposición de todos los estados base pares. Pero si volvemos a nuestra visualización de cada estado base , y cómo la fase de cada componente gira veces, la razón por la que obtenemos este resultado puede volverse más clara.
Comprueba tu comprensión
Lee la(s) pregunta(s) a continuación, piensa en tu respuesta y luego haz clic en el triángulo para ver la solución.
Usando la pista anterior, explica por qué el resultado que obtuvimos para la QFT de es el esperado.
Respuesta:
El estado original tiene una fase relativa de 0 (o un múltiplo entero de ) entre las dos partes de la superposición. Por tanto, sabemos que este estado tiene componentes de Fourier cuyas fases también coinciden de esa forma: las que tienen un desfase de 0 entre el término |0000> y el término |1000>. Cada estado base de Fourier está compuesto de términos cuya fase se acumula a una tasa de , lo que significa que, ordenados de la forma habitual, cada término de la superposición tiene una fase mayor que el término anterior. Por tanto, en el punto medio , queremos que la fase sea un múltiplo entero de . Esto ocurre cuando es par.
¿Qué superposición de estados computacionales correspondería a una QFT con picos en cada número binario impar?
Respuesta:
Si aplicaras la QFT al estado , verías picos en cada estado de número binario impar.
Desglose del algoritmo QFT
Ahora que hemos desarrollado 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 propio algoritmo QFT. En otras palabras, ¿qué gates implementamos realmente en la computadora cuántica para lograr esta transformada?
Empecemos con algo pequeño: un único qubit. Esto significa que tendremos dos estados base. La QFT transforma los estados de la base computacional y en los estados de la base de Fourier y :
Comprueba tu comprensión
Lee la(s) pregunta(s) a continuación, piensa en tu respuesta y luego haz clic en el triángulo para revelar la solución.
Usa la ecuación de la QFT de la sección anterior para verificar estos dos estados de la base de Fourier.
Respuesta:
La fórmula general de la QFT es:
Para un único qubit (), , y . Entonces, tenemos
Observa esas dos ecuaciones. Puede que ya conozcas un gate cuántico que pueda usarse para implementar esta transformada. Es decir, existe un gate que transforma los estados de la base computacional y en los respectivos estados de la base de Fourier y . ¡Es el gate de Hadamard! Esto queda aún más claro si introducimos una representación matricial de la operación QFT:
Si no estás familiarizado con esta notación para expresar un operador cuántico, ¡no te preocupes! Es una forma de representar una matriz , donde e indexan las columnas y filas de la matriz, de a , y es el valor de esa entrada en particular. Así, la entrada en la columna 0 y la fila 2, por ejemplo, sería simplemente .
En esta representación, cada uno de los estados de la base computacional se asocia con uno de los vectores de base:
Si quieres aprender más sobre esta representación en profundidad, consulta la lección de John Watrous sobre sistemas múltiples en el curso Basics of quantum information.
Intentemos construir la matriz para QFT. Usando la fórmula anterior, encontramos que
\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 una computadora cuántica, necesitaremos determinar qué combinación de gates aplicados a qué qubits nos dará una transformación unitaria que coincida con la matriz anterior. Ya conocemos uno de los gates que necesitaremos: el Hadamard. Otro gate que necesitaremos es el gate de fase controlada, que aplica una fase relativa al estado del qubit objetivo, siempre que el qubit de control esté en el estado . En forma matricial, esto se ve así:
\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 solo se cambia el estado , en realidad no importa cuál qubit se considera el "control" y cuál el "objetivo". El resultado será el mismo en ambos casos.
Finalmente, también necesitaremos algunos gates SWAP. Un gate SWAP intercambia los estados de dos qubits. Se ve así:
\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 sobre qubits es iterativo: primero aplicas QFT a los qubits hasta , luego añades algunos gates entre el qubit y los otros qubits. Pero para aplicar QFT, primero debes aplicar QFT a los qubits 2 hasta , y luego añadir algunos gates entre el qubit 1 y los qubits restantes hasta . Es como una matrioska rusa: cada muñeca agrega un factor de dos a la dimensión del circuito QFT, con la muñeca más pequeña en el centro, que es QFT, o el gate de Hadamard.
Para meter una muñeca dentro de la siguiente de mayor tamaño, y así aumentar la dimensión de la QFT por un factor de dos, siempre se sigue el mismo procedimiento:
- Primero, aplica QFT a los qubits inferiores. Esta es tu "muñeca más pequeña" del conjunto de matrioskas que pronto meterás dentro de la siguiente.
- Usa el siguiente qubit como control, y aplica gates de fase controlada a cada uno de los qubits inferiores, con fases a los estados de la base estándar de cada uno de los qubits restantes.
- Realiza un Hadamard sobre ese mismo qubit superior que se usó como control en los gates de fase.
- Usa gates 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 suban una posición.
Ya hemos estado usando la función QFTGate de la biblioteca de circuits de Qiskit, pero ahora veamos el interior de algunos de estos gates QFT para verificar el procedimiento anterior. Podemos hacer esto con decompose().
qc = QuantumCircuit(1)
qc.compose(QFTGate(1), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(2)
qc.compose(QFTGate(2), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(3)
qc.compose(QFTGate(3), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(4)
qc.compose(QFTGate(4), inplace=True)
qc.decompose().draw("mpl")
Así que, con suerte, a partir de las primeras cuatro QFTs puedes empezar a ver cómo cada una está anidada dentro de la siguiente más grande. Puede que hayas notado, sin embargo, que algunos de los gates de fase no son exactamente como se prescribe en el procedimiento que describimos anteriormente, y los SWAPs no aparecen después de cada subrutina, sino solo al final de la QFT completa. Esto nos ahorra gates innecesarios, 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 lleva un registro de dónde debería estar cada estado de qubit y ajusta en consecuencia los qubits a los que aplica los gates de fase. Luego, un conjunto final de SWAPs al final coloca todo en su lugar correcto.
Aplicar la QFT: estimación de fase
Veamos cómo se puede usar la QFT para resolver un problema útil en computación cuántica. Calcular la transformada cuántica de Fourier inversa es un paso necesario en un algoritmo conocido como Estimación de Fase Cuántica (QPE, por sus siglas en inglés), 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 de 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 grande. Dependiendo del problema, un valor propio puede representar la energía de un Hamiltoniano en un problema de 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 ampliamente utilizadas en computación cuántica.
Entonces, ¿qué tiene que ver esto con la transformada cuántica de Fourier? Pues bien, como recordarás, todo valor propio de un operador unitario tiene magnitud . Así que podemos escribir cada valor propio como un número complejo de magnitud uno:
donde es un número real entre 0 y 1. Si quieres más información sobre matrices unitarias, consulta la lección de John Watrous sobre el tema en Basics of quantum information.
Observa que es periódico en . Esto ya podría sugerirte que una QFT podría estar involucrada, ya que vimos lo útiles que son las QFTs 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
Primero, empezaremos con el algoritmo QPE más simple, que estima aproximadamente la fase con un único dígito binario de precisión. En otras palabras, este algoritmo puede distinguir entre y , pero no puede hacerlo mejor que eso. Aquí está el diagrama del circuito:

Los qubits se preparan en el estado , donde el qubit está en el estado y los qubits restantes están en el estado , que es un autoestado de . Después del primer Hadamard, el estado del qubit se convierte en:
El siguiente gate es un gate "controlled-". Este aplica la operación unitaria a los qubits inferiores que están en el estado si el qubit 0 está en el estado , pero no hace nada sobre si el qubit 0 está en el estado . Esto transforma los qubits al estado:
Algo curioso acaba de ocurrir: el gate controlled- solo usa el qubit como qubit de control, por lo que uno podría pensar que este gate no cambiaría el estado del qubit 0 en absoluto. ¡Pero de alguna manera, sí lo hace! Aunque la operación se aplicó a los qubits inferiores, el efecto global del gate es cambiar la fase del qubit . Esto se conoce como el "mecanismo de retroceso de fase" (phase kickback), y se usa en muchos algoritmos cuánticos, incluyendo los algoritmos de Deutsch-Jozsa y Grover. Si quieres aprender más sobre el mecanismo de retroceso de fase, consulta la lección de John Watrous sobre Algoritmos de consulta cuántica en Fundamentals of quantum algorithms.
Después del retroceso de fase, aplicamos un Hadamard más al qubit , lo que resulta en el estado:
Así, cuando medimos el qubit al final, mediremos con un 100% de certeza si y mediremos con un 100% de certeza si (y si nuestra computadora cuántica es perfecta, sin ruido). Si es distinto de estos valores, la medición final es solo probabilística y nos dice únicamente hasta cierto punto.
QPE con más precisión: más qubits
Podemos extender este concepto simple a un algoritmo más complejo con precisión arbitraria. Si en lugar de usar solo el qubit para medir la fase, usamos qubits del al , podremos estimar la fase con bits de precisión. Veamos cómo funciona esto:
Este circuito QPE más preciso comienza igual que la versión de un solo bit: se aplican Hadamards a los primeros qubits, y los qubits restantes se preparan en el estado , creando el estado:
Ahora se aplican las unitarias controladas. El qubit es el control para la misma unitaria que antes. Pero ahora, el qubit es el control para la unitaria , que es simplemente aplicada dos veces. Así, el valor propio de es . En general, cada qubit del 0 al será el control para la unitaria . Eso significa que cada uno de estos qubits experimentará un retroceso de fase de . Esto da como resultado el estado:
Esto puede reescribirse como una suma sobre los estados de la base computacional:
¿Te resulta familiar la suma? ¡Es una QFT! Recuerda la ecuación para una transformada cuántica de Fourier:
Entonces, si la fase para algún entero entre y , aplicar la QFT inversa a este estado dará como resultado el estado:
y a partir de , podemos deducir .
Si no es un múltiplo entero, sin embargo, aplicar la QFT inversa solo aproximará . Qué tan bien aproxima será probabilístico, lo que significa que no siempre obtendremos la mejor aproximación, pero será bastante cercana, y cuantos más qubits uses, mejor será la aproximación. Para aprender a cuantificar esta aproximación de , consulta la lección de John Watrous sobre Estimación de fase y factorización en Fundamentals of quantum algorithms.
Conclusión
Este módulo ofreció una visión general de qué es una QFT, cómo se implementa en una computadora cuántica y cuán útil puede ser para resolver problemas. Te dimos una muestra de su utilidad cuando vimos cómo puede usarse en la estimación de fase cuántica para conocer los valores propios de una matriz unitaria.
Conceptos clave
- 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 base.
- El procedimiento de Estimación de Fase Cuántica se basa en el mecanismo de retroceso de fase de las operaciones unitarias controladas, así como en una QFT inversa.
- La QFT y QPE son subrutinas ampliamente utilizadas en numerosos algoritmos cuánticos.
Preguntas
Verdadero/Falso
- V/F La Transformada Cuántica de Fourier es el análogo cuántico de la transformada discreta de Fourier (DFT) clásica.
- V/F La QFT puede implementarse usando solo gates de Hadamard y CNOT.
- V/F La QFT es un componente clave del algoritmo de Shor.
- V/F La salida de la Estimación de Fase Cuántica es un estado cuántico que representa el vector propio del operador.
- V/F QPE requiere el uso de la Transformada Cuántica de Fourier inversa (QFT).
- V/F En QPE, si la fase es exactamente representable con bits, el algoritmo da el resultado correcto con probabilidad 1.
Respuestas cortas
- ¿Cuántos qubits se necesitan para realizar una QFT sobre un sistema con puntos de datos?
- ¿Puede usarse la QFT en un estado que no sea un estado de la base computacional? Si es así, ¿qué ocurre?
- ¿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
- Usa multiplicación matricial para verificar que los pasos del algoritmo QFT efectivamente dan como resultado la matriz :
(¡No tienes que hacerlo a mano!)
Problemas desafiantes
- Crea un estado de cuatro qubits que sea una superposición equitativa de todas las bases computacionales impares: . Luego, realiza una QFT sobre el estado. ¿Cuál es el estado resultante? Explica por qué tu resultado tiene sentido usando tu conocimiento de las transformadas de Fourier.