量子プログラミングとは、量子ゲート、測定、および古典制御ロジックで構成される量子回路を用いて、量子システム上で動作するアルゴリズムを設計・実装するプロセスを指します。これらの回路は、特定の計算タスクや実験結果のために量子状態を操作するように開発されます。量子プログラムは、量子プロセッサ上で実行したり、古典ハードウェア上でシミュレーションしたり、研究目的で実験室の計測機器を通して実装したりすることができます。
量子プロセッサベースのシステムを扱う場合、量子プログラミング言語は量子アルゴリズムを効率的に表現するための高レベルの抽象化を提供します。これらの言語は、多くの場合、古典的なプログラミング環境と統合され、ハイブリッド量子古典ワークフローをサポートします。量子ソフトウェアの開発はオープンソースコミュニティの影響を強く受けており、 Qrisp、Qiskit、Cirq 、PennyLane、qBraid SDKなどの多くのツールキットやフレームワークがオープンライセンスで利用可能です。[ 1 ] [ 2 ]
量子プログラミングは、量子計測機器やセンサーベースのプラットフォームを介して、実験システムのモデリングや制御にも利用できます。KLMプロトコルを用いた線形光量子コンピューティングなど、一部の量子コンピューティングアーキテクチャは専用ハードウェアを必要としますが、ソフトウェアインターフェースを介してアクセス可能なゲートベースの量子プロセッサを使用するものもあります。いずれの場合も、量子プログラミングは理論的なアルゴリズムと物理的な実装をつなぐ架け橋となります。
量子命令セットは、高レベルのアルゴリズムを量子プロセッサ上で実行可能な物理的な命令に変換するために使用されます。これらの命令は、イオントラップや超伝導量子ビットなど、特定のハードウェアプラットフォームに固有のものである場合もあります。
Blackbird [ 3 ] [ 4 ]は、 Xanadu Quantum Technologiesと Strawberry Fieldsが使用する量子命令セットおよび中間表現です。これは、光子量子ハードウェア上で実行できる連続変数量子プログラムを表現するように設計されています。
cQASM [ 5 ]は、共通QASMとしても知られ、ハードウェアに依存しない量子アセンブリ言語であり、すべての量子コンパイルおよびシミュレーションツール間の相互運用性を保証します。これは、デルフト工科大学のQCAラボによって導入されました。
OpenQASM [ 6 ]は、IBM がQiskitおよび IBM Quantum Platformで使用するために導入した中間表現です。
Quantum Intermediate Representation (QIR) は、 MicrosoftがQuantum Development Kitの一部として開発したハードウェア非依存の中間表現です。LLVM コンパイラインフラストラクチャに基づいており、多様な量子ハードウェアバックエンド全体で最適化と実行をサポートする方法で量子プログラムを表現するように設計されています。[ 7 ] QIR は量子コンパイラの共通ターゲットとして機能し、Q# などの異なるプログラミング言語と低レベルのハードウェア制御レイヤー間の相互運用を可能にします。QIR は、学術機関と産業界のパートナーからなる共同グループであるQIR Allianceによって維持されています。
Quil は、量子コンピューティング用の命令セットアーキテクチャであり、共有量子/古典メモリモデルを初めて導入しました。これは、Robert Smith、Michael Curtis、および William Zeng によってA Practical Quantum Instruction Set Architectureで紹介されました。[ 8 ]多くの量子アルゴリズム (量子テレポーテーション、量子誤り訂正、シミュレーション[ 9 ] [ 10 ]、および最適化アルゴリズム[ 11 ]を含む) は、共有メモリアーキテクチャを必要とします。
量子ソフトウェア開発キットは、量子プログラムを作成および操作するためのツール群を提供します。[ 12 ]また、量子プログラムをシミュレートしたり、クラウドベースの量子デバイスや自己ホスト型量子デバイスを使用して実行できるように準備したりする手段も提供します。
以下のソフトウェア開発キットは、プロトタイプの量子デバイス上だけでなく、シミュレータ上でも量子回路を実行するために使用できます。
Googleが開発したオープンソース プロジェクトで、Python プログラミング言語を使用して量子回路を作成および操作します。Cirq で書かれたプログラムは、IonQ、Pasqal、[ 13 ] Rigetti、およびAlpine Quantum Technologiesで実行できます。[ 14 ]
Classiq社が開発したクラウドベースの量子IDEは、高水準量子言語Qmodを用いて、ハードウェアを考慮した合成エンジンにより、拡張性と効率性に優れた量子回路を生成し、幅広いQPUに展開可能です。このプラットフォームには、豊富な量子アルゴリズムライブラリが搭載されています。
Rigettiが開発したオープンソースプロジェクトで、Python プログラミング言語を使用して量子回路を作成および操作します。結果は、シミュレータまたは Rigetti が提供するプロトタイプの量子デバイスを使用して取得されます。基本的な量子操作を使用してプログラムを作成する機能に加えて、Grove パッケージ内にはより高度なアルゴリズムが用意されています。[ 15 ] Forest はQuil命令セットに基づいています。
MindQuantumはMindSporeをベースとした量子コンピューティングフレームワークであり、 NISQアルゴリズムの実装に重点を置いている。[ 16 ] [ 17 ] [ 18 ]
D-Wave社が開発したオープンソースのツール群。主にPythonプログラミング言語で記述されており、ユーザーはイジングモデルおよび二次非制約二値最適化(QUBO)形式で問題を定式化できます。結果は、D-Wave社のリアルタイム量子アプリケーション環境であるLeapのオンライン量子コンピュータ、顧客所有のマシン、または古典的なサンプラーに送信することで得られます。
Xanadu Quantum Technologiesが開発した、量子コンピュータの微分プログラミング用のオープンソースのPython ライブラリ。 [ 19 ] [ 20 ] [ 21 ] [ 22 ] PennyLane は、ユーザーがTensorFlow、NumPy、またはPyTorchを使用してモデルを作成し、 IBMQ、Google Quantum、Rigetti、Quantinuum [ 23 ]、およびAlpine Quantum Technologies [ 14 ] [ 24 ]から入手可能な量子コンピュータのバックエンドに接続する機能を提供します。
Quandelaが作成した、光子量子回路の設計と量子アルゴリズムの開発のための オープンソースプロジェクトで、 Pythonをベースとしています。シミュレーションは、ユーザー自身のコンピュータまたはクラウド上で実行されます。Perceval は Quandela のクラウドベースの光子量子プロセッサに接続するためにも使用されます。[ 25 ] [ 26 ]

ETHの理論物理学研究所で開発されたオープンソースプロジェクトで、Pythonプログラミング言語を使用して量子回路を作成および操作します。[ 27 ]結果はシミュレータを使用するか、IBM量子デバイスにジョブを送信することによって得られます。
qBraid SDK は、 qBraid が開発したオープンソースのプラットフォーム非依存の量子ランタイム フレームワークです。これにより、ユーザーは量子プログラムを一度記述するだけで、コードを変更することなくさまざまな量子ハードウェアやシミュレータで実行できます。SDK は、Qiskit、Cirq、PennyLane、PyQuil、Braket など、複数の量子プログラミング ライブラリをサポートしています。グラフ ベースのトランスパイラを備えており、異なる量子プログラム タイプ間の変換を容易にし、フレームワーク間のシームレスな相互運用性を実現します。SDK には、ジョブの投入、結果の取得、回路の可視化のためのツールも含まれています。qBraid Lab と統合されており、IonQ、Rigetti、QuEra、IQM などのプロバイダーから 20 を超える量子デバイスとシミュレータへのアクセスを提供します。[ 28 ] [ 29 ]
Qiboは、 QRC、CQT、INFNを含む複数の研究機関によって開発された、量子シミュレーション、量子ハードウェア制御、およびキャリブレーションのためのオープンソースのフルスタックAPIです。Qiboは、量子シミュレーションとハードウェア制御のための複数のバックエンドを含むモジュール式のフレームワークです。[ 30 ] [ 31 ]このプロジェクトは、複数の機器のドライバ[ 32 ]と量子キャリブレーション、特性評価、検証のためのツールを備えたプラットフォームに依存しない量子ハードウェア制御フレームワークを提供することを目的としています。[ 33 ]このフレームワークは、ラボで必要なソフトウェア開発を簡素化することで、自己ホスト型の量子デバイスに焦点を当てています。
IBMが開発したオープンソース プロジェクト。[ 34 ]量子回路は Python を使用して作成および操作されます。結果は、ユーザー自身のデバイスで実行されるシミュレータ、IBM が提供するシミュレータ、または IBM が提供するプロトタイプ量子デバイスのいずれかを使用して取得されます。基本的な量子操作を使用してプログラムを作成する機能に加えて、アルゴリズムとベンチマークのための高レベルツールが専用パッケージ内で利用可能です。[ 35 ] Qiskit は、量子回路を表現するためのOpenQASM標準に基づいています。また、QiskitPulse 標準を介して量子システムのパルス レベル制御もサポートしています。[ 36 ]
Qrisp [ 37 ]は、 Eclipse Foundation [ 38 ]が調整するオープンソース プロジェクトであり、 Fraunhofer FOKUS [ 39 ] によって Python プログラミングで開発されています。Qrispは、量子アルゴリズムの作成とコンパイルのための高レベル プログラミング言語です。その構造化されたプログラミング モデルにより、スケーラブルな開発と保守が可能になります。表現力豊かな構文は、量子ビットではなく変数に基づいており、QuantumVariable がコア クラスとして、ゲートではなく関数に基づいています。高性能シミュレータや自動アンコンピュテーションなどの追加ツールが、この広範なフレームワークを補完します。さらに、デバイス固有のゲート セットに基づいて、基本関数を回路レベルまで代替コンパイルできるため、プラットフォームに依存しません。
Microsoft [ 40 ]が.NET Frameworkの一部として開発したプロジェクト。量子プログラムは、量子プログラミング言語 Q# を使用してVisual StudioおよびVSCode内で記述および実行できます。QDK で開発されたプログラムは、 Microsoft のAzure Quantum [ 41 ]で実行でき、 Quantinuum [ 23 ] 、IonQ、およびPasqal [ 13 ]の量子コンピュータで実行できます。
Xanadu Quantum Technologiesが開発した、連続変数(CV)量子光学回路の設計、シミュレーション、最適化のためのオープンソースのPythonライブラリです。 [ 42 ] [ 43 ] 3 つのシミュレーターが提供されており、1 つはフォック基底、1 つは量子光学のガウス定式化を使用、[ 44 ] 1 つはTensorFlow機械学習ライブラリを使用しています。Strawberry Fields は、Xanadu の量子フォトニック ハードウェア上でプログラムを実行するためのライブラリでもあります。[ 45 ] [ 46 ]
Quantinuum社が開発した、シミュレーターや複数のトラップイオン量子ハードウェアバックエンドを対象とした量子プログラミング環境および最適化コンパイラが2018年12月にリリースされた。[ 47 ]
基底、状態、演算子、チャネル、測定、回路などの量子オブジェクトの記号的かつ高レベルな表現を提供する、Mathematicaと統合されたWolfram Language のアドオンpaclet です。[ 48 ]このフレームワークには、時間発展、測定シミュレーション、エンタングルメント モノトーン、部分トレース/転置、離散ウィグナー変換、安定化メソッド、テンソル ネットワーク ユーティリティなどのシミュレーションおよび分析ツール、ならびに名前付き構成要素のライブラリ (例: Bell/GHZ 状態、パウリ演算子、フーリエ、グローバーなど) が含まれています。[ 48 ]組み込みの視覚化 (例: 回路図、ブロッホ球プロット) と、Qiskit および Amazon Braket フォーマットへの変換やサービス接続を介して量子処理ユニット (QPU) にクエリを送信する機能など、外部プラットフォームとの相互運用性を提供します。
量子プログラミング言語には、大きく分けて命令型量子プログラミング言語と関数型量子プログラミング言語の2種類がある。
命令型言語の最も代表的なものとしては、QCL [ 49 ] 、 LanQ [ 50 ]、Q|SI> [ 51 ]が挙げられる。
Ket [ 52 ]は、Python の馴染みのある構文とシンプルさを活用し、量子プログラミングを容易にするために設計されたオープンソースの組み込み言語です。Ket 量子プログラミングプラットフォーム[ 53 ]の不可欠なコンポーネントとして機能し、 Rustランタイムライブラリと量子シミュレータとシームレスに統合されています。Quantuloop によってメンテナンスされているこのプロジェクトは、研究者と開発者にとってのアクセシビリティと汎用性を重視しています。次の例は、Ket を使用してベル状態を実装する方法を示しています。
from ket import *a , b = quant ( 2 ) # 2つの量子ビットを割り当てますH ( a ) # 量子ビット `a` を重ね合わせ状態に置くcnot ( a , b ) # 2つの量子ビットをベル状態にエンタングルするm_a = measure ( a ) # 量子ビット `a` を測定し、量子ビット `b` も縮約するm_b = measure ( b ) # 量子ビット `b` を測定する# 両方の量子ビットの測定値は常に等しいことを主張するassert m_a.value == m_b.value量子プログラムの論理 (LQP) は、量子測定や多粒子状態のユニタリ進化の重要な特徴を表現できる動的な量子論理であり、さまざまな形式のエンタングルメントの論理的特徴付けを提供します。この論理は、量子計算におけるさまざまなプロトコルの正当性を指定および検証するために使用されてきました。[ 54 ] [ 55 ]
Q言語は、実装された2番目の命令型量子プログラミング言語です。[ 56 ] Q言語はC++プログラミング言語の拡張として実装されました。Qopを基本クラスとして派生したQHadamard、QFourier、QNot、QSwapなどの基本的な量子操作のためのクラスを提供します。新しい演算子はC++のクラスメカニズムを使用して定義できます。
量子メモリはクラスQregで表されます。
Qreg x1 ; // 初期値 0 の 1 量子ビット量子レジスタQreg x2 ( 2 , 0 ); // 初期値 0 の 2 量子ビット量子レジスタ計算処理は、提供されたシミュレータを使用して実行されます。シミュレータのパラメータを使用することで、ノイズの多い環境をシミュレートできます。
量子計算言語(QCL)は、最初に実装された量子プログラミング言語の1つです。[ 58 ] QCLの最も重要な特徴は、ユーザー定義の演算子と関数のサポートです。その構文はCプログラミング言語の構文に似ており、その古典的なデータ型はCのプリミティブデータ型に似ています。同じプログラム内で古典コードと量子コードを組み合わせることができます。
量子ガード付きコマンド言語(qGCL)は、P. Zulianiが博士論文で定義したものです。これは、Edsger Dijkstraが作成したガード付きコマンド言語に基づいています。
それは量子プログラムの仕様記述言語と表現できる。
量子マクロアセンブラ(QMASM)は、D-Waveなどの量子アニーリング装置に特化した低レベル言語です。[ 59 ]
量子モデリング(Qmod)言語は、ゲートレベルの量子ビット操作を抽象化する高水準言語であり、量子レジスタ上で量子アルゴリズムを実装するための関数型アプローチを提供します。この言語はClassiqプラットフォームの一部であり、ネイティブ構文、Python SDK、またはビジュアルエディタを介して直接使用できます。いずれの方法でも、より豊富なアルゴリズムライブラリと効率的な回路最適化を活用できます。
Q|SI> は、 .Net言語に組み込まれたプラットフォームで、while 言語の量子拡張による量子プログラミングをサポートしています。[ 51 ] [ 60 ]このプラットフォームには、量子 while 言語のコンパイラ[ 61 ]と、量子計算のシミュレーション、量子回路の最適化、量子プログラムの終了解析[ 62 ] 、および量子プログラムの検証[ 63 ] [ 64 ]のためのツール群が含まれています。
E. Knillによって提案された量子擬似コードは、量子アルゴリズムを記述するための最初の形式化された言語である。これは量子ランダムアクセスマシン(QRAM)と呼ばれる量子マシンのモデルと密接に関連して導入された。
Scaffold は C 言語に似た言語で、QASM および OpenQASM にコンパイルされます。指定された命令セットを生成する前に Scaffold コードに対して最適化を実行するためにLLVMコンパイラ インフラストラクチャの上に構築されています。[ 65 ] [ 66 ]
Silq は、強力な静的型システムを備えた量子コンピューティング向けの高水準プログラミング言語で、チューリッヒ工科大学で開発されました。[ 67 ] [ 68 ]
量子コンピューティング用の関数型プログラミング言語の開発が進められています。関数型プログラミング言語は、プログラムに関する推論に適しています。例としては、Selinger の QPL [ 69 ]やAltenkirch と Grattage によるHaskellに似た言語 QML [ 70 ] [ 71 ]などがあります。ラムダ計算に基づく高階量子プログラミング言語は、 van Tonder [ 72 ] 、 Selinger と Valiron [ 73 ] 、および Arrighi と Dowek [ 74 ]によって提案されています。
LIQUi|>(リキッドと発音)は、 F#プログラミング言語の量子シミュレーション拡張機能です。[ 75 ]これは現在、Microsoft ResearchのStationQプロジェクトの一環である量子アーキテクチャおよび計算グループ(QuArC)[ 76 ]によって開発されています。LIQUi|>は、物理的な量子コンピュータが利用可能になる前に、理論家が量子アルゴリズム設計を実験できるようにすることを目的としています。[ 77 ]
これには、プログラミング言語、最適化およびスケジューリングアルゴリズム、量子シミュレータが含まれます。LIQUi|> を使用すると、高レベルプログラムの形式で記述された量子アルゴリズムを、量子デバイス用の低レベルマシン命令に変換できます。[ 78 ]
QFCとQPLは、ピーター・セリンジャーによって定義された、密接に関連する2つの量子プログラミング言語です。両者の違いは構文のみで、QFCはフローチャート構文を使用するのに対し、QPLはテキスト構文を使用します。これらの言語は古典的な制御フローを持ちますが、量子データまたは古典データの両方を操作できます。セリンジャーは、これらの言語に対して、スーパー演算子のカテゴリにおける表示的意味論を与えています。
QMLは、 AltenkirchとGrattageによるHaskellに似た量子プログラミング言語である。[ 79 ] [ 70 ] SelingerのQPLとは異なり、この言語では量子情報の破棄ではなく複製を基本操作として扱う。この文脈における複製とは、マップする操作を意味する。にまた、これは不可能な操作であるクローニングと混同してはならない。著者らは、これは古典言語における共有のモデル化方法に似ていると主張している。QMLは古典的制御演算子と量子制御演算子の両方を導入しているが、他のほとんどの言語は古典的制御に依存している。
QMLの操作的意味論は量子回路の観点から与えられ、表示的意味論はスーパー演算子の観点から提示され、これらは一致することが示されている。操作的意味論と表示的意味論の両方がHaskellで(従来通り)実装されている。[ 80 ]
量子ラムダ計算は、 1930年代にアロンゾ・チャーチとスティーブン・コール・クリーネによって導入された古典的なラムダ計算の拡張である。量子ラムダ計算の目的は、量子プログラミング言語を高階関数の理論で拡張することである。
量子ラムダ計算を定義する最初の試みは、1996 年に Philip Maymin によって行われました。[ 81 ]彼のラムダ q 計算は、あらゆる量子計算を表現できるほど強力です。しかし、この言語はNP 完全問題を効率的に解くことができるため、標準的な量子計算モデル (量子チューリング マシンや量子回路モデルなど) よりも厳密に強力であるように見えます。したがって、Maymin のラムダ q 計算は、おそらく物理的なデバイス上で実装できません。
2003年、アンドレ・ファン・トンダーは量子プログラムの正当性を証明するのに適したラムダ計算の拡張を定義した。彼はまた、 Schemeプログラミング言語での実装も提供した。[ 82 ]
2004年、セリンジャーとヴァリロンは、線形論理に基づく型システムを用いた量子計算のための強力な型付きラムダ計算を定義した。[ 83 ]
Quipperは2013年に公開されました。[ 84 ] [ 85 ]これは、ホスト言語としてHaskellを使用した組み込み言語として実装されています。 [ 86 ]このため、Quipperで書かれた量子プログラムは、提供されているライブラリを使用してHaskellで記述されます。例えば、次のコードは重ね合わせの準備を実装しています。
クイッパーをインポートspos :: Bool -> Circ Qubit spos b = do q <- qinit b r <- hadamard q return r