Skip to content

Quantum Phase Estimation

The phase estimation function estimates the phase of an eigenvector of a unitary function. More precisely, given a unitary function \(F\) and an input containing a quantum register with a state \(|\psi\rangle\) such that \(F(|\psi\rangle)=e^{2\pi\i\nu}|\psi\rangle\), the phase estimation function outputs an estimation of \(\nu\) as a fixed-point binary number.

Phase estimation is frequently used as a subroutine in other quantum algorithms, such as Shor's algorithm and quantum algorithms for solving linear systems of equations.

Theoretical details are provided in Ref. [1].

Syntax

Function: PhaseEstimation

Parameters:

  • size: int
  • unitary: str
  • unitary_params: FunctionParams

The size argument provides the number of digits in the fixed-point representation of the phase. The unitary_params argument provides the function parameters of the unitary function \(F\). The unitary may be omitted when using the SDK and should otherwise contain the name of the function \(F\).

Example

The following example shows how to perform a simple phase estimation. First we initialize the state "10" over 2 qubits by using XGate on the first qubit. Then we apply a phase estimation on the matrix

\[ \begin{pmatrix} 0 & 0 & 0 & 0 \\ 0 & \tfrac{1}{4} & 0 & 0 \\ 0 & 0 & \tfrac{1}{2} & 0 \\ 0 & 0 & 0 & \tfrac{3}{4} \\ \end{pmatrix} \]

The output register would be in the state "10" corresponding to the number 0.10 which is \(\frac{1}{2}\) in binary implying that \(\nu=\frac{1}{2}\) as expected for input state "10".

{
    "logic_flow": [
        {
            "function": "XGate",
            "function_params": {},
            "outputs": {
                "TARGET": "x_qpe"
            }
        },
        {
            "function": "PhaseEstimation",
            "function_params": {
                "size": 2,
                "unitary": "Exponentiation",
                "unitary_params": {
                    "pauli_operator": {
                        "pauli_list": [
                            ["ZI", -0.125],
                            ["IZ", -0.25],
                            ["II", 0.375]
                        ]
                    },
                    "evolution_coefficient": -6.283185307179586
                }
            },
            "inputs": {
                "IN[0]": "x_qpe"
            }
        }
    ],
    "preferences": {
        "draw_at_level": -1
    }
}
from math import pi
from classiq.interface.chemistry.operator import PauliOperator
from classiq.interface.generator.exponentiation import Exponentiation
from classiq.interface.generator.qpe import PhaseEstimation
from classiq.interface.generator.standard_gates.standard_gates import XGate
from classiq.model_designer import ModelDesigner

model_designer = ModelDesigner()
model_designer.preferences.draw_image = True

x_qpe = model_designer.XGate(params=XGate())
qpe_out = model_designer.PhaseEstimation(
    params=PhaseEstimation(
        size=2,
        unitary_params=Exponentiation(
            pauli_operator=PauliOperator(
                pauli_list=[
                    ("ZI", -0.125),
                    ("IZ", -0.25),
                    ("II", 0.375),
                ]
            ),
            evolution_coefficient=-2 * pi,
        ),
    ),
    in_wires={"IN[0]": x_qpe["TARGET"]},
)
model_designer.preferences.draw_at_level = -1
circuit = model_designer.synthesize()
circuit.show_interactive()

 Mcx example

References

[1] A. Yu. Kitaev Barenco et al, Quantum measurements and the Abelian Stabilizer Problem, arXiv:quant-ph/9511026 (1995). https://doi.org/10.48550/arXiv.quant-ph/9511026