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

# はじめに

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

汎用ゲート型量子コンピュータに関する知識はないが、チュートリアルなどでQiskitでプログラミングし、量子デバイス上で実行してみて、実行結果を得たものの、プログラムのコードが全部おまじないに読めるので、コードの理解を深める意味で、開発ドキュメントを読むきっかけをつかみたい方を想定して執筆しています。

というのも、認定元の公式ドキュメントとしてIBM量子開発者認定資格の「Study Guide」が提供されていますが、情報源のほとんどがチュートリアルとなっており、開発ドキュメントにはあまり触れられておりません。IBM量子開発者認定資格に合格できたとしても、量子開発者としては、Qiskitにおける量子プログラムの書き方に加えて、開発ドキュメントのどこにどういった内容が書かれていて、どう読むかまでを把握したうえで、必要に応じて参照ができてこそ、資格取得後も、開発者としてのさらなる精進ができると思い、対応付けを試みることにしました。

開発ドキュメントを読むと、「へぇ、こんなことができるのかぁ。」「これは知らなかった」といった新たな発見もありますし、チーム内の開発者の間でドキュメントに書いてある内容を把握できていれば、相談もスムーズになります。そのうえ、Qiskit以外のやり方で量子プログラミングをするとき、「Qiskitでの実装では●●だったけれど、他のフレームワークではどう書くんだろうか。」というような形で、知識を広げることもできます。

開発ドキュメントを読むことは、そういったメリットが生まれる可能性があるので、対応付けを通して、頭の中に「開発ドキュメントの地図」を作り、Qiskitの仕様理解、ひいては、量子開発者として社会で活躍できるようになるのではと考えて、このシリーズを始めることとしました。

このシリーズの執筆方針としては、下記のような方を想定して執筆いたします。

* 汎用ゲート型量子コンピュータに関する知識はないが、チュートリアルなどでQiskitでプログラミングし、量子デバイス上で実行したことがある方
* 実行結果を得たものの、プログラムのコードが全部おまじないに読めるので、コードの理解を深める意味で、開発ドキュメントを読むきっかけをつかみたい方

汎用ゲート型量子コンピュータに関連する特有の単語・用語や言い回しについての解説は、なるべく避けています。まずは、用語に出会い、その音に馴染むところから。量子コンピュータに関して調べたり、情報のインプットをしていると、よく耳にする用語があることに気付けるので、そこから徐々に理解を広げるスタンスをとります。認定資格の試験要綱と開発ドキュメントとのどの部分を参照すべきかに焦点を当てますので、汎用ゲート型量子コンピュータそのものについての原理や仕組みの説明については、別をあたっていただければと思います。

なお、今回、対応先の開発ドキュメントは、記事執筆時点(2024/12/19)で最新版のQiskit v1.3.1です。

### 今回の記事概要

今回の記事は、シリーズの最初の記事ということもあるので、下記の3つの話題を扱います。

* [IBM量子開発者認定資格の出題対象であるQiskitの簡単な説明と認定資格試験との関係](#QiskitとIBM量子開発者認定資格試験との関係)
* [IBM量子開発者認定資格の試験の出題範囲、出題トピックを紹介](#IBM量子開発者認定資格試験の出題範囲)
* [IBM量子開発者認定資格の試験出題範囲の一つである「Section 1：Perform Operations on Quantum Circuitsと開発ドキュメントの紐付け](#試験要綱の読解と開発ドキュメントとの結びつけ)

# QiskitとIBM量子開発者認定資格試験との関係

### Qiskit

Qiskit(キスキット)とは、汎用ゲート型量子コンピュータの操作するためのオープンソースのSDKです。このSDKを活用することで、高水準プログラム言語のレベルにて、とてもざっくりではありますが、以下のようなプログラミングができます。

* 汎用ゲート型量子コンピュータに対して計算の指示を出す
* 量子回路の構築
* 構築した量子回路での計算
* 量子回路のシミュレーション
* など・・

開発者としてQiskitを使う側から見ると、汎用ゲート型量子コンピュータを操作するために必要なAPIの集まりとして見えます。これらのAPIはPythonから呼び出すことができます。

Githubのリリースログによると、2017年11月のVersion 0.3で初リリースとなり、2024年2月にVersion 1.0がリリースされ、現在も開発が進められております。

Qiskitでできることは、上記に挙げたこと以外にもあります。しかし、何ができるのかについて細かく学習しようとすると、際限なく学習が必要となってしまいます。そこで、Qiskitについて一通り知っており、Qiskitでの開発能力があることを証明する資格として、IBM量子開発者認定資格というものがあります。

### IBM量子開発者認定資格試験

IBM量子開発者認定資格試験は、量子コンピューター業界初とされる、量子開発者の認定資格です。正式名称は、"Fundamentals of Quantum Computation Using Qiskit v0.2X Developer"です。この認定資格の出題対象として取り扱われているものの一つがQiskitです。

この資格を取得すると、Qiskitを用いて開発する能力と経験があることが認定されます。具体的には、QiskitをPythonから使用して、IBM Quantumのコンピュータ・シミュレーターで量子プログラムを作成・実行する能力があることを認められます。開発能力の中には、Qiskitを使った基本的な量子プログラムの書き方を理解していることに加えて、量子ビットや、代表的な量子ゲート、量子回路に対する理解を有していることも含まれております。

認定元団体としては、「量子開発者は、量子プログラミングをするときに使う道具であるQiskitだけでなく、道具を使うために必要な量子情報科学分野の知識も備えている」ということが、認定の条件になるようですね。

# IBM量子開発者認定資格試験の出題範囲

IBM量子開発者認定資格には試験要綱があり、[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)にて参照できます。試験要綱には、認定資格の出題範囲が出題比率と共に公開されています。出題範囲は、全部で10個のSectionに分かれています。

| 出題範囲(Section名)                                    |                  日本語訳                  | 出題比率 |
| :----------------------------------------------------- | :----------------------------------------: | :------: |
| Section 1: Perform Operations on Quantum Circuits      |            量子回路に対する操作            |   47%    |
| Section 2: Executing Experiments                       |                 実験の実行                 |    3%    |
| Section 3: Implement BasicAer: Python-based Simulators | PythonベースのシミュレータBasice Aerの実装 |    3%    |
| Section 4: Implement Qasm                              |                 Qasmの実装                 |    1%    |
| Section 5: Compare and Contrast Quantum Information    |            量子情報の比較と対照            |   10%    |
| Section 6: Return the Experiment Results               |               実験結果の出力               |    7%    |
| Section 7: Use Qiskit Tools                            |             Qiskitツールの使用             |    1%    |
| Section 8: Display and Use System Information          |          システム情報の表示と使用          |    3%    |
| Section 9: Construct Visualizations                    |                視覚化の構築                |   19%    |
| Section 10: Access Aer Provider                        |          Aer Providerへのアクセス          |    6%    |

各Section内には、出題トピックが存在します。例えば、Section 1:Perform Operations on Quantum Circuitsは、8つの出題トピックがあります。出題トピックごとの出題比率は、公開されていません。

| 出題トピック                                       | 日本語訳                                |
| -------------------------------------------------- | --------------------------------------- |
| 1. Construct multi-qubit quantum registers         | 1. 多量子ビット量子レジスタを構築する   |
| 2. Measure quantum circuits in classical registers | 2. 古典的なレジスタで量子回路を測定する |
| 3. Use single-qubit gates                          | 3. 単一量子ビットゲートを使用する       |
| 4. Use multi-qubit gates                           | 4. 複数量子ビットゲートを使用する       |
| 5. Use barrier operations                          | 5. バリア操作を使用する                 |
| 6. Return the circuit depth                        | 6. 回路の深さを出力する                 |
| 7. Extend quantum circuits                         | 7. 量子回路を拡張する                   |
| 8. Return the OpenQASM string for a circuit        | 8. 回路のOpenQASM文字列を出力する       |

試験の出題範囲と構成がつかめたところで、今回はSection 1を取り上げて、開発ドキュメントとの対応付けを試みます。



# 試験要綱の読解と開発ドキュメントとの結びつけ
### Section 1：Perform Operations on Quantum Circuits

Section 1は、「Perform Operations on Quantum Circuits」で、「Qiskitを使った量子回路で演算をする」ことに必要な知識が問われています。出題トピックを見てみると、レジスタ、量子ゲートを配置して量子回路を構築するところまでをQiskitでどのように記述できるかを理解できているかという点と、記述された内容の意味は何かという点が問われているようです。

Qiskitにおける量子レジスタの定義方法、計算結果の格納方法、量子ゲートの定義方法といった、回路を構成するための操作するという点では、プリミティブな内容です。

####  1.多量子ビット量子レジスタを構築する

量子回路上に複数の量子ビットで構成された量子レジスタを構築することが問われるようです。量子回路に量子ビットを配置しないと、事が始まりませんからね。Qiskitで量子回路を構築する上で、誰もが通る道です。

Qiskit上での量子レジスタを定義する方法については、開発ドキュメント中の下記ページが該当します。

https://docs.quantum.ibm.com/api/qiskit/circuit#register

#### 2.古典的なレジスタで量子回路を測定する

量子回路上で計算した結果を、古典コンピュータにおける論理ビットとして、格納することが問われるようです。古典的なレジスタは、計算結果が格納された量子ビットに対しての測定結果を格納することに使われます。古典的なレジスタを定義する方法については、開発ドキュメント中の下記ページが該当します。

https://docs.quantum.ibm.com/api/qiskit/circuit#classicalregister

#### 3.単一量子ビットゲートを使用する

量子回路上で1つの量子ビットに作用する量子ゲートについて問われるようです。単一量子ビットゲートの定義方法は、下記の開発ドキュメントが該当します。

https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.QuantumCircuit#methods-to-add-standard-instructions

古典コンピュータにおけるビットは0、1の2つの状態を扱うため、基本的にはAND、OR、NOTの原始的な3種類のゲートを組み合わせて回路を構成するものでした。一方、量子ビットゲートは、量子ビットがどちらに向いているかという三次元的な「状態」を扱います。古典コンピュータの論理ビットと比べて量子ビットがとる状態が多いのもあり、上記の開発ドキュメントを見ると、30種類以上の量子ビットゲートがあります。

#### 4.複数量子ビットゲートを使用する

こちらは、複数の量子ビットに対して作用する量子ビットゲートに対する理解が問われようです。複数量子ビットゲートの例として、ゲートに入力した1つ目の量子ビットと2つ目の量子ビットを交換するSWAPゲートが挙げられます。

https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.library.SwapGate
https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.QuantumCircuit#swap

こちらも単一量子ビットゲートと同じく、たくさんの種類の複数量子ビットゲートがあります。例えば、下記開発ドキュメント"standard-gates"には、Qiskitであらかじめ定義されている量子ビットゲートの一覧を確認できます。このなかで、複数量子ビットゲートを探したいと思ったら、主にメソッド名がCから始まるものをヒントに探すとよさそうです。

https://docs.quantum.ibm.com/api/qiskit/circuit_library#standard-gates

#### 5.バリア操作を使用する

このシリーズは試験要綱を読み解き、出題範囲と開発ドキュメントの対応付けすことが目的なので、「バリア操作」についての詳細な説明は、ドキュメントに譲りますが、Qiskitで作成した量子回路をコンパイルするにあたって、最適化する箇所をある程度コントロールすることができます。

例えば、[「4.複数量子ビットゲートを使用する」](#4.複数量子ビットゲートを使用する)で、「ゲートに入力した1つ目の量子ビットと2つ目の量子ビットを交換するSWAPゲート」を例に出しました。量子ビットに対して連続で2回、SWAPゲートを作用させると、演算結果が作用前の状態に戻りますので、実質SWAPゲートはいらないことになります。Qiskitではそういった部分を最適化して、量子ゲートの数を減らす仕組みが備わっています。

バリア操作については、下記のドキュメントが該当します。

https://docs.quantum.ibm.com/api/qiskit/0.40/qiskit.circuit.library.Barrier
https://docs.quantum.ibm.com/api/qiskit/circuit#qiskit.circuit.Barrier

#### 6.回路の深さを出力する

回路の深さを出力する方法については、下記のドキュメントが該当します。

https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.QuantumCircuit#qiskit.circuit.QuantumCircuit.depth

「回路の深さ」とは、量子回路における「層」の数のことで、量子回路上におけるクリティカルパス(量子回中で、単一の量子ビットに対して、最も多く作用するゲート数)のことを指します。

https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.QuantumCircuit#circuit-properties

上記のページの通り、「深さ」は、量子コンピュータ上で実行する前、量子回路を量子デバイス上で構築する時間に関係するそうで、「深さ」が大きいほど、量子回路を構築するのにかかる時間も長くなるようです。

開発ドキュメントによると、この「深さ」は、専門家でさえ厳密に理解するのが難しいという公式見解ですが・・・自身で定義した量子回路の深さを表示することで、おおよその量子回路の規模をつかむことができる機能がQiskit上にあるということだけでも知っておくとよいと思います。

#### 7.量子回路を拡張する

Qiskitには、拡張機能としてqiskit.extentionsパッケージがありました。「た」というのは、qiskit.extensionsは、Qiskit 1.0.0で廃止になったパッケージです。認定資格ができたのが2021年で、Qiskit 1.0.0のリリースは2024年1月です。認定資格ができた当時のことと、公式Study Guideのリンク先を考えると、開発ドキュメント上の該当箇所は、下記になると考えられます。

[extensions | IBM Quantum Documentation (0.46)](https://docs.quantum.ibm.com/api/qiskit/0.46/extensions)

上記は、v0.46.3ですが、Qiskit v0.44では、qiskit.circuit.libraryに移ったゲートの記述があります。

[extensions | IBM Quantum Documentation (0.44)](https://docs.quantum.ibm.com/api/qiskit/0.44/extensions)

qiskit.extensionsの変遷は、下記のリリースノートが参考になります。

[Qiskit 1.0 release notes | IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/release-notes/1.0#circuits-upgrade-notes)

#### 8.回路のOpenQASM文字列を出力する

Qiskitで書いた量子コンピュータのプログラムは、QASM(カズム)という言語に変換されます。変換結果の出力に使用するインターフェースは、QASMのバージョンによって変わります。開発ドキュメント上では、下記が該当します。

https://docs.quantum.ibm.com/api/qiskit/qasm2#exporting-api
https://docs.quantum.ibm.com/api/qiskit/qasm3#exporting-to-openqasm-3

# まとめ

Section 1では、

* 量子レジスタを作成し、様々な量子ゲートを駆使して量子回路を構築する。量子レジスタに格納された計算結果を古典コンピュータで言うところの論理ビットとして取り出す。この流れを理解したうえで、Qiskitではどういう書き方になるのか。(出題トピック1, 2, 3, 4, 5, 7)
* 量子回路の構造についての情報(深さ、QASM)を得るため、Qiskitではどういう書き方になるのか。(出題トピック6,8)

ということが問われています。

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

| 出題トピック                            | 開発ドキュメント                                             |
| --------------------------------------- | ------------------------------------------------------------ |
| 1. 多量子ビット量子レジスタを構築する   | https://docs.quantum.ibm.com/api/qiskit/circuit#register     |
| 2. 古典的なレジスタで量子回路を測定する | https://docs.quantum.ibm.com/api/qiskit/circuit#classicalregister |
| 3. 単一量子ビットゲートを使用する       | https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.QuantumCircuit#methods-to-add-standard-instructions |
| 4. 複数量子ビットゲートを使用する       | https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.library.SwapGate<br/>https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.QuantumCircuit#swap<br />https://docs.quantum.ibm.com/api/qiskit/circuit_library#standard-gates |
| 5. バリア操作を使用する                 | https://docs.quantum.ibm.com/api/qiskit/0.40/qiskit.circuit.library.Barrier<br/>https://docs.quantum.ibm.com/api/qiskit/circuit#qiskit.circuit.Barrier |
| 6. 回路の深さを出力する                 | https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.QuantumCircuit#qiskit.circuit.QuantumCircuit.depth<br />https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.QuantumCircuit#circuit-properties |
| 7. 量子回路を拡張する                   | https://docs.quantum.ibm.com/api/qiskit/0.46/extensions<br />https://docs.quantum.ibm.com/api/qiskit/0.44/extensions<br />https://docs.quantum.ibm.com/api/qiskit/release-notes/1.0#circuits-upgrade-notes |
| 8. 回路のOpenQASM文字列を出力する       | https://docs.quantum.ibm.com/api/qiskit/qasm2#exporting-api<br/>https://docs.quantum.ibm.com/api/qiskit/qasm3#exporting-to-openqasm-3 |