HPCシステムズではエンジニアを募集しています。詳しくはこちらをご覧ください。
HPCシステムズのエンジニア達による技術ブログ

Tech Blog

世界最速の量子コンピュータ用汎用コンパイラ「tket」を使ってみた

はじめに

 量子コンピュータを活用するには、もちろんそのためのプログラムが必要です。古典コンピュータの黎明期では、ユーザがハードウェアの特性をよく理解した上で、やりたい計算を実現する回路を物理的に組んでいく必要がありました。やがて、コンパイラが発明され、ユーザはハードウェアの特性をさほど意識することなく、人間が理解しやすい言葉でプログラムを書き、コンパイラを通じてやりたい計算を実現できるようになりました。量子コンピュータも当初はユーザが物理的な量子回路を構築する必要がありましたが、量子コンピュータ用のコンパイラの開発が進み、現在では人間が理解しやすい言葉で量子コンピュータを運用することが可能となってきました。とはいえ、異なるアーキテクチャに対する汎用性や計算精度(特にノイズの影響)での問題もあり、多くの一般ユーザにとって「使いやすい」と感じられる量子コンピュータ環境は、まだ実現には至っていないのが現状と言えます。

 そんな中、英国のCambridge Quantum Computing(以下CQC)社が量子コンピュータ用のコンパイラ「tket(ティケット)」を開発・公開しました。tketは、多数のフロントエンド(プログラミング言語)とバックエンド(量子ハードウェア)に対応する汎用コンパイラであり、また各バックエンドに応じて量子回路の最適化が行われるため、高速かつ高精度の量子計算を実現することができます。今のところ、tketはGitHubから無償でダウンロード・利用が可能となっています。そこで本ブログでは、tket(特に、pythonでのtket運用キット「pytket」)を手元のパソコンで試用し、その概要を簡単にレポートします。

tketの特徴

  • 多数のフロントエンド・バックエンドに対応

 好みの開発環境がどの量子ハードウェア(量子シミュレータを含む)でも実行可能で、量子ハードウェアに応じて回路が最適化されます。

  • ノイズエラーの軽減

 量子回路のゲート数削減やレイアウト最適化、量子ビットルーティングの最適化により、ノイズの影響を軽減させています。

tketを実際に使ってみた

  • インストール

 まず手元のPC(Windows 10)にPython 3.9.4をインストールしました(pytketには3.6以降のPythonが必要)。次にWindows用pytket 0.9.0(pytket-0.9.0-cp39-cp39-win_amd64.whl)を専用サイト( https://pypi.org/project/pytket/0.9.0/#files )よりダウンロードしました。ダウンロードが終わったら、pytketのGetting Startedページ( https://cqcl.github.io/pytket/build/html/getting_started.html )に従って、インストールを行いました。より具体的には、コマンドプロンプトを立ち上げ、以下のコマンドを入力しました。

pip install pytket

pytketが無事インストールできたら、次にpytket拡張モジュールをインストールします。ここではとりあえず、Qiskit、Cirq、Qulacsをインストールしました。これで、これらの量子コンピュータインターフェースをPC上で利用することができます。

pip install pytket-qiskit
pip install pytket-cirq
pip install pytket-qulacs

他にもいろいろな拡張モジュールがあります。詳しくは、https://github.com/CQCL/pytket のInterfacesをご参照下さい。

 

  • 簡単なプログラムの実行

 必要モジュールのインストールが完了したので、CQC社から公開されているpytket Examples( https://github.com/CQCL/pytket/tree/master/examples )を参考に、ごく簡単なプログラムを作成し、実行してみました。ここでは量子回路の解析・可視化を行うcircuit_analysis_exampleを採り上げます。

 解説ページ(https://github.com/CQCL/pytket/blob/master/examples/circuit_analysis_example.ipynb)を参考にして、以下のプログラムを作成しました。

from pytket.circuit import Circuit, OpType
from pytket.extensions.qiskit import tk_to_qiskit
from pytket.extensions.cirq import tk_to_cirq

c = Circuit(4, name="example")
c.add_gate(OpType.CU1, 0.5, [0,1])
c.H(0).X(1).Y(2).Z(3)
c.X(0).CX(1,2).Y(1).Z(2).H(3)
c.Y(0).Z(1)
c.add_gate(OpType.CU1, 0.5, [2,3])
c.H(2).X(3)
c.Z(0).H(1).X(2).Y(3).CX(3,0)

print('=== Information on the Circuit ===')
print('Name of the Circuit:',c.name)
print('Number of the Qubits in the Circuit:',c.n_qubits)
print('Depth of the Circuit:',c.depth())
print()
print('=== Visualization of the Circuit ===')
print('Via Qiskit')
print(tk_to_qiskit(c))
print()
print('Via Cirq')
print(tk_to_cirq(c))

 このプログラムにcircuit_analysis.pyというファイル名を付け、pythonプログラムと同じディレクトリに保存した後、実行しました。

python circuit_analysis.py

その実行結果が、以下の出力です。

=== Information on the Circuit ===
Name of the Circuit: example
Number of the Qubits in the Circuit: 4
Depth of the Circuit: 8

=== Visualization of the Circuit ===
Via Qiskit
           ┌───┐┌───┐┌───┐┌───┐           ┌───┐
q_0: ─■────┤ H ├┤ X ├┤ Y ├┤ Z ├───────────┤ X ├
      │π/2 ├───┤└───┘├───┤├───┤ ┌───┐     └─┬─┘
q_1: ─■────┤ X ├──■──┤ Y ├┤ Z ├─┤ H ├───────┼──
     ┌───┐ └───┘┌─┴─┐├───┤└───┘ ├───┤┌───┐  │
q_2: ┤ Y ├──────┤ X ├┤ Z ├─■────┤ H ├┤ X ├──┼──
     ├───┤ ┌───┐└───┘└───┘ │π/2 ├───┤├───┤  │
q_3: ┤ Z ├─┤ H ├───────────■────┤ X ├┤ Y ├──■──
     └───┘ └───┘                └───┘└───┘

Via Cirq
0: ───@───────H───X───Y───Z───────────────X───
      │                                   │
1: ───@^0.5───X───@───Y───Z───────H───────┼───
                  │                       │
2: ───Y───────────X───Z───@───────H───X───┼───
                          │               │
3: ───Z───────H───────────@^0.5───X───Y───@───

変数cに定義された量子回路の情報が正しく出力されていることがわかります。可視化された回路も、QiskitインターフェースでもCirqインターフェースでも全く同じ結果となっています。

おわりに

 量子コンピュータ用のプログラムは、すでにパッケージ化されているものもありますが、痒い所に手が届くような計算を行うためには、プログラムの作成方法やコンパイラの使用方法をある程度知っておいて損はないように思います。今回、試行錯誤や紆余曲折もありながらも、ひとまず「tketを使ってみた」程度には、pythonでtketを動作させることができました。これからも少しずつtketを使いこなしていきたいと思います。