新しい物好きの方は是非新しいblueqatで新世界を体験してみましょう。多くの量子ビット数が計算できるようになりました。その代わりとしてdepthと呼ばれる回路の深さ方向に制限が付きます。ちょっと実機に近いですよね。まずは更新と必要なライブラリを入れます。
pip install --no-deps -U git+https://github.com/jcmgray/quimb.git@develop autoray blueqat
Collecting git+https://github.com/jcmgray/quimb.git@develop
Cloning https://github.com/jcmgray/quimb.git (to revision develop) to /tmp/pip-req-build-y58jowxa
Running command git clone -q https://github.com/jcmgray/quimb.git /tmp/pip-req-build-y58jowxa
Requirement already satisfied: autoray in /opt/conda/lib/python3.8/site-packages (0.3.1)
Requirement already satisfied: blueqat in /opt/conda/lib/python3.8/site-packages (0.6.0)
Collecting blueqat
Downloading blueqat-1.0.0-py3-none-any.whl (79 kB)
[K |████████████████████████████████| 79 kB 678 kB/s eta 0:00:010:01
[?25hInstalling collected packages: blueqat
Attempting uninstall: blueqat
Found existing installation: blueqat 0.6.0
Uninstalling blueqat-0.6.0:
Successfully uninstalled blueqat-0.6.0
Successfully installed blueqat-1.0.0
Note: you may need to restart the kernel to use updated packages.
まず基本的な使い方を見てみましょう。以前と大きな違いはありませんが、少し使いかたが異なります。いまはバックエンドを指定していますが、今後は標準シミュレータになる予定です。
80量子ビットの重ね合わせを作ってみましょう。jupyternotebookなどで動かない人はインストールが終わった後に、カーネルをリスタートしてみてください。
from blueqat import Circuit
N=80
Circuit(N).h[:].run(backend="quimb")
Counter({'10001011100101111000011111111101010100001011111010111000001001001001111011110010': 1})
どうでしょうか、1回だけ80量子ビットが計算されました。重ね合わせなので、量子ビットがばらばらででました。次にもつれを作ってみます。
circ = Circuit(80).h[0]
for i in range(N-1):
circ.cx[i, i+1]
circ.run(backend="quimb")
Counter({'00000000000000000000000000000000000000000000000000000000000000000000000000000000': 1})
もつれの場合は一回計算しただけだとわかりづらいので、繰り返し計算をしてみます。shotsで指定します。
circ = Circuit(80).h[0]
for i in range(N-1):
circ.cx[i, i+1]
circ.run(backend="quimb", shots=100)
Counter({'11111111111111111111111111111111111111111111111111111111111111111111111111111111': 52,
'00000000000000000000000000000000000000000000000000000000000000000000000000000000': 48})
このようにサンプルがとれました。より実機に近いですね。大きな量子状態を保存することは今のコンピュータではできませんので、状態ベクトルがフルで取れないかわりに単一の状態の振幅がとれます。
import numpy as np
amplitude = ''.join([str(np.random.choice([0,1])) for _ in range(N)])
print(amplitude)
Circuit(N).h[:].run(backend="quimb", amplitude = amplitude)
01101000110100001111010000101001101101001010010010110100101100110100110111100110
(9.094947017729225e-13+0j)
たくさんの量子ビットでサンプルを取ると重ね合わせの処理の大変さもわかります。
Circuit(100).h[:].run(backend="quimb",shots=100)
Counter({'1110000100001000101010010000101001000010000110110011000111000010111001111000100100111100111010000001': 1,
'1100000001001000001010001101101110110001110010111100110001111011100110000011011011001100000110111111': 1,
'1010000110101110001011100010000000010011010010011011001111111101010101111110110101011000100000110100': 1,
'1110011000110011000100100001011101000100100010100001011001110011010010111100101110011001111001001101': 1,
'0000100101001101100000100010010110100000100111011110101111110100011000001000010001100110111111000111': 1,
'1010111010000010000100100110111000110111001011010101110100000011010110000010001001100011101100100011': 1,
'1001111000010110011011011100001000011000010011100011111001111001100101101010010000010011100101100111': 1,
'0000000100100011111000011111110011000000010001111100100111101011111010100101011100000000001011000000': 1,
'1000110101001001100110000010100000000000001010111011010100111000000001010010000010110001100110001011': 1,
'0111100111101100101100111011011001000001100010000000111001110111111100001111111100111011001100010000': 1,
'1000001110010011111011100010010100001111111011001100110001110101001000110010100100000001001110001110': 1,
'1011001100010101101110101111011110001010111100100110111011001101011111010100100001001011100000010110': 1,
'0001100001110001011011111100111101010000110001110011010001010000000000011010011010011111000001111101': 1,
'1010001110010001000000011101000000001100000011000101010001001101001010100111110101000110111010100010': 1,
'1110000110011000111100000010101000101000101000001010111110000001000000100010001010000011010000001011': 1,
'1011100100100000001010101010010111101110111110101000101010001000000110110010101011010000000100101101': 1,
'1110100111101000101001010001000111000100010110100111100101010111000110001011111000111100001001110010': 1,
'0110010110000001010000010101010101011011011101010101101101101001101111100101000001000010101001101110': 1,
'0100110111011011010100011010111111110110100010001111110011010101010000110101100000101000111001111011': 1,
'0100000000001010101101110110011110100111100001101000001000010111001010101011100100100000000010011111': 1,
'1000010001111011001101100110111100011110011000101110011100100010111110011011001011111111100110101111': 1,
'0110010101100000001100110111101100110100010110101000011010011000101010111011000010011100011011111101': 1,
'0100101011110001011110001110011101111001010000011100010011101001000110010110011101010010001001001101': 1,
'0011011000100011100011001100111011100100101000010100110000100111101101010110110000010000100011111111': 1,
'1100000011100111110000101101001111100100101011101101110110001111110001101101111111100101001001110111': 1,
'0111010010101000100111101010101100110100110110101100101101011101111000101010011000100010110010111110': 1,
'1100011100110011111111111000111010110100000110101100100101011110001101110011001111000001111000010111': 1,
'1010000110001001000101101000000111011001101111010010010001101010100101000000110001110011111101101111': 1,
'0101100101100011001001101010001010111110110010001010100111110011001000101110100011100100001101100010': 1,
'1101100110111100010001000111011110010110110000100010111110001011100100110010000010111111101111010001': 1,
'0010111011101110001110011010000101011010101101110011111001100111011111001111111111100101100001001100': 1,
'0010010001110101110000000101001010101100010010111011100001000100100110001010011000110000100011000010': 1,
'0011011111000101110000101110101100000110001000101110001101110001110110010011001111001000100000100101': 1,
'1001101001000010100110001010101100001100001001010111111001011100101100010110100000111110110010111001': 1,
'0100110101010101111010010000000111001101011110000011000101100101111100010001100000101010110110101010': 1,
'0111100111010110001010111101011011101110111111101101010111101100010011110100111100110011101110111001': 1,
'1000101100000010001100001100100111000110011110000101000001011100100110010101000100000001100110011000': 1,
'1001000110100010001001010001010111010100010100010101100011000111111011110011101010111000111010101001': 1,
'0001100010011010110010101101100001011111010000001011100111011100010010011010111001001011101110011001': 1,
'1001100000001000000000001101100111101111111101000011011011110011000110010101101101110001111011110010': 1,
'1111100110100011011010000001001001000101011011111110001110001011110100101101101100101010111010010110': 1,
'0010100000101100011110111101111111111000110000101110110100111101111001100000110011000111100010100010': 1,
'0000110101101010010101001001000001000111011111010110000010101001011111111000011001110011101100100010': 1,
'0110100010010101010100000011010111100001000001001111101111001000011010101000110111100100010111111000': 1,
'1001000100000100000001111101111010010000111100110010111100001010100000000111110011110100011101101100': 1,
'0011111010010011110011011110110110011100110001101100001001111011001100010111010010001100010100101011': 1,
'0110101101011111010000111111010110110101110011011101101011001010001000010010010011011001111111101110': 1,
'1001111100100100000111101111000110000011010100111010010100010110011110011011100000001000001011010010': 1,
'0100011110010101101000111100101010011010111101100010111101001000000111110010101010011010010110010101': 1,
'0100010011111010101110101101000101110111100111100111000110011100101011010100010010000000000100110011': 1,
'1101111100100001000100001011111100110111111000001110000000000101011100110001001100000100110010000101': 1,
'0000010110001000111001000011010000111111111101010000101011101000011011000010011100100110110011000101': 1,
'1001111001000001111100110110001110010101000000000100000101011110001011000001010010001001100000010101': 1,
'0001001001111010011001100111110111111101101001000100010110010000000100110110100110101101101100110010': 1,
'0101101011000101111001111111011001011100111100000001101111110110100100110010110000010011111010111010': 1,
'1000110011101110000001100001001001100111110101001100000011011110010111001110011010000101111100111111': 1,
'1111001110000011100101110011101000110110100001100101101110010110001000101000110101110110011010000110': 1,
'1010000011010110011000111110100011000000000010101101011101010110100010100100110101110010011111110100': 1,
'1000001100000101111010010101110000101011110001100101010110011100011011010000010110001010110100011010': 1,
'0000010010110111011001110010001100111011111100001001011001110011111001010101111010010010010001110101': 1,
'0110100010001111110011110101000101011101111111001010010000010001011110001101001011101100001110100110': 1,
'0101111011001001000110001010001011111000110111110101010001000010001110001110101111010110111111110001': 1,
'0101111001110111000010101011001101100011000011001000110111110001011111111110011101110001010000111101': 1,
'0111101101111000110100001100100101111001110010100010011100101000010001001111011000001011001000101011': 1,
'1110101100100010000110010101101010101000000111100001110101101111001110101101001100011110110100100000': 1,
'0010100000011101010000111101010101110111011101001100111110010010100100011101011111111000101110001100': 1,
'0111011101101110111011011011110100111001101111100110001010111110000010000110001010000101101110000100': 1,
'0001111011011100100001000001110011111011111111100110101111111100011011100101010001011101001001111111': 1,
'0010010110110110011100100110111111010010000101010001011011010011100111101001110000000100111101100010': 1,
'1000101111110101100011110000111010111000101001011111001111001001010010010010001010010011011001001101': 1,
'0011010000010011011101111100010110100000100110111000010101111001110101010001000011100000100001010011': 1,
'1000011100110010010000000100111010100000011000101101011101010011101111000011001010000111011110010110': 1,
'1101110101001011010001010001111011011001100100001001100010101111101110000111110010010011011100111001': 1,
'1000011010010001011111100100000110000011000101101000010111001100011010001110101000111011110011100101': 1,
'0101101100110011010010110001010100111010111010010011111011100101010010000000010000100101000011010000': 1,
'0110111101000110000101110001001100011101101100100111111001111001001000101001101110111011011100110111': 1,
'0001001100011010101110111011000011011100100001110010000111001100110111100110111011011000111111001010': 1,
'0100101111000111011000110000110011110110100000101110011000010111001110111100101110100111001111100010': 1,
'1001110011000001111100001101101111010101001010010001011100100000101000110111010010011011110000011111': 1,
'1000100100001000000011101001110111101001111011010001011100111110111110111001110101110000011100011010': 1,
'0111010001101011101111010011110100111011110101110011011101000110111111010010100111100011110000010001': 1,
'0000000111000100000000100101010100110000011010011110100101011011101111001000100110001000101110001000': 1,
'1000110100101111101100100110101111001000101110011111010111111101111111111011011000100011110011010001': 1,
'0010100101010011111101000001010001001100111000100100100101010101011011001111001111011101000101010101': 1,
'1111111100000010001101111110010001100110010111110001010101110001101101101011110100101000100011011000': 1,
'0001011100110111110000011110101000111110110001111110100111010100001101100000010110100010001110111000': 1,
'0101111001111001111100001010000011101101111111101010000110010111010010111100000101000001010110001101': 1,
'1101011110010100011111111011001101110001100100010010001100110111001010000110010001001010110000000011': 1,
'1111110001100100011101001011101110111100101010100100010110011110101101101011101011000001000001111000': 1,
'1110001111110011110001111101111110011110000100011111000110110111011111010001000111110100100110011011': 1,
'1100001100111001110110111100101101011100100000111101110101011000111101111111001010011011100111100110': 1,
'0001010101010001010101110000100101100001001110100011100101111110111011101110000011001000010011110110': 1,
'1110001011010000011001001111101100010011001101011010100101001111011110001100111010011111111011011100': 1,
'0111010011001011100000001111100111100011111000101011100100110000110011100100110000010100000110000010': 1,
'1110110110000110100110111001100011111100010110110111110011011111001010111110000000000010100010111110': 1,
'0000000010010011010101001011110010110000100100001010011010100011101111001011111101001111011101000000': 1,
'0001110100101110110000101101011111100011001001111011010010101001100001010011110011110001001101100011': 1,
'1111101000011100111111000111100010100101001100100110111111010111011010011001000110011110011101100001': 1,
'1101100100011111101100101110011000111101011000011111111010001100000010101110101110111001010100100010': 1,
'0001000011100100010110001000010010001010000100000010110000000101101010100001000010100000100111100100': 1})
まだコードもいろいろ追加、修正しないといけないので少しずつ進めていきます。ぜひ使ってみてください。以上です。