中高生向け：量子コンピューター入門 演習編


$$
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
$$

ユーザーインターフェースを現行版に更新したものを[こちら](https://qiita.com/kifumi/items/1c1a3438db214f369b97)に公開しました。(2021年11月26日追記)

2020年 3/30(月)14:00〜開催のオンラインイベント[『中高生向け：量子コンピューター入門 〜長期春休み特別企画〜』](https://quantum-tokyo.connpass.com/event/170994/)のハンズオン資料です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/75bbef21-7553-10ca-6770-14d509042737.png)

IBM Quantum Experience (https://quantum-computing.ibm.com/) を使って、量子コンピューターの計算をしてみましょう。パソコンまたは、iPadなどのタブレット端末で実行できます。

# 0. はじめの設定
## 0-1) ホーム画面からComposer(コンポーザー)画面へ行く
まず、[こちら](https://quantum-computing.ibm.com/)からログインします。ID登録がまだの方は、[『IBM Quantum Experienceへの登録（くわしいバージョン）』](https://qiita.com/kifumi/items/7ac33ab7939d2dd796d0)を参考に、登録してください。
ログインできたら、左側の家マークをクリックして、ホーム画面に行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/9a2107cf-7beb-06eb-e8e0-bd6565ff0d2d.png)

ホーム画面の真ん中の上ぐらいにある青字の「Start a composer experiment」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/5e382578-0356-ce43-a15d-dbe057515e36.png)

下にあるコンポーザー画面で計算します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/9a8dce75-4f69-ea6c-7ebc-e059eac37763.png)

## 0-2) 量子ビットの数の設定
初期設定では、5量子ビットが並んでいますが、まず、1量子ビットで実験しますので、1量子ビットの回路に変更します。また、棒グラフで結果を見やすくします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/1d692a2e-082e-5426-e6f8-99627f1f59d3.png)


１）マウスをq[1]に近づけると、左側にゴミ箱マークが出てくるので、クリックして消します。同じように繰り返して、q[0]だけ残します。量子ビットが1つだけの回路になりました。
２）左側の棒グラフのアイコンをクリックして、青いグラフを出してください。
下の画面がセットできたら、始めましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/7bca4a0f-aba7-7a46-3d07-1e71a8427676.png)



# 1. Xゲート
右上に並んんでいるH,S,・・・X,Y, などの量子ゲートの箱をドラッグアンドドロップで下の回路に移動させて量子回路を作っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/64e9f6bd-fbc0-5b54-8a51-5980d75df608.png)
図の回路を作ってみてください。それぞれ左側の棒グラフの変化を確認しましょう。
1-1) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/71872825-a8b5-ce15-7b3f-401cc03acc13.png)
1-2)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/6a23996b-587d-6a51-acf1-cdced3ca7a51.png)
1-3)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/dbc7971c-a212-3de3-42bc-d64af9385317.png)
量子ビットの初期値は、$\ket{0}$ なので、 **反転ゲート** のXを1回使うと$\ket{0}$が$\ket{1}$に、また2回使うと$\ket{0}$に戻ることが左側の棒グラフを見て確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/eca560fd-ee43-5628-13e1-e5507d442f34.png)

次の章に移る前に、Xゲートをクリックして、右肩のバツマークを出し、バツをクリックしてゲートをクリアしてください。この方法で３つのXゲートを削除して、量子回路をきれいにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/900926e2-ae5c-480e-f5b3-26e99072f122.png)


# 2. Hゲート
Hゲートは、アダマールゲートと呼ばれるもので、量子重ね合わせ状態を作ることができる重要なゲートです。$\ket{0}$が、$\ket{0}$と$\ket{1}$の**重ね合わせ**状態になります。
次の図の回路を作ってみてください。左側の棒グラフの変化を確認しましょう。

2-1)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/d249bff3-ead6-4459-5171-6257ef9ee285.png)
量子ビットの初期値は$\ket{0}$ なので、アダマールゲートHを適用すると、$\ket{0}$と$\ket{1}$の**重ね合わせ**状態になります。これは、$\ket{0}$でもあり$\ket{1}$でもある状態ですが、量子ビットを測定するまでどちらの状態かわかりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/082240bc-ca46-fea1-8412-1398c7e221c0.png)
棒グラフのメモリに0.707があるのが読めますが、式で書くと、
　　$\ket{0} →(H)→ 0.707\ket{0}+0.707\ket{1}$
です。（高校生向け：これは、$\frac{1}{\sqrt{2}}\ket{0}+\frac{1}{\sqrt{2}}\ket{1}$ と等しいです。）

測定する前にどのくらいの確率で$\ket{0}$と$\ket{1}$が測定されるか事前に予測できます。下の図のように、棒グラフの上の「Statevector(状態ベクトル)」をクリックして「Measurement Probabilities(測定確率)」にしてみましょう。00000と00001の確率が50%ずつの均等な重ね合わせの状態ができていることがわかります。これは、この状態の量子ビットを測定すると０か１のどちらかが観測されるのですが、たくさん測定されると、例えば1000回測定されると約500回は0が観測され、約500回は1が観測されるということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/d3a22d8b-acb0-4819-4d54-76c67f40fa1c.png)

続けます。
2-2)  Hゲートも2回繰り返すと棒グラフの値が元に戻ることを確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/314c4160-2a27-e50b-4fe4-6473f146a74f.png)

2-3)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/0cabcb54-33ca-aa6c-92ac-9d36c1a17d0e.png)
$\ket{0}$にXゲートを使うと$\ket{1}$になり、$\ket{1}$にHゲートを使うと棒グラフの$\ket{1}$の部分が黄色になりました。これはマイナス（ー）の意味があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/26b703cf-c9a6-1654-458d-c1305e1ccd85.png)
式で書くと、
　$\ket{1} →(H)→ 0.707\ket{0}-0.707\ket{1}$
です。（高校生向け：これは、$\frac{1}{\sqrt{2}}\ket{0}-\frac{1}{\sqrt{2}}\ket{1}$ と等しいです。）
$\ket{0}$にHゲートだけを使った状態と同じように、$\ket{0}$でもあり$\ket{1}$でもある状態ですが、$\ket{1}$の前にマイナス（ー）がついているので、別の状態と考えて計算に使います。

2-4) 続けてHゲートをもう一度かけると棒グラフはどうなりますか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/35aee761-2292-ff8f-66d8-6d03845a2860.png)

2-5) q[0]の下にある灰色の「+」マークをクリックして２量子ビットの回路をセットし、Hゲートをそれぞれ使ってみましょう。棒グラフには何個の状態がありますか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/48fdf9cd-3c72-ed45-ecce-959e0927246c.png)
2-6) ５量子ビットの時の重ね合わせです。何通りの状態ができますか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/9f45992b-1a32-e659-5ce4-9c3c910ce747.png)



# 3. Zゲート
次の図の回路を作ってみてください。それぞれ左側の棒グラフの変化を確認しましょう。
3-1)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/81f63089-7c9f-3009-ceb1-65b2035d3f45.png)
3-2)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/014f9925-8c80-2755-b3bb-dd673fc022f0.png" width="1000"> 

左側の棒グラフの色は何色になりましたか？
Zゲートは、$\ket{1}$に操作するとマイナスがつくゲートです。
　　$\ket{0} →(Z)→ \ket{0}$
　　$\ket{1} →(Z)→ -\ket{1}$
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/7a9b96ab-c618-db44-e912-1e94cbfcb77b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/7898ebb2-201a-04b7-218d-b660d91c5a99.png)

続いて次の回路を作ってみてください。
3-3)<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/65842c00-0ffe-fb07-cf4a-c116017d1b57.png" width="1000">

3-4)<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/107f4122-307f-1787-61e8-85fafdb9d96d.png" width="1000">

棒グラフの色と下の数字のプラス・マイナスの符号を確認してみましょう。
Zゲートは、重ね合わせの＋と-の符号を入れ替えるゲートです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/c8f322fb-f966-951d-0471-cab82ac583c4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/888dc8f8-1519-fdb8-28b7-2f5b7c119937.png)


〜〜高校生向けの説明〜〜
Hゲートは$\ket{0}$と$\ket{1}$の重ね合わせを作るゲートでしたので、
　　$\frac{1}{\sqrt{2}}\ket{0}+\frac{1}{\sqrt{2}}\ket{1} → (Z) → \frac{1}  {\sqrt{2}}\ket{0}-\frac{1}{\sqrt{2}}\ket{1} $
　　$\frac{1}{\sqrt{2}}\ket{0}-\frac{1}{\sqrt{2}}\ket{1} → (Z) → \frac{1}{\sqrt{2}}\ket{0}+\frac{1}{\sqrt{2}}\ket{1} $
になっていることが確認できると思います。このとき
　　$\frac{1}{\sqrt{2}}\ket{0}+\frac{1}{\sqrt{2}}\ket{1} =\ket{+}$
　　$\frac{1}{\sqrt{2}}\ket{0}-\frac{1}{\sqrt{2}}\ket{1} =\ket{-}$
とかくことにすると、
　　$\ket{+} → (Z) → \ket{-}$
　　$\ket{-} → (Z) → \ket{+}$
になります。
Zゲートは、重ね合わせの＋と-の符号を入れ替えるゲートです。
〜〜高校生向けの説明ここまで〜〜

# 4. 練習問題 A
次の棒グラフが表示されるような量子回路を作ってみましょう。答えは一つではないので、どんな作り方でもOKです。
ヒント：棒グラフ下の右側の数字が上側の量子ビットq[0]に対応していることに注目して作ってみましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/93579646-db41-c0f7-2611-5a2487c1c475.png" width="500"> 
さらにヒント：使うゲートはX、H、Zだけです！
4-1)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/28010a00-39df-224a-fd96-4c582a802da8.png" width="300"> 
4-2)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/1b13e0d7-18ec-fb4f-10b6-474ce5387459.png" width="300"> 
4-3)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/2f012287-c432-4c05-dafe-d87b0097b2f7.png" width="300"> 
4-4)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/1533615c-c482-e56b-6a4c-f52ce38d0313.png" width="300"> 
4-5)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/450e411c-111a-2285-f5dd-9ecf4b363b2b.png" width="300"> 
4-6)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/c6f56b81-752f-7864-0172-5076c57f0810.png" width="300"> 

次はCXゲートを練習します。

#5. CXゲート
CXゲート（コントロールNOTゲート）は2量子ビットを使う計算をします。
CXゲートは、下の図にあるような記号で、＋がついていない側が制御ゲート、＋がついている側が目標ゲートと呼ばれます。制御ゲートが$\ket{1}$のときのみ、目標ゲートを反転（NOT）するゲートです。下の図では、q[0]がXゲートで$\ket{1}$になっているので、q[1]の値$\ket{0}$を反転して$\ket{1}$にします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/dc48684f-72bc-fec9-3d99-e67989e4735f.png" width="300"> 


次の図の回路を作ってみてください。q[0]が$\ket{1}$のときのみ、q[1]の値が反転していることを確認しましょう。
5-1)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/b688b24e-c011-253e-ff01-1609ab55b150.png)
5-2)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/eee2dbc0-17ed-2643-7b90-b798e72d0095.png)
5-3)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/d44cadc0-e618-e5d5-155a-aaf15819d18f.png)
5-4)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/7401da69-efdb-0a44-181e-cb9b7bd9a1e6.png)
5-5)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/d6bec70b-7e8e-85d6-b6ae-ae017e30b766.png)
最後の回路の棒グラフを見てみましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/c4217d6d-a4c0-ea23-5896-72221b34c2a7.png" width="300"> 
これは、q[0]だけみると$\ket{0}$と$\ket{1}$の重ね合わせ、q[1]だけみても$\ket{0}$と$\ket{1}$の重ね合わせですが、$\ket{00}$, $\ket{01}$, $\ket{10}$, $\ket{11}$の４状態ではなく、$\ket{00}$, $\ket{11}$の2つの状態のみになっています。
これはエンタングルメント状態とよばれる量子状態で、q[0]が$\ket{0}$のときはq[1]も$\ket{0}$、q[0]が$\ket{1}$のときはq[1]も$\ket{1}$という、q[0]とq[1]が切っても切れない関係になっている特別な状態です。量子コンピューターはこのエンタングルメント状態を上手に使って複雑な計算を行っていきます。

このエンタングルメント状態の2つの量子ビットを遠くに離した時、例えば、片方は地球上に置いたまま、もう片方は宇宙の遥か遠くに離した時を考えます。それぞれ$\ket{0}$と$\ket{1}$の50%ずつの重ね合わせ状態でどちららか分からないのですが、地球の量子ビットを測定してそれが$\ket{0}$だと判明すると、遠くの宇宙にある量子ビットも$\ket{0}$だと瞬時にわかるという不思議な現象が起こることが考えられます。この思考実験は、アインシュタインが考えたもので、アインシュタインはこれを不気味な遠隔作用と呼び、疑っていたのですが、このエンタングルメント状態は今、IBMの量子コンピューターで誰でも実験してみることができます。
<img src="https://1.bp.blogspot.com/-KdW1056kUTY/UaVWPx75ZuI/AAAAAAAAUFg/MOLAaA6ho5Y/s800/einstein.png" width="100"> 

これまでは、IBM Quantum Experienceの計算機能のみ使っていたので、実際に測定してみましょう。

#6. 測定してみる
次のようにして測定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/2523c7a7-e4ec-50c3-c313-60361b02cd7e.png)
(1) 測定ゲートをq[0]とq[1]に設置します。
(2) 左上の「Untitled Experiment(名無しの実験)」あたりにマウスを持っていくと鉛筆マークが出てくるのでクリックして名前を「エンタングルメント」などにします。
(3) 右上の「Unsaved changes(未保存の変更あり)」をクリックして保存します。
(4) その横の「Run(実行)」をクリックします。
(5) 下の図のようなウィンドウが出てきます。
まず、量子シミュレーターでやってみましょう。シミュレーターは、本物の量子コンピューターで実験する前に、普通のコンピューターで計算してみて回路があっているか確認するために使います。初期設定ではシミュレーターになっているので、このまま「Run(実行)」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/a50341b8-b358-d9af-312a-259d86daf3c0.png" width="400"> 
(6) 画面下の方に「Results(結果)」と出たら青字の結果をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/e75725cd-bee6-720c-cdbe-377cbf85e96f.png)
(7) 結果を見てみましょう。00000が約50%、00011が約50%ずつ観測されたことがわかります。より50%に近くするにはショット数を大きくします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/43fd8b2a-fd59-470d-d48e-7d6526097f88.png)

次に、ニューヨークにあるIBMの実物の量子コンピューターでやってみましょう。
左側の(1)家アイコンをクリックしてホーム画面に戻り、(2)のようにスクロールして一番空いている（Queueの少ない・紫のバーが短い）量子コンピューター・デバイスを見つけて覚えておきます。（下から2番目の「ibmq_armonk」は1量子ビットなので選ばないでください。一番下はシミュレーターなのでこれも除きます。）IBMの量子コンピューターは、世界中の人が実験しているため、多少混んでいるときがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/a3bf8193-b3d8-09f9-03e8-0e0e8e65c9b2.png)

私が今、この文書を書いている時には、「ibmq_5_yorktown - ibmqx2 (5 qubits)」が1個のみ実験を待っている状態で最も空いていましたので、この名前をメモしました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/6cc903a3-5728-eb55-0dc2-9c3d7b39d6fb.png" width="200"> 

(1)量子回路のタブに戻り、(2)「Run(実行)」をクリックし、(3)メモした実物の量子コンピューター名を探し、選択します。(4)「Run」で実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/48b66d89-7caa-5a4e-7988-9f56b31aea9f.png)
混雑の具合にもよりますが、しばらく、下の図のように結果待ちになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/938beb8c-1665-4a9d-2e0d-8db98c5365ec.png)
下のように「Pending results(保留中の結果)」がなくなり「Results(結果)」に移ったら、結果をクリックしてみてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/4935ae24-0538-389a-b6bb-390a430b9598.png)
シミュレーションの時とちがって、000000と00011以外の結果、00001、00010も出ています。実際の量子コンピューターはまだ完璧ではなく、このように結果にエラーが含まれますが、00000と00011が最も多く観測されることがわかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/3c286de5-f05e-7bcb-5a75-487ff27fb8aa.png" width="1000"> 

# 7. 練習問題 B
次の状態の量子回路を作ってみましょう。答えは一つではないので、どんな作り方でもOKです。
ヒント：使うゲートはX、H、Z、CXゲートだけです！
7-1) 　$\frac{1}{\sqrt{2}}(\ket{00}-\ket{11})$
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/ad2220ae-41be-1f9f-92b9-b6b8dc0d6409.png" width="300"> 
　
7-2) 　$\frac{1}{\sqrt{2}}(\ket{01}+\ket{10})$
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/3b97f685-6835-55a2-064e-12d3e5593cf5.png" width="300"> 

7-3) 　$\frac{1}{\sqrt{2}}(\ket{01}-\ket{10})$
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/980069f8-7237-c6e8-fcd9-8564b7f7fa83.png" width="300"> 


みなさん、最後までできましたか？
ぜひ感想を下のコメント欄に残してください。


# 更新履歴
2020/04/17：ユーザーインターフェースUpdateによる画面操作方法の更新。