こんにちは、Juliaです。量子計算を手で確認するの大変なので入門編として量子ビットと量子ゲート計算をJuliaで基礎的なところをやります。
量子ビットの作成
量子ビットは状態ベクトルのテンソル積が取れますので、
q = [1,0]
このように単体の量子ビットを準備します。
2-element Array{Int64,1}:
1
0
量子ビットを増やしたい場合には、
kron(q,q)
こうすることで、
4-element Array{Int64,1}:
1
0
0
0
これをループで回すと、
function svq(N)
q = [1,0]
sv = q
for i=2:N
sv = kron(sv,q)
end
return sv
end
のような関数になります。3量子ビットの状態ベクトルを作るには、
svq(3)
8-element Array{Int64,1}:
1
0
0
0
0
0
0
0
できました。
ゲートの作成
次に量子ゲートです。行列として作ります。まずはXゲート
x = [0 1;1 0]
2×2 Array{Int64,2}:
0 1
1 0
単位行列も使います。
i = [1 0;0 1]
2×2 Array{Int64,2}:
1 0
0 1
アダマールゲート
h = 1/sqrt(2)*[1 1;1 -1]
2×2 Array{Float64,2}:
0.707107 0.707107
0.707107 -0.707107
できました。2量子ビットゲートのCXは、
cx = [1 0 0 0;0 1 0 0;0 0 0 1;0 0 1 0]
4×4 Array{Int64,2}:
1 0 0 0
0 1 0 0
0 0 0 1
0 0 1 0
準備が整いました。
量子ゲートのテンソル積
今回は愚直に量子回路を計算します。まずは、同時に計算する量子ゲートのテンソル積を取ります。量子ゲートのないところには単位行列を採用します。
function svg(gates)
sv = gates[1]
for i=2:length(gates)
sv = kron(sv,gates[i])
end
return sv
end
できました。早速Xゲートを片方にかけた回路のテンソル積を見てみましょう。
svg([i,x])
これは、
4×4 Array{Int64,2}:
0 1 0 0
1 0 0 0
0 0 0 1
0 0 1 0
こんな感じです。早速計算してみましょう。
計算
あとは状態ベクトルにゲートをかけるだけです。
svg([i,x,i])*svq(3)
8-element Array{Int64,1}:
0
0
1
0
0
0
0
0
あとは、
svg([h,i,i])*svq(3)
重ね合わせ回路です。
8-element Array{Float64,1}:
0.7071067811865475
0.0
0.0
0.0
0.7071067811865475
0.0
0.0
0.0
うまくできました。最後に量子回路を計算してみます。
量子もつれ
もつれ回路です。hの後にcxをかけます。
svg([cx])*svg([h,i])*svq(2)
こうすると、、、
4-element Array{Float64,1}:
0.7071067811865475
0.0
0.0
0.7071067811865475
綺麗にもつれましたね!以上です!