量子コンピューター入門 IBM Quantum Composer編


$$
\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}}
$$

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

# 0. はじめの設定
## 0-1) ホーム画面からComposer(コンポーザー)画面へ行く
まず、[こちら](https://quantum-computing.ibm.com/)からIBM Quantumのダッシュボードにログインします。ID登録がまだの方は、[『IBM Quantum Experienceへの登録（くわしいバージョン）』](https://qiita.com/kifumi/items/7ac33ab7939d2dd796d0)を参考に、登録してください。
ログインできたら、左側の青色の「Launch Composer」をクリックします。
![はじめの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/d1f1854b-ab97-23cc-1c96-8dba1dc46933.png)

ポップアップウィンドウが出てきた場合は、確認して、Xマークをクリックして閉じます。
![はじめの設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/e821c4a4-4f44-b602-000f-8c4d615a4387.png)


下のようなコンポーザー画面で計算します。左上のファイルアイコン「Composer files」をクリックして閉じるとComposer画面が大きくなります。
![はじめの設定3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/429c17a6-d986-653e-b3c4-427bf350704c.png)


## 0-2) 量子ビットの数の設定
初期設定では、5量子ビットが並んでいますが、まず、1量子ビットで実験しますので、1量子ビットの回路に変更します。
１）マウスをq1に近づけると、ゴミ箱マークが出てくるので、クリックして消します。同じように繰り返して、q0だけ残して、量子ビットが1つだけの回路にします。
![はじめの設定4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/1ad64274-1577-003e-ed05-6a10e9869258.png)


２）左下の「Probabilities」をクリックして「Statevector」を選択し、青い棒グラフを出してください。
![はじめの設定5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/f081f0b2-7c0e-3727-b3c3-d639dd94d23a.png)

下の画面がセットできたら、始めましょう。
![はじめの設定6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/6c855881-a7c0-d9d9-f284-f9feeccdf178.png)




# 1. Xゲート
上に並んんでいるH,$\oplus$,・・・T,S, などの量子ゲートの箱をドラッグアンドドロップで下の回路に移動させて量子回路を作っていきます。Xゲートは$\oplus$の記号になっています。
![xゲート1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/b61887f5-78e1-c844-7c9c-351f38a5ce22.png)


図の回路を作ってみてください。下に表示される棒グラフの変化を確認しましょう。
1-1) ![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/b9adcd7d-d1ee-bb75-6831-5a93628b61b9.png)
1-2)![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/f777fb32-e565-1ad4-413e-ec731be2e672.png)
1-3)![1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/65fa5dc2-699c-a4d2-d578-f2c48693093a.png)


量子ビットの初期値は、$\ket{0}$ なので、 **反転ゲート** のXを1回使うと$\ket{0}$が$\ket{1}$に、また2回使うと$\ket{0}$に戻ることが量子回路の下の棒グラフを見て確認できます。
![1-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/b26d9032-b41d-9c95-f2ec-88970cc29ade.png)

次の章に移る前に、Xゲートを右クリックして、「Cut」を選んで置いたゲートを取り除いてください。この方法で３つのXゲートを削除して、量子回路を元の空の状態にできます。
![1-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/4a14c77f-2053-36e4-0d4e-143359e56e43.png)



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

2-1)![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/37e61ea4-4ffe-48a7-e1c5-565a5e8ded2d.png)

量子ビットの初期値は$\ket{0}$ なので、アダマールゲートHを適用すると、$\ket{0}$と$\ket{1}$の**重ね合わせ**状態になります。これは、$\ket{0}$でもあり$\ket{1}$でもある状態ですが、量子ビットを測定するまでどちらの状態かわかりません。![2-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/480d6fe6-ce18-59b9-ab20-99ce3ca1f66b.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(状態ベクトル)」をクリックして「Probabilities(確率)」にしてみましょう。0と1の確率が50%ずつの均等な重ね合わせの状態ができていることがわかります。これは、この状態の量子ビットを測定すると０か１のどちらかが観測されるのですが、たくさん測定されると、例えば1000回測定されると約500回は0が観測され、約500回は1が観測されるということです。
![2-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/769024ca-7e6d-1e00-2bd8-25096dd00e31.png)

続けます。
2-2)  Hゲートも2回繰り返すと棒グラフの値が元に戻ることを確認しましょう。
![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/4ddcad0c-7147-24ad-1316-06643ad81cab.png)
2-3)![2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/f4960170-150e-ae90-5f8d-8ce10ba58c2e.png)


$\ket{0}$にXゲートを使うと$\ket{1}$になり、$\ket{1}$にHゲートを使うと棒グラフの$\ket{1}$の部分が赤色になりました。これはマイナス（ー）の意味があります。
![2-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/63a9d4a2-eca5-3df6-159a-2295f2389666.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ゲートをもう一度かけると棒グラフはどうなりますか？
![2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/dbc0c5c6-7c97-aac5-9b75-9c3095cb851d.png)

2-5) q[0]の下にある灰色の「+」マークをクリックして２量子ビットの回路をセットし、Hゲートをそれぞれ使ってみましょう。棒グラフには何個の状態がありますか？
![2-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/72add9da-5d92-dd04-9bef-c7623d873e15.png)

2-6) ５量子ビットの時の重ね合わせです。何通りの状態ができますか？
![2-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/2aa8e7da-c863-b347-e8ce-a9553ea8708f.png)


# 3. Zゲート
次の図の回路を作ってみてください。それぞれ棒グラフの変化を確認しましょう。
3-1)![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/c6508262-25ac-a960-5ad1-d4f26dbc10bc.png)
3-2)![3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/a41317b9-339f-5884-0b47-027d9ab9620f.png)

棒グラフの色は何色になりましたか？
Zゲートは、$\ket{1}$に操作するとマイナスがつくゲートです。
　　$\ket{0} →(Z)→ \ket{0}$
　　$\ket{1} →(Z)→ -\ket{1}$
![3-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/c2e0582e-de57-8754-6946-5acc0fde2ba6.png)
![3-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/8b516ed2-91a0-ab8e-9b6d-233e76036098.png)

続いて次の回路を作ってみてください。
3-3)![3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/aec2f503-e446-c3ce-910f-e1e068b38357.png)
3-4)![3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/4aa16ca2-3e39-dc5a-33b6-c57c92ea924a.png)


棒グラフの色と下の数字のプラス・マイナスの符号を確認してみましょう。
Zゲートは、重ね合わせの＋と-の符号を入れ替えるゲートです。
![3-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/5f2a2a89-92cb-6310-6b7f-e80c59a059c8.png)
![3-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/ece03f5e-6400-cb49-17cf-9ba6f113ef51.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です。
ヒント：棒グラフ下の右側の数字が上側の量子ビットq0に対応していることに注目して作ってみましょう。
![A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/b384eeb9-d3a7-ff60-fde3-66403cf5f9d1.png)

さらにヒント：使うゲートはX、H、Zだけです！
4-1)![4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/cda48334-f246-4cda-d098-70bea7ef87f3.png) 
4-2)![4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/c459a529-adb1-31f6-1f49-1d20c7f07a62.png)
4-3)![4-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/0893b7e1-022f-b5ac-eeef-19d9649a7088.png)
4-4)![4-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/d0b7f9aa-764b-b067-9857-b70f87de39e8.png)
4-5)![4-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/b992e6ee-0ba5-039a-1e35-89b85a4e4d49.png)
4-6)![4-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/12fe16ee-cd51-ed7b-9253-476d02533a8a.png) 

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

# 5. CXゲート
CXゲート（コントロールNOTゲート）は2量子ビットを使う計算をします。
CXゲートは、下の図にあるような記号で、＋がついていない側が制御ビット、＋がついている側が目標ビットと呼ばれます。制御ビットが$\ket{1}$のときのみ、目標ビットを反転（NOT）するゲートです。下の図では、q0がXゲートで$\ket{1}$になっているので、q1の値$\ket{0}$を反転して$\ket{1}$にします。
![5-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/83074280-8214-a903-86c5-fd13264f4bd5.png)

次の図の回路を作ってみてください。q0が$\ket{1}$のときのみ、q1の値が反転していることを確認しましょう。
5-1)![5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/0a54ace6-03ae-4201-af3e-3e7528df1ee4.png)
5-2)![5-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/6851960a-2b55-d77b-3718-59e5be6c96a8.png)
5-3)![5-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/db1503ba-c01f-952d-5eae-4c316c551189.png)
5-4)![5-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/e11a056a-20df-a14c-e90d-c7640261b7f4.png)
5-5)![5-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/99f9488b-923c-116f-bdf7-7f44e0b75de7.png)
最後の回路の棒グラフを見てみましょう。
![5-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/04a51d61-4006-a3c7-7ee9-64d6d44e253c.png)

これは、q0だけみると$\ket{0}$と$\ket{1}$の重ね合わせ、q1だけみても$\ket{0}$と$\ket{1}$の重ね合わせですが、$\ket{00}$, $\ket{01}$, $\ket{10}$, $\ket{11}$の４状態ではなく、$\ket{00}$, $\ket{11}$の2つの状態のみになっています。
これはエンタングルメント状態とよばれる量子状態で、q0が$\ket{0}$のときはq1も$\ket{0}$、q0が$\ket{1}$のときはq1も$\ket{1}$という、q0とq1が切っても切れない関係になっている特別な状態です。量子コンピューターはこのエンタングルメント状態を上手に使って複雑な計算を行っていきます。

このエンタングルメント状態の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 Composerの計算機能のみ使っていたので、実際に測定してみましょう。

# 6. 測定してみる
次のようにして測定します。
![6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/687d1b99-f702-7899-a67f-131dd642b799.png)
(1) 測定ゲートをq0とq1に設置します。
(2) 左上の「Untitled Experiment(名無しの実験)」あたりにマウスを持っていくと鉛筆マークが出てくるのでクリックして名前を「エンタングルメント」などにします。
(3) 右上の青の「Setup and run」をクリックします。
(4) 下の図のようなポップアップウィンドウが出てきます。
まず、量子シミュレーターでやってみましょう。シミュレーターは、本物の量子コンピューターで実験する前に、回路があっているか確認するためなどに使います。ポップアップウィンドウ左側のデバイス一覧をスクロールします。
(5) 下から2番目の「ibmq_qasm_simulator」を選びます。
(6) そのほかの設定はそのままで、右下の青い「Run on ibmq_qasm_simulator」をクリックして実行します。
![6-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/191b81b9-9640-1cd5-2d04-09e61967d581.png)
(7) 結果を見てみましょう。左側のバーから矢印アイコンの「Composer jobs」をクリックします。
(8) すでに計算が終わっていると思いますので、「Completed:日付時間」をクリックします。
![6-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/e12f8577-ef89-feea-79f3-e4bdfb9608d9.png)
(9) ヒストグラムから、00が約50%、11が約50%ずつ観測されたことがわかります。より50%に近くするにはショット数を大きくします。
![7-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/a9f4daea-a280-010d-79b4-054d9a75d7ee.png)


次に、ニューヨークにあるIBMの実物の量子コンピューターでやってみましょう。
(10) 再び右上の青い「Setup and run」をクリックします。
(11) スクロールして一番空いている（Total pending jobsの少ない）量子コンピューター・デバイスを見つけて選択します。緑色の丸で「Online」になっているものの中から選びます。（下から5番目の「ibmq_armonk」は1量子ビットなので選ばないでください。下のほうにある「simulator_」から始まるシミュレーターも今回は選ばないように注意してください。）IBMの量子コンピューターは、世界中の人が常に実験しているため、多少混んでいるときがあります。
![7-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/acd4e86c-e01b-1526-c9f3-1902b1f601a1.png)
私が今、この文書を書いている時には、「ibmq_lima」が13個のみ実験を待っている状態で最も空いていましたので、こちらを選びました。
(12) そのほかの設定はそのままで、右下の青い「Run on デバイス名」をクリックして実行します。
(13) 左上の「Jobs」をクリックして実行状況を確認します。
![6-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/cfa92c9d-2f0a-6843-9b69-c693d15ec6dc.png)

(14) 混雑の具合にもよりますが、しばらく、結果待ち(Pending)になります。「Pending:」をクリックしてみます。![6-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/3e3d7fef-c562-bb59-5346-1b7aa8d88d7e.png)
今の私の状況では計算が終わるまで9分かかるようです。
![6-14-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/d04d9f2f-1026-a61f-0dbd-5a4e59838bb6.png)
(15) 下のように計算が終わると、結果が表示されます。
![6-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/05191eaa-91ed-3649-96af-da234b60e621.png)
シミュレーションの時とちがって、00と11以外の結果、01、10も出ています。実際の量子コンピューターの計算には、このように結果にエラーが含まれますが、00と11が最も多く観測されることがわかります。


# 7. 練習問題 B
次の状態の量子回路を作ってみましょう。答えは一つではないので、どんな作り方でもOKです。
ヒント：使うゲートはX、H、Z、CXゲートだけです！
7-1) 　$\frac{1}{\sqrt{2}}(\ket{00}-\ket{11})$
![7-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/8a002368-8656-4e11-2a6c-015295ca4b12.png)
　
7-2) 　$\frac{1}{\sqrt{2}}(\ket{01}+\ket{10})$
![7-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/8648789a-3788-3fc1-766a-542c429e7981.png)

7-3) 　$\frac{1}{\sqrt{2}}(\ket{01}-\ket{10})$
![7-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/d226f025-5d68-0f28-73df-111e68a0023d.png)

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

ここから先は更に詳しく学んでいきたい方のための応用編（の入り口紹介）です。

# 8. 応用編：IBM Quantum LabとQiskit
最後に、IBM Quantum Composerで作った量子回路をQiskitで実行する方法をご紹介します。これまで画面の右側には、「OpenQASM 2.0」という量子アセンブラ言語が表示されて、みなさんが作っている量子回路がリアルタイムにこのコードに変換されていました。
![8-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/ddb913ec-c6a0-0ccf-8818-0d1a374dc11b.png)
この「OpenQASM 2.0」をクリックして「Qiskit」を選択すると、Qiskitというpythonベースの量子プログラミング言語で同じように作成中の量子回路が表示されます。
ここで、「Open in Quantum Lab」をクリックしてみましょう。
![8-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/cb674c71-95d8-109f-1024-cf23261e5df1.png)
先ほどのQiskitのコードが「IBM Quantum Lab」上に表示されます。
![8-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/5edb6139-8a3f-96ea-7aad-095eff1ef1d7.png)

Qiskitを使うと更に高度な量子計算を行うことができます。詳しく学びたい方は、ぜひ[Qiskitテキストブック「Qiskit を使った量子計算の学習」](https://qiskit.org/textbook/ja/preface.html)をご参照ください。



# 更新履歴
2022/03/03：2-1)の確率振幅のグラフを修正しました。