はじめに
最近は量子コンピュータを気軽に使えるようになりました。IBMは本物の量子コンピュータをクラウドで公開してますし、量子コンピュータ用のプログラミング言語なども出てきています。
今回はその中でも、PythonのライブラリであるpyQuilを使って遊んでみました。
pyQuilについて
量子コンピュータを開発しているRigettiという会社のAPIにアクセスして、仮想量子コンピュータで計算することができます。公式ドキュメントを参考にしてます。
環境
OS: macOs High Sierra
Python: Anaconda3-5.0.0
pyQuilのバージョンは1.7.0です
インストール方法
@YuichiroMinatoさんの記事にまとめられているので、そちらを参考にしてください。
量子ゲートモデルのSDK、Rigetti Forestを触ってみる
pip一発で入るはずなのですが、私の環境だとなぜか失敗するのでソースからインストールしました。
どこか適当なディレクトリで
git clone git@github.com:rigetticomputing/pyquil.git
cd pyquil
pip insall -e .
を実行すると使えるようになります。
前提知識
今回は「そもそも量子コンピュータってなに?」とか「量子ゲートって?」みたいなところは触れません。
その辺から知りたい人向けに、IBMがいい感じの入門記事を公開してくれているので紹介しておきます。
IBM Quantum Computing で計算してみよう
1 + 1を計算する量子回路
量子回路図はこんな感じになりました。CNOTゲートとCCNOTゲートだけで構成されています。
今回はパワポで描いたのですが、量子回路を描画するのにもっと便利なツールを知ってる人はコメントください。
[0]と[1]のビットに足し合わせる数(0か1)で、[2]と[3]が計算結果です。よくある1ビット加算器を量子回路で置き換えただけですね。
[2]にやっている処理が古典的コンピュータでいうXOR、[3]のがAND演算にあたります。
できたプログラム
こんなプログラムになりました。
from pyquil import api
from pyquil.quil import Program
from pyquil.gates import *
def add(num1, num2):
# 量子ビットの初期化(無くてもいいのかも)
calc = Program(I(0), I(1), I(2), I(3))
# 1が入力されてたら反転させる
if num1:
calc.inst(X(0))
if num2:
calc.inst(X(1))
# 残りの計算はどの場合も共通
calc.inst(CNOT(0, 2), CNOT(1, 2), CCNOT(0, 1, 3))
# 量子ビットの値を古典ビットに入れて観測する
calc.measure(0,0).measure(1,1).measure(2,2).measure(3,3)
return calc
# 初期状態の結果はビットの並びが逆順になっているから整形する
def formating_result(result):
left_hand = str(result[0][0]), str(result[0][1])
right_hand = str( int(str(result[0][3]) + str(result[0][2]), 2) )
answer = left_hand[0] + ' + ' + left_hand[1] + ' = ' + right_hand
return answer
def main():
qvm = api.QVMConnection()
calc = add(0, 0)
result = qvm.run(calc, [0, 1, 2, 3])
answer = formating_result(result)
print(answer)
if __name__ == '__main__':
main()
実際に量子ゲートの設定をしているのはadd()です。
もうちょっと頑張って拡張すれば、多ビット化できる気がする。
add()の引数に応じて計算してくれます。今のところ引数は0と1のみです。
計算結果
4パターンしかないので、テストも楽です。実行すると、下のような出力をします。
1 + 1:
1 + 1 = 2```
1 + 0:
```$ python one_plus_one.py
1 + 0 = 1```
# 重ね合わせ
ちなみに、add()の中をちょっと書き換えて
```python
calc = Program(
I(0), I(1), I(2), I(3),
H(0), H(1),
CNOT(0, 2), CNOT(1, 2),
CCNOT(0, 1, 3)
)
のようにすると、0と1を重ね合わせて同時に入力できます。
この重ね合わせが量子コンピュータの最大の武器なのですが、今回はただ出力がランダムになるだけです。
もうちょっと複雑な量子アルゴリズムになると、重ね合わせをフル活用していくことになります。
おわりに
今回はpyQuilを使ってみたい!という思いでやってみました。
とはいえ、足し算くらいだと量子コンピュータでやる意味は全く無いので、次はもうちょっと量子コンピュータらしいアルゴリズムに挑戦してみます。