!pip install qiskit

!pip install pylatexenc

import math
import numpy as np
from qiskit import Aer, QuantumCircuit, execute
from qiskit.utils import QuantumInstance
from qiskit.algorithms import Shor

import pylatexenc

backend = Aer.get_backend('aer_simulator')
quantum_instance = QuantumInstance(backend, shots=1024)

def c_amod15(a, power):
  U = QuantumCircuit(4)
  for iteration in range(power):
    U.swap(2, 3)
    U.swap(1, 2)
    U.swap(0, 1)
    for q in range(4):
      U.x(q)
  U = U.to_gate()
  U.name = "%i^%i mod 15" % (a, power)
  c_U = U.control()
  return c_U

n_count = 8
a = 7

def qft_dagger(n):
  qc = QuantumCircuit(n)
  for qubit in range(n//2):
    qc.swap(qubit, n-qubit-1)
  for j in range(n):
    for m in range(j):
      qc.cp(-np.pi/float(2**(j-m)), m, j) # not cu1
    qc.h(j)
  qc.name = "QFT dagger"
  return qc

qft_dagger(5).draw(output='mpl', fold=-1)

qc = QuantumCircuit(n_count + 4, n_count)

for q in range(n_count):
  qc.h(q)

qc.x(3+n_count)

for q in range(n_count):
  qc.append(c_amod15(a, 2**q), [q]+[i+n_count for i in range(4)])

qc.append(qft_dagger(n_count), range(n_count))

qc.measure(range(n_count), range(n_count))

qc.draw(output='mpl', fold=-1)


results = execute(qc, backend, shots=2048).result()
counts = results.get_counts()

from qiskit.tools.visualization import plot_histogram

plot_histogram(counts)