sympy の基本的な使い方は sympy で量子計算 を参考のこと。
ドイチェ=ジョザアルゴリズムDJ とは量子ゲート Fが constant もしくは balanced であるとわかっている場合、 F がどちらであるかを決定するアルゴリズムである。
入力:3-qubit, 出力:1-qubit の系を考えよう。DJ アルゴリズムを使うと、以下のように isBalanced
関数を定義できる。引数は量子ゲートである。
def isBalanced(circuit):
start = Qubit('1000')
DJ = H(0)*H(1)*H(2)*circuit*H(0)*H(1)*H(2)*H(3)
# calculate probability for |*000>, could be better implemented.
p1 = qapply(Dagger(Qubit('0000')) * DJ * start)
p2 = qapply(Dagger(Qubit('1000')) * DJ * start)
prob = abs(p1)**2 + abs(p2)**2
#print (prob)
if prob < 0.001:
return True
elif prob > 0.999:
return False
else:
raise Exception('something wrong')
いくつかの balanced, constant なゲートを通してみる。うまく動作しているようだ。
from sympy.physics.quantum.qubit import Qubit, measure_all
from sympy.physics.quantum.gate import I, X, Z, H, CNOT, CGate
from sympy.physics.quantum.dagger import Dagger
from sympy.physics.quantum.qapply import qapply
Toffoli = lambda a,b,c: CGate((a,b),X(c))
def isBalanced(circuit):
start = Qubit('1000')
DJ = H(0)*H(1)*H(2)*circuit*H(0)*H(1)*H(2)*H(3)
# calculate probability for |*000>, could be better implemented.
p1 = qapply(Dagger(Qubit('0000')) * DJ * start)
p2 = qapply(Dagger(Qubit('1000')) * DJ * start)
prob = abs(p1)**2 + abs(p2)**2
#print (prob)
if prob < 0.001:
return True
elif prob > 0.999:
return False
else:
raise Exception('something wrong')
Fc1 = I
Fc2 = X(3)
Fb1 = Toffoli(0,1,3)*CNOT(2,3)
Fb2 = CNOT(0,3)*CNOT(1,3)*CNOT(2,3)
for f in [Fc1, Fc2]:
assert(isBalanced(f) is False)
for f in [Fb1, Fb2]:
assert(isBalanced(f) is True)
# F = CNOT(0,3)*Toffoli(0,1,3)
# isBalanced(F) #throws Exception