QFT (transformada cuántica de Fourier) para encontrar el período de una función

La transformada cuántica de Fourier (QFT) es un elemento clave en los algoritmos cuánticos, especialmente en el algoritmo de estimación de fase y en el algoritmo de Shor.

Vamos a ver como la transformada inversa de Fourier (IQFT) permite encontrar el período de una función periódica que se implementa aplicando fases periódicas.

Recordemos que una función cuántica se implementa de manera reversible a través de:

Uf:|x|0|x|f(x)U_f : |x\rangle |0\rangle \rightarrow |x\rangle |f(x)\rangle

El objetivo es, a través de fases controladas por los qubits de entrada |x\rangle, crear una fase periódica |f(x)\rangle que afecte a los qubits de entrada a través del phase kickback y después aplicando la IQFT, encontrar la frecuencia y posteriormente el período.

Primero, importamos las librerías necesarias como qiskit, circuitos y los simuladores y creamos un registro de seis qubits, tres de entrada y tres para la función, y tres bits clásicos para la medición.

import numpy as np
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, transpile
# Importamos la librería nativa de QFT
from qiskit.circuit.library import QFT
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram

# 1. Definición del circuito (6 qubits en total)
n_entrada = 3
n_funcion = 3
qr = QuantumRegister(n_entrada + n_funcion, 'q')
cr = ClassicalRegister(n_entrada, 'c')
qc = QuantumCircuit(qr, cr)

Ponemos en superposición los tres qubits de entrada, inicializamos a 1 el primer qubit de la función y creamos la función periódica aplicando a este qubit una fase de 90º si el primer qubit de la entrada está en 1 y una fase 180º si el segundo qubit está en 1.

# 2. Inicialización
# Estado de superposición en el registro de entrada
qc.h(qr[:n_entrada])
# Preparar el estado |1> en el registro de la función
qc.x(qr[n_entrada])
# 3. Oráculo (Función Periódica)
# Simulación de desplazamientos controlados
qc.cp(np.pi/2, qr[0], qr[n_entrada])
qc.cp(np.pi, qr[1], qr[n_entrada])

De esta forma, estamos creando una fase periódica que se traslada a los qubits de entrada, como se muestra a continuación:

Fase cuántica periódica

Creamos la QFT inversa a partir de la librería de circuitos de Qiskit y la aplicamos a los qubits de entrada.

# 4. QFT Inversa usando la librería de Qiskit
# Creamos la QFT para 'n_entrada' qubits, la invertimos y la hacemos circuito
iqft_gate = QFT(num_qubits=n_entrada, inverse=True).to_gate()
# La añadimos al circuito principal aplicándola sobre los qubits de entrada
qc.append(iqft_gate, qr[:n_entrada])

Por último, medimos estos tres qubits de entrada, visualizamos el circuito y hacemos una simulación con Aer usando transpile para compilar el circuito.

# 5. Medición
qc.measure(qr[:n_entrada], cr)

# Visualización del circuito
print(qc.draw())

# 6. Ejecución en el simulador local de Aer
conversor = AerSimulator()
qc_compilado = transpile(qc, backend=conversor)

job = conversor.run(qc_compilado, shots=1024)
resultado = job.result()

# 7. Obtener los conteos e imprimirlos
conteos = resultado.get_counts()
plot_histogram(conteos)

Vemos el circuito, que se corresponde con las operaciones descritas, es decir superposición de la entrada y creación de fases controladas por los dos primeros qubits de la entrada.

El resultado de la simulación es 2, que es la frecuencia de repetición dentro del número de estados posibles. Como la entrada tiene tres qubits, N=8 estados posibles, y 2/8=1/4, entonces el período de la fase es de 4, como hemos definido y mostrado previamente en el diagrama de la fase.

Deja una respuesta

Orgullosamente ofrecido por WordPress | Tema: Baskerville 2 por Anders Noren.

Subir ↑