bachelor_thesis/computations/C_L_as_products.ipynb

619 lines
69 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Lookup table of the Local Clifford Group for local graph complementation"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"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{\\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{\\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}}{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{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}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}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}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{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{i \\left(-1 + i\\right)}{2}\\\\- \\frac{1}{2} + \\frac{i}{2} & \\frac{i \\left(-1 + i\\right)}{2}\\end{matrix}\\right]\\right]$"
],
"text/plain": [
"⎡⎡√2 √2 ⎤ ⎡ √2 √2 ⎤ ⎡√2 √2⋅ ⎤ ⎡ √2 √2⋅\n",
"⎢⎢── ── ⎥ ⎢ ── ── ⎥ ⎢── ──── ⎥ ⎢ ── ───\n",
"⎢⎢2 2 ⎥ ⎡1 0⎤ ⎡1 0⎤ ⎢ 2 2 ⎥ ⎢2 2 ⎥ ⎡1 0 ⎤ ⎢ 2 2 \n",
"⎢⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ \n",
"⎢⎢√2 -√2 ⎥ ⎣0 ⅈ⎦ ⎣0 1⎦ ⎢√2⋅ -√2⋅ ⎥ ⎢√2 -√2⋅ ⎥ ⎣0 -1⎦ ⎢√2⋅ √2\n",
"⎢⎢── ────⎥ ⎢──── ──────⎥ ⎢── ──────⎥ ⎢──── ──\n",
"⎣⎣2 2 ⎦ ⎣ 2 2 ⎦ ⎣2 2 ⎦ ⎣ 2 2 \n",
"\n",
"ⅈ⎤ ⎡√2 -√2 ⎤ ⎡ √2 -√2 ⎤ ⎡√2 -√2⋅ ⎤ ⎡ √2 -√2⋅ ⎤ ⎡1 1\n",
"─⎥ ⎢── ────⎥ ⎢ ── ────⎥ ⎢── ──────⎥ ⎢ ── ──────⎥ ⎢─ + ─ ─\n",
" ⎥ ⎢2 2 ⎥ ⎡1 0 ⎤ ⎢ 2 2 ⎥ ⎢2 2 ⎥ ⎢ 2 2 ⎥ ⎢2 2 2\n",
" ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ \n",
" ⎥ ⎢√2 √2 ⎥ ⎣0 -ⅈ⎦ ⎢√2⋅ √2⋅⎥ ⎢√2 √2⋅ ⎥ ⎢√2⋅ -√2 ⎥ ⎢1 1\n",
" ⎥ ⎢── ── ⎥ ⎢──── ────⎥ ⎢── ──── ⎥ ⎢──── ──── ⎥ ⎢─ - ─ ─\n",
" ⎦ ⎣2 2 ⎦ ⎣ 2 2 ⎦ ⎣2 2 ⎦ ⎣ 2 2 ⎦ ⎣2 2 2\n",
"\n",
" ⅈ⎤ ⎡ √2 √2⎤ ⎡ √2 √2 ⎤ ⎡ 1 1 ⅈ⎤ ⎡\n",
" - ─⎥ ⎢ ── ──⎥ ⎢ ── ── ⎥ ⎢ ─ - ─ ─ + ─⎥ ⎢\n",
" 2⎥ ⎢ 2 2 ⎥ ⎡0 1⎤ ⎢ 2 2 ⎥ ⎡0 1⎤ ⎢ 2 2 2 2⎥ ⎡0 ⅈ⎤ ⎢\n",
" ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢\n",
" ⅈ⎥ ⎢-√2 √2⎥ ⎣1 0⎦ ⎢-√2⋅ √2⋅⎥ ⎣ⅈ 0⎦ ⎢ 1 1 ⅈ⎥ ⎣1 0⎦ ⎢\n",
" + ─⎥ ⎢──── ──⎥ ⎢────── ────⎥ ⎢- ─ + ─ ─ + ─⎥ ⎢\n",
" 2⎦ ⎣ 2 2 ⎦ ⎣ 2 2 ⎦ ⎣ 2 2 2 2⎦ ⎣\n",
"\n",
" √2 √2⋅⎤ ⎡ 1 1 ⅈ⎤ ⎡ √2 -√2 ⎤ ⎡ 1 ⅈ⋅(-1 \n",
" ── ────⎥ ⎢ ─ - ─ - ─ + ─⎥ ⎢ ── ──── ⎥ ⎢ ─ - ─ ──────\n",
" 2 2 ⎥ ⎢ 2 2 2 2⎥ ⎡0 -1⎤ ⎢ 2 2 ⎥ ⎢ 2 2 2 \n",
" ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ ⎥, ⎢ \n",
"-√2⋅ -√2 ⎥ ⎢ 1 1 ⅈ⎥ ⎣1 0 ⎦ ⎢-√2⋅ -√2⋅ ⎥ ⎢ 1 ⅈ⋅(-1 \n",
"────── ────⎥ ⎢- ─ + ─ - ─ + ─⎥ ⎢────── ──────⎥ ⎢- ─ + ─ ──────\n",
" 2 2 ⎦ ⎣ 2 2 2 2⎦ ⎣ 2 2 ⎦ ⎣ 2 2 2 \n",
"\n",
"+ )⎤⎤\n",
"────⎥⎥\n",
" ⎥⎥\n",
" ⎥⎥\n",
"+ )⎥⎥\n",
"────⎥⎥\n",
" ⎦⎦"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sympy\n",
"\n",
"M = sympy.Matrix\n",
"simplify = sympy.simplify\n",
"sqrt = sympy.sqrt\n",
"i = sympy.I\n",
"\n",
"from sympy.physics.quantum import Dagger\n",
"\n",
"sympy.init_printing()\n",
"H = simplify(M([[1, 1], [1, -1]]) / sqrt(2))\n",
"S = M([[1, 0], [0, i]])\n",
"C_L = [H, S]\n",
"basis_vectors = [M([1, 0]), M([0, 1])]\n",
"\n",
"def getitem(m, i, j):\n",
" # Note that sympy uses an extremely weird way to store the matrices,\n",
" # in particular the internal representation is vastly different from what\n",
" # is printed. For instance the H matrix is stored as a Mul object\n",
" # (even after using simplify) instead of a matrix. \n",
" # Therefore m[i][j] will NOT work. This is a workaround.\n",
" return (Dagger(basis_vectors[i]) * m * basis_vectors[j])[0]\n",
"\n",
"def is_known(C_L, a):\n",
" for c in C_L:\n",
" test = c * Dagger(a)\n",
" if(simplify(getitem(test, 0, 1)) != 0):\n",
" continue\n",
" if(simplify(getitem(test, 0, 0) / getitem(test, 1, 1)) == 1):\n",
" return True\n",
" return False\n",
"for i in range(5):\n",
" for m in (H, S):\n",
" for c in C_L:\n",
" c = simplify(c*m)\n",
" if(is_known(C_L, c)):\n",
" continue\n",
" C_L.append(c)\n",
"C_L"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from sympy import exp,pi, I as i\n",
"\n",
"siZ = exp(i*pi/4)*Dagger(S)\n",
"smiX = simplify(M([[1, -i], [-i, 1]]) / sqrt(2))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def eval_str(s):\n",
" result = M([[1, 0], [0, 1]])\n",
" for c in s:\n",
" if(c == \"s\"):\n",
" result *= siZ\n",
" if(c == \"x\"):\n",
" result *= smiX\n",
" return result\n",
"\n",
"\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAHQAAAA1CAYAAACQns/uAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFf0lEQVR4Ae2cj3XUOBDGszwKyDs6WDoIUMGFDoAOODo4XirgcR1ABzzSQaCCu6QD6ICQDsL3WzR7slZreW3Z1u5K7ykrj0fyzHyakfxnsri/vz+p5XAs8GAMVRaLxfUY49Yx0xZYiOU0xibPvYvRK60MC8hporjhoXjTz6C+7yO2LvJC9W+q31/H56rXqj+D3w8+X23vZIHP4g5x+2wh97k8cuHVNzsN3WT+rsPHTdLJicZ+ItpH9/uOX9Uh1wkvcVTHsl0DMym/suXDnFbQRS7lgVca860/ruhfRF96tGdeuzYzWsA8NMuQAo24vhSAN2qfB4MCMmBTzhzv76P6N5sFcnvonYACTNbQj4GU13iqozU8OODbu0Ppa3uOHxKe5ea9dGXpmbxkBRTppcjLmBairwFW+zLGs480gcmmkj3BSicdE6XYALLGTQ5qtpArBe771n0EEpml71/6OTUwoanN7R7gzrKDzwaoFPF3yTu1McSeFqLRTUT2f0XjVi16rxjhz0bKBmhKIil3NYeCKbkGnmfjdxsZAy+lhBvD39QR/3ZaQx0QF5KDRZ/Cwv/WhZcVoe2P+hOalm08+3au4+T8Y2q9kh4qwZllLPyfBOA/VLVZHwA4WdT/hZhsd5vk3yMGA8u80RfdvHbykNvqoQIDr+Le8Y2A9NcKQLZ7Sl+RRlv9z0S4U9/vajfOHcnBo6n1bAVUwthO7VSAcG9pAl4JpFavEz+z86n41rcrUys38vXMC2OXMe+1JSrGMwotBSieeClQCLO7FpSyiUBfvP1CQH/AYyHsc5EOPERBhVhYNdrkeibXUAncSyhAcxPhUD0UMIlSTNSwmIe2RrGwU47jFKBbwdTsZLOTLMxkgFXl3pSd8dYxk4OVx8ArrKcRsXizdCNd7yLnRiWlAOUZJWF3XVgbCZsi+Juk9fljaggwos+tP7mxj2ivVF/PYYvWNRSBHYAAu17gRa/vMf9HC29kb2Chl1eDf8pGs0z4VkCRWYL12RDR9SiK7ENYLebtUSrkHgUoh6RkBfSQ0JQuFdAK6IFZ4MDUqR5aAT0wCxyYOtVDZwRU9668lsxaKqBZzbnbYLqH5aFE1lIBzWrOboPJM0dLGamAdsNgDC5eUmRPGUk++htDk2MfU6F2tJSR6qEzzC5eeOiyo6SMVEBnANQ90LeUkf8CEQaljGQNuZp5xeR4BEbKeig9+b7qsYDp/RpRfUdJGckGqJTknqqYHI+sCG4OBpBF5udkAVRgRnM8RLccj+ebNtlfirxrY3faVRvZpPd/KdF1k9/C5lpDi8vx6GrgqfkApW/tImsuQM91sdh3qvaRFOdr6WABefCgHKDBIVcCsAVPFfusMcVX7HmnJ0sL4fabvGzj0xzHQ4qIfX81eQ5QDg81sMwbfVDMa7uA7vcrsX3hQOTTzY28HoFJFGJjOGsO0GAP7Wh5S6HoyF4Wm8BaSiJyPinsFxrfFrvzReQA5QDUvHClbfDHvNdCUHB6ukMXDr/qirtEi5fySj7HvNWv3aYQdsOv/IrJARoMqBQtMscjnCrIKVqv11WuLyn4li0QpncQbovIAcqxhmK74nI8EGqEwtoJcLH9QiMMd722xsqaA5QL0OJyPLoatCufC9ln4v9EHx3bY04Ot4LpeTV8WwuTRHVwDlAWQCVIcTkeWy3X/8QqKUm68uqLTdI3byjAJeyuCxNAlbWVNXiyMngN9SQtKsfDkytLU0Dy7+2oPJjHm9brKG0HIMCuN4Ci935431fobIBKeNaVcPfXV64i+0nHrc+kdW7jQcMcSmQJuXMIXq8Zt4B56JKQ4bM4j/NJtV2QBUK8JNoKP17HsLizyPuF/2s7efz3BajtdgsIUJ5MNTZiOv7yCyjWjW+RDHHDAAAAAElFTkSuQmCC\n",
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}e^{\\frac{i \\pi}{4}} & 0\\\\0 & - i e^{\\frac{i \\pi}{4}}\\end{matrix}\\right]$"
],
"text/plain": [
"⎡ ⅈ⋅π ⎤\n",
"⎢ ─── ⎥\n",
"⎢ 4 ⎥\n",
"⎢ℯ 0 ⎥\n",
"⎢ ⎥\n",
"⎢ ⅈ⋅π⎥\n",
"⎢ ───⎥\n",
"⎢ 4 ⎥\n",
"⎣ 0 -ⅈ⋅ℯ ⎦"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eval_str(\"s\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAEIAAAAzCAYAAAAjKt6MAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADZElEQVRoBe1bi5HTMBC1GQq4gQ5CB3wqINcBRwdABzCpgDk6ODpgSAc5KmDuOjg6IJMOwntm90ZyZEtrK87EI80osWVpd9/TriJrJ3VVVReoB2W/3+8OGmfQUNd1EC+hPaDuW/UGRFRzrMC5aWEl9s0TfLBcAnTt1E//m+f3CYweViBssCoR80NsRPTU2L9CjH3GmBdg9uReA1uuxf6/tAn1Gnb9kTbTl5kISCcBa5OWI3QGCXcQ+xXAG1tkEbzDN13fTIaZCCgh8yctAPsRBlwoCTQG1zu0k5Qb1Eu2Wcq5rhFXAHkfAPobbUvxjsDj7qZzJWIJSNsALN378LmpJIWGMEx3ZFg8wA2/mbRk7Jw428+sKlM9YiXgf0LByqokc38FqbPvilcv6dw9up3d6ygRmIEFBjD2WBib5hW5GTntx3OruigRELh1VmeGxw+rksz9ddZDYtVbuK8wlSgR/FmiRHjGO5H83aQhc2e1B2JD7q9tZq+NEuHg4NqwdgxxHk1+eQuNDNl2UY/gc1NJIkJW6peQ3IQF7nVra1KWsTMX7dcBea/Qdj9kspKIUKVQsJbFk6/uJyuwg+G5dcKVocuweI/6YYhhSfsIKL6FIla+cO3EkCH6co7h7K9gk4bIG9y/hW2hHWdUbxIRlAIF5v17VPuIDrCHi/iXESK8oamh4Q2a400hQma1EFGI8AO8eETxiOIRPgPFI3w+yhpRPML3iKQtNvbz+rY5OpHiq5/mTt6RepNSUSIgJGsiZRroB1qiSaleIkBC9kTKgYkTNOAFLZqUii2W2RMpE+AepCJGxBJSQ4elfAVm4fNZlM7QQFjoQWgfUD0j7Otzkmdif3JSqs8jFKTOvgtIvSSFLHfclNempFQfESlGmxMpKULH9oE3LCDDlJTqDA0I0lkP2aXeYk6khISF2sS1f+GZxeuu5MyynZSKHul1EsEzQRhDG0OGaJs5kRICHWqTM0ke0JqLjDUlpWKhkT2RYkY1bkByUipGRPZEyjhc6aMltJKTUr1EwMWyJ1LSoYzu2WTCgCEpKdW5RjhmZE2kOHKPegkCTEmpKBGy8ERX3aOiGigcticnpXpDY6D+sxxWiJBpK0QUIvwILh4hfOivxkI2II80ya/F4/1cLto4gUtfF8ofV0DG5h8Y3m3ea2xiTwAAAABJRU5ErkJggg==\n",
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}i & 0\\\\0 & - i\\end{matrix}\\right]$"
],
"text/plain": [
"⎡ⅈ 0 ⎤\n",
"⎢ ⎥\n",
"⎣0 -ⅈ⎦"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eval_str(\"ss\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def get_product_index(a):\n",
" for i,c in enumerate(C_L):\n",
" test = c * Dagger(a)\n",
" if(simplify(getitem(test, 0, 1)) != 0):\n",
" continue\n",
" if(simplify(getitem(test, 0, 0) / getitem(test, 1, 1)) == 1):\n",
" return i\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"from itertools import product\n",
"from collections import defaultdict\n",
"\n",
"results = defaultdict(set)\n",
"\n",
"def recursive_xs_products(length):\n",
" if(length == 1):\n",
" yield \"x\"\n",
" yield \"s\"\n",
" else:\n",
"\n",
" for p in recursive_xs_products(length - 1):\n",
" yield p\n",
" yield p + \"x\"\n",
" yield p + \"s\"\n",
" \n",
" \n",
"for p in recursive_xs_products(5):\n",
" results[get_product_index(eval_str(p))] |= {p}\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"defaultdict(set,\n",
" {12: {'ssssx', 'x', 'xssss', 'xxxxx'},\n",
" 14: {'sxxs', 'xx'},\n",
" 22: {'xs'},\n",
" 6: {'ssxss', 'sxsxs', 'sxxsx', 'xsxxs', 'xxx'},\n",
" 16: {'sssxx', 'sxxss', 'xxs'},\n",
" 20: {'sxs', 'xsx'},\n",
" 19: {'ssxxx', 'xss', 'xxssx'},\n",
" 2: {'ssss', 'xxxx'},\n",
" 3: {'xxxs'},\n",
" 17: {'sxss', 'xsxs', 'xxsx'},\n",
" 21: {'ssxx', 'xxss'},\n",
" 9: {'ssxs', 'sxsx', 'xsxx'},\n",
" 5: {'ss', 'xssx'},\n",
" 15: {'xsss'},\n",
" 8: {'s', 'sssss', 'sxxxx', 'xxxxs'},\n",
" 13: {'sxsss', 'xsxss', 'xxsxs', 'xxxsx'},\n",
" 11: {'ssx', 'xssxx', 'xxxss'},\n",
" 1: {'sss', 'sxssx', 'xssxs', 'xsxsx', 'xxsxx'},\n",
" 18: {'ssxxs', 'sxx', 'xxsss'},\n",
" 7: {'sssxs', 'ssxsx', 'sxsxx', 'xsxxx'},\n",
" 0: {'sxxxs', 'xsssx'},\n",
" 23: {'sx'},\n",
" 4: {'sxxx'},\n",
" 10: {'sssx'}})"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"lookup_table = [min(v) for k,v in sorted(results.items(), key=lambda x:x[0])]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['sxxxs',\n",
" 'sss',\n",
" 'ssss',\n",
" 'xxxs',\n",
" 'sxxx',\n",
" 'ss',\n",
" 'ssxss',\n",
" 'sssxs',\n",
" 's',\n",
" 'ssxs',\n",
" 'sssx',\n",
" 'ssx',\n",
" 'ssssx',\n",
" 'sxsss',\n",
" 'sxxs',\n",
" 'xsss',\n",
" 'sssxx',\n",
" 'sxss',\n",
" 'ssxxs',\n",
" 'ssxxx',\n",
" 'sxs',\n",
" 'ssxx',\n",
" 'xs',\n",
" 'sx']"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lookup_table"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}- \\frac{\\sqrt{2} i}{2} & - \\frac{\\sqrt{2} i}{2}\\\\- \\frac{\\sqrt{2} i}{2} & \\frac{\\sqrt{2} i}{2}\\end{matrix}\\right]$"
],
"text/plain": [
"⎡-√2⋅ -√2⋅ ⎤\n",
"⎢────── ──────⎥\n",
"⎢ 2 2 ⎥\n",
"⎢ ⎥\n",
"⎢-√2⋅ √2⋅ ⎥\n",
"⎢────── ──── ⎥\n",
"⎣ 2 2 ⎦"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eval_str(\"sxxxs\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}\\frac{i e^{\\frac{i \\pi}{4}}}{2} + \\frac{e^{\\frac{i \\pi}{4}}}{2} & \\frac{i e^{\\frac{i \\pi}{4}}}{2} + \\frac{e^{\\frac{i \\pi}{4}}}{2}\\\\\\frac{i e^{\\frac{i \\pi}{4}}}{2} + \\frac{e^{\\frac{i \\pi}{4}}}{2} & - \\frac{e^{\\frac{i \\pi}{4}}}{2} - \\frac{i e^{\\frac{i \\pi}{4}}}{2}\\end{matrix}\\right]$"
],
"text/plain": [
"⎡ ⅈ⋅π ⅈ⋅π ⅈ⋅π ⅈ⋅π ⎤\n",
"⎢ ─── ─── ─── ─── ⎥\n",
"⎢ 4 4 4 4 ⎥\n",
"⎢ⅈ⋅ℯ ⅈ⋅ℯ ⎥\n",
"⎢────── + ──── ────── + ──── ⎥\n",
"⎢ 2 2 2 2 ⎥\n",
"⎢ ⎥\n",
"⎢ ⅈ⋅π ⅈ⋅π ⅈ⋅π ⅈ⋅π⎥\n",
"⎢ ─── ─── ─── ───⎥\n",
"⎢ 4 4 4 4 ⎥\n",
"⎢ⅈ⋅ℯ ⅈ⋅ℯ ⎥\n",
"⎢────── + ──── - ──── - ──────⎥\n",
"⎣ 2 2 2 2 ⎦"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eval_str(\"xsssx\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"lookup_table_lengths = [len(l) for l in lookup_table]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$\\displaystyle \\left[ 5, \\ 3, \\ 4, \\ 4, \\ 4, \\ 2, \\ 5, \\ 5, \\ 1, \\ 4, \\ 4, \\ 3, \\ 5, \\ 5, \\ 4, \\ 4, \\ 5, \\ 4, \\ 5, \\ 5, \\ 3, \\ 4, \\ 2, \\ 2\\right]$"
],
"text/plain": [
"[5, 3, 4, 4, 4, 2, 5, 5, 1, 4, 4, 3, 5, 5, 4, 4, 5, 4, 5, 5, 3, 4, 2, 2]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lookup_table_lengths"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAYAAAASVl2WAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAWUlEQVQYGWP4//8/AwwzMDAYAfFdIBaAibEwMjIKAAVmA/E7IDYBYiUgRgCYShANBGVADGLATWACieIDowogoUMwHBhBQQyMj9VA9aA4AcUFiL4HxOeA+DQAT1cpCApe64MAAAAASUVORK5CYII=\n",
"text/latex": [
"$\\displaystyle 1$"
],
"text/plain": [
"1"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_product_index(Dagger(siZ))"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA00lEQVQoFXWSgQ2CQAxF74gDEEfADYwjMAKJG7iKYQRHMIwgK8gGsoHBDfD940oaEpqU9v/+a3sX4jzPwVuMsfWY/IlmCBJmcQX5wWvHdeKECxIzkT1kbwSxxMeEc7cGoB1K67aNNvaNaNoWPT6ktiGciQMXUbziX/yEd4jXVbSHxqrrzXcBT3gjTmZC8PICFqk9cInLAvJHIltut+T21RQ1utjzSGQHTORj5YU6uWejPU+NYndH7ZyEKQnhhbhVnrEmrLeOmUwj8w9hKxwh79QHFf8zQq2xR+TPOQAAAABJRU5ErkJggg==\n",
"text/latex": [
"$\\displaystyle 6$"
],
"text/plain": [
"6"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_product_index(Dagger(smiX))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"def str2vops(s):\n",
" c2v = {'s': 1, 'x': 6}\n",
" result = [c2v[c] for c in s]\n",
" return result + ([0] * (5 - len(result)))\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$\\displaystyle \\left[ \\left[ 1, \\ 6, \\ 6, \\ 6, \\ 1\\right], \\ \\left[ 1, \\ 1, \\ 1, \\ 0, \\ 0\\right], \\ \\left[ 1, \\ 1, \\ 1, \\ 1, \\ 0\\right], \\ \\left[ 6, \\ 6, \\ 6, \\ 1, \\ 0\\right], \\ \\left[ 1, \\ 6, \\ 6, \\ 6, \\ 0\\right], \\ \\left[ 1, \\ 1, \\ 0, \\ 0, \\ 0\\right], \\ \\left[ 1, \\ 1, \\ 6, \\ 1, \\ 1\\right], \\ \\left[ 1, \\ 1, \\ 1, \\ 6, \\ 1\\right], \\ \\left[ 1, \\ 0, \\ 0, \\ 0, \\ 0\\right], \\ \\left[ 1, \\ 1, \\ 6, \\ 1, \\ 0\\right], \\ \\left[ 1, \\ 1, \\ 1, \\ 6, \\ 0\\right], \\ \\left[ 1, \\ 1, \\ 6, \\ 0, \\ 0\\right], \\ \\left[ 1, \\ 1, \\ 1, \\ 1, \\ 6\\right], \\ \\left[ 1, \\ 6, \\ 1, \\ 1, \\ 1\\right], \\ \\left[ 1, \\ 6, \\ 6, \\ 1, \\ 0\\right], \\ \\left[ 6, \\ 1, \\ 1, \\ 1, \\ 0\\right], \\ \\left[ 1, \\ 1, \\ 1, \\ 6, \\ 6\\right], \\ \\left[ 1, \\ 6, \\ 1, \\ 1, \\ 0\\right], \\ \\left[ 1, \\ 1, \\ 6, \\ 6, \\ 1\\right], \\ \\left[ 1, \\ 1, \\ 6, \\ 6, \\ 6\\right], \\ \\left[ 1, \\ 6, \\ 1, \\ 0, \\ 0\\right], \\ \\left[ 1, \\ 1, \\ 6, \\ 6, \\ 0\\right], \\ \\left[ 6, \\ 1, \\ 0, \\ 0, \\ 0\\right], \\ \\left[ 1, \\ 6, \\ 0, \\ 0, \\ 0\\right]\\right]$"
],
"text/plain": [
"[[1, 6, 6, 6, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0], [6, 6, 6, 1, 0], [1, 6, 6,\n",
" 6, 0], [1, 1, 0, 0, 0], [1, 1, 6, 1, 1], [1, 1, 1, 6, 1], [1, 0, 0, 0, 0], [1\n",
", 1, 6, 1, 0], [1, 1, 1, 6, 0], [1, 1, 6, 0, 0], [1, 1, 1, 1, 6], [1, 6, 1, 1,\n",
" 1], [1, 6, 6, 1, 0], [6, 1, 1, 1, 0], [1, 1, 1, 6, 6], [1, 6, 1, 1, 0], [1, 1\n",
", 6, 6, 1], [1, 1, 6, 6, 6], [1, 6, 1, 0, 0], [1, 1, 6, 6, 0], [6, 1, 0, 0, 0]\n",
", [1, 6, 0, 0, 0]]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[str2vops(s) for s in lookup_table]"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'sssxs'"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lookup_table[7]"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['sxxxs',\n",
" 'sss',\n",
" 'ssss',\n",
" 'xxxs',\n",
" 'sxxx',\n",
" 'ss',\n",
" 'ssxss',\n",
" 'sssxs',\n",
" 's',\n",
" 'ssxs',\n",
" 'sssx',\n",
" 'ssx',\n",
" 'ssssx',\n",
" 'sxsss',\n",
" 'sxxs',\n",
" 'xsss',\n",
" 'sssxx',\n",
" 'sxss',\n",
" 'ssxxs',\n",
" 'ssxxx',\n",
" 'sxs',\n",
" 'ssxx',\n",
" 'xs',\n",
" 'sx']"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lookup_table"
]
}
],
"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
}