{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Computing the elements of the local clifford group" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from itertools import product\n", "import sympy\n", "i = sympy.I\n", "exp = sympy.exp\n", "M = sympy.Matrix\n", "simplify = sympy.simplify\n", "from sympy.physics.quantum.dagger import Dagger\n", "\n", "sympy.init_printing()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "I = M([[1, 0], [0, 1]])\n", "X = M([[0, 1], [1, 0]])\n", "Y = M([[0, -i], [i, 0]])\n", "Z = M([[1, 0], [0, -1]])\n", "O = M([[0, 0], [0, 0]])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "H = M([[1, 1], [1, -1]]) / sympy.sqrt(2)\n", "S = M([[1, 0], [0, i]])\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "C = [H, S]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def is_math_the_same(v):\n", " return simplify(v[0] - v[1]) == O\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "from multiprocessing import Pool, cpu_count\n", "\n", "pool = Pool(cpu_count())" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "found Matrix([[1, 0], [0, 1]])\n", "found Matrix([[sqrt(2)/2, sqrt(2)/2], [sqrt(2)*I/2, -sqrt(2)*I/2]])\n", "found Matrix([[sqrt(2)/2, sqrt(2)*I/2], [sqrt(2)/2, -sqrt(2)*I/2]])\n", "found Matrix([[1, 0], [0, -1]])\n", "found Matrix([[1/2 + I/2, 1/2 - I/2], [1/2 - I/2, 1/2 + I/2]])\n", "found Matrix([[sqrt(2)/2, sqrt(2)/2], [-sqrt(2)/2, sqrt(2)/2]])\n", "found Matrix([[sqrt(2)/2, sqrt(2)*I/2], [sqrt(2)*I/2, sqrt(2)/2]])\n", "found Matrix([[sqrt(2)/2, -sqrt(2)/2], [sqrt(2)/2, sqrt(2)/2]])\n", "found Matrix([[1, 0], [0, -I]])\n", "found Matrix([[1/2 + I/2, 1/2 - I/2], [1/2 + I/2, -1/2 + I/2]])\n", "found Matrix([[0, 1], [1, 0]])\n", "found Matrix([[sqrt(2)/2, sqrt(2)/2], [-sqrt(2)*I/2, sqrt(2)*I/2]])\n", "found Matrix([[1/2 + I/2, 1/2 + I/2], [1/2 - I/2, -1/2 + I/2]])\n", "found Matrix([[sqrt(2)/2, sqrt(2)*I/2], [-sqrt(2)/2, sqrt(2)*I/2]])\n", "found Matrix([[sqrt(2)/2, -sqrt(2)/2], [sqrt(2)*I/2, sqrt(2)*I/2]])\n", "found Matrix([[sqrt(2)/2, -sqrt(2)*I/2], [sqrt(2)/2, sqrt(2)*I/2]])\n", "found Matrix([[sqrt(2)*(1 + I)/2, 0], [0, sqrt(2)*(1 - I)/2]])\n", "found Matrix([[1/2 + I/2, 1/2 - I/2], [-1/2 + I/2, -1/2 - I/2]])\n", "found Matrix([[0, 1], [I, 0]])\n", "found Matrix([[1/2 - I/2, 1/2 + I/2], [1/2 + I/2, 1/2 - I/2]])\n", "found Matrix([[1/2 + I/2, 1/2 + I/2], [1/2 + I/2, I*(-1 + I)/2]])\n", "found Matrix([[0, I], [1, 0]])\n", "found Matrix([[sqrt(2)/2, sqrt(2)*I/2], [-sqrt(2)*I/2, -sqrt(2)/2]])\n", "found Matrix([[1/2 + I/2, -1/2 + I/2], [1/2 - I/2, I*(-1 + I)/2]])\n", "found Matrix([[sqrt(2)/2, -sqrt(2)/2], [-sqrt(2)/2, -sqrt(2)/2]])\n", "found Matrix([[sqrt(2)/2, -sqrt(2)*I/2], [sqrt(2)*I/2, -sqrt(2)/2]])\n" ] } ], "source": [ "\n", "#def list_contains_matrix(l, m):\n", "# for elem in l:\n", "# test = simplify(elem - m)\n", "# if(test == 0):\n", "# return True\n", "# return False\n", "\n", "def list_contains_matrix(l, m):\n", " #print(l, m)\n", " for test in pool.map(is_math_the_same, [(e,m) for e in l]):\n", " if(test):\n", " return True\n", "\n", "\n", "#for i in range(10):\n", "while(len(C) < 24):\n", " new_ops = ([c * H for c in C]\n", " + [c * S for c in C])\n", " for new_op in new_ops:\n", " new_op.simplify()\n", " #if(new_op not in C): # and Dagger(new_op) not in C):\n", " if(not list_contains_matrix(C, new_op)):\n", " print(\"found\", new_op)\n", " C.append(new_op)\n", " #else:\n", " #print(new_op, \"is already known\")\n", " " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "for c in C:\n", " c.simplify()\n", "#C = [c for c in C if Dagger(c) not in C]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left[ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2}}{2}\\\\\\frac{\\sqrt{2}}{2} & - \\frac{\\sqrt{2}}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}1 & 0\\\\0 & i\\end{matrix}\\right], \\ \\left[\\begin{matrix}1 & 0\\\\0 & 1\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2}}{2}\\\\\\frac{\\sqrt{2} i}{2} & - \\frac{\\sqrt{2} i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2} i}{2}\\\\\\frac{\\sqrt{2}}{2} & - \\frac{\\sqrt{2} i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}1 & 0\\\\0 & -1\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{1}{2} + \\frac{i}{2} & \\frac{1}{2} - \\frac{i}{2}\\\\\\frac{1}{2} - \\frac{i}{2} & \\frac{1}{2} + \\frac{i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2}}{2}\\\\- \\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2}}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2} i}{2}\\\\\\frac{\\sqrt{2} i}{2} & \\frac{\\sqrt{2}}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & - \\frac{\\sqrt{2}}{2}\\\\\\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2}}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}1 & 0\\\\0 & - i\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{1}{2} + \\frac{i}{2} & \\frac{1}{2} - \\frac{i}{2}\\\\\\frac{1}{2} + \\frac{i}{2} & - \\frac{1}{2} + \\frac{i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}0 & 1\\\\1 & 0\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2}}{2}\\\\- \\frac{\\sqrt{2} i}{2} & \\frac{\\sqrt{2} i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{1}{2} + \\frac{i}{2} & \\frac{1}{2} + \\frac{i}{2}\\\\\\frac{1}{2} - \\frac{i}{2} & - \\frac{1}{2} + \\frac{i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2} i}{2}\\\\- \\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2} i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & - \\frac{\\sqrt{2}}{2}\\\\\\frac{\\sqrt{2} i}{2} & \\frac{\\sqrt{2} i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & - \\frac{\\sqrt{2} i}{2}\\\\\\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2} i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2} \\left(1 + i\\right)}{2} & 0\\\\0 & \\frac{\\sqrt{2} \\left(1 - i\\right)}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{1}{2} + \\frac{i}{2} & \\frac{1}{2} - \\frac{i}{2}\\\\- \\frac{1}{2} + \\frac{i}{2} & - \\frac{1}{2} - \\frac{i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}0 & 1\\\\i & 0\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{1}{2} - \\frac{i}{2} & \\frac{1}{2} + \\frac{i}{2}\\\\\\frac{1}{2} + \\frac{i}{2} & \\frac{1}{2} - \\frac{i}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{1}{2} + \\frac{i}{2} & \\frac{1}{2} + \\frac{i}{2}\\\\\\frac{1}{2} + \\frac{i}{2} & \\frac{i \\left(-1 + i\\right)}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}0 & i\\\\1 & 0\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & \\frac{\\sqrt{2} i}{2}\\\\- \\frac{\\sqrt{2} i}{2} & - \\frac{\\sqrt{2}}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{1}{2} + \\frac{i}{2} & - \\frac{1}{2} + \\frac{i}{2}\\\\\\frac{1}{2} - \\frac{i}{2} & \\frac{i \\left(-1 + i\\right)}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & - \\frac{\\sqrt{2}}{2}\\\\- \\frac{\\sqrt{2}}{2} & - \\frac{\\sqrt{2}}{2}\\end{matrix}\\right], \\ \\left[\\begin{matrix}\\frac{\\sqrt{2}}{2} & - \\frac{\\sqrt{2} i}{2}\\\\\\frac{\\sqrt{2} i}{2} & - \\frac{\\sqrt{2}}{2}\\end{matrix}\\right]\\right]$" ], "text/plain": [ "⎡⎡√2 √2 ⎤ ⎡ √2 √2 ⎤ ⎡√2 √2⋅ⅈ ⎤ ⎡1 ⅈ 1 \n", "⎢⎢── ── ⎥ ⎢ ── ── ⎥ ⎢── ──── ⎥ ⎢─ + ─ ─ \n", "⎢⎢2 2 ⎥ ⎡1 0⎤ ⎡1 0⎤ ⎢ 2 2 ⎥ ⎢2 2 ⎥ ⎡1 0 ⎤ ⎢2 2 2 \n", "⎢⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ \n", "⎢⎢√2 -√2 ⎥ ⎣0 ⅈ⎦ ⎣0 1⎦ ⎢√2⋅ⅈ -√2⋅ⅈ ⎥ ⎢√2 -√2⋅ⅈ ⎥ ⎣0 -1⎦ ⎢1 ⅈ 1 \n", "⎢⎢── ────⎥ ⎢──── ──────⎥ ⎢── ──────⎥ ⎢─ - ─ ─ \n", "⎣⎣2 2 ⎦ ⎣ 2 2 ⎦ ⎣2 2 ⎦ ⎣2 2 2 \n", "\n", " ⅈ⎤ ⎡ √2 √2⎤ ⎡ √2 √2⋅ⅈ⎤ ⎡√2 -√2 ⎤ ⎡1 ⅈ 1 ⅈ ⎤ \n", "- ─⎥ ⎢ ── ──⎥ ⎢ ── ────⎥ ⎢── ────⎥ ⎢─ + ─ ─ - ─ ⎥ \n", " 2⎥ ⎢ 2 2 ⎥ ⎢ 2 2 ⎥ ⎢2 2 ⎥ ⎡1 0 ⎤ ⎢2 2 2 2 ⎥ ⎡0 1⎤ \n", " ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥,\n", " ⅈ⎥ ⎢-√2 √2⎥ ⎢√2⋅ⅈ √2 ⎥ ⎢√2 √2 ⎥ ⎣0 -ⅈ⎦ ⎢1 ⅈ 1 ⅈ⎥ ⎣1 0⎦ \n", "+ ─⎥ ⎢──── ──⎥ ⎢──── ── ⎥ ⎢── ── ⎥ ⎢─ + ─ - ─ + ─⎥ \n", " 2⎦ ⎣ 2 2 ⎦ ⎣ 2 2 ⎦ ⎣2 2 ⎦ ⎣2 2 2 2⎦ \n", "\n", " ⎡ √2 √2 ⎤ ⎡1 ⅈ 1 ⅈ ⎤ ⎡ √2 √2⋅ⅈ⎤ ⎡ √2 -√2 ⎤ ⎡√2 -√2⋅ⅈ ⎤ ⎡\n", " ⎢ ── ── ⎥ ⎢─ + ─ ─ + ─ ⎥ ⎢ ── ────⎥ ⎢ ── ────⎥ ⎢── ──────⎥ ⎢\n", " ⎢ 2 2 ⎥ ⎢2 2 2 2 ⎥ ⎢ 2 2 ⎥ ⎢ 2 2 ⎥ ⎢2 2 ⎥ ⎢\n", " ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢\n", " ⎢-√2⋅ⅈ √2⋅ⅈ⎥ ⎢1 ⅈ 1 ⅈ⎥ ⎢-√2 √2⋅ⅈ⎥ ⎢√2⋅ⅈ √2⋅ⅈ⎥ ⎢√2 √2⋅ⅈ ⎥ ⎢\n", " ⎢────── ────⎥ ⎢─ - ─ - ─ + ─⎥ ⎢──── ────⎥ ⎢──── ────⎥ ⎢── ──── ⎥ ⎢\n", " ⎣ 2 2 ⎦ ⎣2 2 2 2⎦ ⎣ 2 2 ⎦ ⎣ 2 2 ⎦ ⎣2 2 ⎦ ⎣\n", "\n", "√2⋅(1 + ⅈ) ⎤ ⎡ 1 ⅈ 1 ⅈ ⎤ ⎡1 ⅈ 1 ⅈ⎤ ⎡1 ⅈ \n", "────────── 0 ⎥ ⎢ ─ + ─ ─ - ─ ⎥ ⎢─ - ─ ─ + ─⎥ ⎢─ + ─ \n", " 2 ⎥ ⎢ 2 2 2 2 ⎥ ⎡0 1⎤ ⎢2 2 2 2⎥ ⎢2 2 \n", " ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ \n", " √2⋅(1 - ⅈ)⎥ ⎢ 1 ⅈ 1 ⅈ⎥ ⎣ⅈ 0⎦ ⎢1 ⅈ 1 ⅈ⎥ ⎢1 ⅈ ⅈ\n", " 0 ──────────⎥ ⎢- ─ + ─ - ─ - ─⎥ ⎢─ + ─ ─ - ─⎥ ⎢─ + ─ ─\n", " 2 ⎦ ⎣ 2 2 2 2⎦ ⎣2 2 2 2⎦ ⎣2 2 \n", "\n", " 1 ⅈ ⎤ ⎡ √2 √2⋅ⅈ⎤ ⎡1 ⅈ 1 ⅈ ⎤ ⎡ √2 -√2 ⎤ ⎡ √2 \n", " ─ + ─ ⎥ ⎢ ── ────⎥ ⎢─ + ─ - ─ + ─ ⎥ ⎢ ── ────⎥ ⎢ ── \n", " 2 2 ⎥ ⎡0 ⅈ⎤ ⎢ 2 2 ⎥ ⎢2 2 2 2 ⎥ ⎢ 2 2 ⎥ ⎢ 2 \n", " ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ \n", "⋅(-1 + ⅈ)⎥ ⎣1 0⎦ ⎢-√2⋅ⅈ -√2 ⎥ ⎢1 ⅈ ⅈ⋅(-1 + ⅈ)⎥ ⎢-√2 -√2 ⎥ ⎢√2⋅ⅈ \n", "─────────⎥ ⎢────── ────⎥ ⎢─ - ─ ──────────⎥ ⎢──── ────⎥ ⎢──── \n", " 2 ⎦ ⎣ 2 2 ⎦ ⎣2 2 2 ⎦ ⎣ 2 2 ⎦ ⎣ 2 \n", "\n", "-√2⋅ⅈ ⎤⎤\n", "──────⎥⎥\n", " 2 ⎥⎥\n", " ⎥⎥\n", " -√2 ⎥⎥\n", " ──── ⎥⎥\n", " 2 ⎦⎦" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "C" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAAOCAYAAADNGCeJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABZklEQVQ4EXWTgVHDMAxFHY4BcmWDdoMCE5ARwgqwAT1GgA06Q9mgXaHdgG5A0w3Ce8HKNSTV3Y+tL/lbke2ibdtUFMU8pbQC2gM4gRWxg0QYeSXzd/AD7oD+hrwdY2cKSaQA/gdoQRWcI7a+9DO3ga/zPOmUE0kNfBM88xcRfoyuBXv9GyYVaPIvMO3N0svcAskFeHZyzRRz0RHl85Ukd9a2oEJ8+29jW7I2oe9TlB0joe+/8KCXtsTmiTegSNcv102KkbAE3YIQjxE+Dsf4Hsz7WEwuRxKsaurkanjFvAH+toKiO/VRZQQsfUrI0xzw+Ior5smXAzGI0YKoOBaEHyO8VSpY3/LpjBNylwVJr5mKl6Hri/Aujk4c7sjaL+Izr4aLbPgjgXhS0pobnLLImTyrmDKvz67gE83s31fOnjEuEfKyuqGX2+Y/ZXFpeVtj1Z+KebxWNmUHku4jkP/Ah+5vh/UP/Rd43VK9lG9blAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 28$" ], "text/plain": [ "28" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(C)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is bad. Does one have to ignore global phases? Note that the matrices 10 and 18 are the same, disregarding a phase of $pi/4$:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEIAAAAzCAYAAAAjKt6MAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADb0lEQVRoBe1bi3ETMRC1GQrwQAdOBwlUgNMBoQOgAxhXwIQOAhUwuIOECjJJB6EDPO7AvHfsZnQXaXUyOtu60c7IZ31ute9pV6eT7OlkMpkhPZHtdrt5UjiCgul06sVLaA9I2066AhGTMSbgvO5gJfbrZ/ignAP01Ekf/xWP7xMYW1iBsMGqRIwPcSKi533bI7ZO0fYn0hlYPYr5AzZdiv1/cD1BuoRtv6Us6WISIRPLd2hcI71CmidpH7AxbLuD+i8AvmI3YusdrnT9ZDLM0ODII10gMY5+sMNjEID9ADtmsKshgTbRVlyYv2I+VUwiUpXtsf0F+rr39HeLsoV4h6c6XFQqEQtAYrh2Recu1idJcUT0HO0XSSygcXFEwGYFqaPvYlYvmbmFfb6XSEQfXC/7NHLblEiEjrqLQ7+rt3BdkSTFESGPSYL0ub+W5V1HJFG638Y36G7u6VI9gvVJUpxHCDou9bnS7coZCu4dr+nWB/NFEgGg34BojUfpW0Umj9V3yL/XspSr+a5BReiA7DP2dAS4nueq7hYGfcX1UMLRX8IWDZHXyL+BTbQtWaJEQDGXs0cnsGsDoz7nMqzI0MgF3tVTiRA2KhGVCDcwynzpaiPIlKuhUUOj7UrVI6pHVI9oMyC56BKb7bCez3aQ4rVi4ELY/wldnGBZHjzKjBIBJVkPUgbGHFJPAh7PQHyNTCJAgvcgBeV6kHLuU3psZfAEHgeaEntqZD9IMa05YGWMiAVs822W8hWYwvpRSDA04P66EWoB1T1Cq81B6sR+hjbD4gHhYW4iWR6hIHX0XUDqJX3Icu/b5/elgOcO2zLWsUVE7F7WJx+k9FH6v23gDXPo4IEwhfNcdHs/GBq4WUedyrqi3pJ8kNJVFMqLa/9CfYrX8ScM3LNc46qPS4ZHdEsvSAQUbWAM7fQZomVRpqlgF2H/uI8btMki93IhqLvc3PU2JRYa2Q9STGvyV3JuWCkxlvoYEdkPUixjctZJaJ1CZ/NLH+T1NcHbjUkEmMx+kOK1YpjC5hwGGFYggZMnf08alOAc4dyR9SDF0TvoVxBwAwKY+MLF34KZ80SUCCjgpBWddQdFtaNy2N77XcgMjR37L/K2SoQMWyWiEtGO4OoRwoc+NeZ4zOiyuamSp0WbthHkujgB6RF3/eMK/rjyFzozUuFUA8PIAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle \\left[\\begin{matrix}1 & 0\\\\0 & - i\\end{matrix}\\right]$" ], "text/plain": [ "⎡1 0 ⎤\n", "⎢ ⎥\n", "⎣0 -ⅈ⎦" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C[10]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left[\\begin{matrix}\\frac{\\sqrt{2} \\left(1 + i\\right)}{2} & 0\\\\0 & \\frac{\\sqrt{2} \\left(1 - i\\right)}{2}\\end{matrix}\\right]$" ], "text/plain": [ "⎡√2⋅(1 + ⅈ) ⎤\n", "⎢────────── 0 ⎥\n", "⎢ 2 ⎥\n", "⎢ ⎥\n", "⎢ √2⋅(1 - ⅈ)⎥\n", "⎢ 0 ──────────⎥\n", "⎣ 2 ⎦" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C[18]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "XXX: continue here with computations" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "lookup_table = [ca * cb for ca, cb in product(C, C)]\n", "for l in lookup_table:\n", " l.simplify()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(lookup_table) == 24*24" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "ltb = []\n", "row = []\n", "for i, result in enumerate(lookup_table):\n", " if(i % 24):\n", " ltb.append(row)\n", " row = []\n", " row.append(result)\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "#lookup_table = [[C.index(i) for i in row] for row in ltb]\n" ] } ], "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.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }