bachelor_thesis/computations/lookup_table_2_qbits_CZ_mat...

878 lines
74 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": "code",
"execution_count": 14,
"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": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sympy\n",
"import numpy as np\n",
"\n",
"from collections import defaultdict\n",
"from itertools import product\n",
"\n",
"M = sympy.Matrix\n",
"simplify = sympy.simplify\n",
"sqrt = sympy.sqrt\n",
"i = sympy.I\n",
"_i = i\n",
"\n",
"from sympy.physics.quantum import Dagger\n",
"from sympy.physics.quantum import tensorproduct\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": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAALQAAABlCAYAAADkr8m4AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIeklEQVR4Ae1d7Y3cNhTcDVyA08K6geDcQIBsOojdQeIaAuR/kHRgF5A/SQdOOohdgIG7AvIjOaSAXGZuJULeD5JvSZHv0U+AfFpRFGeGI+otpX3ePjw8bCTLdrt9iuNfYn2Fus8ldVseawVnjiajcGnB4wkauYGo7y4I+xtM+2Ium47dT59pbJWLFZw54o3CpRYPnOcWuu3OaQevbp8sCn7GNg9eLnfLD6jwHp/f46TfLPdr27aCM0e3UbhU5PHTGd2+xr5HTy4N/RqNfmTgMxV9lyvQVQF49M0xAAyw3PVo6M+OC/2zK2BZATe05d5z7CcKuKFPJPEdlhVwQ1vuPcd+ooAb+kQS32FZgeUsR5IHvk3ucNArrJyL3uHza/y9xTdPTvmpWazgzBFsFC6teHC+Y36w8syn7XIs5sdoUwAXy3fAxGnnrYcc2nrH8RQp4IYuks8ra1MgO4bGsJ58i4lDfm+CVnDm6DQKl5Y8sg2twaw5JrCC81Pi0rJPPOTIcZYfY0aB7BGajHDr4Cuj30/sOIXH5VtcgfeHTR3/WsGZo9YoXFry4LQd4+MdjLmJrTiGUyPhGH7GynnosE/DthWcOVqNwmVNHjg3p+0g5+FrnsTQrLGfOwLbHKW572bep+HvhEk9zhytRuGyJg+cOxhaGkPzKeGfWLUvVnDm6DgKlyY8RDE0RpTjl6sJ8g77+UsWNYsVnDmCjcKlFQ/pCB36AEE+QxX+SkDtD2UJ1gpOYk0to3BZk8dVhgYgxs78bddzXHmqZjiWprCCc4n50vYoXNbmIQo5KPYMCEbmDxPnEfAen1X9HtEKTmqYWkbh0oKHaISeAHGq7kds33DFNuPov1Od0rLcCs4cTUbh0pKHZNruH3QCp+k+WjE6a5uHTuIEBz4k4nTPO234l3iAL8llebzW7RweOOaqPkG9MG0nDTm+QuU9Vi7MnPTssKnrX+D6PIZourPMPCii5sWE5ikBW/WJyNAAZSLRTIa4ZniMonmrPhHF0ClQXu4K9FbADd27B7z9qgq4oavK6SfrrYAbuncPePtVFXBDV5XTT9ZbATd07x7w9qsqIJq2m5728Mkg53DVJppJKWSJhyWsKd1j5bV4eqKZmMpeZkIBXAx8UuiJZkz0loMUKeAxtEguP1i7Aoyh+abcL1j/i4HFsM4XkqILHtOummgGGPjexR9YJe9fvJgeHz9i18AjKuKiUDvWGv1BuhV4fsBp6OGNx9BUwRfTCuCC8BjadA86+IsKSKfteKtXn2jmItupYLpVmuBhCWtK91h5TZ6SF/xNJJpBzBz9wQGENcPDEtaU7rHyEp6oy5ADpz98zZMYmjXMJ3AheSs8LGGNGTZVVsITdYOhpdN2TZKFAODaiyUelrCW9FsVnqIYGleZiUQzKVUt8bCENaV7rLwWT+kIHTAhiGeooj7RTAB8YcMSD0tYL8idtbuE51WGRoM7IFOfaCalniUelrCmdI+Vl/IUhRwEMjeIW4TqRDMx0azxGEXzFn0iGqEnYdUnmskUzgSPUTRv2SdfojFOY32BUTc1f2sm6Qn48CEQp3NOEslgnyUeSawxrqk+1VJe0ieo+wNWUHnYMOT4FyuX+e/h0/l/TSQ9wajGL6z7icLJi0wgHk1Ec556n70prCmufVBf1WqJt/6aWxTF0BDXRIIWKzjnTij5OwrXWjxEMXSJ8F7XFWihgBu6hcreRjMF3NDNpPaGWijghm6hsrfRTAE3dDOpvaEWCrihW6jsbTRTQDRtNz214mt+nONVm2jGCs4avTwK11o8/EeyNVzl5+iqAC4G/5Fs1x7wxldTwGPo1aT1E/dQIDuGxrB++AViBCUeX66aaCbSdCiygBMY+X5JUcIcEu7NVSOPbENrMGtwbWTDAk5gvAeF4v9SujdXjTw85IhcHF5kT4HsEZrUpluM+gQtVnDWsMsoXGvy4LvDjI93uIWkXvA3kaAFXEzgTOmdUz4K1xIeqBvycmB7IzG0iQQt4GQCZ45hU8eMwrWEB+oGQ0tj6CrJQABg7cUKzho6jMK1Cg9RDI3RwkSiGSs4a7h5FK61eEhH6NAHCOIZqqhPNGMFZxC2YGMUriU8rjI0GtxBd/WJZqzgLPBwqDoK11IeopCD6s0N4hahOtGMFZzBkQUbo3CtwUM0Qk8Nqk/QYgVngYdD1VG41uQhmbZLJj3ByB2dy25Rjt5O4sQxFxPRtMBYq40crrXaKj1PTPMSHqgbpu2kIUdJMhC022aB8NFEMhgNeBHvJzQniWjaoKzWiok+SWme6rNctUSGRqMmEs2kyI/CgzytcGmFUxRDp4zi5a5AbwXc0L17wNuvqoAbuqqcfrLeCrihe/eAt19VATd0VTn9ZL0VcEP37gFvv6oComm76WkOX/PjHK7aRDMphUbhQZ5WuLTC6YlmUu73cvUK4GLxRDPqe8kBXqWAx9BXyeaVtCqQHUNjWO+eaAYYihO0jMKDhtLAJcfYLXFmGxrP4rtnRQKG4gQto/CgkTRwyTF0S5wecuT0iB9jRoHsEZqMplu++kQzKfVH4WGpT1pqLnnBf4gELjDCEDxwK6enTXBZEyfOHV7wpyASQw+RwAWch+AxGdoElzU1x7mDoaUxdJVkIADQexmFB3W0wqUJTlEMjRHBRKKZ1NUyCg/ytMKlFU7pCB28giCfoYr6RDMB8IWNUXiQnhUua+K8ytAAtIN+6hPNXPBw2D0KDxKywmVtnKKQYykcbiGqE80E117YmIW1zsNSn7TSfJ7l4Lfl4/VXdHjIs4FyjsxvsbLOvDLxzNPlcdq3gXcIHtTZCpdaOHGeW6zHPn38TD34OJvvR7zEem65w0G/zwW4wpjA5SSPBY7p/lh8xpjzdxQe5GqFSy2cOA+n6M4u8OGb/wFmtDR28OD1wgAAAABJRU5ErkJggg==\n",
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2} & \\frac{1}{2} & \\frac{1}{2} & \\frac{1}{2}\\\\\\frac{1}{2} & - \\frac{1}{2} & \\frac{1}{2} & - \\frac{1}{2}\\\\\\frac{1}{2} & \\frac{1}{2} & - \\frac{1}{2} & - \\frac{1}{2}\\\\\\frac{1}{2} & - \\frac{1}{2} & - \\frac{1}{2} & \\frac{1}{2}\\end{matrix}\\right]$"
],
"text/plain": [
"⎡1/2 1/2 1/2 1/2 ⎤\n",
"⎢ ⎥\n",
"⎢1/2 -1/2 1/2 -1/2⎥\n",
"⎢ ⎥\n",
"⎢1/2 1/2 -1/2 -1/2⎥\n",
"⎢ ⎥\n",
"⎣1/2 -1/2 -1/2 1/2 ⎦"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"H2 = tensorproduct.matrix_tensor_product(H, H)\n",
"H2"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"zero_state = M([1, 0, 0, 0])"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAB0AAABlCAYAAACx4uijAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC/klEQVRoBe1ay03DQBB1EGeUEwWYDkgJhA4QHRBKQFSAQgdJAVxSApRAKAApKYADIArAvOfsrhxn7czYgIOYkSb78ey89dvfZJMky7JEo0mS9KEj6FzTrmi71+v1jqFZhc7gPAhtUSAggalRgd2iwl/GBvuFVrfILwplZpfFMnr7hPITHJ4V6yP5caTuFHV5uyLoBE7XQCINRVXwMy0boqOsykH3yg9/o2ygP8pyJ/QWZ+/Wt8MMTGF0CR1CU5QnSBeYrVxuYlGBuiV1JfZeYdgJvZ2AiunF+OX7ZgVjeTXoz7edOhs+E4NKHW4D5PPdppc9BMU8zq6Zh3D5UC7AwvsqK/sU0+vcjQHAdZqLW6dzFI5clSjR0jsC0LDgmecmNwke7mLRgvItH8XeKwxV9ILa8uHMTixRz4hCLNo3DY4dpYwEBqFSmGkECsAU/jmeA+3MZb9U9LKBBwQYAy2WOYneURbHV6o3dYA8zm4I5gA5rq9QsWjflGuSGwTTIHjLsHZDZU1GC3oCX0Pn7xJgqk3B90MFChBpsO39R1PVmEY9NKg00AakyZv8H3pVS8btSNwIuFYt2N46ozqZSBxTnhB30M+6LmI82wbbzw4nh+F5SIcp9lbV9Y7GHv55K4MmmQXbICIuFmzHeamoVW2DmHkWbFcQGa9W0UsX7qThLP57wfaBI8GncU5WtW2C7UPvmPR+uIJP/bNY2ibYfvEOVWOKcbRg2zMnSjuJHAxUNDZNjVRLxoJtLc2dzF7xmH5DsB0IEYNi3xVdlQfPNZndppcdB8V2s80vYWLRjim/+tvN9o/Rmzv2sS8KdrNdS7V4G3Re2gTboSNa0DbBdjNQC7YDb8KMdhsUuq03M9B6flo+Va1TC7a1bHcye8VjasG2djxpL6aXxhZsgwELtjkVNqTx5uAotb+RbFBaruDM429tMZ0hAgy/v8Emhd5D2cYr/1bSL9nxz8kxfzDLEt4j8Nv1OTQm/K/Rg3+AcXxDnvZrApu1+wjY8ce8qMB2+gXddflBWpRqZgAAAABJRU5ErkJggg==\n",
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2}\\\\\\frac{1}{2}\\\\\\frac{1}{2}\\\\\\frac{1}{2}\\end{matrix}\\right]$"
],
"text/plain": [
"⎡1/2⎤\n",
"⎢ ⎥\n",
"⎢1/2⎥\n",
"⎢ ⎥\n",
"⎢1/2⎥\n",
"⎢ ⎥\n",
"⎣1/2⎦"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plus_state = H2 * zero_state\n",
"plus_state"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"I = M([[1, 0], [0, 1]])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"C_L_0 = [tensorproduct.matrix_tensor_product(I, c) for c in C_L]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"C_L_1 = [tensorproduct.matrix_tensor_product(c, I) for c in C_L]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}1 & 0 & 0 & 0\\\\0 & 1 & 0 & 0\\\\0 & 0 & 1 & 0\\\\0 & 0 & 0 & -1\\end{matrix}\\right]$"
],
"text/plain": [
"⎡1 0 0 0 ⎤\n",
"⎢ ⎥\n",
"⎢0 1 0 0 ⎥\n",
"⎢ ⎥\n",
"⎢0 0 1 0 ⎥\n",
"⎢ ⎥\n",
"⎣0 0 0 -1⎦"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"CZ = M([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1]])\n",
"CZ"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAC0AAABlCAYAAADZEWqbAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD30lEQVR4Ae1cXW7UMBjcVDyj0gcOsEgcgB6B7Q2AB95pj4A4ASo3aA/Qlx4BuAHtAZC2B+ABVhyAZSZ8jtxgb7Lx2CjIllz/xPt5Mpn97HxNttlutwtlaprmEPZeIZ/B9rHStrN1gEmeIW8j+doNHFPSFsadIhM486QEO+sInpbhB57VD6ivvTard732ziaYvcWAW0z4YufA4YPngSEn6Gvt+qAvMOleIAOGJV3Acdk3BCLY1YI+6B+cQ7uCLnWVKtOlmPa9R/Kc+IYvYeQMeYW8RPsC5RregO5UlqSgzWW+laGLGKqajhAj75bJA/od3HlBPu2ylnoWMtAqQGNOaJaaljFNhiARbkffGVt0f0xvcBU2f6qav1LQgHQOgPTTbTI/fYPGE+uSFGp5nALoykPGfTEXGd4cyJIaNFn+IkMXMSSVB6TR37zzJO7QzzsaWVIz3QEzSfBOQ35zmwU0AC8Blno+VnsOsiKVBw06wADLG1G2+SXcoC27/5QybYC5HX1PsAaYuv6OLEtqpumTucCw7BJY7nx315lQUYN+Diwrw8MIk3RRcecpBQ2QqmCNwxcspZoOzpChs4LOQGrQZGU6SEuGzlkyLXV5tiJyIaGvrsEaX2WzlMcsQVPT3IFdIf/yL8G+deg5d7Dmq+FckOkj5NfISaxj39EMZcyRkp7iw8SZBjQFQcpn1S6vBmtiVyNJxwGjNVgTIKXtkmoa3qMGa2JMqzXdzmMbpxqs8VmXMm0MFwnWPLSzcKV/UvvWcwZrHjsw9B4/reFKd2xKmTNY880BUru8GqxxzPZL6RexbzxXu4LOxWzfbmW6z0iuttTl1WDNjstUNb2DHOkhmaYLBGu6E5eBZqCms5q5MktNy5gmuZBIDdbEVKaWRw3WxJiWaroGa2I0o1+t6XYq2zjVYI1PvJRpYzh7sIYnwGeM+E+eJb5Ii5QMGz/MFu112beJfi5AfOvoxu8fqttnMGyrffAKBh/BeDThSpCglQ0g+ElJ6vKGEOCkJMEcqaaHQKuOV9AqJofsVKaHGFIdnyXTRV2erZjJT94UBQ0/zSd7k1+TmqU8Zgl6lDygRe4TPiPvs194act26zRgQ/bkzSjQmHyDmZOe7YcNWTDn/5VHe30Ff0xmya9JjZKHAK8zIXlNqrQ8JMGc0qC5Gia/JlVUHvAgkidvSjPttO1e2pn0mtQ/AW0bp8nBnKLyIM0OMKSS9JqUi3t0cQrYdvVrGE+Khfifh90l8kdkzukygzuHvXH8cRSH4V7JcVxauZ/gb8yEEt8l/BQ6MKUPLDOY89f+BXPcW+IxjsGcYMLYy9/xqBy2/jxphQAAAABJRU5ErkJggg==\n",
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2}\\\\\\frac{1}{2}\\\\\\frac{1}{2}\\\\- \\frac{1}{2}\\end{matrix}\\right]$"
],
"text/plain": [
"⎡1/2 ⎤\n",
"⎢ ⎥\n",
"⎢1/2 ⎥\n",
"⎢ ⎥\n",
"⎢1/2 ⎥\n",
"⎢ ⎥\n",
"⎣-1/2⎦"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"CZ * plus_state"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}1 & 0 & 0 & 0\\\\0 & 1 & 0 & 0\\\\0 & 0 & 1 & 0\\\\0 & 0 & 0 & 1\\end{matrix}\\right]$"
],
"text/plain": [
"⎡1 0 0 0⎤\n",
"⎢ ⎥\n",
"⎢0 1 0 0⎥\n",
"⎢ ⎥\n",
"⎢0 0 1 0⎥\n",
"⎢ ⎥\n",
"⎣0 0 0 1⎦"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I_4 = M([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])\n",
"I_4"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compute all possible starting matrices: Two qbits either entangled or unentangled with any of the 24 $C_L$ operators."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"starting_matrices = [a * b * c for a, b, c in product(C_L_0, C_L_1, (I_4, CZ))]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compute the resulting matrix after a $CZ$ has been applied."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"resulting_matrices = [CZ * c for c in starting_matrices]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGoAAAAVCAYAAACuVXuDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADtklEQVRoBe2ZjXEaMRCFjScFMEkHuAMSOsAdJKQDuwOnhqQDu4Q4HWCXQDqADmLTAXmfkDQSJ7jjLGlgxjuzSFrt7Vvt6u+OwWazuQhpMBiMJFuFsvd63QikcnAZuiCFO7XHoSx3XRgN+5INcS431hnbG9lc+CH4RKnjq6SftJr++N6gov6xeCkeBuJGtYPes3Q24oXlpYwsxC+hMfXh7L1ldOfiRpLDZ3LWwQI7p82UrRSOcvCErvrIyZbs1kfwF9RDlgz5oxiHCSb75DDUCZ5v1bO6JAbGFuVPcWRTbVbXY4hj9XhmGspL1YWDb5EPJbAO4aiPmJvYmMSoQSJuDjmifrbFZKLC59r01N86eHTEUfLAEL3CIV6JujAYa/FEteGo/0Z8zxjd1jdT40HCU6GpHHnV0t/dZtkSip5nbEXCWFtWUYa64NiczIjDpX4Iyqnd8kjISo4SsBTtJjCl01f2vdKk7YpDbmYf9PNNbA6vviM79jlNDpa0C/aV6izvv86O6viUInOZCHVTSn1l8ostr8YF4hgccnNNor7UcE4YjkjQbwXbrBYFh4sDt8lryfZOGPWTJHR/iLOT9WMtH4ruLj1wOCunnFEELroaZ49CYFCBICEmSYhtYEhQ20zmgvEg/V88V4BuZbvGOX0sDrkZkqiPYh+4AgHoYpJZzHsTK6ZBkpPEJwXyttGZQSD75naVwdRBEz1xTGxIVDWSo7y08m6wj1jdEdnBsfJKJYnJwatAjS2vD45ZSJxRONgIUBStfA3Ow9Q2izMkw18oaCtJvJlfhUmSzKy6jIHF3kR22VpDMmeilXMDfevZ2BeH3LyQKAJnBh96WajOGZMa8FR40UVCASJQk4Q+yYvOEukyU3tt33oO3AhbbSYJL9dst9ENtC/WsTj4YIlJvLrUD7N4YoWlC/PtLgTRwLmqQj4gkjFxzNcJ1d33PkpkHMY+KZIx43g5PrSlSuVowi7sqRBWA8cDbiufVcypMpuXGrz5nLRbqo/goMgMc9/nkN2Fump31SMJXA5gnqFkRXh8td13RfB2OfVNkissHNkJbXatywb+hPiM3Y9V9SxYbTjOX4s3MsGxjbHrPMdSY2BLfHOiuoy9FpZwmNRmEbH1QXzBLnKrMtbr/HCeretAmbOzBhbnObm5MInSADmc977HoHjKZM+OfzV8rIUlHFYT/7ZvL05uqUvIoTZ37XMq5ffBv2hyjqUWFrkQ+618wCAc2Szyx1x0/XX972WdCCgPfCnh1cC/hP8HWgYo7Ny1PQYAAAAASUVORK5CYII=\n",
"text/latex": [
"$\\displaystyle \\left( 1152, \\ 4, \\ 4\\right)$"
],
"text/plain": [
"(1152, 4, 4)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"starting_matrices_np = np.array([np.array(m).astype(np.cdouble) for m in starting_matrices])\n",
"\n",
"starting_matrices_np.shape"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGoAAAAVCAYAAACuVXuDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADtklEQVRoBe2ZjXEaMRCFjScFMEkHuAMSOsAdJKQDuwOnhqQDu4Q4HWCXQDqADmLTAXmfkDQSJ7jjLGlgxjuzSFrt7Vvt6u+OwWazuQhpMBiMJFuFsvd63QikcnAZuiCFO7XHoSx3XRgN+5INcS431hnbG9lc+CH4RKnjq6SftJr++N6gov6xeCkeBuJGtYPes3Q24oXlpYwsxC+hMfXh7L1ldOfiRpLDZ3LWwQI7p82UrRSOcvCErvrIyZbs1kfwF9RDlgz5oxiHCSb75DDUCZ5v1bO6JAbGFuVPcWRTbVbXY4hj9XhmGspL1YWDb5EPJbAO4aiPmJvYmMSoQSJuDjmifrbFZKLC59r01N86eHTEUfLAEL3CIV6JujAYa/FEteGo/0Z8zxjd1jdT40HCU6GpHHnV0t/dZtkSip5nbEXCWFtWUYa64NiczIjDpX4Iyqnd8kjISo4SsBTtJjCl01f2vdKk7YpDbmYf9PNNbA6vviM79jlNDpa0C/aV6izvv86O6viUInOZCHVTSn1l8ostr8YF4hgccnNNor7UcE4YjkjQbwXbrBYFh4sDt8lryfZOGPWTJHR/iLOT9WMtH4ruLj1wOCunnFEELroaZ49CYFCBICEmSYhtYEhQ20zmgvEg/V88V4BuZbvGOX0sDrkZkqiPYh+4AgHoYpJZzHsTK6ZBkpPEJwXyttGZQSD75naVwdRBEz1xTGxIVDWSo7y08m6wj1jdEdnBsfJKJYnJwatAjS2vD45ZSJxRONgIUBStfA3Ow9Q2izMkw18oaCtJvJlfhUmSzKy6jIHF3kR22VpDMmeilXMDfevZ2BeH3LyQKAJnBh96WajOGZMa8FR40UVCASJQk4Q+yYvOEukyU3tt33oO3AhbbSYJL9dst9ENtC/WsTj4YIlJvLrUD7N4YoWlC/PtLgTRwLmqQj4gkjFxzNcJ1d33PkpkHMY+KZIx43g5PrSlSuVowi7sqRBWA8cDbiufVcypMpuXGrz5nLRbqo/goMgMc9/nkN2Fump31SMJXA5gnqFkRXh8td13RfB2OfVNkissHNkJbXatywb+hPiM3Y9V9SxYbTjOX4s3MsGxjbHrPMdSY2BLfHOiuoy9FpZwmNRmEbH1QXzBLnKrMtbr/HCeretAmbOzBhbnObm5MInSADmc977HoHjKZM+OfzV8rIUlHFYT/7ZvL05uqUvIoTZ37XMq5ffBv2hyjqUWFrkQ+618wCAc2Szyx1x0/XX972WdCCgPfCnh1cC/hP8HWgYo7Ny1PQYAAAAASUVORK5CYII=\n",
"text/latex": [
"$\\displaystyle \\left( 1152, \\ 4, \\ 4\\right)$"
],
"text/plain": [
"(1152, 4, 4)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"resulting_matrices_np = np.array([np.array(m).astype(np.cdouble) for m in resulting_matrices])\n",
"\n",
"resulting_matrices_np.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Invert the resulting matrices to check if they match a starting matrix."
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"resulting_matrices_np_invers = np.array([m.transpose().conjugate() for m in resulting_matrices_np])"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [],
"source": [
"resulting_matrices_np_invers = np.array([m.transpose().conjugate() for m in starting_matrices_np])"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAOCAYAAADT0Rc6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABsklEQVQ4EaWUj1FCMQyHeZ4DcLgBbAA6gYyAK+gGeoygG+AKuAFs4MEGsIHABvh9pcHy7w4wd3lN0uTXNMlrtV6va0FVVbWRh3AH+yrssbLfRH7L+j3rQh3fabalBb86Qh/+ge9g9SF+Y9ZEyYA0gCewWdRNpmRsHmjg1o7+Duvf3bMPSl0Z8jK9JJebGF/hU4cadCyZJfZl4CA/y6HHaiw8Ub9BOJe6OC5z6coYS1bPpdfegp8UTtElhwo+J9PVCTBvIo3gLkmM9hK0FbaQWu726GR5S79SBmK2gdnpta2wTbKYHpb6aey/DgXIaU/AZSIJ+G/I3HdAm+FzSXmJOyBv9AnYR7lDWXtZt7+2xeRm2J2L629KqCU79ms4vTt2dJPwxk56/aryEngAHKUL4NBjxe5/7sG9Wz4XUS5dC7CXCMQmoOQL5b98MOHY5vh9sd+4qKcE2ZsHAOIpRE1k+Rb5sFWRRN7eLv5W47NvmoEcnDHy5n/bYDVY2hwYw+TDMMTnMSeRvNBtyQjbvOJTw5CeOIw+4mYzh33EvwMMH8femx6jKX6d2MBXvz5suYO2D/4vzMjHQvKY+PsAAAAASUVORK5CYII=\n",
"text/latex": [
"$\\displaystyle 128$"
],
"text/plain": [
"128"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"indices = defaultdict(list)\n",
"check_indices_zero = [(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]\n",
"check_indices_zero += [(k,i) for i,k in check_indices_zero]\n",
"check_indices_zero = [(i - 1, k - 1) for i, k in check_indices_zero]\n",
"\n",
"for rm_np, rm_np_i in zip(resulting_matrices_np, resulting_matrices_np_invers):\n",
" rm_tuple = tuple((tuple(r) for r in rm_np))\n",
" for i, sm_np in enumerate(starting_matrices_np):\n",
" test = sm_np.dot(rm_np_i)\n",
"\n",
" #for check in check_indices_zero:\n",
" # if(not np.allclose(test[check], 0)):\n",
" # continue\n",
" \n",
" diag = np.diagonal(test)\n",
" if(not np.allclose(np.absolute(diag), np.ones(4))):\n",
" continue\n",
" \n",
" phases = np.angle(diag)\n",
" phases = phases - phases[0]\n",
" #if(not np.allclose(phases, np.zeros(4))):\n",
" #print(phases)\n",
" #print(test)\n",
" # continue\n",
"\n",
" if(not (phases[0] == phases[1]\n",
" and phases[2] == phases[3])):\n",
" continue\n",
" \n",
" indices[rm_tuple].append(i)\n",
" \n",
"len(indices.keys())"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGAAAAAVCAYAAAC5d+tKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADDElEQVRYCe2ZjVHjMBCFzxkKyNx1YDqAowPoAEIHXAdQAyVwLXAdhBZCB6EDfjrIvU+RzFqW73IeyzfKZGc2lp5+vHqydtdOtdlsvlipqqoW9mKxQ3kcBlLczuzU6nCr+onFDuVRGag9x82kzQao4VLoNz39v5pWFdg16YPXla5L6V83iT6MsXONVda8Rdokbp/gQPbD9Va8C5qrtqJsVVgtfYywe2H4rXOLx2W1r+OxcZ8hdc1ZvE1aw0o6Z/2OcFV4Um9iQoQ9ho62Tdg7ajFbVhuuLNcGFG+TuLmRPsBZcEELVX4KjOVcwLuODCfECkdpjiuwIGVhuKcPr0BjS/E2ea4X8DrTDwvqy3og+kUDIDQl8cbQ57pnM1Pjh2D7YhOcL470cyV1wSFmQ0TSlhIXhNX+bBu1mbieLIE33GcfbPJrgfMLXNB3Kf56J/EuBtdzZwcIB/sQQX2nyXYftVySTWbhcO5cOIVLEdfKgPrq6kt/F0BsH2H3UZ1I38qgbPuY5ZJsCuuWzaSia07AV2mfj1fTp+hJw708aZIfn6gLvC6qW2yqckk2RZzgKWo2YCfRQiGZUxKTzzEip/0frqcYmxIkuwefIAxxqWymGSPyOS7Hlnxhzn8J53qmOvm5FQI1b6zgZFKtmGE7DimXZlPiAYXzN9a+lN6qQzIGqA0iW/6dvoyRure51Fi18bLWiQF/GpOaJ4VpjuJt0ho4vctKP3xa4AtoJ+X0TzkbFKepHJ8TjTnWNSkayy4RLy5CB2HsOhvzLPw04P9y3RebtA7iqcs+eRFbi5DOCRBOJgORKe18O2IOCRPbca0TpjZuivaenpQtAYvmju0qySY4qB3pnhCe6M4m5MB0P2LKoA3IYQ9zTmmT7kXcdA/9jDtLcEOt7Mah+X7OtOidUt98JnRmntImEhI4336MExl8iCNjCZkNbVnEx4HXLJMPnHRKmzzHxNztx0+OHyohQC5DPddV9+h89s51r13nndImOJY27rfCyCB+d/ijJfVpOnQ7XAcyIH5JPckMm5fW3+gnifLF8ptzAAAAAElFTkSuQmCC\n",
"text/latex": [
"$\\displaystyle \\left( 24, \\ 24, \\ 2\\right)$"
],
"text/plain": [
"(24, 24, 2)"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from collections import deque\n",
"lookup_edge_c0_c1_to_number = []\n",
"r = []\n",
"c = []\n",
"\n",
"i = 0\n",
"\n",
"for _ in C_L_0:\n",
" r = []\n",
" for _ in C_L_1:\n",
" c = []\n",
" for _ in (I_4, CZ):\n",
" c.append(i)\n",
" i += 1 \n",
" r.append(c)\n",
" lookup_edge_c0_c1_to_number.append(r)\n",
" \n",
"lookup_edge_c0_c1_to_number = np.array(lookup_edge_c0_c1_to_number, dtype=np.int)\n",
"lookup_edge_c0_c1_to_number.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Produce (almost valid) `C` code to look up the lookup table number from given clifford operator indices and entanglement (0 means no entanglement)."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" , { {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19}, {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 29}, {30, 31}, {32, 33}, {34, 35}, {36, 37}, {38, 39}, {40, 41}, {42, 43}, {44, 45}, {46, 47} }\n",
" , { {48, 49}, {50, 51}, {52, 53}, {54, 55}, {56, 57}, {58, 59}, {60, 61}, {62, 63}, {64, 65}, {66, 67}, {68, 69}, {70, 71}, {72, 73}, {74, 75}, {76, 77}, {78, 79}, {80, 81}, {82, 83}, {84, 85}, {86, 87}, {88, 89}, {90, 91}, {92, 93}, {94, 95} }\n",
" , { {96, 97}, {98, 99}, {100, 101}, {102, 103}, {104, 105}, {106, 107}, {108, 109}, {110, 111}, {112, 113}, {114, 115}, {116, 117}, {118, 119}, {120, 121}, {122, 123}, {124, 125}, {126, 127}, {128, 129}, {130, 131}, {132, 133}, {134, 135}, {136, 137}, {138, 139}, {140, 141}, {142, 143} }\n",
" , { {144, 145}, {146, 147}, {148, 149}, {150, 151}, {152, 153}, {154, 155}, {156, 157}, {158, 159}, {160, 161}, {162, 163}, {164, 165}, {166, 167}, {168, 169}, {170, 171}, {172, 173}, {174, 175}, {176, 177}, {178, 179}, {180, 181}, {182, 183}, {184, 185}, {186, 187}, {188, 189}, {190, 191} }\n",
" , { {192, 193}, {194, 195}, {196, 197}, {198, 199}, {200, 201}, {202, 203}, {204, 205}, {206, 207}, {208, 209}, {210, 211}, {212, 213}, {214, 215}, {216, 217}, {218, 219}, {220, 221}, {222, 223}, {224, 225}, {226, 227}, {228, 229}, {230, 231}, {232, 233}, {234, 235}, {236, 237}, {238, 239} }\n",
" , { {240, 241}, {242, 243}, {244, 245}, {246, 247}, {248, 249}, {250, 251}, {252, 253}, {254, 255}, {256, 257}, {258, 259}, {260, 261}, {262, 263}, {264, 265}, {266, 267}, {268, 269}, {270, 271}, {272, 273}, {274, 275}, {276, 277}, {278, 279}, {280, 281}, {282, 283}, {284, 285}, {286, 287} }\n",
" , { {288, 289}, {290, 291}, {292, 293}, {294, 295}, {296, 297}, {298, 299}, {300, 301}, {302, 303}, {304, 305}, {306, 307}, {308, 309}, {310, 311}, {312, 313}, {314, 315}, {316, 317}, {318, 319}, {320, 321}, {322, 323}, {324, 325}, {326, 327}, {328, 329}, {330, 331}, {332, 333}, {334, 335} }\n",
" , { {336, 337}, {338, 339}, {340, 341}, {342, 343}, {344, 345}, {346, 347}, {348, 349}, {350, 351}, {352, 353}, {354, 355}, {356, 357}, {358, 359}, {360, 361}, {362, 363}, {364, 365}, {366, 367}, {368, 369}, {370, 371}, {372, 373}, {374, 375}, {376, 377}, {378, 379}, {380, 381}, {382, 383} }\n",
" , { {384, 385}, {386, 387}, {388, 389}, {390, 391}, {392, 393}, {394, 395}, {396, 397}, {398, 399}, {400, 401}, {402, 403}, {404, 405}, {406, 407}, {408, 409}, {410, 411}, {412, 413}, {414, 415}, {416, 417}, {418, 419}, {420, 421}, {422, 423}, {424, 425}, {426, 427}, {428, 429}, {430, 431} }\n",
" , { {432, 433}, {434, 435}, {436, 437}, {438, 439}, {440, 441}, {442, 443}, {444, 445}, {446, 447}, {448, 449}, {450, 451}, {452, 453}, {454, 455}, {456, 457}, {458, 459}, {460, 461}, {462, 463}, {464, 465}, {466, 467}, {468, 469}, {470, 471}, {472, 473}, {474, 475}, {476, 477}, {478, 479} }\n",
" , { {480, 481}, {482, 483}, {484, 485}, {486, 487}, {488, 489}, {490, 491}, {492, 493}, {494, 495}, {496, 497}, {498, 499}, {500, 501}, {502, 503}, {504, 505}, {506, 507}, {508, 509}, {510, 511}, {512, 513}, {514, 515}, {516, 517}, {518, 519}, {520, 521}, {522, 523}, {524, 525}, {526, 527} }\n",
" , { {528, 529}, {530, 531}, {532, 533}, {534, 535}, {536, 537}, {538, 539}, {540, 541}, {542, 543}, {544, 545}, {546, 547}, {548, 549}, {550, 551}, {552, 553}, {554, 555}, {556, 557}, {558, 559}, {560, 561}, {562, 563}, {564, 565}, {566, 567}, {568, 569}, {570, 571}, {572, 573}, {574, 575} }\n",
" , { {576, 577}, {578, 579}, {580, 581}, {582, 583}, {584, 585}, {586, 587}, {588, 589}, {590, 591}, {592, 593}, {594, 595}, {596, 597}, {598, 599}, {600, 601}, {602, 603}, {604, 605}, {606, 607}, {608, 609}, {610, 611}, {612, 613}, {614, 615}, {616, 617}, {618, 619}, {620, 621}, {622, 623} }\n",
" , { {624, 625}, {626, 627}, {628, 629}, {630, 631}, {632, 633}, {634, 635}, {636, 637}, {638, 639}, {640, 641}, {642, 643}, {644, 645}, {646, 647}, {648, 649}, {650, 651}, {652, 653}, {654, 655}, {656, 657}, {658, 659}, {660, 661}, {662, 663}, {664, 665}, {666, 667}, {668, 669}, {670, 671} }\n",
" , { {672, 673}, {674, 675}, {676, 677}, {678, 679}, {680, 681}, {682, 683}, {684, 685}, {686, 687}, {688, 689}, {690, 691}, {692, 693}, {694, 695}, {696, 697}, {698, 699}, {700, 701}, {702, 703}, {704, 705}, {706, 707}, {708, 709}, {710, 711}, {712, 713}, {714, 715}, {716, 717}, {718, 719} }\n",
" , { {720, 721}, {722, 723}, {724, 725}, {726, 727}, {728, 729}, {730, 731}, {732, 733}, {734, 735}, {736, 737}, {738, 739}, {740, 741}, {742, 743}, {744, 745}, {746, 747}, {748, 749}, {750, 751}, {752, 753}, {754, 755}, {756, 757}, {758, 759}, {760, 761}, {762, 763}, {764, 765}, {766, 767} }\n",
" , { {768, 769}, {770, 771}, {772, 773}, {774, 775}, {776, 777}, {778, 779}, {780, 781}, {782, 783}, {784, 785}, {786, 787}, {788, 789}, {790, 791}, {792, 793}, {794, 795}, {796, 797}, {798, 799}, {800, 801}, {802, 803}, {804, 805}, {806, 807}, {808, 809}, {810, 811}, {812, 813}, {814, 815} }\n",
" , { {816, 817}, {818, 819}, {820, 821}, {822, 823}, {824, 825}, {826, 827}, {828, 829}, {830, 831}, {832, 833}, {834, 835}, {836, 837}, {838, 839}, {840, 841}, {842, 843}, {844, 845}, {846, 847}, {848, 849}, {850, 851}, {852, 853}, {854, 855}, {856, 857}, {858, 859}, {860, 861}, {862, 863} }\n",
" , { {864, 865}, {866, 867}, {868, 869}, {870, 871}, {872, 873}, {874, 875}, {876, 877}, {878, 879}, {880, 881}, {882, 883}, {884, 885}, {886, 887}, {888, 889}, {890, 891}, {892, 893}, {894, 895}, {896, 897}, {898, 899}, {900, 901}, {902, 903}, {904, 905}, {906, 907}, {908, 909}, {910, 911} }\n",
" , { {912, 913}, {914, 915}, {916, 917}, {918, 919}, {920, 921}, {922, 923}, {924, 925}, {926, 927}, {928, 929}, {930, 931}, {932, 933}, {934, 935}, {936, 937}, {938, 939}, {940, 941}, {942, 943}, {944, 945}, {946, 947}, {948, 949}, {950, 951}, {952, 953}, {954, 955}, {956, 957}, {958, 959} }\n",
" , { {960, 961}, {962, 963}, {964, 965}, {966, 967}, {968, 969}, {970, 971}, {972, 973}, {974, 975}, {976, 977}, {978, 979}, {980, 981}, {982, 983}, {984, 985}, {986, 987}, {988, 989}, {990, 991}, {992, 993}, {994, 995}, {996, 997}, {998, 999}, {1000, 1001}, {1002, 1003}, {1004, 1005}, {1006, 1007} }\n",
" , { {1008, 1009}, {1010, 1011}, {1012, 1013}, {1014, 1015}, {1016, 1017}, {1018, 1019}, {1020, 1021}, {1022, 1023}, {1024, 1025}, {1026, 1027}, {1028, 1029}, {1030, 1031}, {1032, 1033}, {1034, 1035}, {1036, 1037}, {1038, 1039}, {1040, 1041}, {1042, 1043}, {1044, 1045}, {1046, 1047}, {1048, 1049}, {1050, 1051}, {1052, 1053}, {1054, 1055} }\n",
" , { {1056, 1057}, {1058, 1059}, {1060, 1061}, {1062, 1063}, {1064, 1065}, {1066, 1067}, {1068, 1069}, {1070, 1071}, {1072, 1073}, {1074, 1075}, {1076, 1077}, {1078, 1079}, {1080, 1081}, {1082, 1083}, {1084, 1085}, {1086, 1087}, {1088, 1089}, {1090, 1091}, {1092, 1093}, {1094, 1095}, {1096, 1097}, {1098, 1099}, {1100, 1101}, {1102, 1103} }\n",
" , { {1104, 1105}, {1106, 1107}, {1108, 1109}, {1110, 1111}, {1112, 1113}, {1114, 1115}, {1116, 1117}, {1118, 1119}, {1120, 1121}, {1122, 1123}, {1124, 1125}, {1126, 1127}, {1128, 1129}, {1130, 1131}, {1132, 1133}, {1134, 1135}, {1136, 1137}, {1138, 1139}, {1140, 1141}, {1142, 1143}, {1144, 1145}, {1146, 1147}, {1148, 1149}, {1150, 1151} }\n",
"}\n"
]
}
],
"source": [
"print(\"{\")\n",
"for r in lookup_edge_c0_c1_to_number:\n",
" print(\" , {\", \", \".join((\"{%d, %d}\" % (c[0], c[1]) for c in r)), \"}\")\n",
"print(\"}\") "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To satisfy some constraints try one wants to keep the indentity on one qbit if possible."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108,\n",
" 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,\n",
" 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,\n",
" 135, 136, 137, 138, 139, 140, 141, 142, 143])"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I0_indices = lookup_edge_c0_c1_to_number[2, :, :].reshape(2*24)\n",
"I0_indices"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 4, 5, 52, 53, 100, 101, 148, 149, 196, 197, 244,\n",
" 245, 292, 293, 340, 341, 388, 389, 436, 437, 484, 485,\n",
" 532, 533, 580, 581, 628, 629, 676, 677, 724, 725, 772,\n",
" 773, 820, 821, 868, 869, 916, 917, 964, 965, 1012, 1013,\n",
" 1060, 1061, 1108, 1109])"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I1_indices = lookup_edge_c0_c1_to_number[:, 2, :].reshape(2*24)\n",
"I1_indices"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Throw away all the matrices that produce the same result that we don't need."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"def contract_indices(equivs):\n",
" indices_I1 = [e for e in equivs if e in I1_indices]\n",
" indices_I0 = [e for e in equivs if e in I0_indices]\n",
" \n",
" if(not indices_I0 and not indices_I1):\n",
" return [equivs[0], -1, -1]\n",
" if(indices_I0 and not indices_I1):\n",
" return [-1, indices_I0[0], -1]\n",
" if(indices_I1 and not indices_I0):\n",
" return [-1, -1, indices_I1[0]]\n",
" return [-1, indices_I0[0], indices_I1[0]]"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"indices_contracted = {k: contract_indices(v) for k,v in indices.items()}"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"def get_resulting_matrix_index(tpl):\n",
" arr = np.array(tpl)\n",
" for i, test in enumerate(resulting_matrices_np):\n",
" if(np.allclose(test, arr)):\n",
" return i"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"indices_contracted_by_resulting_index = {get_resulting_matrix_index(k): v for k,v in indices_contracted.items()}"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"None in indices_contracted_by_resulting_index"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"remap_lookup_table_multiple_results = [v for k,v in sorted(indices_contracted_by_resulting_index.items())]"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAVCAYAAAB7R6/OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARUlEQVQoFWNgYGAoA+K7UGyEhc/QCRR0+f//PwMyBoqBxZmADLxgVAEkeEbDgchwYIEmp5mMjIwgZigQuwBxOhALAfFuAP68FOR8/BSoAAAAAElFTkSuQmCC\n",
"text/latex": [
"$\\displaystyle \\left[ \\right]$"
],
"text/plain": [
"[]"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"remap_lookup_table_multiple_results[0:10]"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAxElEQVQoFYWRjQ2CMBCFbeMABDeADfyZQEZgBndwBGZhBFhBNpANUDco7zV95DRNbHJt7/W7n7YuhLDTcM51ab9grWEdzueoEUzwA0Jr/AL+E1bF8wTdKArSCo0VBgsOEHoBWqG1MPZWeEwcDewVd9/TJ7mNxwXYy79RMmOZKEXbIFXZStvD3P7AjIrKAaq2eNxQJXO9Spt16xHpqkxKZRwF9oDOGfAEbYpVzePyu36/8A3tSGZvsjD6jndVCxf4V0ATmRXq32m5fsF9TwAAAABJRU5ErkJggg==\n",
"text/latex": [
"$\\displaystyle 0$"
],
"text/plain": [
"0"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(remap_lookup_table_multiple_results)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"starting_indices_to_operators = {i: (c0, c1, e) for i, (c0, c1, e) in enumerate(product(range(24), range(24), range(2)))}"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"def contract_indices_to_single(result_index, indices):\n",
" c0, c1, e = starting_indices_to_operators[result_index]\n",
" # Preserve identity on one qbit.\n",
" # Note that there is no case where both vops are the identity,\n",
" # As they are handled by a different case.\n",
" if(c0 == 2):\n",
" return indices[1]\n",
" if(c1 == 2):\n",
" return indices[2]\n",
" \n",
" # Try to have an identity if it is possible.\n",
" if(indices[1] != -1):\n",
" return indices[1]\n",
" if(indices[2] != -1):\n",
" return indices[2]\n",
" # No identity is possible.\n",
" return indices[0]"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [],
"source": [
"remap_lookup_table_indices = [contract_indices_to_single(i, indices) for i,indices in enumerate(remap_lookup_table_multiple_results)]"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [],
"source": [
"remap_lookup_table_operators = [starting_indices_to_operators[i] for i in remap_lookup_table_indices]"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAVCAYAAAB7R6/OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARUlEQVQoFWNgYGAoA+K7UGyEhc/QCRR0+f//PwMyBoqBxZmADLxgVAEkeEbDgchwYIEmp5mMjIwgZigQuwBxOhALAfFuAP68FOR8/BSoAAAAAElFTkSuQmCC\n",
"text/latex": [
"$\\displaystyle \\left[ \\right]$"
],
"text/plain": [
"[]"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"remap_lookup_table_operators[0:10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Produce some (almost valid) `C` code from the lookup table:"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
"\n",
"}\n"
]
}
],
"source": [
"print(\"{\")\n",
"print(\"\\n , \".join((\"{%d, %d, %d}\" % i for i in remap_lookup_table_operators)))\n",
"print(\"}\")"
]
}
],
"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
}