2008-08-19 [長年日記]
λ. QMLで量子テレポーテーション
先日の圏論勉強会での量子テレポーテーションの話について、みんな色々書いているようだ。
参考:
- ベル状態、少し分かった、がやっぱりよくは分からん - 檜山正幸のキマイラ飼育記
- ベル状態について。 - hiroki_fの日記
- 勉強会その後:量子テレポーテーション - たけをの日記@天竺から帰ってきたよ
私もご多分にもれず悩んでいて、それで、ふと「プログラミング言語で書いてみたら分かり易くなるんじゃ」と思ってQML(c.f. 20080630#p01)で書こうとしたら、コンパイラのサンプルとして既に用意されていた。teleport.qml
記法
記法は論文「A functional quantum programming language」のときには
Qnot : qb -o qb Qnot x = ifo x then qfalse else qtrue
だったのが、
Qnot (b,qb) |- ifo b then qfalse else qtrue :: qb;
という形式に変更になっている。 判定(judgement)そのものに名前をつけた感じか。 ただ、文脈部分では (変数, 型) よりも (変数 :: 型) と書けるといいのにと思った。
ここで、ifo は観測を伴わないを伴わない分岐で、then式とelse式がstrictな項*1でかつ直交している必要がある。ifoを使うと、制御NotやEPRペアの生成は以下のように定義できる。
-- A quantum CNOT operation CNot (s,qb) (t,qb) |- ifo s then (qtrue,Qnot (t)) else (qfalse,t) :: qb*qb; -- The constant EPR pair Epr |- hF * (qtrue,qtrue) + hF * (qfalse,qfalse) :: qb*qb;
また、普通の if もあって、こちらは条件が不要で、代わりに decoherence を引き起こすようになっている。これを使うとqubitに対する観測は以下のように定義できる。
-- The measurement operator, using "if" Meas (x,qb) |- if x then qtrue else qfalse :: qb;
ifやcaseが観測に対応するというのは、遅延評価を行う関数型言語を使ったことがある人にとっては馴染み深いのではないかと思う。それらの言語でも、遅延評価されたサンクはある意味では値が確定していない状態であって、それに対してifやcaseによる分岐を適用することで評価が駆動されて値が確定するので。もちろん普通の関数型言語のサンクは干渉したりはしないけど。
teleport.qml
で、このteleport.qmlを読むと、量子テレポーテーションはまさに、たけをさんの日記に貼ってあった以下の図そのものなのね。
図の |00〉 + |11〉 の部分に相当するのが上で定義した Epr 。 そして、図の MBell に相当する以下の Bmeas では (Had ⊗ id)∘CNot を適用した結果に観測を行って 2bit の古典情報を得ている。QMLには古典情報用のデータ型といったものは特に用意されていないので、データ型としては qb*qb のままだけど。
-- The Bell-measurement operation Bmeas (x,qb) (y,qb) |- let (xa,ya) = CNot (x,y) in (Meas (Had (xa)),Meas (ya)) :: qb*qb; Bnmeas (x,qb) (y,qb) |- let (xa,ya) = CNot (x,y) in (Had (xa),ya) :: qb*qb;
そして、量子テレポーテーションの過程全体を表したのが、以下の Tele で、U では 2bit の古典情報をもとに4つのユニタリー変換のどれかを適用して、もとの状態を復元している。
Tele (a,qb) |- let (b,c) = Epr () in let f = Bnmeas (a,b) in U (c,f) :: qb;
Bmeas ではなく、観測を伴わない Bnmeas の方を用いているのは何故か結構悩んでしまったのだけど、たけをさんと話したら「U内部のifでdecoherenceは起こるのでプログラム的には変わらないから」ということのよう*2。