


'''simple docstring'''



import math

import numpy as np
import qiskit
from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute



def 			UpperCAmelCase__					(	UpperCAmelCase_    :				int = 3							)     ->		qiskit.result.counts.Counts:
     if isinstance(__UpperCAmelCase      ,    __UpperCAmelCase							):
          raise TypeError('number of qubits must be a integer.'							)
     if number_of_qubits <= 0:
          raise ValueError('number of qubits must be > 0.'							)
     if math.floor(__UpperCAmelCase							) != number_of_qubits:
          raise ValueError('number of qubits must be exact integer.'							)
     if number_of_qubits > 10:
          raise ValueError('number of qubits too large to simulate(>10).'							)

     __lowerCamelCase   :	str								=		QuantumRegister(__UpperCAmelCase      ,    'qr'							)
     __lowerCamelCase   :	Optional[Any]								=		ClassicalRegister(__UpperCAmelCase      ,    'cr'							)

     __lowerCamelCase   :	str								=		QuantumCircuit(__UpperCAmelCase      ,    __UpperCAmelCase							)

     __lowerCamelCase   :	Optional[Any]								=		number_of_qubits

     for i in range(__UpperCAmelCase							):
          quantum_circuit.h(number_of_qubits - i - 1							)
          counter -= 1
          for j in range(__UpperCAmelCase							):
               quantum_circuit.cp(np.pi / 2 ** (counter - j)      ,    __UpperCAmelCase      ,    __UpperCAmelCase							)

     for k in range(number_of_qubits // 2							):
          quantum_circuit.swap(__UpperCAmelCase      ,    number_of_qubits - k - 1							)

     # measure all the qubits
     quantum_circuit.measure(__UpperCAmelCase      ,    __UpperCAmelCase							)
     # simulate with 10000 shots
     __lowerCamelCase   :	Dict								=		Aer.get_backend('qasm_simulator'							)
     __lowerCamelCase   :	Any								=		execute(__UpperCAmelCase      ,    __UpperCAmelCase      ,    shots=1_00_00							)

     return job.result().get_counts(__UpperCAmelCase							)


if __name__ == "__main__":
      print(
          f'''Total count for quantum fourier transform state is: \
    {quantum_fourier_transform(3)}'''
      )












def 					UpperCAmelCase_							(      __UpperCAmelCase						:	int			,			__UpperCAmelCase						:	int							)					-> int:
      return number | (1 << position)

def 					UpperCAmelCase_							(      __UpperCAmelCase						:	int			,			__UpperCAmelCase						:	int							)					-> int:
      return number & ~(1 << position)

def 					UpperCAmelCase_							(      __UpperCAmelCase						:	int			,			__UpperCAmelCase						:	int							)					-> int:
      return number ^ (1 << position)

def 					UpperCAmelCase_							(      __UpperCAmelCase						:	int			,			__UpperCAmelCase						:	int							)					-> bool:
      return ((number >> position) & 1) == 1

def 					UpperCAmelCase_							(      __UpperCAmelCase						:	int			,			__UpperCAmelCase						:	int							)					-> int:
      return int((number & (1 << position)) != 0							)


if __name__ == "__main__":
   import doctest

   doctest.testmod()