{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0330f473-1a90-485c-bc5a-b60a3da9f8a6",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Importing standard Qiskit libraries\n",
    "from qiskit import QuantumCircuit, transpile\n",
    "from qiskit import QuantumRegister, ClassicalRegister\n",
    "from qiskit.visualization import *\n",
    "from ibm_quantum_widgets import *\n",
    "from qiskit.visualization import plot_histogram\n",
    "from qiskit.primitives import Sampler\n",
    "from qiskit_aer import Aer\n",
    "\n",
    "# Import the Quantum Fourier Transform (QFT) circuit implementation from the Qiskit circuit library\n",
    "from qiskit.circuit.library import QFT\n",
    "\n",
    "# qiskit-ibmq-provider has been deprecated.\n",
    "# Please see the Migration Guides in https://ibm.biz/provider_migration_guide for more detail.\n",
    "from qiskit_ibm_runtime import QiskitRuntimeService, Sampler, Estimator, Session, Options\n",
    "\n",
    "# Loading your IBM Quantum account(s)\n",
    "service = QiskitRuntimeService(channel=\"ibm_quantum\")\n",
    "\n",
    "# Invoke a primitive. For more details see https://docs.quantum.ibm.com/run/primitives\n",
    "# result = Sampler().run(circuits).result()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4d3d7577-4e54-4d37-b610-9fb8cd429d31",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "q = QuantumRegister(4)\n",
    "c = ClassicalRegister(4)\n",
    "circuit = QuantumCircuit(q,c)\n",
    "display(circuit.draw())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a8bc4597-606e-4356-9d76-5f7b92dba0c7",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Create a Quantum Fourier Transform circuit with 4 qubits\n",
    "qft_circuit = QFT(num_qubits=4, approximation_degree=0, do_swaps=True, inverse=False, insert_barriers=True, name=None)\n",
    "# Decompose the QFT circuit into its elementary gates\n",
    "decomposed_qft_circuit = qft_circuit.decompose()\n",
    "# Draw the decomposed circuit graphically for visualization\n",
    "display(decomposed_qft_circuit.draw())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "76b810fa-7b4b-474b-b7bd-b12bd0dd1959",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "\n",
    "#encode number 5 into our qubits to demonstrate the circuit works correctly\n",
    "circuit.x(q[2])\n",
    "circuit.x(q[0])\n",
    "\n",
    "#append a Quantum Fourier Transform circuit with 4 qubits\n",
    "circuit.append(decomposed_qft_circuit, qargs=[0, 1, 2, 3])\n",
    "\n",
    "circuit.measure(q,c)\n",
    "display(circuit.decompose().draw())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "03b6ee40-a4b1-4dda-b673-88032a0b600c",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Execute the quantum circuit and obtain the results\n",
    "result = Sampler().run(circuit).result()\n",
    "\n",
    "# Visualize the histogram of the quasi-probability distributions\n",
    "# Note: 'quasi_dists' might represent quasi-probability distributions obtained from the quantum circuit execution.\n",
    "display(plot_histogram(result.quasi_dists))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f02b377c-4402-4734-979d-5d06acff15a0",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "#run the result and show as histogram\n",
    "qasm_sim = Aer.get_backend('qasm_simulator')\n",
    "circuitobj = transpile(circuit, qasm_sim)\n",
    "prob = qasm_sim.run(circuitobj).result().get_counts() \n",
    "plot_histogram(prob)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "375fe47c-db48-484d-91b1-413f9d5c9a67",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Create an inverse Quantum Fourier Transform circuit with 4 qubits\n",
    "inverse_qft = QFT(num_qubits=4, approximation_degree=0, do_swaps=True, inverse=True, insert_barriers=True, name=None)\n",
    "# Decompose the inverse QFT circuit into its elementary gates\n",
    "decomposed_inverse_qft = inverse_qft.decompose()\n",
    "# Draw the decomposed circuit graphically for visualization\n",
    "display(decomposed_inverse_qft.draw())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7a02bd16-9156-4926-9eeb-5f2d4bdf2324",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "q = QuantumRegister(4)\n",
    "c = ClassicalRegister(4)\n",
    "circuit = QuantumCircuit(q,c)\n",
    "display(circuit.draw())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "29e05a15-7128-4016-9796-3e356ec1583a",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "\n",
    "#encode number 5 into our qubits to demonstrate the circuit works correctly\n",
    "circuit.x(q[2])\n",
    "circuit.x(q[0])\n",
    "\n",
    "#append a Quantum Fourier Transform circuit with 4 qubits\n",
    "circuit.append(decomposed_qft_circuit, qargs=[0, 1, 2, 3])\n",
    "\n",
    "#append an inverse Quantum Fourier Transform circuit with 4 qubits\n",
    "circuit.append(decomposed_inverse_qft, qargs=[0, 1, 2, 3])\n",
    "\n",
    "circuit.measure(q,c)\n",
    "display(circuit.decompose().draw())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9afa1b7e-517e-4b9f-a4b8-658d9ef66f42",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "#run the result and show as histogram\n",
    "qasm_sim = Aer.get_backend('qasm_simulator')\n",
    "circuitobj = transpile(circuit, qasm_sim)\n",
    "prob = qasm_sim.run(circuitobj).result().get_counts() \n",
    "plot_histogram(prob)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c86e7734-2bd9-47af-92a8-18142591ddab",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Qiskit v1.0.2 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {},
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
