{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Two-particle systems\n", "An introduction to multi-particle spaces, starting with photon polarization states. This lab answers the question: How do we describe the state of two photons?" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "from numpy import sqrt,pi,sin,cos,arange\n", "from qutip import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The polarization states (in the HV-basis):" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "H = basis(2,0)\n", "V = basis(2,1)\n", "P45 = 1/sqrt(2)*(H+V)\n", "M45 = 1/sqrt(2)*(H-V)\n", "L = 1/sqrt(2)*(H+1j*V)\n", "R = 1/sqrt(2)*(H-1j*V)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Define two-particle states using the `tensor()` function:\n", "Mathematically, we are taking the tensor product of two vectors. That product is a larger vector with twice as many entries as the individual state vectors. As long as we take the tensor products in the right order (i.e. always talking about photon 1 and photon 2 in that order) we can also make operators that act on two-photon states). In order to keep a consistent naming scheme, we'll call the first photon the **signal** photon and the second photon the **idler** photon. The names aren't particularly important but they come from the process we use in the lab: [Spontaneous Parametric Down Conversion](https://en.wikipedia.org/wiki/Spontaneous_parametric_down-conversion) \n", "\n", "First, look at a generic pair of vectors and their tensor product:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Quantum object: dims = [[2], [1]], shape = (2, 1), type = ket\n", "Qobj data =\n", "[[ 1.]\n", " [ 2.]]\n", "Quantum object: dims = [[2], [1]], shape = (2, 1), type = ket\n", "Qobj data =\n", "[[ 3.]\n", " [ 4.]]\n", "Quantum object: dims = [[2, 2], [1, 1]], shape = (4, 1), type = ket\n", "Qobj data =\n", "[[ 3.]\n", " [ 4.]\n", " [ 6.]\n", " [ 8.]]\n" ] } ], "source": [ "A = Qobj([[1],[2]])\n", "B = Qobj([[3],[4]])\n", "print(A)\n", "print(B)\n", "print(tensor(A,B))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So we see that the tensor product has the following elements: 1\\*3 = 3, 1\\*4 = 4, 2\\*3 = 6, 2\\*4 = 8. Essentially, we distributed the multiplication of the first vector through the second vector. Using the technical terms of vector spaces, the tensor product exists in a larger Hilbert space (the number of dimensions is the product of the dimensions of the original states). See this with larger initial states: two 3-dim vectors have a tensor product in 9-dim space:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Quantum object: dims = [[3, 3], [1, 1]], shape = (9, 1), type = ket\n", "Qobj data =\n", "[[ 4.]\n", " [ 5.]\n", " [ 6.]\n", " [ 8.]\n", " [ 10.]\n", " [ 12.]\n", " [ 12.]\n", " [ 15.]\n", " [ 18.]]\n" ] } ], "source": [ "C = Qobj([[1],[2],[3]])\n", "D = Qobj([[4],[5],[6]])\n", "print(tensor(C,D))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, back to the quantum mechanics. Form the four different combinations of two photons:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "HH = tensor(H,H)\n", "HV = tensor(H,V)\n", "VH = tensor(V,H)\n", "VV = tensor(V,V)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[2, 2], [1, 1]], shape = (4, 1), type = ket\\begin{equation*}\\left(\\begin{array}{*{11}c}1.0\\\\0.0\\\\0.0\\\\0.0\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[2, 2], [1, 1]], shape = (4, 1), type = ket\n", "Qobj data =\n", "[[ 1.]\n", " [ 0.]\n", " [ 0.]\n", " [ 0.]]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# How do we represent HH? It is a vector with four elements.\n", "HH" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So we interpret the state $|HH\\rangle$ as the vector (1,0,0,0) in a four-dimensional space." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Recall: The polarization measurement operator (for one photon):" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\\begin{equation*}\\left(\\begin{array}{*{11}c}1.0 & 0.0\\\\0.0 & -1.0\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\n", "Qobj data =\n", "[[ 1. 0.]\n", " [ 0. -1.]]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phv = H*H.dag() - V*V.dag()\n", "Phv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Also, the identity is defined as `qeye(n)` for `n` dimensions in qutip:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\\begin{equation*}\\left(\\begin{array}{*{11}c}1.0 & 0.0\\\\0.0 & 1.0\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\n", "Qobj data =\n", "[[ 1. 0.]\n", " [ 0. 1.]]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qeye(2) # 2-dimensional identity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The two-photon operator, measuring the **signal** photon, is formed with the `tensor()` function. It is the tensor product of the projection operator `Phv` and the 2-dimensional identity operator `qeye(2)`. The trick is putting them in the correct order. The first element in the tensor product acts on the signal photon, the second acts on the idler photon. So to act on only the signal photon, we create a tensor product with the projection operator first, and the identity second:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[2, 2], [2, 2]], shape = (4, 4), type = oper, isherm = True\\begin{equation*}\\left(\\begin{array}{*{11}c}1.0 & 0.0 & 0.0 & 0.0\\\\0.0 & 1.0 & 0.0 & 0.0\\\\0.0 & 0.0 & -1.0 & 0.0\\\\0.0 & 0.0 & 0.0 & -1.0\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[2, 2], [2, 2]], shape = (4, 4), type = oper, isherm = True\n", "Qobj data =\n", "[[ 1. 0. 0. 0.]\n", " [ 0. 1. 0. 0.]\n", " [ 0. 0. -1. 0.]\n", " [ 0. 0. 0. -1.]]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phv_s = tensor(Phv,qeye(2))\n", "Phv_s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It can be hard to interpret these values visually but remember it was constructed by multiplying all the terms between two matrices with only diagonal elements. It makes sense that the result is also diagonal. Also, the sign of the diagonal depends on the state of the signal photon (the first one listed). Recall the states are in the order: HH, HV, VH, VV so the first two states have H signal photons and are therefore 1, and the second two states are V signal photons so -1 for those diagonals." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now construct the two-photon operator that measures the idler photon:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[2, 2], [2, 2]], shape = (4, 4), type = oper, isherm = True\\begin{equation*}\\left(\\begin{array}{*{11}c}1.0 & 0.0 & 0.0 & 0.0\\\\0.0 & -1.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 1.0 & 0.0\\\\0.0 & 0.0 & 0.0 & -1.0\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[2, 2], [2, 2]], shape = (4, 4), type = oper, isherm = True\n", "Qobj data =\n", "[[ 1. 0. 0. 0.]\n", " [ 0. -1. 0. 0.]\n", " [ 0. 0. 1. 0.]\n", " [ 0. 0. 0. -1.]]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phv_i = tensor(qeye(2),Phv)\n", "Phv_i" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, construct a projection operator that projects the idler photon to H:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "Ph = H*H.dag()\n", "Ph_i = tensor(qeye(2),Ph) # Ph for idler photon" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And the same but for the signal photon:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "Ph_s = tensor(Ph,qeye(2)) # Ph for signal photon" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You start to see the pattern. Build these up from our earlier operators, just apply them to the specific particle by including them in the tensor product at that position.\n", "\n", "Next we will do some example calculations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example: find the probability of measuring a horizontal idler photon if the system is prepared in the state $|HH\\rangle$" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\\begin{equation*}\\left(\\begin{array}{*{11}c}1.0\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\n", "Qobj data =\n", "[[ 1.]]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HH.dag()*Ph_i*HH" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example: find the probability of measuring a horizontal idler photon in the state $|\\psi\\rangle = |H,+45\\rangle$" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "psi = tensor(H,P45) # the prepared state" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\\begin{equation*}\\left(\\begin{array}{*{11}c}0.500\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\n", "Qobj data =\n", "[[ 0.5]]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "psi.dag()*Ph_i*psi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 8.2 prob. of measuring vertical signal and horizontal idler if $|\\psi\\rangle = |R,+45\\rangle$" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\\begin{equation*}\\left(\\begin{array}{*{11}c}0.250\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\n", "Qobj data =\n", "[[ 0.25]]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# First, form the prepared state:\n", "psi = tensor(R,P45)\n", "\n", "# Then create the projection operator for the state we are asking about:\n", "projection = VH*VH.dag()\n", "\n", "# Finally, calculate the probability by computing the bra-ket:\n", "psi.dag()*projection*psi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Entangled states:\n", "\n", "A very interesting system can be set up where there are paired photons being created with unknown but correlated polarization. In this case, we can say the state is in a combination of $|HH\\rangle$ and $|VV\\rangle$. If either two-photon state is allowed, then the normalized state is $$\\big|\\phi^+\\big\\rangle = \\frac{1}{\\sqrt{2}}\\big( \\big|HH\\big\\rangle + \\big|VV\\big\\rangle \\big)$$" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "phiPlus = 1/sqrt(2)*(HH + VV)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\\begin{equation*}\\left(\\begin{array}{*{11}c}0.500\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\n", "Qobj data =\n", "[[ 0.5]]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phiPlus.dag()*Ph_i*phiPlus # probability of measuring a horizontal idler photon:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is expected, because the HH state has 50% of the probability amplitude. Same for a horizontal signal photon:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\\begin{equation*}\\left(\\begin{array}{*{11}c}0.500\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\n", "Qobj data =\n", "[[ 0.5]]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phiPlus.dag()*Ph_s*phiPlus # probability of measuring a horizontal signal photon" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Now, find $P(H_s|H_i)$ (Example 8.5)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\\begin{equation*}\\left(\\begin{array}{*{11}c}0.500\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\n", "Qobj data =\n", "[[ 0.5]]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Projection operator for H idler and H signal:\n", "phh = HH*HH.dag()\n", "phiPlus.dag()*phh*phiPlus" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\\begin{equation*}\\left(\\begin{array}{*{11}c}0.500\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\n", "Qobj data =\n", "[[ 0.5]]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Projection operator for H idler\n", "Pih = tensor(qeye(2),H*H.dag())\n", "phiPlus.dag()*Pih*phiPlus" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$P(H_s|H_i) = \\frac{P(H_s,H_i)}{P(H_i)}$" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "0.5/0.5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Guaranteed to measure a horizontal signal photon whenever a horizontal idler photon is measured. What about vertical? Find the conditional probability of measuring a vertical signal photon if the idler photon is found to be vertical:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, measure a different basis (use the +45 states) to show that the photons are always found in the same polarization even when measured at a different angle:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[1], [1]], shape = [1, 1], type = oper, isherm = True\\begin{equation*}\\left(\\begin{array}{*{11}c}0.500\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[1], [1]], shape = [1, 1], type = oper, isherm = True\n", "Qobj data =\n", "[[ 0.5]]" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Solution\n", "\n", "# Probability that signal is +45 and idler +45\n", "Pp45p45 = tensor(P45,P45) * tensor(P45,P45).dag()\n", "phiPlus.dag()*Pp45p45*phiPlus" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[1], [1]], shape = [1, 1], type = oper, isherm = True\\begin{equation*}\\left(\\begin{array}{*{11}c}0.500\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[1], [1]], shape = [1, 1], type = oper, isherm = True\n", "Qobj data =\n", "[[ 0.5]]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Solution\n", "\n", "# Probability that the idler is +45 regardless of the signal\n", "Pp45i = tensor(qeye(2),P45) * tensor(qeye(2),P45).dag()\n", "phiPlus.dag()*Pp45i*phiPlus" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, to really drive this odd point home, show that they are **never** found in the $\\big|+45,-45\\big\\rangle$ state:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "Quantum object: dims = [[1], [1]], shape = [1, 1], type = oper, isherm = True\\begin{equation*}\\left(\\begin{array}{*{11}c}0.0\\\\\\end{array}\\right)\\end{equation*}" ], "text/plain": [ "Quantum object: dims = [[1], [1]], shape = [1, 1], type = oper, isherm = True\n", "Qobj data =\n", "[[ 0.]]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Solution\n", "\n", "# Probability that they are in different 45 states:\n", "Pp45m45 = tensor(P45,M45) * tensor(P45,M45).dag()\n", "\n", "phiPlus.dag()*Pp45m45*phiPlus" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using these states solve problems 8.2, 8.3, 8.7, 8.8" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernel_info": { "name": "python3" }, "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.7.4" }, "nteract": { "version": "0.8.4" } }, "nbformat": 4, "nbformat_minor": 1 }