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

## はじめに

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

前回はIBM量子開発者認定資格の出題範囲である[Section 9](https://qiita.com/imh1104/items/cb9fc19a31cd903eb6c2)について開発ドキュメントとの対応付けを試みました。今回は、Section 5に対して、対応付けを試みます。今回でIBM量子開発者認定資格試験の出題範囲における76%をカバーすることになります。

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

## Section 5: Compare and Contrast Quantum Informationの出題トピック

[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 5: Compare and Contrast Quantum Informationの出題トピックを見てみましょう。

| Section 5の出題トピック                | 日本語訳                                  |
| -------------------------------------- | ----------------------------------------- |
| 1. Use classical and quantum registers | 1. 古典的レジスタ・量子レジスタを使用する |
| 2. Use operators                       | 2. 演算子を使用する                       |
| 3. Measure fidelity                    | 3. 忠実度を測定する                       |

## 試験要綱の読解と開発ドキュメントとの結びつけ
### Section 5：Compare and Contrast Quantum Information

Section 5は、「Compare and Contrast Quantum Information」です。「演算子」、「忠実度」という独特の単語が出てきていることから、Section 5は「量子情報理論」分野寄りになっており、これまでのSection 1、Section 9と比べると、専門的な知識が問われる印象を受けます。"Fidelity(忠実度)"という字面からも、何か学術的な雰囲気が醸し出されています。

加えて、Section 5では古典的なレジスタ、量子レジスタに関する出題トピックが登場しています。Section 1でも、古典的なレジスタ、量子レジスタに関連する出題トピックがありました。出題トピックの話題として2回出てきていることから鑑みて、開発者としてQiskitを学習するにあたっては、このシリーズで対象としているハチワリの中で、古典的なレジスタ、量子レジスタについては、最重点学習項目だと言えそうです。

####  1.古典的レジスタ・量子レジスタを使用する

古典的レジスタ・量子レジスタに関する話題は、開発ドキュメント中の下記ページが該当します。

[circuit#register](https://docs.quantum.ibm.com/api/qiskit/circuit#register)

[circuit #quantumregister](https://docs.quantum.ibm.com/api/qiskit/circuit#quantumregister)

[circuit#classicalregister](https://docs.quantum.ibm.com/api/qiskit/circuit#classicalregister)

Section 1の出題トピック[「1.多量子ビット量子レジスタを構築する」]([https://qiita.com/imh1104/items/ac2c3d0b92add77109e0#1多量子ビット量子レジスタを構築する)、[「2.古典的なレジスタで量子回路を測定する」](https://qiita.com/imh1104/items/ac2c3d0b92add77109e0#1多量子ビット量子レジスタを構築する)と変わりがありません。「重複項目」だから省略しても良いと思いたいところですが、ここでは、Section 1との違いを見出してみます。

もう一度Section 1に戻って、Section 1内で扱われている他の出題トピックを見ると、量子回路の構成要素の視点として、回路にレジスタを配置していくというように、回路部品としてレジスタが扱われているように読めます。対して、Section 5は、「演算子」、「忠実度」というように、相手や比較対象がないと成立しない内容が扱われています。この点から察すると、Section 5では、レジスタ同士を結び付ける視点から本トピックが取り扱われているように読めます。

となると、Section 5では、Qiskitにおけるレジスタの定義を理解したうえで、レジスタを使った「演算子」の使用方法、「忠実度」の計算方法について問われている、と捉えることができます。

この視点でSection 5の出題トピックを見れば、Section 1での出題トピック1.、2.と参照内容が同じといえども、開発ドキュメントの読み方・捉え方・解釈が変わってくるのではないでしょうか。

#### 2.演算子を使用する

演算子に関する記載は、開発ドキュメントの下記の部分が対応します。

[Operators module overview | IBM Quantum Documentation](https://docs.quantum.ibm.com/guides/operators-overview)

[The Operator class | IBM Quantum Documentation](https://docs.quantum.ibm.com/guides/operator-class)

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

量子の世界における「演算子」について、ざっくり説明すると古典コンピュータのビットに対してANDゲートやORゲートを作用させて演算するように、量子ビットに作用させる変換操作のイメージです。より詳細な解説は、[1-2. 量子ビットに対する基本演算 — Quantum Native Dojo ドキュメント](https://dojo.qulacs.org/ja/latest/notebooks/1.2_qubit_operations.html)が参考になります。演算子は、数式として行列表現で書くことができます。例えば、古典コンピュータのNOTゲートに相当するXゲートは、行列として表すことができます。試しにQiskitで定義済のXゲートをOperatorクラスに変換して、Xゲートの行列表現を出力してみました。

```Qiskit
from qiskit.quantum_info import Operator
from qiskit.circuit.library import XGate

op1 = Operator(XGate())
Operator(op1)
```

```
Operator([[0.+0.j, 1.+0.j],
          [1.+0.j, 0.+0.j]],
         input_dims=(2,), output_dims=(2,))
```

量子に対してXゲートの演算する場合は、

$$
\begin{vmatrix}
0 & 1 \\\\
1 & 0 
\end{vmatrix}
$$

として演算子を行列で表現できることがわかります。行列の各要素が何を表すか、input_dims、output_dimsの説明については割愛しますが、Qiskitには、演算子を行列で表すインターフェースがあるということです。

:::note info
量子ゲートの話題は、[Section 1 4.複数量子ビットゲートを使用する](https://qiita.com/imh1104/items/ac2c3d0b92add77109e0#4複数量子ビットゲートを使用する)でも扱い、量子ゲートの種類が多数あることについて触れました。
:::

上記はQiskitで定義済の演算子から行列表現を出力していますが、行列表現から演算子を定義する機能もあります。

[Operators module overview | IBM Quantum Documentation](https://docs.quantum.ibm.com/guides/operators-overview#operator)

#### 3.忠実度を測定する

忠実度(Fidelity、フィデリティ)を測定する方法は、開発ドキュメント中の下記ページが該当します。

* [quantum_info (latest version) | IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/quantum_info#measures)
  * [quantum_info#state_fidelity](https://docs.quantum.ibm.com/api/qiskit/quantum_info#state_fidelity)
  * [quantum_info#process_fidelity](https://docs.quantum.ibm.com/api/qiskit/quantum_info#process_fidelity)
  * [quantum_info#average_gate_fidelity](https://docs.quantum.ibm.com/api/qiskit/quantum_info#average_gate_fidelity)

「忠実度」とは、2つの量子状態がどの程度似ているのかを測る定量的な指標です。例えば、量子状態を転送して、転送前と転送後の量子状態を比較する、量子ゲートの操作前の量子状態と操作後の量子状態を比較するというように、実際の操作結果がどれだけ理想の量子状態に近づいているかを評価するため、「忠実度」を計算することがあります。

上記の説明は、2つの量子の状態がどの程度似ているかという意味での「忠実度」です。Qiskitでは、state_fidelityに相当します。[演算子](#2.演算子を使用する)に対しても、演算がどれだけ似ているかの「忠実度」を計算できます。こちらは、process_fidelityに相当します。なお、Process fidelityの出力方法については、下記の開発ドキュメントが参考になります。

[operator-class#process-fidelity](https://docs.quantum.ibm.com/guides/operator-class#process-fidelity)

2つの量子状態や2つの演算子がどの程度似ているのかを測ることは、どんなことに役立つのでしょうか。Section 9で述べた通り、量子というのは外界からのノイズに弱く、エラーが発生します。なので、量子コンピュータ上で計算や実験、シミュレーションを行なう場合、量子ビットへの操作が正しく作用し、正しい結果になっているのかを評価するために、定量的な指標を示す必要があります。そこで、「忠実度」が役に立ちます。

例えば、以下の記事のように量子コンピュータにおける「量子ビットの誤り訂正」関連の研究が進められていますが、量子コンピュータ実用化に向けて、より忠実度の高い量子ゲートでの操作が必要であるという意味で、「忠実度」という用語が使われています。

[MITが超伝導量子ビットで99.998%という史上最高の忠実度を達成 ―量子コンピュータの実用化に向け大きな前進 | XenoSpectrum](https://xenospectrum.com/mit-achieves-highest-fidelity-ever-with-superconducting-qubits-at-99-998/)

[量子力学における測定 | オンライン講義 | 公開のオンライン講義 | 量子通信のショートコース(作成者：吾妻広夫 CC BY-SA)｜量子技術高等教育拠点 - 量子技術を学ぶ、 新しいかたち](https://qacademy.jp/lecture/online/quantum/measurement/)

## まとめ

Section 5は、レジスタに格納された情報([出題トピック1](#1.古典的レジスタ・量子レジスタを使用する))「演算子」を使って処理([出題トピック2](2.演算子を使用する))し、演算結果を「忠実度」で比較する([出題トピック3](#3.忠実度を測定する))という一連の流れをQiskitで書けるかどうかということが、問われているようです。

* 古典的レジスタ、量子レジスタを使う(出題トピック1)
* レジスタに格納された量子情報を演算する(出題トピック2)
* 量子情報の忠実度を測定する(出題トピック3)

量子特有の項目についても、これまで説明してきたSection1、Section 9より内容が濃くなりました。Qiskitを学習するにあたっては、Qiskitのインターフェース・使い方の理解に加えて、量子情報理論分野の視点でのインターフェース・使い方を捉えることが必要と感じました。

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

| 出題トピック                                     | 開発ドキュメント                                             |
| ------------------------------------------------ | ------------------------------------------------------------ |
| 1.古典的レジスタ・量子レジスタを使用する         | [circuit#register](https://docs.quantum.ibm.com/api/qiskit/circuit#register)<br />[circuit #quantumregister](https://docs.quantum.ibm.com/api/qiskit/circuit#quantumregister)<br />[circuit#classicalregister](https://docs.quantum.ibm.com/api/qiskit/circuit#classicalregister) |
| 2.演算子を使用する[quantum_info (latest version) | [Operators module overview \|IBM Quantum Documentation](https://docs.quantum.ibm.com/guides/operators-overview)<br />[The Operator class \|IBM Quantum Documentation](https://docs.quantum.ibm.com/guides/operator-class)<br />[Operator (latest version) \|IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/qiskit.quantum_info.Operator) |
| 3.忠実度を測定する                               | [quantum_info (latest version) \| IBM Quantum Documentation](https://docs.quantum.ibm.com/api/qiskit/quantum_info#measures)<br />[quantum_info#state_fidelity](https://docs.quantum.ibm.com/api/qiskit/quantum_info#state_fidelity)<br />[quantum_info#process_fidelity](https://docs.quantum.ibm.com/api/qiskit/quantum_info#process_fidelity)<br />[quantum_info#average_gate_fidelity](https://docs.quantum.ibm.com/api/qiskit/quantum_info#average_gate_fidelity) |