common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app
Annealing
DEEPSCORE
Translation

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

時間発展

Yuichiro Minato

2021/02/19 16:37

#量子ゲート

はじめに

量子位相推定を勉強していましたが、時間発展のシミュレーションで量子状態を作るところで少し時間がかかりそうだったので、先にこの部分だけを勉強しておこうと思いました。量子コンピュータの一分野である量子シミュレーションで主に使われる、時間発展シミュレーションを見てみます。量子コンピュータを学ぶ上で量子力学や物理の知識は必ずしも必要ではないですが、この分野はたまたまアプリケーションが物理に対応しているので物理の知識が少し出てきます。

シュレディンガー方程式

時間発展のシミュレーションをしたい場合には、ハミルトニアンが時間で変化しないとして、

itψ=Hψi\hbar \frac{\partial}{\partial t} \mid \psi \rangle = H \mid \psi \rangle

こちらは、

ψ(t)=exp(i/H(tt0))ψ(t0)\mid \psi (t)\rangle = exp(-i/ \hbar H(t-t_0))\mid \psi(t_0)\rangle

このように、初期状態からスタートして時間発展のユニタリ演算子をかけることで量子状態を変化させることができます。簡潔に書くと、

ψ(t)=U(t)ψ(t0)\mid \psi(t) \rangle = U(t)\mid \psi(t_0) \rangle

ある初期状態からユニタリ変換を適用することで、量子状態を変化させることができるというシミュレーションができ、ある量子状態に対しての変換をユニタリな形に変換できればさまざまなシミュレーション手法がとれそうなので、どのようにユニタリ変換に時間発展を表現するかによって応用が広がりそうです。

今後は実際のユニタリ変換への変換方法を勉強していきたいです。以上です。

時間発展演算子

超電導量子ビットのような閉鎖系の量子コンピュータの場合には、系のエネルギーが保存され、時間発展演算子を使ってeiHte^{-iHt}をトロッター展開したものを量子状態に作用させるようにして量子状態の遷移ができます。

時間発展シミュレーション

ある量子状態(状態ベクトル、波動関数)を作りたいときにユニタリ操作を断続的に行う時間発展シミュレーションを行うことで実現ができます。その際の式は、とあるハミルトニアンと呼ばれる演算子HHを用いて、

ψ=eiHtψ0\mid \psi\rangle = e^{-iHt}\mid \psi_0 \rangle

のように初期状態ψ\mid \psi \rangleからスタートしてeiHte^{-iHt}を作用させますが、これはユニタリ変換に直すことができ、量子コンピュータのゲート操作によって量子状態がきちんと作り出せるようになります。

早速トライ

早速試してみましょう。ハミルトニアンHには行列が対応します。ここでは一番簡単な行列であるパウリ演算子のZ演算子を見てみたいと思います。

Z=[1001]Z = \begin{bmatrix} 1&0 \\ 0&-1 \end{bmatrix}

ここでは、初期状態の0\mid 0 \rangleに対して時間発展で量子状態を変化させてみます。

ψ=eiHt0=eiZt0\mid \psi\rangle = e^{-iHt}\mid 0 \rangle = e^{-iZt}\mid 0 \rangle

をやってみます。指数の肩に行列が乗っていますが、Z行列は対角行列なので、行列指数関数の性質から、対角行列の各要素をそれぞれ指数の肩にいれることができて、

eiZt=[ei1t00ei(1)t]=[eit00eit]=eit[100e2it]=Rz(2t)e^{-iZt} = \begin{bmatrix} e^{-i*1*t}&0\\ 0&e^{-i*(-1)*t} \end{bmatrix} = \begin{bmatrix} e^{-it}&0\\ 0&e^{it} \end{bmatrix} = e^{-it} \begin{bmatrix} 1&0\\ 0&e^{2it} \end{bmatrix} = Rz(2t)

このようになります。時間tを導入して、Rzゲートを利用することで量子状態を変化させることができそうです。

ハミルトニアンが対角行列ではない時

ときたいハミルトニアンが対角行列でない時は、対角化を通じて解くことができます。

A=UDU1A=UDU^{-1}

かつDDが対角行列なら、

eA=UeDU1e^A = Ue^DU^{-1}

となります。これを利用して対角化を行います。通常対角行列はZゲートを使うので、ハミルトニアンH=Xのときは、

X=HZHX = HZH

より

eiXt=eH(iZt)H1=HeiZtH1=HRz(2t)H=Rx(2t)e^{-iXt} = e^{H(-iZt)H^{-1}} = He^{-iZt}H^{-1} = HRz(2t)H = Rx(2t)

となります。またハミルトニアンH=Yのときは、

eiYt=eRx(π/2)(iZt)Rx(π/2)=Rx(π/2)Rz(2t)Rx(π/2)=Ry(2t)e^{-iYt} = e^{Rx(-\pi/2)(-iZt)Rx(\pi/2)} = Rx(-\pi/2)Rz(2t)Rx(\pi/2) = Ry(2t)

となります。

ハミルトニアンがユニタリではない場合

ハミルトニアンHがユニタリ行列ではない場合、このeiHte^{-iHt}はそのままでは量子コンピュータでは計算できなさそうです。そこで工夫が必要そうです。まずはハミルトニアンHをユニタリ行列の和の形に直します。

eiHt=ei(A+B)te^{-iHt} = e^{-i(A+B)t}

これを計算したいのですがそのままではいけません。そこでトロッター展開と呼ばれるテクニックを使います。

トロッター展開

十分に大きいnを用意して、

eA+B=limn(eA/neB/n)ne^{A+B} = lim_{n \to \infty} (e^{A/n}e^{B/n})^n

https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%88%E3%83%AD%E3%83%83%E3%82%BF%E3%83%BC%E7%A9%8D%E5%85%AC%E5%BC%8F

この形にできれば、断続的にユニタリ演算の形になおせそうです。十分にnが大きければ、

eiHt=ei(A+B)t=(eiAt/neiBt/n)ne^{-iHt} = e^{-i(A+B)t} = (e^{-iAt/n}e^{-iBt/n})^n

という感じでしょうか。

ちょっとトライ

ハミルトニアンH = X + Zをみてみたいと思います。

H=[0110]+[1001]=[1111]H = \begin{bmatrix} 0&1\\ 1&0 \end{bmatrix} + \begin{bmatrix} 1&0\\ 0&-1 \end{bmatrix} = \begin{bmatrix} 1&1\\ 1&-1 \end{bmatrix}

という式をときます。トロッタ展開より、十分大きいnを採用して、

eiHt=ei(X+Z)t=(eiXt/neiZt/n)ne^{-iHt} = e^{-i(X+Z)t} = (e^{-iXt/n}e^{-iZt/n})^n

を計算します。ユニタリに直すと、

(eiXt/neiZt/n)n=(Rx(2t/n)Rz(2t/n))n(e^{-iXt/n}e^{-iZt/n})^n = (Rx(2t/n)Rz(2t/n))^n

このようになり、nの回数分だけRxとRzゲートを時間と分割数に対応したパラメータで計算を行えば良いことになります。

今後

上記はエルミート行列であるハミルトニアンHに対応して、トロッター展開を利用すればパラメータnとtを使って量子状態を作ることができそうでした。最終的にいい量子状態ができれば、ハミルトニアンHの行列と対応させて固有値λ\lambdaを求めることができそうです。固有値を位相の形で求めるアルゴリズムが位相推定で、上記のプロセスの後に位相を抽出する回路を構成することで実現できそうです。

また、トロッタ展開を利用した位相推定回路は上記のようにnを使ってユニタリの繰り返し計算が入りますので計算量が増えます。現在の量子コンピュータのエラーがある状態においての固有値計算は量子変分原理を利用したものがありますので、その辺りも上記のテクニックと一緒にみていきたいと思います。

今回は短いですが以上です。

© 2024, blueqat Inc. All rights reserved