一方向量子計算のシミュレーション(2)

$$
\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}}
$$

[前回](https://qiita.com/SamN/items/db181408092d214fb77b)に続き、一方向量子計算のシミュレーションです。前回は１量子ビット回路の構成をしてみたので、今回は２量子ビット回路をやってみます。前回同様、参考文献は以下です。

* [小柴、藤井、森前、「観測に基づく量子計算」コロナ社（2017年）](http://www.coronasha.co.jp/np/isbn/9784339028706/)
* [電子情報通信学会知識ベース：量子通信と量子計算：3-5 観測による量子計算モデル](http://www.ieice-hbkb.org/portal/doc_S2_05.html)



## CNOTゲート

上記、[電子情報通信学会知識ベース](http://www.ieice-hbkb.org/portal/doc_S2_05.html)の方に、CNOTゲートの例がでているので、これを試してみます。量子ビットをたくさん（１５量子ビットも！）使うので、手順を言葉で言うのではなく、いきなり図示します。

![cnot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391058/d1d6bc58-797f-3f8b-abb4-ef306e2511ad.png)
ここで、XはX方向の測定、YはY方向の測定を表します。測定を繰り返して、最終的に６番目と１４番目の量子ビットが計算結果の状態となります。

## シミュレーション

[qlazy](https://github.com/samn33/qlazy)でシミュレーションしてみます。上の図を素直に書くと、以下のようになります。比較検証のため、従来の量子ゲートでの計算も下の方でやっています。結果をわかりやすくするため、最初に０番目の量子ビットにアダマールをかけ、それにCNOTする形にしています。最終的に、量子もつれのベル状態となれば、今回のシミュレーションは成功です。

```python
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}$のベル状態になることもあります。


```sh
== 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 |++++++
```

## まとめ

たかが、２量子ビットの計算をやるだけで、１５量子ビット必要になりました。このように、量子ビットをすごく浪費してしまうというのは、一方向量子計算のデメリットのように感じてしまいますが、おそらくそれ以上の面白いメリットがあるのだと思います（勉強進めればわかるはず！？）。

実際、[「観測に基づく量子計算」](http://www.coronasha.co.jp/np/isbn/9784339028706/)には、「物性物理」「量子光学、光物質系」「誤り耐性量子計算」「古典統計物理学」「暗号（セキュアなクラウド量子計算）」「計算量理論」の分野で、「ここ十数年の間」「さまざまな新しい結果を可能にしてきた」ということで、理論研究に関して重要な貢献をしているようです。

また、[電子情報通信学会知識ベース](http://www.ieice-hbkb.org/portal/doc_S2_05.html)の方には、ハードウェアの実用化の状況も触れられています。「線形光学系」や「光学格子に補足された中性冷却原子による実装」なども研究され、「１０万個程度の原子からなる３次元クラスタ状態」が生成できた、という研究例もあると記載されています（これは2010年時点までの情報です。いまはもっといろんな研究事例があるのだと想像します）。

というわけで、現在主流の超電導量子ビット以外の方式の可能性も、横目でちゃんと見ておきたいと思います。

## 補足(2021.9.5)

[qlazy](https://github.com/samn33/qlazy)最新版でのソースコードは[ここ](https://github.com/samn33/qlazy/blob/master/example/py/OneWayQC)に置いてあります。

以上