non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

150行の量子コンピューターのシミュレーターのコードを知って学んだこと

おはようございます。4月から次男は一人で保育園に通ってます。しかし、登園前に長男と保育園からの同級生と一緒に小学校そばまで一緒に行ってから登園してます。kjunichiです。

背景

ハッカーニュースでPythonで書かれた150行の量子コンピューターのシミュレーター知った

github.com

表題日本語で訳してツイートしたら、思った以上にTLでの反響があった

学んだこと

いきなり、手元の環境では以下のエラーが出力されて動かない

Traceback (most recent call last):
  File "examples.py", line 45, in <module>
    print('NOT Gate: |' + NOT.measure() + '>')
  File "/Users/junichi/work/python/QuSimPy/QuSim.py", line 147, in measure
    self.numQubits
  File "/Users/junichi/.pyenv/versions/3.6.1/lib/python3.6/site-packages/numpy/core/numeric.py", line 2039, in binary_repr
    binary = bin(num)[2:]
TypeError: only integer scalar arrays can be converted to a scalar index

でも、WindowsのAnacondaでは動いた。

ちょっと調べたらNumpyのバージョンが古いと動く模様

使用しているnumpyのバージョンを調べるには

import numpy as np

print(np.version.version)

ということを以下のURLで知った。

自力でエラーに対応した

numpy#binary_reprでとうもスカラ値を入れれば良さそうな事が 察知できたので、以下の様にnp.random.choiceで得られる配列の 先頭を取得するように修正した。

np.random.choice(results, 1,p=self.probabilities)[0],

さらに良い方法

ハッカーニュースで紹介されたからか、同様の事象がすぐにIssue挙げられて、

翌日みたら、以下のように

np.random.choice(results, p=self.probabilities),

random.choiceの第二引数の指定が消されていた、これで、 ランダムに1つだけ選択してスカラ値が取れる模様。

参考資料

もう一年くらい前かIBMクラウド量子コンピューターを一般公開していた 事を思い出し、ちょっとググったら、当時は英語だった気がするが、日本語のページを発見

www.ibm.com

TLで「量子コンピューター」で検索したら日銀の公式で論文紹介していたヤツ

まとめ

当初は、動いたり、動かなかったりするのが量子コンピューターなのかも?そこも含めて シミュレーションしているのかなどとも考えたりした。

学べたこと

  • numpyのバージョンの調べ方
  • numpy#binary_reprの引数の指定方法
  • numpy#random.choiceの結果をスカラ値で取得する方法

関連記事

10年前の記事