最近、この本を使って量子コンピューティングを勉強し始めました。
練習問題が難しいです(笑)
ここではアウトプットの一環として量子テレポーテーションをqiskitを使って実装していきます!
開発環境はcolabです。
IBMのアカウントを作る
ここからIBMのアカウントを作成します。
qiskitのインストール
pip install qiskit
pip install pylatexenc
下のやつは量子回路を表示させるときに使います。(なくても一応大丈夫ですがあったほうが見やすくなります。)
必要なライブラリのインポート
``` from qiskit import * import numpy as np %matplotlib inline ```回路を作っていく!
``` qc = QuantumCircuit(3, 1)#未知の状態を作る
qc.ry(np.pi/5, 0)
qc.barrier()
#ベル状態を作る
qc.h(1)
qc.cx(1, 2)
qc.barrier()
qc.cx(0, 1)
qc.h(0)
qc.barrier()
qc.cz(0, 2)
qc.cx(1, 2)
qc.ry(-np.pi/5, 2)
qc.measure(2, 0)
qc.draw(output="mpl")
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1127342/e3bc34db-300a-d340-9f56-717d630c552f.png)
回路の説明をしていきます。
数式ベースの話は次の記事に書こうと思いますので、雰囲気だけ掴んでもらえれば幸いです。
最初の$q_0$にかかっている$R_Y$というゲートで、送りたい量子状態をつくっています。
つぎの点線の中は$q_1$と$q_2$をベル状態という特別な状態にしています。
ここまではいわば、準備の段階で、次からが量子テレポーテーションを行うところです。
ここからは次回の記事で説明します
<h2>実際に量子コンピューターに投げてみる</h2>
from qiskit import IBMQ
IBMQ.save_account('###') #ここに自分のtokenをいれる
#使える量子コンピューターを調べる
IBMQ.load_account()
provider = IBMQ.get_provider(hub='ibm-q')
provider.backends()
実行結果に現在使用できる量子コンピューターが表示されます。
最もすいているバックエンドを選ぶ
from qiskit.providers.ibmq import least_busy
large_enough_devices = IBMQ.get_provider().backends(filters=lambda x: x.configuration().n_qubits > 3 and not x.configuration().simulator)
print(large_enough_devices)
real_backend = least_busy(large_enough_devices)
print("ベストなバックエンドは " + real_backend.name())
実行結果に一番すいているものが表示されます。
job = execute(qc,real_backend)
ジョブの実行状態を確認
from qiskit.tools.monitor import job_monitor
job_monitor(job)
自分の場合は一時間ぐらい待ったら実行結果が返ってきました
real_result= job.result()
print(real_result.get_counts(qc))
plot_histogram(real_result.get_counts(qc))
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1127342/ba2e3a85-ab19-2760-bae5-4bd9ac783a14.png)
<h2>感想</h2>
シミュレーターでられば、0が100%になるんですけど、実際の量子コンピューターだと1が少し出てきてしまいます。誤り制御?がまだ量子コンピューターではできないからこうなるそうです。(自分もまだよくわかっていないです)
鉛筆と紙で理論ばっかり勉強するのも楽しいですが、こうやって実際に自分でやってみるのも楽しいかったです。これからもたくさん利用させていただきたく思います。