😸
OpenQASM 3. フワッと解説
このページの目的
- このページはOpenQASM3. をフワッと説明するページである。
- 量子力学の基礎とかゲート操作とか知ってる人向け。
OpenQASM 3. とは
- OpenQASM3. とは、量子計算機のアセンブリ言語 OpenQASMのバージョン3.である。
- この論文を見ればだいたいわかる。
例を見る
論文6章で取り上げられていた反復位相推定アルゴリズムをステップバイステップで見てみる。論文中の物のほうが色分けされてて見やすいが・・・。
OPENQASM 3;
include "stdgates.inc"
-
OPENQASM 3OpenQASM3.のコードであることを表現している。 -
include "stdgates.inc"stdgates.incをincludeしていることを表現している。
const n = 3; // number of iterations
const θ = 3 * π / 8; // phase angle on target qubit
- 古典的な定数
nとΘを宣言している。
qubit q; // phase estimation qubit
qubit r; // target qubit for the controlled-unitary gate
angle[n] c = 0; // phase estimation bits
- 量子ビット
qとrおよびangle[n]型のcを宣言している。angle[n]型については下参照。
// initialize
reset q;
reset r;
// prepare uniform superposition of eigenvectors of phase
h r;
- 量子ビット
qとrを で初期化している。\ket{0} - アダマールゲート
をH rに適用している。
// iterative phase estimation loop
for k in [1:n] { // implicitly cast val to int
-
for文で、kが1からnになるまで1増やしつつ{}内ループ。
reset q;
h q;
-
qを に\ket{0} -
をH qに適用。
ctrl @ pow(2**k) @ phase(θ) q, r;
-
ctrl @ gateは対象のgateをコントロールゲートにする修飾子。修飾子とは、下を参照。 -
pow(K) @ gateは対象のgateをK回作用させるようにするゲートにする修飾子。 -
phase(Θ)はZ軸でのΘ回転させるゲート。
inv @ phase(c) q;
-
inv @ gateは対象のgateの逆を作用させるようにするゲート。つまり、gateの作用がユニタリー作用素 だった場合は、U を作用させるようになる修飾子。U^*
h q;
measure q -> c[0];
// newest measurement outcome is associated to a π/2 phase shift
-
measure q-> c[0]量子ビットqを測定してc[0]に結果を格納する。
// in the next iteration, so shift all bits of c left
c <<= 1;
}
-
c <<= 1cを初期化(1に)する。
// Now c contains the n-bit estimate of ϕ in the
// eigenvalue e^{i*ϕ} and qreg r is projected to an
// approximate eigenstate of the phase gate.
このコードで生成される回路図が次のようになる。この図は論文中から拝借した。

出てきた命令たち
例で出てきた命令たちについてまとめると次のようになる。
宣言
-
const n = x;古典定数のnを左辺値で初期化して宣言する。 -
qubit q;1量子ビットのqを宣言する。 -
angle[n] c = 0;angle[n]型の変数cを0で初期化して宣言する。 -
gate cx c, t { ctrl @ x c, t; }cxゲートを引数c,tとして持ち、ctrl @ xをc,tに対して適用するゲートとして宣言する。 -
gate phase(λ) q { U(0,0,λ) q; }古典引数λを用いてゲートを定義する方法もある。
関数
-
reset q;量子変数qを に初期化する。\ket{0} -
h r;アダマールゲート を量子変数H rに作用させる。 -
measure q -> c[k]量子変数qを測定し、古典型のangle[n]型であるcのk番目に代入する。 -
c <<= 1型angle[n]の古典変数に対して作用して、 をすべてc_n にする。1
文
-
for k in [1:n] { P }文Pをkを 1ずつ増加させつつnになるまで実行する。
修飾子
-
ctrl @ gコントロール修飾子: 作用素 を作用させるゲートg gに対して作用し、 を作用させるコントロールI\oplus g gゲートとなる。ここでこの の次元はI と同じ。g -
pow(X) @ gべき乗修飾子:gをX回作用させる。Xは非整数でも可能で、その場合はg= をみたすとき\exp(iH) pow(X) @ g= である。\exp(iXH) -
inv @ g逆関数修飾子: ゲートgが を作用させる時、その逆g を作用させるゲートになる。g^*
型
出てきた謎の型についての説明。
古典型
-
angle[n] xn個の0または1の列 によって以下のように表される\{c_n\} の有利数値。[0,2\pi)
x = 2\pi \cdot 0.c_{n-1}c_{n-2}\cdots c_0.
(注: )0.c_{n-1}c_{n-2}\cdots c_0 = \sum_{j=0}^{n-1}2^{-n+j}c_j.
補遺
ここで紹介していない命令もいっぱいあるので、論文を確認のこと。
紹介していない機能の一例:
delay[t] qbox{ P }box[t]{ P }barrier r, q
OpenQASMはコヒーレンス時間とかの制約から素の文からさらに様々な最適化をすることが必要なので、古典計算機でいう意味のアセンブリ言語とは少し異なる立ち位置にある。
Discussion