量子コンピュータ
量子ゲート
量子もつれ
blueqat


はじめに

以前連続量プログラミングで量子テレポーテーションを紹介しました。

光連続量量子テレポーテーションプログラミング

https://qiita.com/YuichiroMinato/items/af1d8b7c97f3c9b92e13

今回は汎用型量子ゲートマシンでのBlueqatSDKを利用して量子テレポーテーションを実装したいと思います。


量子テレポーテーション

量子テレポーテーションは量子もつれにある2つの粒子の片方を観測することで、もう片方の状態が決まります。これにより状態がテレポートしたように見えるためこのような名前が付いています。

量子もつれを生成し、それを測定し、測定結果を持って、最終的な転送先の量子ビットの操作をすることで量子状態を写すことができます。

テレポーテーションという名前であるものの、粒子が空間の別の場所に瞬間移動するわけではない。量子もつれの関係にある2つの粒子のうち一方の状態を観測すると瞬時にもう一方の状態が確定的に判明することからこのような名前がついた。また、この際に粒子間で情報の伝達や物理的作用は起こっていない。

量子テレポーテーションはEPRペアという量子もつれの関係にある2つの粒子の間に起こる。

引用:https://ja.wikipedia.org/wiki/%E9%87%8F%E5%AD%90%E3%83%86%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

以前上記の量子テレポーテーションで紹介したように、量子もつれを生成し、それを測定し、測定結果を持って、最終的な転送先の量子ビットの操作をすることで量子状態を写すことができます。

今回は量子状態を追っての数式は細かくは確認しませんが、主には各量子ビットの状態をゲートごとに変換して状態の係数をみていくことで量子テレポーテーションの内部の量子状態を追うことができます。こちらが詳しいので、勉強したい方はこちらを参照ください。

吾輩は量子プログラミング言語である。名前はまだ無い。 Microsoftで生れ量子テレポーテーションした事だけは記憶している。

https://qiita.com/piyo7/items/0c80181c567b3075c00f


回路を見る

最初にq0の状態を決めます。ここでは?にしています。次に、最初に量子もつれを作るのはq1とq2です。q1にHゲート、q1,q2にCXをかけることで、EPRペアと呼ばれる量子もつれ状態を実現できます。そして、ベル測定という部分ですが、q0,q1にもつれを発生させ、q0にHゲートをかけてから測定をします。今回は測定の代わりにCX/CZ回路で代替します。本来はCX/CZの代わりに測定をして、Xゲート、Zゲートを適用させます。

q0 -?-----*-H---*-------

q1 ---H-*-X---*-|-------
q2 -----X-----X-Z-------

コードはとてもシンプルですので、実行して結果を見ます。

from blueqat import Circuit

#量子テレポーテーション回路
a = Circuit().h[1].cx[1,2].cx[0,1].h[0].cx[1,2].cz[0,2].m[:]
a.run(shots=100)

Counter({'010': 21, '000': 30, '100': 28, '110': 21})

これを見ると、初期のq0はq2の値を見ればいいので0がテレポートしたことがわかります。q0とq1の測定結果によらずq2にq0の元の状態の0が移っています。次に1を写して見ます。

(Circuit().x[0] + a).run(shots=100)

Counter({'001': 25, '111': 23, '101': 24, '011': 28})

最初にq0をXゲートを使って1にして見ると、同様にq0とq1の測定結果によらず、q0の状態の1が移ってます。最後にHゲートをq0にかけてみると、

(Circuit().h[0] + a).run(shots=100)

Counter({'100': 15,
'000': 20,
'111': 16,
'011': 8,
'001': 14,
'101': 8,
'110': 10,
'010': 9})

約半々でq2に0と1が約半々ででるようになって重ね合わせ状態が移っています。このように簡単にBlueqatで量子テレポーテーションが実装できました。ちょっと工夫することで複雑なコードがどんどん簡単になります。みんなで頑張りましょう。