{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# SU(2) → SO(3) homomorphism\n", "\n", "```{autolink-concat}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Cornwell theorem from the group theory (see for example Section 3, Chapter 5 of {cite}`Cornwell:1997ke`) gives the relation between the rotation of the transition amplitude and the physical vector of polarization sensitivity:\n", "\n", "$$\n", "\\begin{align}\n", " R_{ij}(\\phi,\\theta,\\chi) &= \\frac{1}{2}\\mathrm{tr}\\left(\n", " D^{1/2*}(\\phi,\\theta,\\chi) \\sigma^P_i D^{1/2*\\dagger}(\\phi,\\theta,\\chi) \\sigma^P_j\n", " \\right)\\,,\n", "\\end{align}\n", "$$\n", "\n", "where $\\mathrm{tr}$ represents the trace operation applied to the product of the two-dimensional matrices, $D$ and $\\sigma^P$, and $R_{ij}(\\phi,\\theta,\\chi)$ is a three-dimensional rotation matrix implementing the Euler transformation to a physical vector." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "source_hidden": true }, "mystnb": { "code_prompt_show": "SO(3) rotation with SymPy" }, "tags": [ "full-width", "hide-input" ] }, "outputs": [], "source": [ "from sympy import Matrix, cos, sin, symbols\n", "\n", "\n", "def Rz(α):\n", " return Matrix(\n", " [\n", " [cos(α), -sin(α), 0],\n", " [sin(α), cos(α), 0],\n", " [0, 0, 1],\n", " ]\n", " )\n", "\n", "\n", "def Ry(α):\n", " return Matrix(\n", " [\n", " [cos(α), 0, sin(α)],\n", " [0, 1, 0],\n", " [-sin(α), 0, cos(α)],\n", " ]\n", " )\n", "\n", "\n", "θ, ϕ, χ = symbols(\"theta phi chi\", positive=True)\n", "R_SO3 = Rz(ϕ) @ Ry(θ) @ Rz(χ)\n", "R_SO3" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "source_hidden": true }, "mystnb": { "code_prompt_show": "SU(2) rotation with SymPy" }, "tags": [ "full-width", "hide-input" ] }, "outputs": [], "source": [ "from sympy import S, Trace, conjugate, expand, expand_trig, simplify\n", "from sympy.physics.matrices import msigma\n", "from sympy.physics.quantum.dagger import Dagger\n", "from sympy.physics.quantum.spin import WignerD\n", "\n", "\n", "def R(Dx, i, j):\n", " return Trace(Dx @ msigma(i) @ Dagger(Dx) @ msigma(j)) / 2\n", "\n", "\n", "h = S(1) / 2\n", "Dx = conjugate(\n", " Matrix([[WignerD(h, i, j, ϕ, θ, χ) for i in [+h, -h]] for j in [+h, -h]])\n", ")\n", "Rij = Matrix([[R(Dx, j, i).doit() for i in range(1, 4)] for j in range(1, 4)])\n", "hangle = {\n", " cos(θ / 2) ** 2: (1 + cos(θ)) / 2,\n", " sin(θ / 2) ** 2: (1 - cos(θ)) / 2,\n", "}\n", "R_SU2 = expand_trig(simplify(expand(Rij, complex=True).subs(hangle)))\n", "R_SU2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "assert R_SO3 == R_SU2" ] } ], "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.8.13" } }, "nbformat": 4, "nbformat_minor": 4 }