量子シミュレーターラボ:JupyterLab で量子ビット、ゲート、測定
このラボは、生徒ひとりひとりに専用の JupyterLab を用意します。中には小さな量子シミュレーター qsim.py が入っていて、NumPy で書かれた70行ほどのコードなので、最初から最後まで読めます。作業フォルダーには、最初のノートブックと短いスクリプトもあり、量子ビットを作り、ゲートをかけ、測定し、ベル状態を作り、干渉を見せます。
これは、ふつうのコンピュータで動くシミュレーターです。量子コンピュータではなく、量子コンピュータが速いことを示すこともできません。すべての振幅を記憶に持つので、量子ビットがひとつ増えるたびに仕事が2倍になります。見せられるのは、決まりのほうです。攻撃のラボではありません。どのコピーも、インターネットにも他の生徒にも通じていません。
生徒が学ぶこと
量子ビットは振幅で表され、ある答えの確率はその振幅の2乗であること。ゲートは振幅を変えること。X は 0 と 1 を入れ替え、H は等しく混ぜます。測定は偶然でひとつの答えを返すので、等しい混ぜ合わせを1000回測ると、それぞれ500回に近くなり、ぴったりにはなりません。ベル状態は2つの量子ビットを結びつけ、いつも同じ答えにすること。振幅は打ち消し合えること、これが干渉です。最後に、4つの項目を印のついたものへ寄せる一歩。Python を少し知っている生徒の、量子コンピューティングの入口に向いています。正確な文言はお使いの認定機関の単元でご確認ください。ここでは引用していません。
ブラウザーで動かす
ラボはサービスをひとつ、jupyter だけ起動し、シミュレーター、ノートブック、短いスクリプトを作業フォルダーに書き出します。JupyterLab はトークンを求めません。プラットフォーム自身の入口が、開く人をすでに知っているからです。ラボの横のターミナルには Python がないので、docker exec jupyter に続けて、中で実行するコマンドを入力して、ラボの Python を使います。
- コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
- ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。JupyterLab:量子シミュレーターを探します。
- 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
- 開く. ラボのページのラボバーに JupyterLab というリンクがあります。押すとブラウザーで JupyterLab が開くので、start.ipynb をダブルクリックします。次に「ターミナルを開く」を押して docker exec jupyter python3 steps/qubit.py と入力すると、状態 |0> の量子ビットが表示されます。
生徒に提出させるもの
qsim.py を使った自分のノートブック。たとえば各量子ビットに H をかけた3量子ビットの状態や、別のゲートが |0> に何をするかを調べたもので、JupyterLab の File、Download でダウンロードします。それに、見たことと、シミュレーターには見せられないことを、自分の言葉で一、二文。自動採点はありません。その文が、理解できたかどうかを示します。もっと力を見たいときは、セルを実行する前に回数を予想させてください。
このラボで進める基本のレッスン
Quantum Simulator Basics は、このラボで進める小さなレッスンです。生徒は作業フォルダーを表示し、量子ビットを作り、X と H をかけ、固定した乱数の種で測定し、ベル状態を作り、振幅が打ち消し合うのを見て、4つの項目を印のついたものへ寄せます。
わざと小さくしてあります。ラボで進めるレッスンがどういうものかを先生に見せるのが役目で、あとはラボが担います。変更したいときは、ご自分のモジュールにコピーしてください。
GitHub のコード
compose ファイルには Dockerfile がありません。Jupyter Docker Stacks の公式イメージ scipy-notebook を、日付つきのタグに固定して、特権のない専用アカウントとメモリ 512 MB で動かすだけです。イメージのライセンスは BSD-3-Clause で、私たちは配布していません。ファイルは起動時に qsim.py とスクリプトを書き出し、何もダウンロードせず、どのスクリプトも毎回同じものを表示します。限界は正直に書いておきます。これはシミュレーターで速さは示せないこと、すべての振幅を持つので少数の量子ビットにしか向かないこと、インターネットから何かをインストールすることはできないことです。ラボを止めると何も残らないので、生徒は先にノートブックをダウンロードします。
課題として出す
課題には何を提出するかを書いておきます。
- ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-quantum-sim とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、たとえば自分のゲートを足すときは、先にリポジトリをフォークしてください。
- 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
- 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
- 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。
このラボを試す、そして費用
無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。
よくある質問
- これは本物の量子コンピュータですか。
- いいえ。シミュレーターです。NumPy で量子ビットの決まりに従うふつうのプログラムで、決まりを学ぶのに向いています。すべての振幅を記憶して動くので、量子コンピュータが速いかどうかは示せません。
- なぜ実行のたびに同じ回数が表示されるのですか。
- 測定には乱数の種を渡し、同じ種なら同じ結果が出ます。種を変えると、偶然のとおり回数が少し変わります。スクリプトは種を固定してあるので、レッスンの数字とみなさんの画面が一致します。
- なぜターミナルは docker exec jupyter を使うのですか。
- ラボのターミナルには curl や psql などのクライアントはありますが、Python はありません。docker exec jupyter は、Python と NumPy のあるラボのコンテナの中でコマンドを実行します。JupyterLab にも、File、New、Terminal から開く専用のターミナルがあります。