[PYTHON] Qiskit: Transformée de Fourier quantique

Aperçu

La transformée quantique de Fourier est une implémentation de la transformée de Fourier discrète sur un circuit quantique. Je laisserai l'explication détaillée au livre de référence et à d'autres sites, et ici je voudrais l'implémenter avec Qiskit. C'est complètement commémoratif, alors ne vous inquiétez pas des détails. À l'avenir, j'aimerais implémenter d'autres algorithmes en utilisant ce code.

code

python


# coding: utf-8

from qiskit import QuantumRegister, QuantumCircuit, ClassicalRegister
from math import log2, pi
import numpy as np


class QFT:

    def __init__(self, numQubit):
        self.numQubit = numQubit

    def construct_circuit(self, circuit=None, inverse=False):
        if circuit is None:
            circuit = QuantumCircuit(range(self.numQubit))
        if not inverse:
            self._input_initial_state(circuit)
            self._qft(circuit)
            self._swap_registers(circuit)
            return circuit
        elif inverse:
            self._swap_registers(circuit)
            self._qft(circuit, inverse=True)
            self._input_initial_state(circuit, inverse=True)
            return circuit

    def _input_initial_state(self, circuit, inverse=False):
        if not inverse:
            for j in range(self.numQubit):
                circuit.h(j)
                circuit.u1(-pi / float(2 ** j), j)
        elif inverse:
            for j in range(self.numQubit):
                circuit.u1(-pi / float(2 ** j), j)
                circuit.h(j)

    def _qft(self, circuit, inverse=False):
        if not inverse:
            for j in range(self.numQubit):
                circuit.h(j)
                for k in range(j + 1, self.numQubit):
                    circuit.cu1(pi / float(2 ** (k - j)), k, j)
        elif inverse:
            for j in range(self.numQubit).__reversed__():
                for k in range(j + 1, self.numQubit).__reversed__():
                    circuit.cu1(pi / float(2 ** (k - j)), k, j)
                circuit.h(j)
        circuit.barrier()

    def _swap_registers(self, circuit):
        for j in range(int(np.floor(self.numQubit / 2.))):
            circuit.swap(j, self.numQubit - j - 1)

Les références

[1]Qiskit textbook

Recommended Posts

Qiskit: Transformée de Fourier quantique
Téléportation quantique avec Qiskit!
Transformée de Fourier des données brutes
Traitement du signal en Python (1): transformée de Fourier
Qiskit: Implémentation des états d'hypergraphes quantiques
Propriétés de la transformée de Fourier discrète
Qiskit: mise en œuvre de l'apprentissage des circuits quantiques (QCL)