Files
Quantum-Computation-course-…/practice/Practice1.ipynb
quantumjim 63be27c7bd add folder
2025-10-07 11:59:14 +02:00

416 lines
56 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "91ad3d04-8f28-49c8-91bc-39fec385235d",
"metadata": {},
"source": [
"# Practice Exercises 1 (due October 14)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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": 19,
"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": 19,
"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": 20,
"id": "cc082fc1-bcaa-4035-a2ab-3a8ab979f81d",
"metadata": {},
"outputs": [],
"source": [
"backend = AerSimulator()\n",
"job = backend.run(qc, shots=1024)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "b17f5172-ede9-4dff-843d-9b715258cff5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"execution_count": 21,
"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": 29,
"id": "fcc04d9c-a191-4cd5-90cf-13219cf7351e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<qiskit.circuit.instructionset.InstructionSet at 0x122d7bb20>"
]
},
"execution_count": 29,
"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 ###"
]
},
{
"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": null,
"id": "8e6ec719-b213-434f-9843-3c9634a7075b",
"metadata": {},
"outputs": [],
"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***: "
]
},
{
"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": 5,
"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": 6,
"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": 8,
"id": "2e6e6a1d-b9ca-4d0c-8ab4-281d7e4ab0ad",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"your_Hadamard = rotation(### YOUR ANSWER GOES HERE###)\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": 105,
"id": "614b4c15-7789-4199-8bb8-7971464fb027",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAV+tJREFUeJzt3XlclWX+//H3YVFcsRRZlE1zoTQ1KIMg0yn8omNmNrmkLS5lTpPL1OSa+9iM5mDlkkaZlkuNk41fqaTMpaRMgzKzUlNRBBU00VTgwP37wx/nyxEwOJzDcvd6Ph486lznOvf9+Qge39znvq/bYhiGIQAAANR6btVdAAAAAJyDYAcAAGASBDsAAACTINgBAACYBMEOAADAJAh2AAAAJkGwAwAAMAmCHQAAgEl4VHcBtUVhYaFOnDihRo0ayWKxVHc5AADgd8IwDJ0/f14BAQFyc7v2MTmCXTmdOHFCgYGB1V0GAAD4nTp27Jhatmx5zTkEu3Jq1KiRpCt/qI0bN67magAAwO9FTk6OAgMDbVnkWgh25VT08Wvjxo0JdgAAoMqV51QwLp4AAAAwCYIdAACASRDsAAAATIJgB6davHixQkND5eXlpfDwcO3YsaPMuRkZGRo8eLDatWsnNzc3jR07tsScFStWyGKxlPi6fPmybc6SJUt08803285/jIyM1AcffOCK9gAAqNEIdnCadevWaezYsZo8ebJSUlIUExOjuLg4paWllTo/NzdXPj4+mjx5sjp16lTmdhs3bqyMjAy7Ly8vL9vzLVu21AsvvKDdu3dr9+7d6tGjh/r27at9+/Y5vUcAAGoyi2EYRnUXURvk5OTI29tb586d46rYMnTt2lW33HKLlixZYhsLCwvTfffdp7lz517ztXfddZc6d+6s+Ph4u/EVK1Zo7Nix+uWXXypUy/XXX6958+Zp+PDhFXodAAA1TUUyCEfs4BR5eXnas2ePYmNj7cZjY2O1c+fOSm37woULCg4OVsuWLfXHP/5RKSkpZc4tKCjQ2rVr9euvvyoyMrJS+wUAoLZhHTs4RVZWlgoKCuTr62s37uvrq8zMTIe32759e61YsUIdO3ZUTk6OFi5cqDvuuEPffPON2rRpY5u3d+9eRUZG6vLly2rYsKHee+893XjjjQ7vFwCA2ogjdtWsOi422L59u/r06aOAgABZLBZt2LDBaf1cvXiiYRiVurfu7bffriFDhqhTp06KiYnRO++8o7Zt2+rll1+2m9euXTulpqbqiy++0JNPPqlHHnlE33//vcP7BQCgNiLYVaPqutjg119/VadOnfTKK684rZdmzZrJ3d29xNG5U6dOlTiKVxlubm669dZbdeDAAbvxOnXq6IYbblBERITmzp2rTp06aeHChU7bLwAAtQHBrhotWLBAw4cP14gRIxQWFqb4+HgFBgbaXXxQXEhIiBYuXKiHH35Y3t7eZW7XYrHIz8/P7qu4uLg4zZ49W/fff7/TeqlTp47Cw8OVlJRkN56UlKSoqCin7ccwDKWmpsrf3/835+Xm5jptvwAA1AacY1dNii42mDBhgt24My82KCgoUOfOnTVr1ix16dKlUtssj/Hjx2vo0KGKiIhQZGSkli1bprS0NI0aNUqSNHHiRKWnp2vlypW216SmptpqPn36tFJTU1WnTh3b+XEzZszQ7bffrjZt2ignJ0cvvfSSUlNTtWjRIts2Jk2apLi4OAUGBur8+fNau3attm7dqg8//NDlPQMAUJMQ7KpJdV9s4AoDBgxQdna2Zs6cqYyMDHXo0EGJiYkKDg6WdOUcwas/Zi4eOPfs2aPVq1crODhYR44ckST98ssvevzxx5WZmSlvb2916dJF27dv12233WZ73cmTJzV06FBlZGTI29tbN998sz788EPdc889Lu0XAIAax6iBFi1aZISEhBh169Y1brnlFmP79u1lzj1x4oQxaNAgo23btobFYjHGjBlT6ryzZ88ao0ePNvz8/Iy6desa7du3NzZt2lTums6dO2dIMs6dO1fRdkqVnp5uSDJ27txpNz579myjXbt2v/n6bt26ldlrcQUFBUanTp2Mv/zlL6U+L8l47733ylMyAACoBhXJIDXuHDtXXFCQl5ene+65R0eOHNG///1v/fjjj1q+fLlatGjhylauqbovNgAAAOZT44KdKy4oeP3113XmzBlt2LBBd9xxh4KDgxUdHX3NK0tdraZdbAAAAGq/GnWOnasuKPjvf/+ryMhI/fnPf9b7778vHx8fDR48WM8995zc3d1LfU1ubq7dVZU5OTmSpPz8fOXn50u6cjTM3d1dBQUFKiwstM0tGrdarTKK3bHN3d1dbm5utvGnn35ajz32mG655RbdcccdWrp0qdLS0jR8+HDl5+dr6tSpOnHihBIS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1Ro0aKCOHTvqwIEDVbpfAEDtQ7ADSlGnTh2Fh4crKSnJbjwpKUlRUVFVWktubq72798vf3//Kt0vAKD24aNYoAzjx4/X0KFDFRERocjISC1btkxpaWkaNWqUJGnixIlKT0/XypUrba9JTU2VJF24cEGnT59Wamqq6tSpoxtvvFHSlYsyvv/+e9v/p6enKzU1VQ0bNtQNN9wgSXrmmWfUp08fBQUF6dSpU5o9e7ZycnL0yCOPVGH3AIDaiGAHlGHAgAHKzs7WzJkzlZGRoQ4dOigxMVHBwcGSrixIfPWadl26dLH9/549e7R69WoFBwfryJEjkqQTJ07YzZk/f77mz5+vbt26aevWrZKk48ePa9CgQcrKypKPj49uv/12ffHFF7b9AgBQlhr5UayzV/tfvny5YmJidN111+m6667T3XffrV27drmwA5jF6NGjdeTIEeXm5mrPnj268847bc+tWLHCFsaKGIZR4qso1ElX1rorbU7x7axdu1YnTpywHdFbv3697YgfAADXUuOCnStW+9+6dasGDRqkTz/9VMnJyQoKClJsbKzS09Nd2QoAAECVqnHBzhWr/b/99tsaPXq0OnfurPbt22v58uUqLCzUJ5984spWAAAAqlSNCnZVtdr/xYsXlZ+fr+uvv95p2wQAAKhuNeriiapa7X/ChAlq0aKF7r777jLn5ObmKjc31/Y4JydHkpSfn6/8/HxJkpubm9zd3VVQUKDCwkLb3KJxq9UqwzBs4+7u7nJzcytzvGi7VcFqtcrDw6PM2p3VU1XJz8+XxWKpkp6u/j55eFz5a2S1Wss17unpqcLCQhUUFNjGimova5ye6Ime6Imefr89VSQf1KhgV8SVq/3/85//1Jo1a7R161Z5eXmVOW/u3LmaMWNGifHNmzerfv36kqSgoCB16dJF3377rd05gO3atVP79u21a9cunT592jbeuXNnBQcHa/v27Tp//rxtPDIyUs2bN9fmzZud0WK57Nq1S1FRUTpw4IB+/PFH27ize6oqiYmJ8vHxqZKeNm/ebPcXvHv37qpXr54SExPtaurVq5cuXbqkTz/91Dbm4eGh3r17KysrS8nJybbxRo0aqUePHjp27JhtyRRJ9ERP9ERP9ERPunjxosrLYhSPsdUsLy9P9evX17vvvqt+/frZxseMGaPU1FRt27btmq+/66671LlzZ8XHx5f6/Pz58zV79mx9/PHHioiIuOa2SjtiFxgYqKysLDVu3FiSa357aDO1asLdwdk9q+Q3opAJm6qknwOzYvktj57oiZ7oiZ5M2VNOTo6aNWumc+fO2TJIWWrUEbviq/0XD3ZJSUnq27dvpbY9b948zZ49Wx999NFvhjpJqlu3rurWrVti3NPTU56ennZj7u7ucnd3LzG36IehvONXb9eVimooq3Zn9VRViv/Zubqnsr5PFRl3c3Mr9aPqssbpiZ7KqrGi4/RETxI9lVVjRcerqqeK5IMaFewk16z2/89//lNTp07V6tWrFRISYjtfr2HDhmrYsGHVNggAAOAiNS7YuWK1/8WLFysvL08PPPCA3eumTZum6dOnu7QfAACAqlLjgp10ZbX/0aNHl/rcihUrSoz91mmCxVf+BwAAMKsatY4dAAAAHEewAwAAMAmCHQAAgEkQ7AAAAEzC4WDXpUsXLVmyxHarLQAAAFQvh4Pd/v379dRTT8nf31+PPvqoPvvsM2fWBQAAgApyeLmTzMxMrVy5UgkJCVq5cqVWrVqltm3bauTIkXr44YfVrFkzZ9YJ1AhVdYu0Iy/0rpL9AADMxeEjdk2aNNHTTz+tb775Rrt27dLIkSOVkZGhZ555Ri1bttSAAQOq9Kb2AAAAv3dOuXgiIiJCS5cuVUZGhl5//XXddtttevfddxUXF6fQ0FDNmTNHGRkZztgVAAAAyuDUq2Lr1aune++9V/369VNAQIAMw9DRo0c1depUhYSE6KmnntLFixeduUsAAAD8f04Ldh9//LEGDhyoFi1a6JlnnlFhYaEmTZqkH3/8UWvXrrVdRfvUU085a5cAAAAoplL3ij1x4oRef/11vfHGG7b7sd5zzz16/PHH1bdvX7m7u0uS2rRpowcffFB9+vTR+++/X+miAQAAUJLDwa5Pnz768MMPVVBQIF9fX02YMEEjR45USEhIma+JiopSYmKio7sEAADANTgc7DZt2mR3dM7D47c31adPHwUEBDi6SwAAAFyDw8Hu0KFDCg0NrdBrOnTooA4dOji6SwAAAFyDwxdPzJo1S//973+vOScxMVHDhg1zdBcAAACoAIeD3YoVK5SamnrNOXv37tWbb77p6C4AAABQAU5dx+5qly9fLte5dwAAAKi8SqUui8VS6rhhGDp+/LgSExO5WAIAAKCKVOiInZubm9zd3W3r002fPt32uPiXh4eHQkJC9NVXX2ngwIEuKRwAAAD2KnTE7s4777Qdpdu+fbuCgoJKXbfO3d1d119/vXr06KGRI0c6pVAAAABcW4WO2G3dulWffvqpPv30UxmGoccee8z2uPjXxx9/rHfeeUejRo2yHd0DUP0WL16s0NBQeXl5KTw8XDt27Ljm/G3btik8PFxeXl5q1aqVli5davd8fn6+Zs6cqdatW8vLy0udOnXShx9+aDfn/PnzGjt2rIKDg1WvXj1FRUXpq6++cnpvAIBKXDxRWFio559/3pm1AHChdevWaezYsZo8ebJSUlIUExOjuLg4paWllTr/8OHD6tWrl2JiYpSSkqJJkybp6aef1vr1621zpkyZoldffVUvv/yyvv/+e40aNUr9+vVTSkqKbc6IESOUlJSkVatWae/evYqNjdXdd9+t9PR0l/cMAL83FsMwjOouojbIycmRt7e3zp07p8aNG7tsPyETNrls28UdeaF3leyHfhzjin66du2qW265RUuWLLGNhYWF6b777tPcuXNLzH/uuef03//+V/v377eNjRo1St98842Sk5MlSQEBAZo8ebL+/Oc/2+bcd999atiwod566y1dunRJjRo10vvvv6/evf+vp86dO+uPf/yjZs+e7fQ+AcBsKpJByn2O3bBhw2SxWPT3v/9dvr6+5V542GKxKCEhoby7AeACeXl52rNnjyZMmGA3Hhsbq507d5b6muTkZMXGxtqN9ezZUwkJCcrPz5enp6dyc3Pl5eVlN6devXr67LPPJElWq1UFBQXXnAMAcJ5yB7sVK1bIYrHoueeek6+vr1asWFGu1xHsgOqXlZWlgoIC+fr62o37+voqMzOz1NdkZmaWOt9qtSorK0v+/v7q2bOnFixYoDvvvFOtW7fWJ598ovfff18FBQWSpEaNGikyMlKzZs1SWFiYfH19tWbNGn355Zdq06aNa5oFgN+xcge7w4cPS5JatGhh9xhA7XH12pOGYZS5HmVZ84uPL1y4UCNHjlT79u1lsVjUunVrPfbYY3rjjTdsr1m1apWGDRumFi1ayN3dXbfccosGDx6sr7/+2lltAQD+v3IHu+Dg4Gs+BlBzNWvWTO7u7iWOzp06darEUbkifn5+pc738PBQ06ZNJUk+Pj7asGGDLl++rOzsbAUEBGjChAkKDQ21vaZ169batm2b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tHz5cmVmZioqKkrZ2dmV7ApSJYLdDTfcoIyMDGfWYuPskzmlK4eY27Vrp3r16ikwMFDjxo3T5cuXXVI/AAC1QXWsyxcXF6f+/furY8eOuvvuu7Vp05Ulfd58802HeiiuOi4GWbJkiW6++WY1btxYjRs3VmRkpD744INK9+Ioh4Pd8OHDtWnTJqWnpzuzHtvJnJMnT1ZKSopiYmIUFxdnd0JqcUUnc8bExCglJUWTJk3S008/rfXr19vmvP3225owYYKmTZum/fv3KyEhQevWrdPEiROdWjsAALVBVa3Ld/XRutI0aNBAHTt21IEDByrYhT1X5If//Oc/ysjIsH199913cnd3tztnsGXLlnrhhRe0e/du7d69Wz169FDfvn21b9++SvXjKIeDXb9+/dS1a1dFRUVp0aJF2rVrl44ePaq0tLQSXxVR/GTOsLAwxcfHKzAwUEuWLCl1fvGTOcPCwjRixAgNGzZM8+fPt81JTk7WHXfcocGDByskJESxsbEaNGgQN1AGAPwuVee6fFfLzc3V/v37S9xiraJckR+uv/56+fn52b6SkpJKXAzSp08f9erVS23btlXbtm01Z84cNWzYUF988UWl+nGUwxdPtGrVyra8ydNPP13mPIvFIqvVWq5tuupkzujoaL311lvatWuXbrvtNv38889KTExkxW4AqGLcSaPmGD9+vIYOHaqIiAhFRkZq2bJlJdblS09P18qVKyVdWZfvlVde0fjx4zVy5EglJycrISFBa9asKbHta63L98wzz6hPnz4KCgrSqVOnNHv2bOXk5FTq3+TqvhikSEFBgd599139+uuvioyMdLCbynE42D388MNOX87EVTdZHjhwoE6fPq3o6GgZhiGr1aonn3yyxA9Acbm5ucrNzbU9zsnJkSTl5+crPz9fkuTm5ma7IXPxFcCLxq1Wq90l7O7u7nJzcytzvGi7VcFqtcrDw6PM2p3VU1XJz8+XxWJxeU9VpehnwdU9VZXiP9v0VDN7KiwsVEFBge0xPTnvvdzD48o/tVcf5Chr3NPTs8zandnT/fffr1OnTtmty7dx40YFBAQoPz9f6enptk/d8vPz1bJlS/33v//VM888Y1uX71//+pfuvfdeW88eHh62dfkSExNt48V7SktL06BBg5SVlSUfHx917dpVO3bssO3XkZ6K8kPTpk1t+3R3d7flh+Lfk6LvU0ZGhu655x672ps3by6r1aqMjAzbEcSi71NycrK+++47vfrqq7bgV9TT3r17deedd+ry5ctq2LCh1q9frzZt2jjtvbwi+cDhYFfaej3O4uyTObdu3ao5c+Zo8eLF6tq1qw4ePKgxY8bI399fU6dOLXWbc+fO1YwZM0qMb968WfXr15ckBQUFqUuXLvr222/tPnJu166d2rdvr127dun06dO28c6dOys4OFjbt2/X+fPnbeORkZFq3rx5mYtTusKuXbsUFRWlAwcO6Mcff7SNO7unqpKYmCgfHx+X91RVEhMTJcnlPVVyKctyK+pHoiepoj1VTT/Hjh1Tamqq7bHreqqafqSq7OmK4u/lxcNa9+7dVa9ePbufGUnq1auXLl26pE8//dQ25uHhod69eysrK0vJycm28UaNGqlHjx5O7ykoKEgLFy609bRlyxZbnf3797e97xXvafr06XY9Fe+rV69e8vf314YNG5SXl6fExMQSPT300EN66KGHbD0dPXpUqampOnLkiMM9NW7cWNKV8HX27Fnb98kwDF26dMmuxqLv08WLF/XTTz/Znuvevbutxy1btui6666z+z7NmDFDQUFBOn36tDZv3mzXU35+vubPny/DMJSWlqZHHnlEM2bMUGBgoFO+TxcvXlR5WYzq+FW3DHl5eapfv77effddu1uljBkzRqmpqdq2bVuJ19x5553q0qWLFi5caBt777339OCDD+rixYvy9PRUTEyMbr/9ds2bN88256233tLjjz+uCxculHpkqbQjdoGBgcrKyrL9ALnit7w2U6sm3B2c3bNKfnOtqo9dDsyKrZLfxltNqpornQ7MuvLxgKt7qqqft6J+JHoqPl6enqqqn5//HlclR7eqqp8jL/TmiN3vqKeCggLVr19fa9as0X333Werfdy4cUpJSdEnn3xSoqeYmBh17txZCxYssNX+3nvvacCAATp37pzto1gPDw9dvHhRAQEBmjZtmv7yl7/8Zk933323QkNDtXjxYqd8n3JyctSsWTOdO3fOlkHK4pRfnXbu3KnU1FSdO3dO3t7e6ty5c5knX15L8ZM5iwe7pKQk9e3bt9TXREZGauPGjXZjV5/MWdYNlA3DKPOjgbp166pu3bolxj09PUt87u7u7l7qx3RFP+DlHS/t83xXKaqhrNqd1VNVKf5nZ4aeyvszVlt6Ku1n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sRcvXtSZM2dcuQsAAAD8fy4Ldtu3b9eaNWvUrl07V+0CAAAAxTh88USPHj1KHbdarUpPT9eRI0dkGIamTJnicHEAAAAoP4eD3datW0sdt1gsuu6663TPPfdo3Lhx6tmzp6O7AAAAQAVUah07AAAA1ByVvlfsqVOnlJ6ersLCQrVo0UJ+fn7OqAsAAAAV5NDFE7m5uZo3b57atm0rf39/RURE6LbbblOLFi3UrFkzjRs37poLGAMAAMD5Khzsjh07pltvvVUTJkzQwYMH5e/vr9tuu0233nqr/P39debMGS1cuFARERH6+OOPba87ceIEa9oBAAC4UIWCXX5+vnr16qXvvvtOgwYN0v79+3X8+HElJyfriy++0PHjx7V//3499NBDOnPmjPr27avDhw/r4MGDio6O1g8//OCqPgAAAH73KnSO3auvvqp9+/Zp2rRpmjZtWqlz2rVrp1WrVqlt27aaNm2aBg8erCNHjujMmTMKDw93StEAAAAoqUJH7N555x3dcMMNev75539z7pQpU9SmTRt9+eWXysvL04cffqjevXs7XCgAAACurULB7vvvv1dsbKwsFstvzrVYLLa5X375pbp37+5wkQAAAPhtFQp2Fy5ckLe3d7nnN27cWB4eHrrhhhsqXBgAAAAqpkLBrnnz5jp48GC55x86dEjNmzevcFEAAACouAoFu8jISH3wwQfKzMz8zbmZmZnatGmToqOjHS4OAAAA5VehYDdq1ChduHBB/fr1U1ZWVpnzsrOz1a9fP128eFFPPPFEpYsEAADAb6vQcifdu3fXyJEjtXz5coWFhemJJ55Qjx49FBgYKOnK4sWffPKJli9frqysLD3++OO66667XFE3AAAArlLhe8UuXrxYjRs31r/+9S/NnTtXc+fOtXveMAy5ubnpmWeeKfEcAAAAXKfCwc7d3V3z5s3TE088oTfeeEPJycm2c+78/PwUFRWlRx99lCthAQAAqliFg12RG264QXPmzHFmLQAAAKiECl08AQAAgJqLYAcAAGASBDsAAACTINgBAACYBMEOAADAJAh2AAAAJkGwAwAAMAmCHQAAgEkQ7AAAAEyCYAcAAGASBDsAAACTINgBAACYBMEOAADAJAh2AAAAJkGwAwAAMAmCHQAAgEkQ7AAAAEyCYAcAAGASBDsAAACTINgBAACYRI0MdosXL1ZoaKi8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JI0aNUqvvPKKxo8fr5EjRyo5OVkJCQlas2aNbZtjxozRnXfeqX/84x/q27ev3n//fX388cf67LPPqqVHAAAAV6hxwW7AgAHKzs7WzJkzlZGRoQ4dOigxMVHBwcGSpIyMDLs17UJDQ5WYmKhx48Zp0aJFCggI0EsvvaT+/fvb5kRFRWnt2rWaMmWKpk6dqtatW2vdunXq2rVrlfcHAADgKjUu2EnS6NGjNXr06FKfW7FiRYmxbt266euvv77mNh944AE98MADziivRqlbt66mTZtW4mPj2op+ajaz9SOZryf6qdnop2YzQz8WozzXzgIAAKDGq1ELFAMAAMBxBDsAAACTINgBAACYBMEOAADAJAh2ABzCdVcAUPMQ7FAjERpqrpycHEn2918ufvNqwNnOnj0rifeFmu7gwYM6ffp0dZfhNEU/b7Xt545ghxqnoKBAFotF+fn5kswRGi5cuKCTJ08qIyOjukuplN27d+uhhx7SwoUL9eWXX+rSpUuSJDc3N507d66aq3PMsWPHSvxjVNveyIs7evSoPvroI9P8A/v1119rxIgROnPmTI26T7ejCgsLdfToUa1evVpbtmxRYWFhrf55y8rK0qJFixQcHKwhQ4YoNjZWDz30kN566y1dvHixusurlKKft6L/GoZRK75XrGNnApcuXVK9evWquwyn+OGHHxQfH68tW7bo9ttv14wZMxQaGirDMGrtm/qWLVs0d+5cpaSkKDo6Wq+++qp8fX2Vl5cnT0/PWtXXpEmT9MILL6hHjx6yWq0KCwvT3XffrezsbI0fP145OTlyc6tdvy/26NFDnTp10r/+9S9JV968c3NzlZGRoZCQkFr1/ZGkwYMHq06dOlq4cKG8vb117Ngx7d69Wx4eHurdu3et+/786U9/0vr16xUeHq5//etfio6OVmFhoSwWS6373kjS0qVL9dJLLyk3N1f+/v56+eWX1aVLFx0+fFjBwcG17vvz2GOP6fjx4/qf//kf1alTR6+88op+/vlnhYWFqW3btpo9e7bat29f3WVWSGFhoTZs2KDs7Gz9+uuvatGihbp166bmzZtXd2nlQrAzgb/+9a+64447FB4eLj8/v1JXzM7OzlbTpk2robqK6dq1qxo0aKA//OEP2rBhg06fPq2tW7cqJCTENicvL0916tSpviIrwDAMtW3bVj179lR0dLQmTpyo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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"execution_count": 105,
"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\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 = 20000\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": 114,
"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": "code",
"execution_count": null,
"id": "de8e9609-a966-45f7-9afd-4ed230edd794",
"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
}