100マス量子回路計算やってみよう〜初級編〜


駒場祭で、100マス積分や100マスホモロジー計算を配布していたのを見て、ふと思いつきました。
みなさん、やってみましょう。

やり方

左列に書いてある量子回路に、上行に書いてある量子回路をつなげてできる状態をマス目に書いてください。
ただし、初級編では

\begin{eqnarray}
|0> &=& \begin{pmatrix} 1 \\ 0 \end{pmatrix}\\
|1> &=& \begin{pmatrix} 0 \\ 1 \end{pmatrix}\\
|+> &=& \frac{1}{\sqrt 2}\begin{pmatrix} 1 \\ 1 \end{pmatrix}\\
|-> &=& \frac{1}{\sqrt 2}\begin{pmatrix} 1 \\ -1 \end{pmatrix}\\
|i> &=& \frac{1}{\sqrt 2}\begin{pmatrix} 1 \\ i \end{pmatrix}\\
|-i> &=& \frac{1}{\sqrt 2}\begin{pmatrix} 1 \\ -i \end{pmatrix}\\
\end{eqnarray}

のいずれかを記入します。これらの定数倍($-|i>$や$i|->$など)になった場合は、定数は無視して記入します。
たったこれだけしかないので、「これ重複しとるやん」みたいなのが多数ありますが、気にせずやっていきましょう。

初級編

キミはできたかな?

これを暗算できないと量子プログラミングできないかというと、全然そんなことないんですが。やっぱりできた方が便利です。
毎日練習して、量子回路暗算王を目指しましょう。

中級編、上級編?

初級編を作ってみたら、回路が場所を取って厳しい、ということが分かりました。
また、今以上に複雑な解だと、どうやって答えを記述するか、という問題も出てきます。

うまいこと作れたら、これからも出していきます。

答えがほしい

以下をコピペすれば、Blueqatで答えが求まります。

import numpy as np
from blueqat import Circuit

# 初級編
tate = [
    Circuit().i[0],
    Circuit().h[0],
    Circuit().x[0],
    Circuit().y[0],
    Circuit().z[0],
    Circuit().s[0],
    Circuit().h[0].x[0],
    Circuit().h[0].y[0],
    Circuit().h[0].z[0],
    Circuit().h[0].s[0],
    Circuit().x[0].s[0],
]

yoko = [
    Circuit().i[0],
    Circuit().s[0],
    Circuit().z[0],
    Circuit().y[0],
    Circuit().h[0],
    Circuit().x[0],
    Circuit().h[0].s[0],
    Circuit().h[0].z[0],
    Circuit().h[0].y[0],
    Circuit().h[0].x[0],
    Circuit().x[0].s[0],
]

states = [
    (np.array([1, 0], dtype=complex), '|0>'),
    (np.array([0, 1], dtype=complex), '|1>'),
    (np.array([1, 1], dtype=complex) / np.sqrt(2), '|+>'),
    (np.array([1, -1], dtype=complex) / np.sqrt(2), '|->'),
    (np.array([1, 1j], dtype=complex) / np.sqrt(2), '|i>'),
    (np.array([1, -1j], dtype=complex) / np.sqrt(2), '|-i>'),
]
def get_answer(c1, c2):
    state = (c1.copy() + c2).run(ignore_global=True)
    for ref, ans in states:
        if np.allclose(ref, state):
            return ans
    raise ValueError(f'Unexpected states. {state}')

for c1 in tate:
    for c2 in yoko:
        print('{:4}'.format(get_answer(c1, c2)), end=' ')
    print('')