%matplotlib inline
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, execute, Aer, IBMQ, BasicAer
from qiskit.compiler import transpile, assemble
from qiskit.providers.aer import QasmSimulator, StatevectorSimulator, UnitarySimulator
from qiskit.visualization import *
from qiskit.visualization import plot_histogram, plot_gate_map, plot_circuit_layout
from qiskit.tools.jupyter import *
from qiskit.tools.visualization import plot_histogram, plot_state_city
from qiskit.tools.monitor import job_monitor
import matplotlib.pyplot as plt
import numpy as np
from math import pi
provider = IBMQ.load_account()


q = QuantumRegister(5, name='quantumRegister')
c = ClassicalRegister(5, name ='qlassicalRegister')
qc = QuantumCircuit(q, c)


qc.h(q[1])
qc.h(q[2])
qc.h(q[3])
qc.h(q[4])
qc.barrier()
qc.barrier()
qc.draw()

qc.h(q[2])
qc.cx(q[3],q[2])
qc.tdg(q[2])
qc.cx(q[4],q[2])
qc.t(q[2])
qc.cx(q[3],q[2])
qc.tdg(q[2])
qc.cx(q[4],q[2])
# qc.tdg(q[2])
# qc.cx(q[4],q[2])
qc.barrier()
qc.t(q[2])
qc.tdg(q[3])
qc.h(q[2])
qc.barrier()
qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.tdg(q[3])
qc.barrier()
qc.draw()

qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.s(q[3])
qc.t(q[4])
qc.barrier()
qc.cx(q[2],q[1])
qc.t(q[1])
qc.cx(q[2],q[1])
qc.tdg(q[1])
qc.tdg(q[2])
qc.h(q[2])
qc.cx(q[3],q[2])
qc.tdg(q[2])
qc.cx(q[4],q[2])
qc.t(q[2])
qc.cx(q[3],q[2])
qc.tdg(q[2])
qc.cx(q[4],q[2])
qc.t(q[2])
qc.tdg(q[3])
qc.h(q[2])
qc.barrier()
qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.tdg(q[3])
qc.barrier()
qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.s(q[3])
qc.t(q[4])
qc.barrier()
qc.cx(q[2],q[1])
qc.tdg(q[1])
qc.cx(q[2],q[1])
qc.t(q[1])
qc.t(q[2])
qc.barrier()
qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.barrier()
qc.draw()


qc.cx(q[2],q[1])
qc.h(q[1])
qc.h(q[2])
qc.cx(q[2],q[1])
qc.h(q[1])
qc.h(q[2])
qc.cx(q[2],q[1])
qc.cx(q[3],q[2])
qc.u1(pi/8, q[2])
qc.cx(q[3],q[2])
qc.u1(-pi/8, q[2])
qc.u1(-pi/8,q[3])
qc.barrier()
qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.barrier()
qc.cx(q[3],q[2])
qc.u1(-pi/8,q[2])
qc.cx(q[3],q[2])
qc.u1(pi/8,q[2])
qc.u1(pi/8,q[3])
qc.cx(q[4],q[2])
qc.u1(-pi/8,q[2])
qc.cx(q[4],q[2])
qc.u1(pi/8,q[2])
qc.u1(-pi/8,q[4])
qc.barrier()
qc.cx(q[2],q[1])
qc.h(q[1])
qc.h(q[2])
qc.cx(q[2],q[1])
qc.h(q[1])
qc.h(q[2])
qc.cx(q[2],q[1])
qc.barrier()
qc.barrier()
qc.h(q[4])
qc.h(q[1])
qc.h(q[2])
qc.h(q[3])
qc.barrier()
qc.x(q[4])
qc.x(q[1])
qc.x(q[2])
qc.x(q[3])
qc.draw()

qc.barrier()
qc.barrier()
qc.h(q[2])
qc.cx(q[3],q[2])
qc.tdg(q[2])
qc.cx(q[4],q[2])
qc.t(q[2])
qc.cx(q[3],q[2])
qc.tdg(q[2])
qc.cx(q[4],q[2])
# qc.tdg(q[2])
# qc.cx(q[4],q[2])
qc.barrier()
qc.t(q[2])
qc.tdg(q[3])
qc.h(q[2])
qc.barrier()
qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.tdg(q[3])
qc.barrier()
qc.draw()

qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.s(q[3])
qc.t(q[4])
qc.barrier()
qc.cx(q[2],q[1])
qc.t(q[1])
qc.cx(q[2],q[1])
qc.tdg(q[1])
qc.tdg(q[2])
qc.h(q[2])
qc.cx(q[3],q[2])
qc.tdg(q[2])
qc.cx(q[4],q[2])
qc.t(q[2])
qc.cx(q[3],q[2])
qc.tdg(q[2])
qc.cx(q[4],q[2])
qc.t(q[2])
qc.tdg(q[3])
qc.h(q[2])
qc.barrier()
qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.tdg(q[3])
qc.barrier()
qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.s(q[3])
qc.t(q[4])
qc.barrier()
qc.cx(q[2],q[1])
qc.tdg(q[1])
qc.cx(q[2],q[1])
qc.t(q[1])
qc.t(q[2])
qc.barrier()
qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.barrier()
qc.draw()


qc.cx(q[2],q[1])
qc.h(q[1])
qc.h(q[2])
qc.cx(q[2],q[1])
qc.h(q[1])
qc.h(q[2])
qc.cx(q[2],q[1])
qc.cx(q[3],q[2])
qc.u1(pi/8, q[2])
qc.cx(q[3],q[2])
qc.u1(-pi/8, q[2])
qc.u1(-pi/8,q[3])
qc.barrier()
qc.h(q[3])
qc.h(q[4])
qc.cx(q[3],q[4])
qc.h(q[3])
qc.h(q[4])
qc.barrier()
qc.cx(q[3],q[2])
qc.u1(-pi/8,q[2])
qc.cx(q[3],q[2])
qc.u1(pi/8,q[2])
qc.u1(pi/8,q[3])
qc.cx(q[4],q[2])
qc.u1(-pi/8,q[2])
qc.cx(q[4],q[2])
qc.u1(pi/8,q[2])
qc.u1(-pi/8,q[4])
qc.barrier()
qc.cx(q[2],q[1])
qc.h(q[1])
qc.h(q[2])
qc.cx(q[2],q[1])
qc.h(q[1])
qc.h(q[2])
qc.cx(q[2],q[1])
qc.draw()


qc.barrier()
qc.barrier()
qc.x(q[1])
qc.x(q[2])
qc.x(q[3])
qc.x(q[4])
qc.barrier()
qc.h(q[1])
qc.h(q[2])
qc.h(q[3])
qc.h(q[4])
qc.draw()

qc.barrier()
qc.measure(q[1], c[1])
qc.measure(q[2], c[2])
qc.measure(q[3], c[3])
qc.measure(q[4], c[4])