量子プログラミング言語

量子プログラミング言語（りょうしプログラミングげんご、英: Quantum programming language）とは量子アルゴリズム（英語版）の表現を実現するプログラミング言語の総称である。量子プログラミング言語は、プログラマーがプログラミングのツールとして使うことを意図したものではなく、研究者の量子コンピュータの振舞いの理解を促進し、研究者が量子アルゴリズムを形式的に論ずるツールとして用いることを意図したものである。 量子プログラミング言語は2つの主要なグループに分けることができる。すなわち、命令型量子プログラミング言語（imperative quantum programming languages）と関数型量子プログラミング言語（functional quantum programming languages）の2つである。 命令型量子プログラミング言語のうち、もっとも有名なものはQCLおよびLanQである。 関数型量子プログラミング言語は開発が進められているところであり、例えばSelinger's QPL や、AltenkirchとGrattageによって開発された、Haskellに似た言語であるQMLが挙げられる。 ラムダ計算を基にした高階量子プログラミング言語(Higher-order quantum programming languages)が、van Tonder、SelingerとValiron、ArrighiとDowekによって提案されている。 サイモン・ゲイ（Simon Gay）のQuantum Programming Languages Surveyは量子プログラミング言語の研究に関する情報や2007年時点の量子プログラミングに関する包括的な書物の目録を提供している。 E. Knillによって考案された量子擬似コード(Quantum pseudocode)は最初に形作られた言語であり、量子アルゴリズムを説明するためのものだった。量子擬似コードは、導入後にQuantum Random Access Machine (QRAM)と呼ばれる量子マシンと強く結び付けられた。 QCL（英語版）(Quantum Computation Language)は最初に実装された量子プログラミング言語である。Quantum Computation Languageの構文はC言語の構文に似たものであり、Quantum computing languageの「classical data type」はC言語のプリミティブデータ型と似ていた。ひとつの同じプログラムのなかで古典的（量子プログラミング以前の）コードと量子プログラミングのコードを組み合わせることが可能である。 Quantum computing languageで用意された量子データ型はqureg (quantum register)と呼ばれるものである。これはキュービット（qubit, quantum bit, 量子ビット）の配列として解釈することができる。 qureg x1[2]; // 2-qubit quantum register x1 qureg x2[2]; // 2-qubit quantum register x2 H(x1); // Hadamard operation on x1 H(x2[1]); // Hadamard operation on the first qubit of the register x2 Quantum computing languageのインタプリタはqlib simulation libraryを採用しているため、量子プログラムの実行中に量子マシンの内部状態を観察することが可能である。 qcl> dump  : STATE: 4 / 32 qubits allocated, 28 / 32 qubits free 0.35355 |0> + 0.35355 |1> + 0.35355 |2> + 0.35355 |3> + 0.35355 |8> + 0.35355 |9> + 0.35355 |10> + 0.35355 |11> dump operationはmeasurementとは異なることに注意。これはdump operationが量子マシンの状態に影響せず、simulatorを使うことによってのみ実現されるからである。 Quantum computing languageの標準ライブラリは量子アルゴリズムで用いられる量子オペレータを提供している。例えば次のようなものがある。 controlled-not with many target qubits, en:Hadamard operation on many qubits, parse and controlled phase. Quantum computing languageのもっとも重要な特徴はユーザー定義オペレータやユーザー定義関数をサポートしていることである。近代のプログラム言語と同様に、量子データを操作する新たなオペレーションを定義することができる。例えば次のようなものである。 operator diffuse (qureg q) { H(q); // Hadamard Transform Not(q); // Invert q CPhase(pi, q); // Rotate if q=1111.. !Not(q); // undo inversion !H(q); // undo Hadamard Transform } これはグローバーのアルゴリズムで用いられるmean operatorの逆を定義するものである。これによって、より抽象的な水準でアルゴリズムを定義することが可能になり、関数ライブラリをプログラマーが用いることができるように拡張することができる。 データ型 量子（Quantum） - qureg, quvoid, quconst, quscratch, qucond 古典（Classical） - int, real, complex, boolean, string, vector, matrix, tensor 関数型 qufunct - Pseudo-classic operators. Can only change the permutation of basic states. operator - General unitary operators. Can change the amplitude. procedure - Can call measure, print, and dump inside this function. This function is non-invertible. 組込み関数（Built-in functions） 量子（Quantum） qufunct - Fanout, Swap, Perm2, Perm4, Perm8, Not, CNot operator - Matrix2x2, Matrix4x4, Matrix8x8, Rot, Mix, H, CPhase, SqrtNot, X, Y, Z, S, T procedure - measure, dump, reset 古典（Classical） Arithmetic - sin, cos, tan, log, sqrt, ... Complex - Re, Im, conj Q言語とは2番目に実装された命令型量子プログラミング言語である。Q言語はC++の拡張として実装された。Q言語は基礎クラスQopから派生したQHadamard、QFourier、QNot、QSwapのような基本的な量子オペレーションのためのクラスを提供する。新たなオペレータはC++のクラスメカニズムを用いて定義される。 量子メモリはQregクラスを用いて表現される。 Qreg x1; // 初期値0の1キュービット quantum register。 Qreg x2(2,0); // 初期値0の2キュービット quantum register。 Quantum Guarded Command Language (qGCL)はP. Zulianiによって、彼の博士論文において定義された。これはエドガー・ダイクストラによって作られたGuarded Command Languageを基にしている。 qGCLは量子プログラムの言語仕様として評されている。 Q#は、2017年にマイクロソフトによって実装された。Quantum Development Kitに含まれており、Visual Studioを開発環境として利用できる。 近年、関数プログラミングに基づく様々な量子プログラミング言語が提案されている。関数プログラミング言語はプログラムのreasoningと相性が良い。 QFCとQPLは互いに関連性の強い量子プログラミング言語であり、Peter Selingerによって定義された。QFCとQPLの違いは単に構文の違いによるものである。QFCはflow chart構文を用いているが、QPLはtextual構文を用いている。QFCとQPLは古典的な制御フローを用いているが、量子データと古典的データの双方を扱うことができる。Selingerはen:superoperatorの分野においてQFCとQPLに表示的意味（denotational semantic）を与えている。 QMLはAltenkirchとGrattageによって開発されたHaskelによく似た量子プログラミング言語である。SelingerのQPLとは違い、QMLは量子情報を廃棄する（discarding）のではなく、primitive operationとして複製(duplication)をする。この文脈でいう「複製」とは | ϕ ⟩ {\displaystyle |\phi \rangle } を | ϕ ⟩ ⊗ | ϕ ⟩ {\displaystyle |\phi \rangle \otimes |\phi \rangle } へ写す操作として理解され、クローニングと混同してはいけない。クローニングは不可能な操作である。 Quantum lambda calculiは古典的なラムダ計算の拡張である。古典的なラムダ計算はen:Alonzo Churchとen:Stephen Cole Kleeneによって1930年代に考案された。Quantum lambda calculiの目的は量子プログラミング言語を高階関数の理論で拡張することである。 Quantum lambda calculiを定義する最初の試みは1996年のPhilip Mayminによるものである。Mayminによるlambda-q calculusはあらゆる量子計算を表すことができるほど強力であった。しかし、MayminのQuantum lambda calculiはNP完全の問題を効率的に解くことができ、それゆえに厳密に標準量子計算モデル（en:quantum Turing machineモデルやen:quantum circuitモデルなど）よりも強力であるように見えた。ゆえに、Mayminのlambda-q calculusは物理的デバイスには実装不可能な可能性がある。 2003年に、André van Tonderは量子プログラムの正当性を証明するのに適しているラムダ計算の拡張を定義した。また、van TonderはScheme言語における実装を提供した。。 2004年にはSelingerとValironが線形論理を基にしたtype systemを用いて強い型付けの量子計算用lambda calculusを定義した。 Quipperは2013年に公開されたものである。QuipperはHaskellをホスト言語として用いて埋め込み言語として実装された。よって、Quipperで書かれた量子プログラムはHaskellで専用のライブラリを用いて書かれている。例えば、次のコードはpreparation of a superpositionを実装する。 import Quipper spos :: Bool -> Circ Qubit spos b = do q <- qinit b r <- hadamard q return r