Qiskitの基本的な使い方

# １．はじめに
2022年、IBM Community Japanが主催する「ナレッジモール研究 2022」というコミュニティ活動で、IBMが行っている量子開発者認定資格 「IBM Certified Associate Developer - Quantum Computation using Qiskit v0.2X」（以下、本稿ではQiskit Developer試験と略します） の学習・受験の手引きとなる「虎の巻」を作りました。
「2022-B-10c」ＷＧでの研究活動の全体は、Qiita 量子コンピュータ Advent Calendar 2022 [「IBMコミュニティ活動で『量子人材育成の提案』を行い、２年連続で『最優秀賞』を獲得した話」](https://qiita.com/ksj555/items/4ca6655730cefd34e553)にて紹介しております。また、虎の巻について、Qiita 量子コンピュータ Advent Calendar 2022[「IBMのコミュニティ活動でQiskit Developer試験の受験虎の巻を作りました」](https://qiita.com/w371dy/items/bc188f70ffdc2e7b9c7a)にて紹介しております。

本投稿では、虎の巻の「補足解説」の教材を使い、Qiskitの基本的な使い方を説明します。

# ２．Qiskit Developer試験の範囲
本投稿では以下の5つのポイントを説明します。

* 量子回路の作成
* measure( ) methodの使い方
* Barrierのはたらき
* Circuit Depth
* OpenQASMへの変換とファイル出力

Qiskit Developer試験では、「Section 1: Perform Operations on Quantum Circuits」にあたる範囲であり、全体の47%の出題範囲に含まれる重要な部分です。
![図1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2571099/9500e118-d71f-0dca-9827-b25e48442c12.png)

# ３．量子回路の作成
量子回路の作成では、量子回路の作り方、量子ビット、古典ビットの作成方法が問われます。
![図２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2571099/491a15f9-a2ad-aa3f-0ab2-9ae1745c8fea.png)
中央に実際のコードを載せています。
1行目、量子レジスタを定義、量子ビットを2bitと指定し、“quantum”という名前を与えています。それをqrという変数に格納しています。
2行目、古典レジスタを定義、古典ビットを2bitと指定し、“classical”という名前を与えています。それをcrという変数に格納しています。
3行目、QuantumCircuitクラスで、量子回路を実際に作成しています。
4行目、drawメソッドで描画すると下図のような出力を得ます。
量子レジスタについては、指示した名前quantumで作成され、添え字で0,1と付いています。
古典レジスタ、Classicalのほうは、二つ表示されるのではなく、1の線上に2とbit数が記載がされます。
試験では、このような基本的な挙動が理解できているか問われます。
どこが変数なのかどこがレジスタの名前なのかをしっかり押さえましょう。
また、ポイント2点目に書いてある、もっと簡易な方法で作る作り方もあり、その場合の出力、描画したときの違いを理解しておく必要があります。

# ４．measure( ) methodの使い方
measure()メソッドは、量子の状態を計測するためのもので、「量子回路の作成」と合わせて、
基本中の基本となります。
![図３.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2571099/14f7dc5f-a28f-4c27-3d33-39bbcd455e62.png)
measure()とmeasure_all()という2種類があります。
measure()は、古典レジスタを事前に用意しておかないと計測できないですが、measure_all()は計測できるといった違いがあります。
またmeasure()の場合は、量子レジスタと古典レジスタをタプル形式、またはリスト形式でそれぞれ、対応する形で指定する必要があります。
出力についても、measure()とmeasure_all()で、 “c”と“meas”という表示の差があります。
細かいですが、試験ではそのあたりも正しく回答する必要がありますので、押さえておく必要があります。

# ５．Barrierのはたらき
バリアの使い方を3つ紹介しています。
![図４.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2571099/54593f3b-8e14-ac38-a537-7289873e4e45.png)
左から説明します。左と真ん中は結果同じですが、
左側は、それぞれ回路の番号を指定してバリアする方法、真ん中は、番号を指定しないで全てにバリアをかける方法となります。
右側は、一部だけバリアを指定する例です。0と2だけを指定しているので、一番上と一番下にバリアがかかります。

何のためにバリアを使うかですが、
量子回路を作っていくと、操作ゲートを整列して見やすくしたいことがありますその際、整列のためにバリアを使うことがあります。

ただ、このバリアには副作用があるので注意が必要です。
例えば、通常ゲートを2回ならべてかけると、前の操作をキャンセルできますが、
バリアを間に入れると、キャンセルされません。
![図５.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2571099/038542b4-f99a-b327-a3ed-5ec49622a5a9.png)

# ６．Circuit Depth
ゲートの深さについて問われます。
![図７.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2571099/38e3f0c6-9839-d086-cffd-275eadf55354.png)
左の図のq0は左からXゲート、Hゲート、mesureと並んでおり、
q1は左からXゲート、measureと並んでいます。
この回路の深さは長い方の深さとなり、q0の側の深さがカウントされDepthは3と出力します。
注意点としては、measure、measure_allも深さにカウントされるという点です。

なお、バリアはカウントされません。
![図８.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2571099/91577dfd-b3c6-f103-6840-c84fa642e8e5.png)

# ７．OpenQASMへの変換とファイル出力
OpenQASMは、量子計算機のアセンブリ言語、機械語に近いプログラミング言語という理解で問題ないと思います。
![図９.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2571099/ef1f8ffc-618f-a032-a9f0-5747175067c7.png)
ここでは、1ビットの量子回路を作り、xゲートをかけています。
3行目のqc.qasmでOpenQASM形式に変換し、filenameを指定して外部ファイルに出力しています。
出力した結果は下図のようになります。
ポイントとしては、
ファイルの出力方法、とまた、QiskitとOPENQASMでのプログラムの記述の違いを理解しておくことが必要です。
OpenQASM自体をしっかり読める、理解している、というよりは、Qiskitのコードと見比べて違いを理解できるくらいで試験対策はいいと思います。

# ８．さいごに
私自身は、チームメイトのおかげで2022年6月にQiskit Developer試験に合格することができました。
本投稿では、Qiskit Developer試験に関するQiskitの基本的な使い方について説明しました。
Qiskitに興味を持たれている方で、Qiskit Developer試験をこれから受験される方にとって何かお役に立てることができる情報であったら幸いです。