参考文献
Destructive SWAP testの元ネタ:
そもそもSWAP testとは
SWAP test
量子状態|0>|Ψ>|φ>に
Circuit().h[0].cswap[0, 1, 2].h[0].m[0]
を回路に付け加えると、0ビット目が0と測定される確率が(1+|<Ψ|φ>|^2)/2になる。
元ネタの論文
- 光の分野で知られているHong-Ou-Mandel (HOM)効果はSWAP testと等価だよ
- けれど、HOM効果は無駄な|0>を使ってないよね、ということでやってみた
- 元々のSWAP testでは、|Ψ>, |φ>のレジスタは(そのままではないものの)状態として残るが、HOM効果を真似た今回のは、そのレジスタは壊れてしまう(そこがdestructive)
回路づくり
SWAP: Circuit().cx[2, 1].cx[1, 2].cx[2, 1]
CSWAP: Circuit().cx[2, 1].ccx[0, 1, 2].cx[2, 1]
なので、SWAP testは
Circuit().h[0].cx[2, 1].ccx[0, 1, 2].cx[2, 1].h[0].m[0]
X = HZHを使うと
Circuit().h[0].cx[2, 1].h[2].ccz[0, 1, 2].h[2].cx[2, 1].h[0].m[0]
CCZを使い終わったら、1, 2の量子ビットはもういらないから、いらないゲートを消してしまって
Circuit().h[0].cx[2, 1].h[2].ccz[0, 1, 2].h[0].m[0]
ところで、0量子ビット目に注目するとHZH = Xの関係が再び使えて(CCZはどれがcontrolとかどれがtargetとか関係ない)
Circuit().cx[2, 1].h[2].ccx[1, 2, 0].m[0]
ところで、0量子ビット目の測定結果が0になる確率が(1+|<Ψ|φ>|^2)/2になるのだった。
0量子ビット目の測定結果が0になるのは、1量子ビット目と2量子ビット目の少なくともいずれかが0になっているとき。(0量子ビット目にCCXを使っているので)
なので、これでよい。
Circuit().cx[2, 1].h[2].m[1, 2]
0量子ビット目が消えた!
|Ψ>|φ>に対しては、
Circuit().cx[1, 0].h[1].m[0, 1]
の測定結果が11以外となる確率が、(1+|<Ψ|φ>|^2)/2になる。
例
|Ψ> = Circuit().ry(1)[0].rz(0.4)[0].run()
|φ> = |0>
とすると、
from blueqat import Circuit
import numpy as np
c = Circuit().ry(1)[0].rz(0.4)[0]
print((1 + abs(np.vdot(c.run(), Circuit(1).run()))**2) / 2)
# => 0.8850755764670349
print(c.cx[1, 0].h[1].m[0, 1].run(shots=10000))
# => 動かすたびに変わるが
# Counter({'00': 3804, '01': 3900, '11': 1170, '10': 1126})
# 10000 - 1170 = 8830
# 0.8850... * 10000とかなり近い