😸
OpenQASM 3. フワッと解説
このページの目的
- このページはOpenQASM3. をフワッと説明するページである。
- 量子力学の基礎とかゲート操作とか知ってる人向け。
OpenQASM 3. とは
- OpenQASM3. とは、量子計算機のアセンブリ言語 OpenQASMのバージョン3.である。
- この論文を見ればだいたいわかる。
例を見る
論文6章で取り上げられていた反復位相推定アルゴリズムをステップバイステップで見てみる。論文中の物のほうが色分けされてて見やすいが・・・。
OPENQASM 3;
include "stdgates.inc"
-
OPENQASM 3
OpenQASM3.のコードであることを表現している。 -
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 <<= 1
c
を初期化(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] x
n個の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] q
box{ P }
box[t]{ P }
barrier r, q
OpenQASMはコヒーレンス時間とかの制約から素の文からさらに様々な最適化をすることが必要なので、古典計算機でいう意味のアセンブリ言語とは少し異なる立ち位置にある。
Discussion