Estimación de fase
La estimación de fase (EF) es una primitiva cuántica que es utilizada en distintos algoritmos. Permite extraer información legible de superposiciones.
Por ejemplo, es utilizada en el algoritmo de Shor, HHL, entre otros. Internamente, esta primitiva utiliza la transformada de Fourier inversa.
Objetivo
Sección titulada «Objetivo»El objetivo de la primitiva es obtener una estimación de la fase global o autovalor (eigenvalue) de una operación aplicada a un estado cuántico que es autovector (eigenvector).
Para entender mejor qué valor es el que obtiene la primitiva se propone el siguiente ejemplo:
Supóngase el estado inicial , el cual es un autovector de la operación . Al ser un autovector de , se cumple , siendo el autovalor.
Por ejemplo, suponiendo que existe un estado cuántico que es autovector de con el siguiente valor:
y que al aplicar la operación , se obtiene el siguiente estado:
Notar que las magnitudes no cambiaron, ni la fase relativa cambió, y por ende se obtuvo el mismo estado cuántico pero con un autovalor ().
El algoritmo de EF nos permite obtener una estimación sobre este autovalor.
Aunque parezca que esta información obtenida es arbitraria y que no sea practicamente útil, es altamente importante en muchos algoritmos como los mencionados previamente.
Solución
Sección titulada «Solución»El algoritmo de estimación de fase se puede dividir en cuatro secciones: inicialización, superposición, aplicación de puertas controladas y uso de la transformada de Fourier cuántica inversa.
En el siguiente gráfico se dividen las etapas utilizando para representar el estado cuántico en cada sección.

Figura (1): Estructura de la primitiva EF de forma general, con cuatro señalizadores indicando las distintas secciones del algoritmo. En ciertas bibliografías se aplican las puertas U controladas con el orden inverso.
El algoritmo recibe tres parámetros como entrada:
- el cual es un registro inicializado en sobre el cual se dejará el resultado. Llamaremos al tamaño en cubits de .
- es el autovector del cual se quiere obtener el autovalor.
- La puerta controlada de U.
La notación implica que se realizan operaciones sucesivas de U. Esto conlleva un gran costo computacional, por lo que se busca poder crear una puerta que cumpla el mismo funcionamiento que de una forma más eficiente que simplemente repetir la operación original.
En la primer etapa se inicializan los estados cuánticos, el registro de con 0 y el registro con el autovector.
Luego en la segunda etapa se crea una superposición de :
En la tercer etapa se aplican las puertas controladas de U. Así, ocurre el fenómeno de retroceso de fase, por lo que aplicar la puerta puede generalizarse de la siguiente manera:
Por lo tanto, al aplicar las puertas controladas de U al estado superpuesto de se obtiene:
Es útil reescribir , donde siendo una fracción en binario, para obtener un formato similar al de :
Aplicar la operación implica realizar un desplazamiento binario (shift) de posiciones.
Hacer un desplazamiento a una fracción binaria puede incrementar la parte entera del número. Por ejemplo, si se desplaza la fracción binaria ( en decimal) por una posición se obtiene ( en decimal).
Debido a que multiplicar enteros por es redundante, se puede simplificar de la siguiente manera:
El resultado de esta simplificación es idéntico al estado cuántico luego de aplicar sobre el estado . Por lo que aplicar resulta en :
Finalmente, al medir la respuesta se obtiene una estimación de . A partir de se puede obtener el ángulo y su autovalor:
Ejemplos
Sección titulada «Ejemplos»Para este ejemplo se utilizará la operación Hadamard con su versión controlada.
El autovector del cual se va a obtener el autovalor es , que se puede construir aplicándole a un cubit inicializado en la puerta Pauli-X, seguida por una rotación en el eje , usando RotY de radianes ( grados).
El autovector que se eligió coincide con el estado cuántico de la sección “Objetivo”. Su autovalor es ().
Notar que se aplica una sola vez la puerta Hadamard controlada. Esto se debe a que la puerta controlada de Hadamard es Hermitiana, cumpliendo la propiedad:
Por lo que solo es necesario aplicarla donde el número de ocurrencias no es par (solo el primer cubit).
from qiskit import QuantumCircuit, transpilefrom qiskit_aer import QasmSimulatorimport math
QUBIT_COUNT = 4QUBITS = range(QUBIT_COUNT)
def run_circuit(qc: QuantumCircuit): sim = QasmSimulator() transpiled = transpile(qc) result = sim.run(transpiled.decompose(reps=6)).result() return result
def analyze_pe_results(results): counts = results.get_counts() print("Resultados:", counts) total = sum(counts.values()) percentages = {key: f"{value / total*100:.2f}%" for key, value in counts.items()} ordered_percentages = dict(sorted(percentages.items(), key=lambda item: item[1], reverse=True)) print("Porcentajes:", ordered_percentages)
def inverse_qft(qc): """ Aplica la Transformada de Fourier Cuántica inversa al circuito """ for i in range(QUBIT_COUNT-1): qc.h(QUBIT_COUNT-1-i) qc.barrier() for j in range(QUBIT_COUNT-i-1): qc.cp(-math.pi/(2**(j+1)), QUBIT_COUNT-2-i-j, QUBIT_COUNT-1-i) qc.barrier()
qc.h(0) # swap qc.barrier() for i in range(QUBIT_COUNT//2): qc.swap(i, QUBIT_COUNT-i-1)
def controlled_hadamard(qc, control): """ Aplica una puerta de Hadamard controlada al qubit objetivo. Como Hadamard controlada es una puerta hermitiana (su inversa es ella misma) Solo se necesita una puerta Hadamard y es en el primer qubit, el resto al ser cantidades pares (2 veces en el segundo, 4 en el tercero, etc) se cancelan """ if control & 1: qc.ch(control>>1, QUBIT_COUNT)
def phase_estimation(qc, cont_u): """ Realiza la estimación de fase cuántica en un circuito """ qc.h(QUBITS) qc.barrier()
for j in range(QUBIT_COUNT): cont_u(qc, 1<<j)
qc.barrier() inverse_qft(qc)
qc = QuantumCircuit(QUBIT_COUNT+1, QUBIT_COUNT)
# inicializacion de un autovector de Hadamardqc.x(QUBIT_COUNT)qc.ry(math.pi/4, QUBIT_COUNT)
phase_estimation(qc, controlled_hadamard)qc.measure(QUBITS, QUBITS)
print(qc.draw())
res = run_circuit(qc)analyze_pe_results(res)
┌───┐ ░ ░ ░ ░ ░ ░ ░ ░ ┌───┐ ░ ┌─┐q_0: ┤ H ├────────────░───■───░───────░──────────────────────■─────────░───────░────────────■─────────░───────░──■─────────░─┤ H ├─░──X────┤M├────── ├───┤ ░ │ ░ ░ │ ░ ░ │ ░ ┌───┐ ░ │P(-π/2) ░ └───┘ ░ │ └╥┘┌─┐q_1: ┤ H ├────────────░───┼───░───────░────────────■─────────┼─────────░───────░──■─────────┼─────────░─┤ H ├─░──■─────────░───────░──┼──X──╫─┤M├─── ├───┤ ░ │ ░ ░ │ │ ░ ┌───┐ ░ │P(-π/2) │P(-π/4) ░ └───┘ ░ ░ ░ │ │ ║ └╥┘┌─┐q_2: ┤ H ├────────────░───┼───░───────░──■─────────┼─────────┼─────────░─┤ H ├─░──■─────────■─────────░───────░────────────░───────░──┼──X──╫──╫─┤M├ ├───┤ ░ │ ░ ┌───┐ ░ │P(-π/2) │P(-π/4) │P(-π/8) ░ └───┘ ░ ░ ░ ░ ░ │ ┌─┐ ║ ║ └╥┘q_3: ┤ H ├────────────░───┼───░─┤ H ├─░──■─────────■─────────■─────────░───────░──────────────────────░───────░────────────░───────░──X─┤M├─╫──╫──╫─ ├───┤┌─────────┐ ░ ┌─┴─┐ ░ └───┘ ░ ░ ░ ░ ░ ░ ░ └╥┘ ║ ║ ║q_4: ┤ X ├┤ Ry(π/4) ├─░─┤ H ├─░───────░────────────────────────────────░───────░──────────────────────░───────░────────────░───────░─────╫──╫──╫──╫─ └───┘└─────────┘ ░ └───┘ ░ ░ ░ ░ ░ ░ ░ ░ ║ ║ ║ ║c: 4/════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╩══╩══╩══╩═ 3 0 1 2Resultados: {'1000': 1024}Porcentajes: {'1000': '100.00%'}
Interpretando el resultado, se obtiene como medición para los primeros 4 cubits. Esto implica haber leído el número =. Para obtener el autovalor, se inserta este valor en el exponencial:
De esta manera se obtiene el autovalor del autovector con la operación Hadamard.