{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#initialization\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "\n",
    "# importing Qiskit\n",
    "from qiskit_aer import Aer\n",
    "from qiskit_ibm_provider import least_busy\n",
    "from qiskit import QuantumCircuit, transpile, assemble, ClassicalRegister, QuantumRegister\n",
    "\n",
    "from qiskit.quantum_info.operators import Operator\n",
    "\n",
    "# import basic plot tools\n",
    "from qiskit.visualization import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def inversion_about_average(circuit, register):\n",
    "    \"\"\"Apply inversion about the average step of Grover's algorithm.\"\"\"\n",
    "    circuit.h(register)\n",
    "    circuit.x(register)\n",
    "    circuit.barrier()\n",
    "    circuit.h(register[2])\n",
    "    circuit.ccx(register[0], register[1], register[2])\n",
    "    circuit.h(register[2])\n",
    "    circuit.barrier()\n",
    "    circuit.x(register)\n",
    "    circuit.h(register)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "qr = QuantumRegister(3)\n",
    "cr = ClassicalRegister(3)\n",
    "\n",
    "groverCircuit = QuantumCircuit(qr,cr)\n",
    "groverCircuit.h(qr)\n",
    "\n",
    "#marked \"00\" as target state. \n",
    "# uf = Operator([\n",
    "#     [-1, 0, 0, 0],\n",
    "#     [0, 1, 0, 0],\n",
    "#     [0, 0, 1, 0],\n",
    "#     [0, 0, 0, 1]])\n",
    "\n",
    "#mark state '101' and '110'\n",
    "groverCircuit.cz(0,1)\n",
    "groverCircuit.cz(0,2)\n",
    "# groverCircuit.unitary(uf, [qr[0], qr[1]], label='Uf')\n",
    "inversion_about_average(groverCircuit, qr)\n",
    "\n",
    "groverCircuit.measure(qr,cr)\n",
    "groverCircuit.draw(output=\"mpl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "backend = Aer.get_backend('qasm_simulator')\n",
    "shots = 1024\n",
    "new_circuit = transpile(groverCircuit, backend)\n",
    "job = backend.run(new_circuit, shots = 1000)\n",
    "counts = job.result().get_counts() # we run the simulation and get the counts\n",
    "plot_histogram(counts) # let us plot a histogram to see the possible outcomes and corresponding probabilities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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": 4
}
