CNOTゲートの分解
CNOTゲートは条件付きの2量子ビットゲートです。
こちらは4x4の行列となっています。量子回路では、腕四本のテンソルにも書き換えることができます。
import numpy as np
a = np.array([[1,0,0,0],[0,1,0,0],[0,0,0,1],[0,0,1,0]])
print(a)
[[1 0 0 0]
[0 1 0 0]
[0 0 0 1]
[0 0 1 0]]
上記の行列は2量子ビットあった場合に、00,01,10,11と2量子ビットの入出力状態を対応させて行列計算します。
2量子ビット同時に入力せずに、1量子ビットずつの入出力を扱う場合には、テンソルに分解できます。
b = a.reshape(2,2,2,2)
print(b)
[[[[1 0]
[0 0]]
[[0 1]
[0 0]]]
[[[0 0]
[0 1]]
[[0 0]
[1 0]]]]
行列からテンソルに変わりました。ここからさらに腕が三本のテンソル二つに分けることができます。コントロールビットとターゲットビットのそれぞれに対応する操作をテンソルとして記述し、それぞれのテンソルの腕をつないでもつれを作ります。ちょっとグーグルのライブラリ使います。
!pip install tensornetwork
Requirement already satisfied: tensornetwork in /opt/conda/lib/python3.9/site-packages (0.4.6)
Requirement already satisfied: graphviz>=0.11.1 in /opt/conda/lib/python3.9/site-packages (from tensornetwork) (0.20)
Requirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.9/site-packages (from tensornetwork) (1.21.0)
Requirement already satisfied: scipy>=1.1 in /opt/conda/lib/python3.9/site-packages (from tensornetwork) (1.8.1)
Requirement already satisfied: opt-einsum>=2.3.0 in /opt/conda/lib/python3.9/site-packages (from tensornetwork) (3.3.0)
Requirement already satisfied: h5py>=2.9.0 in /opt/conda/lib/python3.9/site-packages (from tensornetwork) (3.6.0)
まずはテンソルのオブジェクトに変換
c = tn.Node(b)
腕を指定してSVD分解します。sは自動的に割りふられます。
U, V, trun_error = tn.split_node(c, [c[0],c[1]], [c[2],c[3]])
上のテンソル
print(U.tensor)
[[[ 1. 0. 0. 0.]
[ 0. 1. 0. 0.]]
[[ 0. 0. 0. -1.]
[ 0. 0. -1. 0.]]]
下のテンソル
print(V.tensor)
[[[ 1. 0.]
[ 0. 0.]]
[[ 0. 1.]
[ 0. 0.]]
[[-0. -0.]
[-1. -0.]]
[[-0. -0.]
[-0. -1.]]]
元に戻るか確認してみます。
d = U@V
print(d.tensor.reshape(4,4))
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 0. 1.]
[0. 0. 1. 0.]]
元に戻りました!普通に量子コンピュータをやっていると見かけることのなかなかない表記ですが、これを使うことで時間発展方向に制限されずに計算できますのでぜひ使いましょう!