Skip to content

QFT

The following snippet defines a QFT model:

from sympy import pi
from classiq import (
    allocate,
    QFunc,
    QParam,
    QVar,
    OutputQVar,
    H,
    CRZ,
    SWAP,
    repeat,
    create_model,
)


@QFunc
def qft(num_qubits: QParam[int], qbv: QVar["num_qubits"]) -> None:
    def outer_loop_body(i: QParam[int], qbv: QVar["num_qubits"]):
        H(qbv[i])

        def inner_loop_body(j: QParam[int], qbv: QVar["num_qubits"]):
            CRZ(pi / 2 ** (j + 1), qbv[i + j + 1], qbv[i])

        repeat(
            count=num_qubits - i - 1,
            port_size=num_qubits,
            iteration=inner_loop_body,
            qbv=qbv,
        )

    repeat(count=num_qubits, port_size=num_qubits, iteration=outer_loop_body, qbv=qbv)

    repeat(
        count=num_qubits // 2,
        port_size=num_qubits,
        iteration=lambda index, qbv: SWAP(qbv[index], qbv[num_qubits - 1 - index]),
        qbv=qbv,
    )


@QFunc
def main(result: OutputQVar[6]) -> None:
    allocate(6, result)
    qft(num_qubits=6, qbv=result)


model = create_model(main)