Skip to content

Commit

Permalink
Merge pull request #37 from aryashah2k/Quantum-Random-Walks
Browse files Browse the repository at this point in the history
Add Quantum Time Random Walks | Qiskit
  • Loading branch information
Ricardo Prins authored Feb 16, 2021
2 parents f65b608 + 6cadd76 commit 7120a94
Show file tree
Hide file tree
Showing 4 changed files with 392 additions and 0 deletions.
160 changes: 160 additions & 0 deletions qiskit/Quantum Random Walks/ContinuousTimeQuantumWalks.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
{
"cells": [
{
"cell_type": "code",
"source": [
"import numpy as np\n",
"from numpy import linalg as LA\n",
"from scipy.linalg import expm, sinm, cosm\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"import math\n",
"from scipy import stats\n",
"%matplotlib inline\n",
"\n",
"from IPython.display import Image, display, Math, Latex\n",
"sns.set(color_codes=True)"
],
"outputs": [],
"execution_count": 1,
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"# Continuous Time Quantum Walks"
],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## Continuous-Time Quantum Walks"
],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Now let's see an example of how it work on cycle graph $C_n$ for some numbers of vertices."
],
"metadata": {}
},
{
"cell_type": "code",
"source": [
"#number of vertices\n",
"n = 4\n",
"\n",
"#Define adjacency matrix A_Cn\n",
"A = np.zeros((n, n))\n",
"for i in range(n):\n",
" j1 = (i - 1)%n\n",
" j2 = (i + 1)%n\n",
" A[i][j1] = 1\n",
" A[i][j2] = 1\n",
"\n",
"#Define our initial state Psi_a\n",
"psi_a = np.zeros(n)\n",
"psi_a[3] = 1\n",
"\n",
"#Define the time t >= 0\n",
"t = math.pi/2\n",
"\n",
"#Exponentiate or hamiltonian\n",
"U_t = expm(1j*t*A)\n",
"U_mt = expm(1j*(-t)*A)\n",
"\n",
"#Compute Psi_t\n",
"psi_t = U_t @ psi_a\n",
"\n",
"#Compute the probabilities\n",
"prob_t = abs(psi_t)**2"
],
"outputs": [],
"execution_count": 2,
"metadata": {}
},
{
"cell_type": "code",
"source": [
"M_t = U_t*U_mt \n",
"M_t = np.around(M_t, decimals = 3)\n",
"M_t"
],
"outputs": [
{
"output_type": "execute_result",
"execution_count": 3,
"data": {
"text/plain": "array([[0.+0.j, 0.-0.j, 1.+0.j, 0.+0.j],\n [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],\n [1.-0.j, 0.+0.j, 0.+0.j, 0.+0.j],\n [0.+0.j, 1.-0.j, 0.+0.j, 0.+0.j]])"
},
"metadata": {}
}
],
"execution_count": 3,
"metadata": {}
},
{
"cell_type": "code",
"source": [
"x = M_t[:, 0].real\n",
"plt.bar(range(len(x)), x, tick_label=[0, 1, 2, 3])\n",
"plt.xlabel('Vertices')\n",
"plt.ylabel('Probability')"
],
"outputs": [
{
"output_type": "execute_result",
"execution_count": 7,
"data": {
"text/plain": "Text(0, 0.5, 'Probability')"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 432x288 with 1 Axes>"
},
"metadata": {}
}
],
"execution_count": 7,
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Then we can easily visualize how our quantum-walker behaves in graph $C_n$ given an initial state and a time $t = \\pi/2$, and we can see the Perfect State Transfer phenomena from vertice 0 to 2, that will be explained in the detail [here](https://github.com/matheusmtta/Quantum-Computing/blob/master/Quantum%20Information%20Theory/State_Transfer.ipynb)."
],
"metadata": {}
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.8.2"
},
"nteract": {
"version": "0.28.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Loading

0 comments on commit 7120a94

Please sign in to comment.