Die Quanten-Fourier-Transformation ist eine Implementierung einer diskreten Fourier-Transformation auf einer Quantenschaltung. Ich werde die ausführliche Erklärung dem Nachschlagewerk und anderen Websites überlassen, und hier möchte ich sie mit Qiskit implementieren. Es ist komplett ein Denkmal, also mach dir keine Sorgen um die Details. In Zukunft möchte ich andere Algorithmen mit diesem Code implementieren.
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)
Recommended Posts