跳转至

Trotter

QuICT.algorithm.quantum_algorithm.Trotter

Trotter(h: Hamiltonian)

An Approximated Hamiltonian Evolution Method based on Trotter-Suzuki formula.

Reference

[1]: Nielsen, M.A., & Chuang, I.L. (2010). Quantum Computation and Quantum Information, p.208.

Source code in QuICT/algorithm/quantum_algorithm/hamiltonian_simulation/trotter.py
def __init__(
    self,
    h: Hamiltonian
) -> None:

    self.sys_size = self._system_size(h)
    self.parsed_h = self._parse_hamiltonian(h, self.sys_size)

circuit

circuit(time_evol: float, num_it: int) -> Circuit

Construct the hamiltonian evolution circuit C = (e^(-itH/n))^n

Parameters:

  • time_evol (float) –

    evolve time.

  • num_it (int) –

    number of iteration for the evolution.

Return

Circuit: the hamiltonian evolution circuit.

Source code in QuICT/algorithm/quantum_algorithm/hamiltonian_simulation/trotter.py
def circuit(self, time_evol: float, num_it: int) -> Circuit:
    """ Construct the hamiltonian evolution circuit C = (e^(-itH/n))^n

    Args:
        time_evol (float): evolve time.
        num_it (int): number of iteration for the evolution.

    Return:
        Circuit: the hamiltonian evolution circuit.
    """
    def construct_transform(pauli_char: str, pre_cg: CompositeGate, index: int) -> None:
        if pauli_char not in ["I", "X", "Y", "Z"]:
            raise ValueError("Not a valid pauli operator.")

        if pauli_char == "X":
            H | pre_cg(index)
        elif pauli_char == "Y":
            SX | pre_cg(index)

    evolve_it = CompositeGate()

    for coef_pauli_pair in self.parsed_h:
        coef, pauli_str = coef_pauli_pair

        basis_transform = CompositeGate()
        cnot_cg = CompositeGate()
        core = CompositeGate()

        highest_zbasis_idx = -1

        for i in reversed(range(self.sys_size)):
            pauli_char = pauli_str[i]
            construct_transform(pauli_char, basis_transform, i)

            if pauli_char != "I":
                if highest_zbasis_idx < 0:
                    Rz(2 * (time_evol / num_it) * coef) | core(i)
                else:
                    cnot_cg.insert(CX & [i, highest_zbasis_idx], 0)
                highest_zbasis_idx = i

        basis_transform | evolve_it
        cnot_cg | evolve_it
        core | evolve_it
        cnot_cg.inverse() | evolve_it
        basis_transform.inverse() | evolve_it

    evolve_it.flatten()

    trotter_circ = Circuit(self.sys_size)

    for _ in range(num_it):
        evolve_it | trotter_circ

    return trotter_circ