$$
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
$$
前回に続き、一方向量子計算のシミュレーションです。前回は1量子ビット回路の構成をしてみたので、今回は2量子ビット回路をやってみます。前回同様、参考文献は以下です。
CNOTゲート
上記、電子情報通信学会知識ベースの方に、CNOTゲートの例がでているので、これを試してみます。量子ビットをたくさん(15量子ビットも!)使うので、手順を言葉で言うのではなく、いきなり図示します。

ここで、XはX方向の測定、YはY方向の測定を表します。測定を繰り返して、最終的に6番目と14番目の量子ビットが計算結果の状態となります。
シミュレーション
qlazyでシミュレーションしてみます。上の図を素直に書くと、以下のようになります。比較検証のため、従来の量子ゲートでの計算も下の方でやっています。結果をわかりやすくするため、最初に0番目の量子ビットにアダマールをかけ、それにCNOTする形にしています。最終的に、量子もつれのベル状態となれば、今回のシミュレーションは成功です。
import random
from qlazypy import QState
def main():
print("== CNOT gate ==")
print("** one-way quantum computing")
# graph state
qs_oneway = QState(15)
qs_oneway.h(0)
qs_oneway.h(1).h(2).h(3).h(4).h(5).h(6).h(7)
qs_oneway.h(9).h(10).h(11).h(12).h(13).h(14)
qs_oneway.cz(0,1).cz(1,2).cz(2,3).cz(3,4).cz(4,5).cz(5,6)
qs_oneway.cz(3,7).cz(7,11)
qs_oneway.cz(8,9).cz(9,10).cz(10,11).cz(11,12).cz(12,13).cz(13,14)
# measurement
qs_oneway.mx(id=[0], shots=1)
qs_oneway.my(id=[1], shots=1)
qs_oneway.my(id=[2], shots=1)
qs_oneway.my(id=[3], shots=1)
qs_oneway.my(id=[4], shots=1)
qs_oneway.my(id=[5], shots=1)
qs_oneway.my(id=[7], shots=1)
qs_oneway.mx(id=[8], shots=1)
qs_oneway.mx(id=[9], shots=1)
qs_oneway.mx(id=[10], shots=1)
qs_oneway.my(id=[11], shots=1)
qs_oneway.mx(id=[12], shots=1)
qs_oneway.mx(id=[13], shots=1)
qs_oneway.show(id=[6,14])
print("** conventianal quantum gate")
qs_gate = QState(2)
qs_gate.h(0)
qs_gate.cx(0,1)
qs_gate.show()
del qs_oneway
del qs_gate
if __name__ == '__main__':
main()
結果は、以下の通りです。ちゃんと正しくもつれていることがわかります。途中の測定結果によっては、パウリゲートが一番前にかかる場合もあります。何度か実行してみればわかりますが、$\ket{00},\ket{11}$ではなく、$\ket{01},\ket{10}$のベル状態になることもあります。
== CNOT gate ==
** one-way quantum computing
c[00] = +0.7071-0.0000*i : 0.5000 |++++++
c[01] = -0.0000+0.0000*i : 0.0000 |
c[10] = -0.0000-0.0000*i : 0.0000 |
c[11] = +0.7071-0.0000*i : 0.5000 |++++++
** conventianal quantum gate
c[00] = +0.7071+0.0000*i : 0.5000 |++++++
c[01] = +0.0000+0.0000*i : 0.0000 |
c[10] = +0.0000+0.0000*i : 0.0000 |
c[11] = +0.7071+0.0000*i : 0.5000 |++++++
まとめ
たかが、2量子ビットの計算をやるだけで、15量子ビット必要になりました。このように、量子ビットをすごく浪費してしまうというのは、一方向量子計算のデメリットのように感じてしまいますが、おそらくそれ以上の面白いメリットがあるのだと思います(勉強進めればわかるはず!?)。
実際、「観測に基づく量子計算」には、「物性物理」「量子光学、光物質系」「誤り耐性量子計算」「古典統計物理学」「暗号(セキュアなクラウド量子計算)」「計算量理論」の分野で、「ここ十数年の間」「さまざまな新しい結果を可能にしてきた」ということで、理論研究に関して重要な貢献をしているようです。
また、電子情報通信学会知識ベースの方には、ハードウェアの実用化の状況も触れられています。「線形光学系」や「光学格子に補足された中性冷却原子による実装」なども研究され、「10万個程度の原子からなる3次元クラスタ状態」が生成できた、という研究例もあると記載されています(これは2010年時点までの情報です。いまはもっといろんな研究事例があるのだと想像します)。
というわけで、現在主流の超電導量子ビット以外の方式の可能性も、横目でちゃんと見ておきたいと思います。
補足(2021.9.5)
以上