量子ビットは、ふつうのビットと何がちがうのか
ビットは 0 か 1 です。量子ビットは、答えごとにひとつずつ、2つの数で表され、測定するとその2つの数から 0 か 1 のどちらか一方が、偶然で決まります。この決まりを、自分で読める短い Python のファイルとして作ります。ふつうのコンピュータで動くので、これはシミュレーターであって量子コンピュータではなく、量子コンピュータが速いかどうかを見せることはできません。見せられるのは、決まりのほうです。
このレッスンが終わると
メモ
量子ビットを作り、ゲートをかけ、測定して、回数の表が何を示すかを言うことができる。
キーワード
- 量子ビット:ビットの量子版。2つの振幅で表す。
- 振幅:ひとつの結果につく数。2乗すると、その結果が出る確率になる。
- ゲート:X や H のように、振幅を変える一歩。
- 測定:量子ビットを読むこと。0 か 1 がひとつだけ、偶然で出る。
- ショット:1回の実行。最後は測定で終わる。
- シミュレーター:決まりに従って動く、ふつうのコンピュータ上のプログラム。
はじめに:もう知っていること
メモ
頭の中で答えてください。1. 2ビットで表せる値は何通りですか。2. 公平なコインを1000回投げると、表はおよそ何回出ますか。3. 0.5 を2乗するといくつですか。答え: 4通り(ただし一度にひとつだけ)。約500回。0.25。
始める前に
メモ
レッスンの上のバーにある ラボを開始 を押し、動いていると表示されるまで待ちます。コンテナはひとつ、jupyter だけで、ターミナルからは docker exec jupyter でその中の Python を使います。これはコンテナの中でコマンドをひとつ実行する命令です。JupyterLab のリンクを押すと、ポート 8888 の画面が開きます。下の 実行 ボタンは、それぞれのコマンドをラボのターミナルに、同じセッションの中で順番に入力します。様子を見たいときや自分で入力したいときは、バーの ターミナルを開く(新しいタブ) を押します。
シミュレーターは、読めるファイルです
ls は作業フォルダーの中身を表示します。シミュレーターの qsim.py(NumPy で書かれた70行に満たないファイル)、ノートブックの start.ipynb、そしてフォルダー steps があります。最初のスクリプトは、状態 |0> の量子ビットを作ります。最初に表示される 1.000|0> は「答え 0 の振幅が 1」という意味です。確率は [1. 0.] で、読めば必ず 0 です。量子ビット2つなら、00、01、10、11 のそれぞれに振幅が1つずつ、合わせて4つ必要です。
docker exec jupyter lsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
docker exec jupyter python3 steps/qubit.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ゲートは振幅を変える
X ゲートは 0 と 1 を入れ替えるので、|0> は 1.000|1> になります。H ゲートは、2つを等しく混ぜます。0.707|0> + 0.707|1> です。どちらの振幅も 0.707 で、0.707 を2乗すると 0.5 なので、確率は [0.5 0.5] です。
docker exec jupyter python3 steps/gates.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
測定は偶然でひとつの答えを返す
このスクリプトは、H の状態を1000回測定します。乱数の種を固定してあるので、何度実行しても同じです。種が 1 のときは 0 が507回、1 が493回。種が 2 のときは 503回と497回。種 1 をもう一度使うと、最初とまったく同じ答えです。どちらもほぼ半分で、ぴったり半分にはなりません。それが偶然です。
docker exec jupyter python3 steps/measure.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
確かめよう
ヒント
H の状態は、どちらの答えも振幅が 0.707 です。回数が 707 と 707 ではなく、500 と 500 に近いのはなぜですか。答え: 確率は振幅の2乗で、0.707 の2乗は 0.5 であり、2つの確率を足すと 1 になるからです。
2つの量子ビットを結びつける
1つ目の量子ビットに H、続けて CNOT をかけると、ベル状態 0.707|00> + 0.707|11> になります。回数の表には 00 と 11 だけが出ます(507回と493回)。01 や 10 は出ません。2つの量子ビットはいつも同じ答えになるのに、ひとつだけ見ればコイン投げと同じです。
docker exec jupyter python3 steps/bell.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
振幅は打ち消し合う
H を2回かけると 1.000|0> にもどり、H、Z、H の順にかけると 1.000|1> になります。2つ目の H は振幅を足し合わせ、間に Z があると、2つの答えのうちひとつが打ち消されます。これが干渉で、量子プログラムはこれで確率を思うほうへ寄せます。
docker exec jupyter python3 steps/interfere.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
確率をひとつの答えへ寄せる
4つの項目に 00、01、10、11 と番号をつけ、11 に印をつけます。どれも振幅は 0.500 から始まるので、確率は 0.25 ずつです。印のついた項目の符号を反転しても、どの確率も変わりません。しかし、もう一歩、すべての振幅を平均を中心に折り返すと 1.000|11> が残ります。印のついた項目が、確実になりました。
docker exec jupyter python3 steps/amplify.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある思い込み
注意
量子コンピュータはすべての答えを同時に試して、いちばんよいものを見せるだけだと思われがちです。測定で出る答えはひとつで、振幅の2乗に従って偶然で決まります。大切なのは、ゲートと干渉で振幅を整えて、ほしい答えが出やすくなるようにすることです。
シミュレーターに見せられないこと
これは、ふつうのコンピュータで動く qsim.py です。すべての振幅を記憶に持つので、量子ビットがひとつ増えるたびに仕事が2倍になり、速くなることは示せません。決まりをそのまま正確にたどるので、決まりを学ぶのには向いていますが、本物の機械の作りや速さについては何も言えません。
同じことをノートブックで
バーから JupyterLab を開き、start.ipynb をダブルクリックします。スクリプトと同じことを、セルごとに行い、最後はベル状態の回数の棒グラフで終わります。セルをクリックして Shift と Enter を押すと実行されます。最後のセルは、あなた自身の問いを書く場所です。
最後の確認
ヒント
見返さずに答えてください。1. 振幅がわかっているとき、その結果が出る確率はどう求めますか。2. H ゲートは |0> に何をしますか。3. ベル状態では、どの組の答えが出ますか。4. このシミュレーターで、量子コンピュータが速いことを示せますか。答え: 振幅を2乗する。等しく混ぜ、どちらも 0.707 になる。00 と 11 だけ。示せない。ふつうのコンピュータ上のシミュレーターだから。
先生へ
ヒント
このレッスンは、ラボで進めるレッスンの小さな例です。手順と実行ボタンがレッスンで、ラボは生徒ひとりひとりのコピーです。ラボはサービスがひとつで、生徒が読める小さな NumPy のシミュレーターが入った JupyterLab です。自動採点はありません。生徒は qsim.py を使った自分のノートブックを JupyterLab からダウンロードして、わかったことの一文といっしょに提出します。学習のポイント:1. 量子ビットは2つの振幅で、確率はその2乗。2. ゲートは振幅を変え、測定は偶然でひとつの答えを返す。3. 干渉は確率を寄せる。よくある思い込み:「すべての答えを同時に試す」。用意するもの:ラボとブラウザー。ヒント:実行を押す前に、それぞれの出力を予想させてください。乱数の種は固定なので、どのコピーでも同じ数になり、ラボは速さを示せないことをはっきり述べています。ご自分のモジュールにコピーして変更するか、レッスンビルダーのラボメニューから一から作ってください。