こんにちは、量子コンピュータの発展は目覚ましいですがまだまだ未完成ですよね。精力的に次世代型のマシンを開発していきます。
この度弊社では光量子計算に対応するためにblueqatにモジュールを追加しました。今年登場予定の光量子コンピュータの実機計算対応です。
導入方法は下記のようにblueqatからphotonqatモジュールを読み込みます。
from blueqat import photonqat as pq
import numpy as np
import matplotlib.pyplot as plt
G = pq.Gaussian(3)
# original state
x_origin = 1
p_origin = 0.5
# squeezeng level
r = 2
G.D(0, x_origin + p_origin * 1j) # state to teleport
G.S(1, -r)
G.S(2, r)
G.BS(1, 2, np.pi/4) # 50:50 beam splitter
G.BS(0, 1, np.pi/4) # 50:50 beam splitter
G.MeasX(0)
G.MeasP(1)
G.X(2, G.Creg(0, "x", scale = np.sqrt(2)))
G.Z(2, G.Creg(1, "p", scale = np.sqrt(2)))
#G.X(2, G.Creg(0, "x"))
#G.Z(2, G.Creg(1, "p"))
G.run()
G.Wigner(2) # plot
print('Mode 0: Original state =', [x_origin * np.sqrt(2), p_origin * np.sqrt(2)])
print('measured x =', G.Creg(0, "x").read())
print('measured p =', G.Creg(1, "p").read())
print('teleported mu =', G.mean(2)) # mu of qumode 0
<Figure size 432x288 with 1 Axes>
Mode 0: Original state = [1.4142135623730951, 0.7071067811865476]
measured x = 2.290600984077483
measured p = -0.651583653902112
teleported mu = [1.4798699 0.64852263]
上記はガウシアンシミュレータを使って実装されています。Fockシミュレータの方も見てみましょう。
F = pq.Fock(3, cutoff = 20)
# original state
x_origin = 1
p_origin = 0.5
# squeezeng level
r = 2
# prepare the state to teleport
F.D(0, x_origin + p_origin * 1j) # Displacement
F.S(1, -r) # Squeezing
F.S(2, r) # Squeezing
F.BS(1, 2, np.pi/4) # 50:50 beam splitter
F.BS(0, 1, np.pi/4) # 50:50 beam splitter
F.MeasX(0)
F.MeasP(1)
F.D(2, F.Creg(0, "x", scale = 1))
F.D(2, F.Creg(1, "p", scale = 1j))
F.run()
print('Mode 0: Original state =', [x_origin * np.sqrt(2), p_origin * np.sqrt(2)])
print('measured x =', F.Creg(0, "x", scale = 1).read())
print('measured p =', F.Creg(1, "p", scale = 1j).read())
W, x, p = F.Wigner(2) # plot
Mode 0: Original state = [1.4142135623730951, 0.7071067811865476]
measured x = [2.37018517]
measured p = [-0.-1.47899555j]
<Figure size 432x288 with 1 Axes>
Fockシミュレータのほうはある程度のcutoffサイズがないと計算ができませんが、一旦両方で計算ができました。