Add solutions to first two practice exercises

This commit is contained in:
petrushkathefirebird authored and GitHub committed 2025-10-28 10:56:43 +01:00
1 parent 7b65d18a0e
commit 5a9404df13
2 files changed
+916

No files matched your search

+514
View File
@@ -0,0 +1,514 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "91ad3d04-8f28-49c8-91bc-39fec385235d",
"metadata": {},
"source": [
"# Practice Exercise 1 (\"due\" October 14)"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "4695ad83-81f7-4aab-b442-c190e2c26648",
"metadata": {},
"outputs": [],
"source": [
"from qiskit import QuantumCircuit, transpile\n",
"from qiskit_aer import AerSimulator\n",
"from qiskit.visualization import plot_histogram\n",
"import numpy as np\n",
"from scipy.linalg import expm"
]
},
{
"cell_type": "markdown",
"id": "1aa322a6-03e6-4a2d-8e0f-c01867c73dca",
"metadata": {},
"source": [
"## Question 1: Generating entanglement \n",
"\n",
"Bell states are foundational to quantum information science and represent the simplest examples of entangled states. The four Bell states are typically denoted\n",
"\n",
"$$\\vert \\Phi^+\\rangle=\\frac{1}{\\sqrt{2}}\\left(\\vert 00\\rangle+\\vert 11\\rangle\\right),$$\n",
"$$\\vert \\Phi^-\\rangle=\\frac{1}{\\sqrt{2}}\\left(\\vert 00\\rangle-\\vert 11\\rangle\\right),$$\n",
"$$\\vert \\Psi^+\\rangle=\\frac{1}{\\sqrt{2}}\\left(\\vert 01\\rangle+\\vert 10\\rangle\\right),$$\n",
"$$\\vert \\Psi^-\\rangle=\\frac{1}{\\sqrt{2}}\\left(\\vert 01\\rangle-\\vert 10\\rangle\\right).$$"
]
},
{
"cell_type": "markdown",
"id": "40dde07a-fbc8-48ef-b65a-4418f8ee9959",
"metadata": {},
"source": [
"The following Qiskit code generates a quantum circuit that prepares the Bell state $\\vert \\Phi^+\\rangle$:"
]
},
{
"cell_type": "code",
"execution_count": 83,
"id": "86507470-9c79-4640-a1e9-c931f4ad3a1d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\"> ┌───┐ ┌─┐ \n",
"q_0: ┤ H ├──■──┤M├───\n",
" └───┘┌─┴─┐└╥┘┌─┐\n",
"q_1: ─────┤ X ├─╫─┤M├\n",
" └───┘ ║ └╥┘\n",
"c: 2/═══════════╩══╩═\n",
" 0 1 </pre>"
],
"text/plain": [
" ┌───┐ ┌─┐ \n",
"q_0: ┤ H ├──■──┤M├───\n",
" └───┘┌─┴─┐└╥┘┌─┐\n",
"q_1: ─────┤ X ├─╫─┤M├\n",
" └───┘ ║ └╥┘\n",
"c: 2/═══════════╩══╩═\n",
" 0 1 "
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"qc = QuantumCircuit(2,2)\n",
"qc.h(0)\n",
"qc.cx(0,1)\n",
"qc.measure([0,1],[0,1])\n",
"qc.draw()"
]
},
{
"cell_type": "markdown",
"id": "a701a1ee-998d-40d0-8705-218d1c02fd0a",
"metadata": {},
"source": [
"We can sample the measurement outcomes using the ```AerSimulator```:"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "cc082fc1-bcaa-4035-a2ab-3a8ab979f81d",
"metadata": {},
"outputs": [],
"source": [
"backend = AerSimulator()\n",
"job = backend.run(qc, shots=2048)"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "b17f5172-ede9-4dff-843d-9b715258cff5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"output = job.result()\n",
"counts = output.get_counts()\n",
"plot_histogram(counts)"
]
},
{
"cell_type": "markdown",
"id": "ace7b3b0-82e6-410e-9669-7c0b6cf32cd5",
"metadata": {},
"source": [
"The measurement above measured both qubits, prepared in $\\vert \\Phi^+\\rangle$, in the $Z$ basis. Ask yourself if the measurement outcomes make sense.\n",
"\n",
"**TO DO**: Write a circuit that measures both qubits in the $X$ basis instead. We will then use ```AerSimulator``` to sample the measurement outcomes."
]
},
{
"cell_type": "code",
"execution_count": 86,
"id": "fcc04d9c-a191-4cd5-90cf-13219cf7351e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\"> ┌───┐ ┌───┐┌─┐ \n",
"q_0: ┤ H ├──■──┤ H ├┤M├───\n",
" └───┘┌─┴─┐├───┤└╥┘┌─┐\n",
"q_1: ─────┤ X ├┤ H ├─╫─┤M├\n",
" └───┘└───┘ ║ └╥┘\n",
"c: 2/════════════════╩══╩═\n",
" 0 1 </pre>"
],
"text/plain": [
" ┌───┐ ┌───┐┌─┐ \n",
"q_0: ┤ H ├──■──┤ H ├┤M├───\n",
" └───┘┌─┴─┐├───┤└╥┘┌─┐\n",
"q_1: ─────┤ X ├┤ H ├─╫─┤M├\n",
" └───┘└───┘ ║ └╥┘\n",
"c: 2/════════════════╩══╩═\n",
" 0 1 "
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Use this as a skeleton\n",
"qc2 = QuantumCircuit(2,2)\n",
"\n",
"#Prepare |Psi^+> (do not alter)\n",
"qc2.h(0)\n",
"qc2.cx(0,1)\n",
"\n",
"## YOUR CODE GOES HERE ###\n",
"qc2.h(0)\n",
"qc2.h(1)\n",
"qc2.measure([0,1],[0,1])\n",
"qc2.draw()"
]
},
{
"cell_type": "markdown",
"id": "8cc9b15e-1518-454d-a6b0-994f583c8c05",
"metadata": {},
"source": [
"Run this cell to sample the output of your circuit and plot a histogram of the results. Vary the number of shots if you like."
]
},
{
"cell_type": "code",
"execution_count": 87,
"id": "8e6ec719-b213-434f-9843-3c9634a7075b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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fmRkpGJiYpSenq5hw4bV+pjl5eUqLy93fV9aWipJcjgccjgckiQfHx9ZrVZVVVWpurraNffyeGVlpZxOp2vcarXKx8enzvHL9wt4m8s/m76+PzxFVFZWum232Wyqrq52OwtusVjk6+tb53hdx01THU91rZ19atn7BHij5jie6svrwi4tLU0HDx7UgQMHat2enJysMWPGKDo6WkePHlVqaqoGDx6sjIwM2e12FRQUyM/Pr8aZvrCwMBUUFNT5uAsXLtTcuXNrjG/evFlt2rSRJHXq1ElxcXH64osvlJub65rTvXt39ejRQ/v379epU6dc471791Z0dLR27typc+fOucb79eun0NBQbd68uX7/KUAzu3x5w4gRI1RWVqbt27e7tvn6+mrkyJEqKirSnj17XOMBAQEaPHiw8vLylJmZ6Rrv0KGD+vfvr5ycHB0+fNg13hTH04+f/BITE9W6desal2qwTy17nwBv1NTH0+7du+u9Fovzx2noYXl5eerTp482b96sXr16SZISEhLUu3dvvfTSS7XeJj8/X9HR0UpLS9N9992nd955RxMnTnQ7+yZJd955p7p27aoVK1bUej+1nbGLiopSUVGRAgMDJTXNK9duqcQdvE/OX3444/1zOhPEPrWMfeI5E97oyILkJj2eiouLFRISopKSEleT1MWrXv5kZGSosLBQ8fHxrrGqqirt3LlTy5cvV3l5uaxWq9ttIiIiFB0drZycHElSeHi4KioqdObMGbezdoWFherfv3+dj22322W322uM22w22Ww2tzGr1VpjHVLdrybrGv/p/QLe4qc/m7X9rPr4+MjHp+ZlunWN13XcNPXx1JBx9qll7BPgbTx1PNW6lnrPbAZDhgxRVlaWMjMzXV99+vTRI488oszMzFr/E06fPq28vDxFRERIkuLj42Wz2bRlyxbXnPz8fGVnZ18x7AAAAFo6rzpjFxAQoJiYGLcxf39/hYSEKCYmRufPn9ecOXN0//33KyIiQseOHdMzzzyj9u3b695775UkBQUFadKkSZo5c6ZCQkIUHBysWbNmKTY2VklJSZ7YLQAAgGbhVWF3NVarVVlZWVq9erXOnj2riIgIJSYmat26dQoICHDNW7p0qXx9fTV27FiVlZVpyJAhWrVqVa1n/AAAAEzh9WG3Y8cO179bt26tTZs2XfU2rVq10rJly7Rs2bImXBkAAIB38apr7AAAANB4hB0AAIAhCDsAAABDEHYAAACGIOwAAAAMQdgBAAAYgrADAAAwBGEHAABgCMIOAADAEIQdAACAIQg7AAAAQxB2AAAAhiDsAAAADEHYAQAAGIKwAwAAMARhBwAAYAjCDgAAwBCEHQAAgCEIOwAAAEMQdgAAAIYg7AALine truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"job = backend.run(qc2, shots=1024)\n",
"counts = job.result().get_counts()\n",
"plot_histogram(counts)"
]
},
{
"cell_type": "markdown",
"id": "52b6096a-a214-4166-8ce4-036f929b9b3b",
"metadata": {},
"source": [
"***TO DO*** If you've done this correctly, only certain measurement outcomes will be represented. Explain why (write your answer in this code cell below). It may help to think about the eigenstates of the Pauli-X operator, which you investigated in the last set of exercises. If you'd like to include equations in your explanation, you can have them render nicely by putting them inside dollar signs like this:$$1+1=2$$ \n",
"\n",
"\n",
"***Your answer goes here***: The Bell state $\\vert \\Phi^+\\rangle$ can be written as $\\vert \\Phi^+\\rangle=(\\vert ++\\rangle+\\vert --\\rangle)/\\sqrt{2}$, where $\\vert\\pm\\rangle=(\\vert 0\\rangle\\pm \\vert 1\\rangle)/\\sqrt{2}$. An $X$-basis measurement measures a qubit in the basis $\\vert\\pm\\rangle$. The measurement outcomes are therefore correlated, same as in the case of $Z$-basis measurements. "
]
},
{
"cell_type": "markdown",
"id": "453a2885-156c-48a9-9832-7d466c98dab2",
"metadata": {},
"source": [
"# Question 2: Fun with Hadamards\n",
"\n",
"Recall that the Hadamard matrix is given by $$H=\\frac{1}{\\sqrt{2}}\\left[\\begin{matrix}1 & 1\\\\\n",
"1 & -1\\end{matrix}\\right].$$\n",
"\n",
"Single-qubit gates can be interpreted as rotations on the Bloch sphere. A rotation of the qubit by angle $\\theta$ about the axis pointing along the unit vector $\\hat{n}=(n_x,n_y,n_z)$ can be expressed as the unitary\n",
"\n",
"$$U=e^{i\\theta \\hat{n}\\cdot \\vec{\\sigma}},$$\n",
"\n",
"where $\\vec{\\sigma}=(X,Y,Z)$ is a vector of Pauli matrices. For the Hadamard gate, we have\n",
"\n",
"$$H = e^{i\\varphi}U$$\n",
"\n",
"for some choice of $\\theta$, $\\varphi$, and $\\hat{n}$. What are the values of these parameters? Recall that unit vectors must satisfy the normalization condition $n_x^2+n_y^2+n_z^2=1$ by definition. A useful identity is that\n",
"\n",
"$$e^{i\\theta \\hat{n}\\cdot \\vec{\\sigma} }=\\cos{\\theta} I + i \\sin{\\theta}(\\hat{n}\\cdot \\vec{\\sigma}),$$\n",
"\n",
"where $I$ is the $2\\times 2$ identity matrix."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "7283ede9-7ddf-4db8-ab17-682756074572",
"metadata": {},
"outputs": [],
"source": [
"X = np.array([[0,1],[1,0]])\n",
"Y = np.array([[0,-1.j],[1.j,0]])\n",
"Z = np.array([[1,0],[0,-1]])\n",
"\n",
"H = 1/np.sqrt(2)*np.array([[1,1],[1,-1]])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "1cc9159d-9c4b-4c48-88ff-2138a467bcac",
"metadata": {},
"outputs": [],
"source": [
"def rotation(n, theta, varphi):\n",
"\n",
" \"ARGS: unit vector n=[nx,ny,nz], theta, varphi\"\n",
" n_dot_sigma=(n[0]*X + n[1]*Y + n[2]*Z)\n",
" U = expm(1.j*theta*n_dot_sigma)\n",
" rot = np.exp(1.j*varphi)*U\n",
" return rot\n",
" "
]
},
{
"cell_type": "markdown",
"id": "46e84071-9382-409a-a797-8fef0ed333ce",
"metadata": {},
"source": [
"***TO DO*** Fill in your answer here. If your answer is correct the cell will return ```True```: "
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "2e6e6a1d-b9ca-4d0c-8ab4-281d7e4ab0ad",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"your_Hadamard = rotation([1/np.sqrt(2), 0, 1/np.sqrt(2)], np.pi/2, -np.pi/2)\n",
"np.allclose(H, your_Hadamard)"
]
},
{
"cell_type": "markdown",
"id": "bee18c16-4b8a-49bb-a917-b3743531966a",
"metadata": {},
"source": [
"# Question 3: Trotterization"
]
},
{
"cell_type": "markdown",
"id": "adf782ef-83be-41ef-9e2f-1a23075a7703",
"metadata": {},
"source": [
"The Hadamard can be constructed from `rx` and `rz` operations as\n",
"\n",
"$$ R_x(\\theta) = e^{i\\frac{\\theta}{2} X}, ~~~ R_z(\\theta) = e^{i\\frac{\\theta}{2} Z},\\\\ H \\equiv \\lim_{n\\rightarrow\\infty} \\left( ~R_x\\left(\\frac{\\theta}{n}\\right) ~~R_z \\left(\\frac{\\theta}{n}\\right) ~\\right)^n$$\n",
"\n",
"for some suitably chosen $\\theta$. When implemented for finite $n$, the resulting gate will be an approximation to the Hadamard whose error decreases with $n$.\n",
"\n",
"The following shows an example of this implemented with Qiskit with an incorrectly chosen value of $\\theta$ (and with the global phase ignored).\n",
"\n",
"* Determine the correct value of $\\theta$.\n",
"\n",
"* Show that the error (when using the correct value of $\\theta$) decreases quadratically with $n$."
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "614b4c15-7789-4199-8bb8-7971464fb027",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"error = {}\n",
"for n in range(1,11):\n",
"\n",
" qc = QuantumCircuit(1,1)\n",
" \n",
" # Implement the Trotterized Hadamard\n",
"\n",
" ### YOUR ANSWER GOES HERE\n",
" theta = np.pi/np.sqrt(2)\n",
" ###\n",
"\n",
" for j in range(n):\n",
" qc.rx(theta/n,0)\n",
" qc.rz(theta/n,0)\n",
" \n",
" # We need to measure how good the above approximation is. Here's a simple way to do this.\n",
" # Step 1: Use a real Hadamard to cancel the above approximation.\n",
" # For a perfect approximation, the qubit will return to its initial state (0) since H squares to the identity. \n",
" qc.h(0)\n",
" \n",
" # Step 2: Run the circuit, and see how many times we get the outcome 1. The fraction of 1s is a measure of the error.\n",
" qc.measure(0,0)\n",
" shots = 100000\n",
" job = backend.run(qc, shots=shots) \n",
" try:\n",
" error[n] = (job.result().get_counts()['1']/shots)\n",
" except:\n",
" pass\n",
" \n",
"plot_histogram(error)"
]
},
{
"cell_type": "markdown",
"id": "f35fd6ba-7182-482e-904b-12562c487c6f",
"metadata": {},
"source": [
"In terms of showing that the scaling is (...or isn't) quadratic, you can do this however you like, but one possibility is to look into fitting functions like numpy's ```polyfit```. If it's helpful, you can convert the error data from a dictionary to a list like this:"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "c3ee4673-1a3f-4492-9b64-f4bf549d0af1",
"metadata": {},
"outputs": [],
"source": [
"n_vals = []\n",
"error_vals = []\n",
"for key, val in error.items():\n",
" n_vals.append(key)\n",
" error_vals.append(val)"
]
},
{
"cell_type": "markdown",
"id": "bc561d6e-4c32-49ff-82f7-305571f80f64",
"metadata": {},
"source": [
"***Sample solution***: Errors due to Trotterization scale quadratically because for noncommuting matrices, we have $$e^{\\Delta t(A+B)}=e^{\\Delta t A}e^{\\Delta t B}e^{-\\frac{\\Delta t^2}{2}[A,B] + h.o.t.'s}.$$ This is the well-known Baker-Campbell-Hausdorff formula. Since the time slice $\\Delta t$ scales like $1/n$, errors due to the commutator (neglected when we Trotterize) scale like $1/n^2$. \n",
"\n",
"If the error for $n$ Trotter steps scales like $$\\mathrm{error}(n)=k/n^2 + c,\\quad k,c=constants,$$\n",
"then we can extract $k$ and $c$ from a linear fit $y=kx + c$ with $x=1/n^2$. The following code finds and plots the resulting fit."
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "4a74b248-962d-4b0d-84b2-59ff936c22dd",
"metadata": {},
"outputs": [],
"source": [
"def inverse_quad(n):\n",
" return 1/n**2"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "de8e9609-a966-45f7-9afd-4ed230edd794",
"metadata": {},
"outputs": [],
"source": [
"degs = np.polyfit(inverse_quad(np.array(n_vals)), error_vals, 1)\n",
"polynomial_fit = np.poly1d(degs)"
]
},
{
"cell_type": "code",
"execution_count": 78,
"id": "5ac02f4c-6543-49fe-8bb5-345cb8cac555",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "0f4d3213-65ca-4c5e-b551-27a4cd376410",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(n_vals, error_vals)\n",
"plt.plot(np.linspace(1,10,100), polynomial_fit(inverse_quad(np.linspace(1,10,100))))\n",
"plt.xlabel('n')\n",
"plt.ylabel('Error')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d4919269-c721-4018-a30b-cc54e05ee530",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (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.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
+402
View File
@@ -0,0 +1,402 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "c35cb2a3-1285-480c-ab04-5ca6119caea5",
"metadata": {},
"source": [
"# Fun with Oracles: The Bernstein-Vazirani Algorithm"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "aa400782-06a3-4a80-9745-ea370dbc0d04",
"metadata": {},
"outputs": [],
"source": [
"from qiskit import *\n",
"%matplotlib inline\n",
"from qiskit.visualization import plot_histogram\n",
"from qiskit_aer import AerSimulator\n",
"\n",
"# import image module\n",
"from IPython.display import Image\n"
]
},
{
"cell_type": "markdown",
"id": "650b3002-863f-4501-af8e-8d96c97031e0",
"metadata": {},
"source": [
"In this exercise, we will construct an oracle that lets us guess a secret number (the bitstring $a$) in a single query to a quantum computer. We begin by posing the problem classically. Suppose we have access to a function $f_a(x)$ that takes a bitstring $a$ as input and returns $a\\cdot x$, modulo 2:\n",
"\n",
"$$ f_a(x)=a\\cdot x\\quad (\\mathrm{mod}\\; 2).$$\n",
"\n",
"As an example, if $a=001$ and $x=101$, then $f_a(x)=0\\times 1 + 0\\times 0 + 1\\times 1=1$. As a classical circuit, we can represent the Bernstein-Vazirani oracle like this (image stolen from Pennylane):\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "8ad6ec84-ff10-45ae-b530-29e8b3b3a069",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<img src=\"classical.png\" width=\"400\" height=\"400\"/>"
],
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Image(url=\"classical.png\", width=400, height=400)"
]
},
{
"cell_type": "markdown",
"id": "6f214d9d-fb7c-4eea-9181-6412f042bcf9",
"metadata": {},
"source": [
"More generally, we can write the action of this oracle as \n",
"\n",
"$$\n",
"\\begin{equation}\n",
"U_f\\vert x\\rangle\\vert s\\rangle=\\vert x\\rangle \\vert s\\oplus f_a(x)\\rangle,\\quad s=0,1,\n",
"\\end{equation}\n",
"$$\n",
"\n",
"where $\\oplus$ denotes addition modulo 2.\n",
"\n",
"To find $a$ classically, we would have to query this oracle $N=\\mathrm{len}(a)$ times with inputs $x_0=0\\dots 01$, $x_1=0\\dots 10$,..., $x_{N-1}=10\\dots0$. (Each query allows us to determine one bit of $a$.) Given the oracle $U_f$, the Bernstein-Vazirani algorithm allows us to find $a$ in a single shot using the following circuit:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7acb0d7d-28c2-4f8b-b4fb-688c6cc1c88a",
"metadata": {},
"outputs": [],
"source": [
"Image(url=\"quantum.png\", width=400, height=400)"
]
},
{
"cell_type": "markdown",
"id": "1db253b7-ce69-4ae3-a5aa-bd68236eecf1",
"metadata": {},
"source": [
"The steps of the algorithm are as follows:\n",
"\n",
"1. Initialize the register qubits to the $|0\\rangle^{\\otimes n}$ state, and the ancilla qubit to $|{-}\\rangle$\n",
"2. Apply Hadamard gates to the input register\n",
"3. Query the oracle\n",
"4. Apply Hadamard gates to the input register\n",
"5. Measure\n",
"\n",
"\n",
"Let's walk through the steps one-by-one. If we start with all register qubits initialized in $\\vert a\\rangle$ and apply a Hadamard to each one, then we have prepared the state\n",
"\n",
"$$\\vert a \\rangle\\stackrel{H^{\\otimes N}}{\\longrightarrow} \\frac{1}{\\sqrt{2^N}}\\sum_{x=0}^{2^N-1}(-1)^{a\\cdot x}\\vert x\\rangle.$$\n",
"\n",
"\n",
"Since the register qubits are all initialized in $\\vert 0\\rangle$, the input state on which the oracle acts is therefore given by\n",
"\n",
"$$\\vert \\psi_0\\rangle =\\frac{1}{\\sqrt{2^{N+1}}}\\sum_{x=0}^{2^N-1}\\vert x\\rangle(\\vert 0\\rangle-\\vert 1\\rangle).$$\n",
"\n",
"Let's start by preparing this state. First, we choose a secret number:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "c3c33752-30db-45fe-a7a2-3cd3e353fac5",
"metadata": {},
"outputs": [
{
"name": "stdin",
"output_type": "stream",
"text": [
"Enter a binary number: 0101\n"
]
}
],
"source": [
"secretnumber = input('Enter a binary number:')\n",
"l = len(secretnumber)"
]
},
{
"cell_type": "markdown",
"id": "5fbe7426-0bf0-4d6b-930f-0c685dc9c251",
"metadata": {},
"source": [
"The next code cell is for you to complete. It should realize Steps #1 and #2 in the list above:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "91a691a1-6d0a-49ed-b921-a322ae585167",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\"> ┌───┐ ░ \n",
"q_0: ┤ H ├──────░─\n",
" ├───┤ ░ \n",
"q_1: ┤ H ├──────░─\n",
" ├───┤ ░ \n",
"q_2: ┤ H ├──────░─\n",
" ├───┤ ░ \n",
"q_3: ┤ H ├──────░─\n",
" ├───┤┌───┐ ░ \n",
"q_4: ┤ X ├┤ H ├─░─\n",
" └───┘└───┘ ░ \n",
"c: 4/═════════════\n",
" </pre>"
],
"text/plain": [
" ┌───┐ ░ \n",
"q_0: ┤ H ├──────░─\n",
" ├───┤ ░ \n",
"q_1: ┤ H ├──────░─\n",
" ├───┤ ░ \n",
"q_2: ┤ H ├──────░─\n",
" ├───┤ ░ \n",
"q_3: ┤ H ├──────░─\n",
" ├───┤┌───┐ ░ \n",
"q_4: ┤ X ├┤ H ├─░─\n",
" └───┘└───┘ ░ \n",
"c: 4/═════════════\n",
" "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"qc = QuantumCircuit(l+1, l)\n",
"\n",
"qc.h(range(l))\n",
"qc.x(l)\n",
"qc.h(l)\n",
"\n",
"qc.barrier()\n",
"qc.draw()"
]
},
{
"cell_type": "markdown",
"id": "cc91b15d-1cfe-4b9f-b6cb-7d5d3c4c0f2e",
"metadata": {},
"source": [
"Next, let's see what happens when we apply the oracle $U_f$ to $\\vert \\psi_0\\rangle$. Using the equation given above, we have\n",
"\n",
"$$\n",
" \\begin{aligned}\n",
" U_f\\lvert \\psi_0 \\rangle \n",
" & = \\frac{1}{\\sqrt{2^{N+1}}}\\sum_{x=0}^{2^N-1} \\vert x\\rangle (\\vert f_a(x)\\rangle - \\vert 1 \\oplus f_a(x)\\rangle) \\\\&= \\frac{1}{\\sqrt{2^{N+1}}}\\sum_{x=0}^{2^N-1}(-1)^{f_a(x)}|x\\rangle ( |0\\rangle - |1\\rangle ) .\n",
" \\end{aligned}\n",
" $$\n",
"\n",
"Neglecting the ancilla qubit, the action of Steps #1-3 above can therefore be summarized as\n",
"\n",
"$$|00\\dots 0\\rangle \\xrightarrow{H^{\\otimes N}} \\frac{1}{\\sqrt{2^N}} \\sum_{x} |x\\rangle \\xrightarrow{U_f} \\frac{1}{\\sqrt{2^N}} \\sum_{x} (-1)^{a\\cdot x}|x\\rangle.$$\n",
"\n",
"Since the Hadamard is its own inverse, the secret number $a$ can be recovered by once again applying Hadamards to all register qubits:\n",
"\n",
"$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x=0}^{2^N-1}(-1)^{a\\cdot x}\\vert x\\rangle\\stackrel{H^{\\otimes N}}{\\longrightarrow}\\vert a \\rangle.$$\n"
]
},
{
"cell_type": "markdown",
"id": "2a41cbc7-774a-493c-9a44-9e7d7c4c3cf5",
"metadata": {},
"source": [
"We will now construct the oracle by applying CNOTs between the ancilla (in position ```l```) and every bit of the secret number equal to 1. (The target qubit should be ```l```.)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "12f33b9c-e0fe-44a2-9e3c-84f04d0d3240",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\"> ┌───┐ ░ \n",
"q_0: ┤ H ├──────░───■───────\n",
" ├───┤ ░ │ \n",
"q_1: ┤ H ├──────░───┼───────\n",
" ├───┤ ░ │ \n",
"q_2: ┤ H ├──────░───┼────■──\n",
" ├───┤ ░ │ │ \n",
"q_3: ┤ H ├──────░───┼────┼──\n",
" ├───┤┌───┐ ░ ┌─┴─┐┌─┴─┐\n",
"q_4: ┤ X ├┤ H ├─░─┤ X ├┤ X ├\n",
" └───┘└───┘ ░ └───┘└───┘\n",
"c: 4/═══════════════════════\n",
" </pre>"
],
"text/plain": [
" ┌───┐ ░ \n",
"q_0: ┤ H ├──────░───■───────\n",
" ├───┤ ░ │ \n",
"q_1: ┤ H ├──────░───┼───────\n",
" ├───┤ ░ │ \n",
"q_2: ┤ H ├──────░───┼────■──\n",
" ├───┤ ░ │ │ \n",
"q_3: ┤ H ├──────░───┼────┼──\n",
" ├───┤┌───┐ ░ ┌─┴─┐┌─┴─┐\n",
"q_4: ┤ X ├┤ H ├─░─┤ X ├┤ X ├\n",
" └───┘└───┘ ░ └───┘└───┘\n",
"c: 4/═══════════════════════\n",
" "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"#Building the oracle\n",
"for i, digit in enumerate(reversed(secretnumber)):\n",
" if digit == '1':\n",
" qc.cx(i,l)\n",
" \n",
"qc.draw()"
]
},
{
"cell_type": "markdown",
"id": "40135256-76f5-43ff-ba73-0d2d27ceee2b",
"metadata": {},
"source": [
"Finally, we apply Hadamards and measure all register qubits in the $Z$ basis. You can visualized your circuit using ```qc.draw()```."
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "5176744b-a527-42c7-b52b-e8a320119097",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\"> ┌───┐ ░ ┌───┐ ┌─┐ \n",
"q_0: ┤ H ├──────░───■──┤ H ├─────────────┤M├───\n",
" ├───┤ ░ │ ├───┤ ┌─┐ └╥┘ \n",
"q_1: ┤ H ├──────░───┼──┤ H ├─────┤M├──────╫────\n",
" ├───┤ ░ │ └───┘ └╥┘┌───┐ ║ ┌─┐\n",
"q_2: ┤ H ├──────░───┼─────────■───╫─┤ H ├─╫─┤M├\n",
" ├───┤ ░ │ ┌───┐ │ ║ └┬─┬┘ ║ └╥┘\n",
"q_3: ┤ H ├──────░───┼──┤ H ├──┼───╫──┤M├──╫──╫─\n",
" ├───┤┌───┐ ░ ┌─┴─┐└───┘┌─┴─┐ ║ └╥┘ ║ ║ \n",
"q_4: ┤ X ├┤ H ├─░─┤ X ├─────┤ X ├─╫───╫───╫──╫─\n",
" └───┘└───┘ ░ └───┘ └───┘ ║ ║ ║ ║ \n",
"c: 4/═════════════════════════════╩═══╩═══╩══╩═\n",
" 1 3 0 2 </pre>"
],
"text/plain": [
" ┌───┐ ░ ┌───┐ ┌─┐ \n",
"q_0: ┤ H ├──────░───■──┤ H ├─────────────┤M├───\n",
" ├───┤ ░ │ ├───┤ ┌─┐ └╥┘ \n",
"q_1: ┤ H ├──────░───┼──┤ H ├─────┤M├──────╫────\n",
" ├───┤ ░ │ └───┘ └╥┘┌───┐ ║ ┌─┐\n",
"q_2: ┤ H ├──────░───┼─────────■───╫─┤ H ├─╫─┤M├\n",
" ├───┤ ░ │ ┌───┐ │ ║ └┬─┬┘ ║ └╥┘\n",
"q_3: ┤ H ├──────░───┼──┤ H ├──┼───╫──┤M├──╫──╫─\n",
" ├───┤┌───┐ ░ ┌─┴─┐└───┘┌─┴─┐ ║ └╥┘ ║ ║ \n",
"q_4: ┤ X ├┤ H ├─░─┤ X ├─────┤ X ├─╫───╫───╫──╫─\n",
" └───┘└───┘ ░ └───┘ └───┘ ║ ║ ║ ║ \n",
"c: 4/═════════════════════════════╩═══╩═══╩══╩═\n",
" 1 3 0 2 "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"qc.h(range(l))\n",
"qc.measure(range(l), range(l))\n",
"\n",
"qc.draw()"
]
},
{
"cell_type": "markdown",
"id": "52f182ee-ea26-465c-b012-0e372e716d4c",
"metadata": {},
"source": [
"We can finally run our circuit. Only a single shot is required since the outcome is deterministic in the absence of other errors. If you've done everything correctly, the following code block should return the secret number you specified at the beginning of this notebook."
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "d4e33e1d-5b8a-4de5-8f16-92462c59e651",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'0101': 1}\n"
]
}
],
"source": [
"backend = AerSimulator()\n",
"result = backend.run(qc, shots=1).result()\n",
"counts = result.get_counts()\n",
"print(counts)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1a21d874-a981-498f-9340-8e535f75220a",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (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.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}