勉強がてら、量子計算シミュレータをつくってみたよ。
[qlazy - Quantum Computer Simulator]
(https://github.com/samn33/qlazy)
Interface2019年3月号にC言語での実装例が出ていたので、参考にさせていただきました。まず、Linuxコマンドとして実装して、その後、ctypesでPythonからも呼び出せるようにしました。
使い方は至ってシンプル。
init 2
h 0
cx 0 1
m
というファイルを用意しておいて、
$ qlazy -qc foo.qc
とやると、
frq[00] = 45
frq[11] = 55
last state => 00
という結果が得られます。何をやっているかというと…
- 1行目:量子ビットを2つ用意し、|00>に初期化
- 2行目:0番目の量子ビットにアダマールゲートを適用
- 3行目:0番目と1番目に制御NOTを適用
- 4行目:全量子ビットを観測(デフォルトでは100回測定してその頻度を出して、100回目の測定結果をlast stateとして表示します。上の例では|00>だったのが45回、|11>だったのが55回で、100回目の結果は|00>でした、という意味)
…です。
また、行の途中で、
show
とやると、そのときの量子状態を出力することもできます。例えば、上のfoo.qcの制御NOTゲートの後にshowを入れると、
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乗(と棒グラフ)を表示してくれます。というわけで、この例の場合、「量子もつれ」の様子がわかります。実際の量子コンピュータでは、こんな芸当はできないですが、シミュレータならではの機能ですね。
あと、ファイル読み込みではなく、対話モードでも実行できます。
$ qlazy
>> init 2
>> h 0
>> cx 0 1
>> show
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 |+++++
>> m
frq[00] = 45
frq[11] = 55
last state => 00
>> quit
$
Pythonから使う場合は、以下のように書けば、同じようなことができます。
from qlazypy.basic import QState
qs = QState(2)
qs.h(0)
qs.cx(0,1)
qs.show()
md = qs.m()
md.show()
del qs
とりあえず、基本的なゲートは実装できた気になっています。以下に置いたので、ご興味あれば触ってみてください。諸々不具合あるかもしれませんが、フィードバックいただけると、とてもうれしいです。
[qlazy - Quantum Computer Simulator]
(https://github.com/samn33/qlazy)
補足(2021.9.5)
以上