こんにちは|こんばんは.カエルのアイコンで活動しております @kyamaz
です.1
はじめに
本稿は,2025年QiitaアドベントカレンダーのTypeScriptのカレンダー向けの投稿です.TypeScriptで書かれた量子コンピュータのための量子計算ライブラリ『q5m.js』の紹介記事です.
q5m.js
q5m.js は量子情報・量子計算のためのライブラリを開発するOSSコミュニティ OpenQL プロジェクト2が主にメンテナンスしているライブラリです.
名前の由来
量子の英語 ”quantum” の最初の文字 'q' と最後の文字 'm' の間の5文字("uantu")を数字の '5' に置き換えて,”q5m” と命名されました.
開発の背景
量子コンピュータ界隈では,各社からPythonベースのライブラリが提供されており,量子コンピュータのプログラム開発といえば,Pythonで書かれることが多いです.その他には,Microsoftが開発した Q# のような専用言語を使ったり,C#/C++で開発するのが一般的になりつつあります,
そのなかで,ブラウザとの相性がよい JavaScript や TypeScript での実装はあまり見かけないというのが現状です.かろうじて,IPAの未踏ターゲット事業で2018年に採択された『web開発向けオープンソース量子計算ライブラリの開発』の成果である「qramana」がありますが,それ以外では活用できそうなライブラリは見当たりません.
Python を活用することに集中されているのは,ただでさえ少ない人材で効率的に実装を前進させなければならない量子計算界隈のエコシステムとしては,仕方ないように思います.
一方で,日本政府(内閣府)が提示している「未来社会ビジョンに向けた2030年に目指すべき状況3」には次の3つの方針が示されています.
- 国内の量子技術の利用者を1,000万人に
- 量子技術による生産額を50兆円規模に
- 未来市場を切り拓く量子ユニコーンベンチャー企業を創出
このような方針が具体化していくと仮定すれば,より量子計算に親しむ人材が増えていき,裾野が広がっていくことが期待されます.
そこで,OSSコミュニティ『OpenQL』では,多言語へのライブラリの対応を目指しており,TypeScriptベースの量子計算ライブラリを開発しております.
q5m.js の使い方
それでは,使い方をみていきましょう.
インストール
NodeJS の開発・実行環境が整っていることを前提として,npm で次のようにインストールして利用します.
$ npm install @q5m/q5m
実行したフォルダの下に pakcage.json とともに node_modules が作られ,ローカルにインストールされます.q5m.js は ES Module で書かれております.実行環境としては,皆さんの環境に合わせて整備してください.以降,typescript環境として npm install typescript とESM環境としてnpm install -D tsx が設定されている環境を想定して進めます.
量子回路をつくってみる
現段階の量子計算ライブラリには,量子回路をつくって量子計算を試せることが最低限サポートされていることが必要になります.そのあたりの使い方を見てみましょう.次のプログラム example1 を実装します.
import {Circuit} from "@q5m/q5m" // ライブラリのimport
// Create a 2-qubit Bell state
const circuit = new Circuit(2); // Circuitモジュールを作成
circuit.h(0).cnot(0, 1); // 量子回路を作成する
const result = circuit.execute(); // 量子回路を実行する
console.log('Bell state probabilities:', result.state.probabilities());
コンソールからプログラムを動かしてみましょう.
$ npx tsx ./example1.ts
Bell state probabilities: [ 0.5000000000000001, 0, 0, 0.5000000000000001 ]
この例は,量子回路で量子もつれのベル状態 $\displaystyle \frac{1}{\sqrt{2}} \lvert 00 \rangle + \frac{1}{\sqrt{2}} \vert 11 \rangle $ を作って,それを測定したときの確率を求めています.$\lvert 00 \rangle$と$\vert 11 \rangle$が50%ずつ観測されるという結果を示しています.
q5m.js の内部
q5m.js は汎用的な量子計算ライブラリを目指しております.ここではその内部構造を少しだけ解説します.ソースのフォルダ構成は次のようになっています.
src/
├── core/ # コアクラス(量子回路、状態、ゲート、オペレータ)
├── math/ # 数学ユーティリティ(複素数、行列演算)
├── algorithms/ # 量子アルゴリズム(Grover、QFT、QPE)
├── visualization/ # 可視化ツール(回路図、状態表示)
├── converters/ # フォーマット変換(OpenQASM、Qiskit、Cirq)
└── notebook/ # Jupyter Notebook 統合
この中でコアクラスを中心に説明しましょう.q5m.js では,量子の世界と非量子の世界の境界を意識した構成になっています.クラス名では,Q5m... から始まるクラスが量子の世界を扱うクラスとしています.まずは,非量子の世界を扱うクラスを見てみましょう.
- BaseCircuit :量子回路を扱う抽象クラスです.
- └ Circuit :量子ゲートを配列である CircuitInstraction[] と量子ビット数を保持するクラスです.1量子ビットゲートや2量子ビットゲートの各種量子ゲート操作をメソッドに備えていて,インストラクションの配列に加えることができます.
量子回路の概念は,量子ゲートの集合と捉えることができますので,量子の世界というよりは,非量子の世界を扱っているとしても自然でしょう.我々が扱いたい計算は非量子の世界にあることを暗に意図しています.
次に,量子ゲートのクラスです.各ゲートクラスは,抽象クラスである Q5mGate を継承しています.Q5mGateは量子の世界のクラスとして,Q5mStateに作用するapplyTo(state: Q5mState): Q5mStateで計算ロジックが実装されるように設計されています.
-
Gate :量子ゲートには,
OneQubitGates,TwoQubitGates,MultiQubitGates,MeasureGatesなどの種類があります.それぞれに次のゲートがプリセットで提供されています.- OneQubitGates : H, X, Y, Z, S, T, Tdg, Sdg, Identity, PH, RX, RY, RZ
- TwoQubitGates : CNOT, CX, CZ, CY, CH, CU, SWAP, CP
- MultiQubitGates : EE, HH
- MeasureGates : Mz, Mx, My, Mp
さて,ここで量子の世界との界面を考えます.量子計算では測定により量子の世界を垣間見ることができます.そこで,q5m.js では,その界面を担うクラスとして CircuitExecutor があります.この実行器は多くは隠蔽されて,BaseCircuit クラスに備わっている execute() や run(initalState) の内部で使われます.
- CircuitExecutor :量子回路を実行するためのクラスです.
- ExecutionResult :量子回路を実行して測定した結果を表すクラスです.
この CircuitExecutor で測定が行われるため,量子計算を古典シミュレーションで計算する処理はここで実装されています.
改めて q5m.js の実世界(非量子の世界)からの量子計算の使い方をシンプルに整理しておきましょう.
| 量子計算の手順 |
|---|
1. 量子計算のための量子回路 Circuit クラスを準備する2. 適切な量子ゲートを Circuit に追加する3. Circuit の execute()もしくはrun() を使って実行する4. 結果は ExecutionResult クラスで出力される |
q5m.js の内側の内側
q5m.js を量子計算のライブラリとして使うには,上記のような手順で必要最低限の計算は可能なように設計されていますので内側のさらに内側にある量子の世界を表現している部分は特に意識しなくてもよいように設計されています.ただし,さらに量子計算の深いところの拡張的な実装にも対応できるな思想で構成されています.この内側の内側は,将来的には手が入って変わる可能性もありますが,その構成を確認してみましょう.
- Q5mMaterial :量子コンピュータの物理的な実装は様々な方式があります.例えば,2準位系だけに限らなかったり,連続量だったりもします.いわゆる一般的な量子ビットだけを扱うだけの設計ではない構造を目指しています.
-
Q5mState :量子状態を扱う抽象クラスです.
Q5mMaterialのGeneric型として定義されています. -
Q5mApplicable :
Q5mOperatorのGeneric型として定義され,メソッドapply()を実装するためのインターフェースです. - Q5mSystem :量子系を定義するためのインターフェースです.2つの量子系の相互変換も想定されており,混合状態やフィデリティの実装も可能となります.
-
Q5mObserver :測定であるメソッド
measure()を実装するための枠組みです.
この他にも,演算子として UnitaryOperator, HermitianOperator などの物理学で馴染みのある形式で内部クラスが構成されており,効率的に演算を処理するような機構も備わっております.
おわりに
量子計算ライブラリ『q5m.js』は,拡張性にも配慮された設計になっており,今後のプラグインでの拡張(extensions)開発も計画されております.また,typescriptベースのライブラリですので,ブラウザで動作するプログラムへの組み込みも期待されています.
本稿をきっかけに量子計算のプログラムに興味をもって頂けると嬉しいです.
ご一読いただきまして有り難うございます.2
(●)(●) Happy Hacking!
/"" __""\
-
@kyamaz は、オープンソース・コミュニティ『OpenQL』プロジェクトを通じて、皆さんと共に量子情報・量子コンピューティングの分野で挑戦しております。引き続きどうぞ宜しくお願い致します。 ↩
-
OpenQLプロジェクトは、量子コンピューターを扱うためのライブラリを開発するためのオープンソースプロジェクトです。量子情報、量子コンピューターに興味のある人たちが集うコミュニティを運営しております。詳しくはconnpassのサイトをご覧ください。 ↩ ↩2