打率ハチワリの試験要綱読解～IBM量子開発者認定資格と開発ドキュメントとを結びつける(2)

## はじめに

このシリーズの記事では、量子コンピューター関連の認定資格の一つであるIBM量子開発者認定資格"Fundamentals of Quantum Computation Using Qiskit v0.2X Developer"について、認定資格の試験要綱を元に出題されると思われる問題を想像し、Qiskitを学習するにあたって、開発ドキュメント上で参考になると思われるところの対応付けを試みます。

前回はIBM量子開発者認定資格の出題範囲である[Section 1](https://qiita.com/imh1104/items/ac2c3d0b92add77109e0)を、開発ドキュメントへ対応付けを試みました。今回は、Section 9に対して、対応付けを試みます。

「あれ、どうしてSection 2じゃないの？」とお気づきの方もいらっしゃるかとは思います。というのも、この記事は、シリーズ名通り、「打率ハチワリ」を目指しているためです。もう一度、IBM量子開発者認定資格の出題範囲を見てみましょう。出題数が60問ですので、今回は出題率順に並べて、出題比率から各Sectionの出題数を計算し、累積度数を計算したものを入れています。
　
| Section名                                              |               日本語訳               | 出題比率 | 出題数 | 累積度数 |
| :----------------------------------------------------- | :----------------------------------: | :------: | ------ | -------- |
| Section 1: Perform Operations on Quantum Circuits      |         量子回路に対する操作         |   47%    | 28     | 47%      |
| Section 9: Construct Visualizations                    |             視覚化の構築             |   19%    | 11     | 66%      |
| Section 5: Compare and Contrast Quantum Information    |         量子情報の比較と対照         |   10%    | 6      | 76%      |
| Section 6: Return the Experiment Results               |            実験結果の出力            |    7%    | 4      | 83%      |
| Section 10: Access Aer Provider                        |       Aer Providerへのアクセス       |    6%    | 4      | 89%      |
| Section 2: Executing Experiments                       |              実験の実行              |    3%    | 2      | 92%      |
| Section 3: Implement BasicAer: Python-based Simulators | Pythonベースのシミュレータ Aerの実装 |    3%    | 2      | 95%      |
| Section 8: Display and Use System Information          |       システム情報の表示と仕様       |    3%    | 2      | 98%      |
| Section 4: Implement Qasm                              |              Qasmの実装              |    1%    | 1      | 100%     |

上記の通り、IBM量子開発者認定資格の出題範囲のハチワリを占めているのは、出題比率が多い順でSection1、Section 9、Section 5、Section 6です。そして、合格基準は60問中44問以上正解＝正答率73％以上となっています。

Qiskitの学習においてまず最初に重視すべきは、上位ハチワリの内容である。上位ハチワリを理解していれば、残りの2割も徐々に理解できカバーできると捉えられるので、Section2ではなく、Section 9について執筆することに決めました。(このハチワリを知っていれば、資格に合格するわけではないので悪しからず。)

これは、「パレートの法則」に則った解釈になります。製造業では、品質管理に関するツールとしてパレート図を駆使して、製品の障害原因を分析し、「パレートの法則」から製造ラインを改善するためのねらい所を決めるということがよくあります。

今回、対応先の開発ドキュメントは、記事執筆時点(2025/1)で最新版のQiskit v1.3.2です。

## Section 9: Construct Visualizationsの出題トピック

[IBM Certified Associate Developer - Quantum Computation using Qiskit v0.2X](https://www.ibm.com/training/certification/ibm-certified-associate-developer-quantum-computation-using-qiskit-v02x-C0010300)からSection 9: Construct Visualizationsの出題トピックを見てみましょう。

| Section 9の出題トピック             | 日本語訳                                    |
| ----------------------------------- | ------------------------------------------- |
| 1. Draw a circuit                   | 1. 回路を描く                               |
| 2. Plot a histogram of data         | 2. データのヒストグラムをプロットする       |
| 3. Plot a Bloch multivector         | 3. Bloch multivectorをプロットする          |
| 4. Plot a Bloch vector              | 4. Bloch Vectorをプロットする               |
| 5. Plot a QSphere                   | 5. QSphereをプロットする                    |
| 6. Plot a density matrix            | 6. 密度行列をプロットする                   |
| 7. Plot a gate map with error rates | 7. エラー率を含むゲートマップをプロットする |



## 試験要綱の読解と開発ドキュメントとの結びつけ
### Section 9：Construct Visualizations

Section 9は、「Construct Visualizations」です。出題トピックには、「描く」や「プロット」するといった単語が並んでいます。Qiskitを使って、量子ビットの状態や測定結果を見える化するのに必要な知識が問われています。出題範囲の中では、「図を描く」という点で、最もアートな内容ですね。

####  1.回路を描く

Qiskit上で定義した量子回路について、量子回路図を出力する方法が問われるようです。量子回路図を出力する方法は、開発ドキュメント中の下記ページが該当します。

* [visualize-circuits](https://docs.quantum.ibm.com/guides/visualize-circuits#draw-a-quantum-circuit)
* [qiskit.visualization.circuit_drawer](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.circuit_drawer#qiskitvisualizationcircuit_drawer)

Qiskitでは、量子回路図をコマンドライン上に出力できます。Matplotlibと呼ばれるモジュールを使って、画像で出力し、Jupyter Notebook上で確認することもできますし、LaTeXを使って、論文などの学術的な記事に掲載されているようなフォーマットで図を出力することもできます。



#### 2.データのヒストグラムをプロットする

Qiskitで構築した量子回路上で、観測した計算結果をヒストグラムとして出力します。開発ドキュメント中の下記ページが該当します。

* [plot_histogram | IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_histogram)
* [visualize-results](https://docs.quantum.ibm.com/guides/visualize-results#plot-histogram-)

開発ドキュメント中では、2つの量子ビットに対して「00」、「11」を観測できた回数、3つの量子ビットに対して、それぞれの量子ビットの並びを観測できた回数をヒストグラムとして出力する例の掲載があります。

汎用ゲート型量子コンピュータの特徴として、古典コンピュータは、問題を入力すると計算結果を返してくれますが、汎用ゲート型量子コンピュータでは、入力した問題を何度も計算して、観測できた計算結果を数えて、出力してくれます。

#### 3.Bloch multivectorをプロットする

量子回路上の量子ビットの状態をBloch球(ブロッホ球)として出力します。開発ドキュメントで対応する箇所は、下記になります。

* [plot_bloch_multivector (latest version) | IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_bloch_multivector)

ブロッホ球とは、量子の状態を単位球面上に図示する表記方法で、3次元空間的に量子の状態を見える化することができます。Qiskitには、量子ビットをブロッホ球として描画するインターフェースを備えています。Multivectorと言っていますので、量子回路上の複数の量子ビットそれぞれの状態をそれぞれのBloch球として、まとめて出力します。例えば、3つの量子ビットに対して、1つずつブロッホ球を出力するので、ブロッホ球が3つ出てきます。

「Multi」があるので「Single」もあります。「Single」に相当する、1つの量子ビットに対しての1つのブロッホ球の出力する方法は、次の[「4.Bloch Vectorをプロットする」](#4.Bloch Vectorをプロットする)にて開発ドキュメントと対応づけます。

#### 4.Bloch Vectorをプロットする

量子回路上の量子ビットの状態をBloch球(ブロッホ球)として出力します。[「3.Bloch multivectorをプロットする](#3.Bloch multivectorをプロットする)では、量子回路上の複数の量子ビットを対象に、それぞれのブロッホ球を出力する方法が問われているのに対して、このトピックは1つの量子ビットに対して、1つブロッホ球を出力する方法が問われています。開発ドキュメントで対応する箇所は、下記になります。

* [plot_bloch_vector (latest version) | IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_bloch_vector)

#### 5.QSphereをプロットする

量子ビットの状態をQSphereとして出力します。QSphereも量子の状態を図示する表記方法です。開発ドキュメントで対応する箇所は、下記になります。

* [plot_state_qsphere (latest version) | IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_state_qsphere)

ブロッホ球とは異なり、QSphereはQiskitに備わっている独自の表記方法です。量子の状態をベクトルの各要素の振幅と位相で、球の表面にプロットします。ブロッホ球では、1つの量子ビットごとにしか量子の状態を図示することができませんが、QSphereでは、|00>、|01>といった複数の量子ビットで量子状態を図示することができます。

#### 6.密度行列をプロットする

密度行列で表された量子ビットの状態を描画します。量子ビットが取りうる状態の確率を3次元の棒グラフで描画することができます。例えば、2ビットの量子ビット列に対してある演算を行なった際に00になる確率、01になる確率、10になる確率、11になる確率がプロットされます。この例だと、演算前の状態が4つ、演算によって取りうる状態が4つになるため、4 x 4 で16個の棒グラフがでてきます。

* [plot_state_city (latest version) | IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_state_city)

「密度行列」の解説は、別の情報に当たっていただくとして、観測しないと状態がわからない量子ビットを数学的に表現する方法があり、それを視覚化する手段がQiskitにあるというということです。

#### 7.エラー率を含むゲートマップをプロットする

汎用ゲート型量子コンピュータ内の量子ビットについて、各量子ビットの結合関係を描画します。開発ドキュメント中で対応づくのは、下記のページになります。

* [plot_gate_map (latest version) | IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_gate_map)

Qiskitでは、汎用ゲート型量子コンピュータ内の各量子ビットの結合関係を表した図をGate-Mapと呼んでいますが、日本語だと、「量子配列」や「トポロジ」と呼ばれています。さて、Gate-Mapを見ることは、何の役に立つのでしょうか。

量子回路に応じて計算に使用する量子ビットにおいて、汎用ゲート型量子コンピュータ内の量子ビットの結合関係によっては、量子ゲートを作用させられない場合があり、量子ゲートを作用できる位置に量子ビットの中身を移動させる必要があります。このあたりの解説については、下記の記事が参考になります。

* [計算をする量子回路の実装 — 量子コンピューティング・ワークブック](https://utokyo-icepp.github.io/qc-workbook/ja/extreme_simd.html#transpilation)

記事にもある通り、量子ビットの中身を、量子ゲートを作用させることのできる位置に持っていくのにも、量子ゲートを使います。そして、所望の位置に持っていく過程で、「量子誤り」と呼ばれる特有のエラーが発生します。

こういった量子コンピュータ特有の使い方、エラーがあるので、

1. 物理ハードウェア上の量子ビットの結合関係について全体像を把握したい
2. 計算途中での「量子誤り」による計算結果の誤差を蓄積させないためにも、誤り発生が少ない量子ビットを計算に使用したいので、物理ハードウェア上の量子ビットの結合関係とエラー率を俯瞰したい

といったケースが考えられます。2.に対応するために、Qiskitには、各量子ビットの結合関係とエラー率を同時に描画するAPIがあります。

* [plot_error_map (latest version) | IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_error_map)

Qiskitではエラー率が低くなるように「Transpile」という機能で量子ビットの割当を最適化しますので、開発者から見れば、開発者がプログラムで定義した量子ビットについて、物理デバイスの量子ビットのうち、どこに配置されるかを意識せずに実装することができます。一方で、計算に使用する量子ビットを手動で指定できるAPIもあります。

* [Layout (latest version) | IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.transpiler.Layout)

## まとめ

Section 9は、汎用ゲート側量子コンピュータ上で扱う量子ビットの状態をQiskitにて視覚化する方法が問われていました。Qiskitのqiskit.visualizationパッケージの活用して、視覚化ができるかどうかが問われているようですね。

* Qiskitで構築した量子回路の回路図を視覚化する。(1)
* 回路図中の量子ビットの状態を視覚化する。(2～6)
  * ヒストグラムとして視覚化
  * ブロッホ球として視覚化
  * QSphereとして視覚化
  * 密度行列を視覚化
* 物理デバイス上の量子ビットの結合関係を視覚化する。(7)

今回の記事で参照先とした開発ドキュメントを表にして、今回の記事のまとめとさせていただきます。

| 出題トピック                               | 開発ドキュメント                                             |
| ------------------------------------------ | ------------------------------------------------------------ |
| 1.回路を描く                               | [visualize-circuits](https://docs.quantum.ibm.com/guides/visualize-circuits#draw-a-quantum-circuit)<br />[qiskit.visualization.circuit_drawer](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.circuit_drawer#qiskitvisualizationcircuit_drawer) |
| 2.データのヒストグラムをプロットする       | [plot_histogram \| IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_histogram)<br />[visualize-results](https://docs.quantum.ibm.com/guides/visualize-results#plot-histogram-) |
| 3.Bloch multivectorをプロットする          | [plot_bloch_multivector (latest version) \| IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_bloch_multivector) |
| 4.Bloch Vectorをプロットする               | [plot_bloch_vector (latest version) \| IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_bloch_vector) |
| 5.QSphereをプロットする                    | [plot_state_qsphere (latest version) \| IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_state_qsphere) |
| 6.密度行列をプロットする                   | [plot_state_city (latest version) \| IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_state_city) |
| 7.エラー率を含むゲートマップをプロットする | [plot_gate_map (latest version) \| IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_gate_map)<br />[plot_error_map (latest version) \| IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.visualization.plot_error_map) |