LoginSignup
1
3

More than 1 year has passed since last update.

Destructive SWAP testに関するメモ

Last updated at Posted at 2021-07-13

参考文献

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とかなり近い
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3