戻る


量子コンピュータの原理

作成: 2022/09/25

目次

量子コンピュータの原理量子力学と量子コンピュータ、量子ビットハミルトニアンとエネルギー量子コンピュータの動作原理古典ビットと量子ビットの違い1量子ビット測定2量子ビット2つの1量子ビットエンタングルメント(量子もつれ)状態ベクトルを視覚化するブロッホ球量子ゲート1量子ビットゲートパウリゲートアダマールゲートS, Tゲート位相ゲート回転ゲート2量子ビットゲート基底ベクトル表記の順番CNOTゲート制御ユニタリゲート制御Zゲート制御アダマールゲートSWAPゲート主な量子ゲートまとめ量子コンピュータはどのように計算をするのか量子ビットの操作は具体的にどうするのかゲート操作の例量子コンピュータは万能量子コンピュータの制約事項・課題量子コンピュータの現在量子アルゴリズムの種類FTQCアルゴリズムNISQアルゴリズムPython と IBM Quantum, Qiskit でプログラミングIBM Quantum実行環境IBM Quantumのアカウント作成IBM Quantum ローカル実行環境Anacondaのインストールと環境設定Qiskit フレームワークの全体像TerraAerIgnisAquaQiskit とPython を用いた量子コンピュータのプログラミングQiskitのプログラムの基本的なステッププログラミングの実例ステップ 1 : パッケージをインポートする。ステップ 2 : 量子回路を定義する。ステップ 3 : ゲートを追加する。ステップ 4: 回路を可視化するステップ 5: 演算のシミュレーションステップ6: 演算結果の可視化実機で実行汎用量子計算量子フーリエ変換(Quantum Fourier Transform, QFT)量子位相推定(Quantum Phase Estimation, QPE)Shorのアルゴリズム量子古典ハイブリッドアルゴリズム量子古典ハイブリッドアルゴリズムの基本ハミルトニアンと期待値量子変分アルゴリズム VQEQiskit プログラム例QAOAQiskit プログラム例 MaxcutQiskitを用いてVQE,QAOA で実問題を解くポートフォリオ最適化四銘柄のポートフォリオ最適化問題ライブラリのインポート時系列データ(金融データ)の生成期待リターンと共分散行列の計算Qiskit Finance のポートフォリオ最適化クラスMinimum Eigen Optimizer(最小固有値オプティマイザー)古典コンピュータの最適化アルゴリズムで問題を解くVQEを使ったソリューションQAOAを使ったソリューションナップザック問題一般的なナップサック問題をQAOAで解く動的計画法(古典コンピュータによる計算)QAOAによる解法蓄電池システムの収益最大化問題設定電池による収益の最適化をQAOAで解く量子機械学習量子古典ハイブリッド機械学習1. 入力データの量子状態へのエンコーディング2. 学習用量子回路3. 損失関数4.回路パラメータ更新量子機械学習の実例パッケージのインポートQiskitを用いた量子回路を作成しますPyTorchを用いた量子古典回路の作成データの準備ハイブリッド・ニューラルネットワークの作成ネットワークの学習学習曲線を表示しますテストを行います。推論結果を表示しますサンプルプログラムについて参考文献

量子力学と量子コンピュータ、量子ビット

量子というのは、粒子と波の両方の性質を両方もつ原子、電子、中性子、陽子、光を粒子とみんなした光子などが量子の代表的なものです。量子力学的な現象を用いているわけですから、量子力学とは切っても切れない関係にあるわけです。ここでは、まず、量子コンピュータで様々な問題を解く際に押さえておくべき基本的な概念をみてみます。

量子の振る舞いは、次のシュレディンガーの波動方程式を解くことによってもとまります。

iddtψ(x,t)=Hψ(x,t)(1)

この式の両辺はエネルギーであって、粒子が持つエネルギーは、波動関数にハミルトニアンという運動エレルギーと位置エネルギーの和からなる演算子Hを作用させることによって計算できます。波動関数の時間微分がエネルギーに等しいということです。つまり、量子状態が時間的に変化するには、エネルギーが必要で、時間変化の原因となるものがエネルギーだということができます。

波動関数に作用する演算子であるハミルトニアンの固有値と固有関数を求めれば、波動関数が解け、量子力学的な状態がわかります。ハミルニアンという名称は、1830年代に活躍したウィリアム・ローワン・ハミルトンにちなんでいます。ハミルトニアンを、波動関数に作用させるとエネルギーが計算できます。ハミルトニアンは行列ですから、エネルギー変換行列とでも呼んだほうが分かりやすいかも知れません。

ハミルトニアンの固有値と固有関数を求め、最低エネルギー状態とそれより一つエレルギーが高い状態が求まったとします。

Hψ0(x)=E0ψ0(x)(2)Hψ1(x)=E1ψ1(x)

2つの状態だけを考えて、量子状態は、この2つの状態に対応する波を重ね合わせたものとして記述できます。複素数 αβ を用いて、以下のように書けます。

αψ0(x)+βψ1(x)(3)

ψ0(x)ψ1(x) は、定数ですから、それを明示的に書く必要はなく、係数だけで表す ことができます。これが量子ビットです。

(αβ)(4)

ハミルトニアンとエネルギー

量子状態にハミルトニアンをかけるとエネルギーになるということは重要です。たとえば、量子古典ハイブリッドアルゴリズム(NISQアルゴリズム)で解くことの出来る問題の典型は、問題がハミルトニアン、つまり状態をエネルギーに変換する行列が与えられ、安定なエネルギー状態を求めることに置き換えることができます。つまり、固有値と固有ベクトルを求めることになります。または、言い換えると安定なエネルギー状態のうち、一番エネルギーが小さいものを求めるということになります。

量子コンピュータの動作原理

量子コンピュータは、「重ね合わせ」や「量子もつれ」と言った量子力学的な現象を用いて従来のコンピュータでは現実的な時間や規模で解けなかった問題を解くことが期待されるコンピュータです。量子コンピュータの世界では、従来のコンピュータは、量子力学的な現象に基づいていないという意味で、古典コンピュータと呼ばれます。

量子コンピュータは、量子力学的な重ね合わせによって、n個の量子ビットを用いて2nの状態を同時に処理できるため、古典コンピュータでは、時間がかかりすぎ解くことが著しく困難な問題が解けることが期待されています。

古典ビットと量子ビットの違い

図1にしめすように、古典コンピュータでは、ビットは、0と1かのどちらか値をとります。量子ビットでは、基底ベクトル |0⟩ |1⟩ に係数を掛けて足し合わせた状態ベクトル |ψ=α|0+β|1 を用いて計算が行われます。量子ビットの状態ベクトルは、直接知ることはできなくて、測定という操作をすると、状態ベクトルの要素、αβ に応じて、結果が0になる確率と1になる確率が決まります。測定という操作を複数回繰り返すことによって、量子ビットの状態が得られます。測定を行うと、状態ベクトルが変化してしまうのも忘れてはいけません。

図1 古典ビットと量子ビット

1量子ビット

式(1)、(2)で示すように、一つの量子ビットは、2つの基底ベクトル、 |0,|1 を用いて量子状態を表します。

|0=(10)(1)|1=(01)(2)
|ψ=(αβ)=α|0+β|1 (3)

これは状態ベクトルや量子ビットと呼ばれます。式(3)でしめす足し合わせた状態のことを重ね合わせ状態と呼びます。αβ は、複素確率振幅と呼ばれます。もともと、αβ は、2つの波の重ね合わせの状態を表すものなので、状態ベクトル|ψ も波の性質をもち、干渉するということは、量子プログラミングを理解するにあたって重要なことです。

測定

残念ながら、量子力学では、この複素確率振幅は、直接知ることができません。測定という操作をしたときに、0か1かが確率的に決まります。また、測定を行うと、状態ベクトルは、測定結果が 0 の場合は|01 の場合は|1に変化してしまいます。したがって、量子ビットを初期状態に設定し、操作し、測定を行うということを、繰り返すことによって、01 の分布を求めます。

状態ベクトル|ψを、基底ベクトル|0,|1で測定したときに、測定結果が0になる確率 p0と1になる確率 p1 は、式(4),(5)のように、複素確率振幅の絶対値の2乗になります。すべての確率の和は1ですので、複素確率振幅は、式(6)の関係を満たします。

 p0=|α|2(4)p1=|β|2(5)|α|2+|β|2=1(6)

このような表現の方法は、ディラック記法と呼ばれ、|ψ は、ケットベクトル、α, β の複素共役(複素数の虚数部の符号を反転したもの)を要素とした行ベクトル ψ|=(α β) を、ブラベクトルと呼びます。

ψ||ψの行列積をとると、内積になります。ψ||ψは、ψ|ψとも、表記されます。ブラベクトルとケットベクトルの内積をもちいると、上の条件は、式(7)のように表記できます。

ψ||ψ=ψ|ψ=(α β)(αβ)=αα+ββ=|α|2+|β|2=1 (7)

2量子ビット

2個の量子ビットの状態ベクトル |ψ は、基底ベクトル |00,|01,|10,|11 と、4個の複素数を用いて、式(8)、式(9)のように表せます。

|00=(1000),|01=(0100),|10=(0010),|11=(0001) (8)
|ψ=c00|00+c01|01+c10|10+c11|11=(c00c01c10c11) (9)

ここでも、状態ベクトルの絶対値が量子の存在確率を表しますので、cij は、式(10)のような関係を満たす複素数とします。

ψ|ψ=|c00|2+|c01|2+|c10|2+|c11|2=1 (10)

1量子ビットの場合と同様、cij を複素確率振幅と呼び、基底ベクトルで測定すると、確率を得ることができます。

2つの1量子ビット

2 のの1量子ビット |ψ,|ϕ に対して、テンソル積 |ψ|ϕを、式(11)、式(12)のように定義します。

|ψ=(a0a1), |ϕ=(b0b1)(11)
|ψ|ϕ:=(a0|ϕa1|ϕ):=(a0b0a0b1a1b0a1b1) (12)

基底ベクトル|0,|1に対しては、式(12)がなりたちます。

|0|0=(1000),|0|1=(0100),|1|0=(0010),|1|1=(0001) (12)

つまり、上の2量子ビットの基底ベクトル |00,|01,|10,|11|0|0, |0|1,|1|0,|1|1 と、テンソル積を用いて表すことができるということです。

エンタングルメント(量子もつれ)

重ね合わせ状態に加えて、重要な量子ビット間の関係に、エンタングルメント(量子もつれ)があります。2つの1量子ビットが、上のテンソル積で記述できない状態が存在します。例えば、式(13)のような状態です。この状態のことをエンタングルメント(量子もつれ)といい、量子コンピュータにおいては、非常に重要な役割を果たします。

12(|00+|11)(13)

量子もつれとは、複数の量子ビットがつくられるときや、相互作用するとき、空間的に近接した場合に起こる物理現象です。量子ビットが大きく離れている場合も含めて、量子ビットの量子状態が他の量子ビットの状態に依存するという不思議な現象です。

状態ベクトルを視覚化するブロッホ球

量子ビットを単位球面上の点として視覚化するのが、Bloch(ブロッホ)球です。状態ベクトル |ψ を式(14)のように変形して、長さ1のベクトルとして表示したものです。ここでは、下の式の右辺全体にかかるグローバル位相と呼ばれる項(eiλ )を、省略しています。量子ビットを複数もちいた量子回路における量子ビットの回転操作を視覚化するのに用いられます。

|ψ=cos(θ/2)|0+eiϕsin(θ/2)|1=cos(θ/2)|0+(cosϕ+isinϕ)sin(θ/2)|1 (14)

図2 ブロッホ球

量子ゲート

古典コンピュータでは、論理ゲートは、AND, OR, NOTなどですが、量子コンピュータでは、量子ビットの回転操作を行う量子ゲートによって、計算が行われます。量子ゲートの回転操作は行列によて表わされます。式(15)のように、状態ベクトル|ψ に行列をかける演算を繰り返すことによって計算が行われます。1量子ビットの操作は、 2行×2列の 行列 U で表されます。 この行列Uを量子ゲートと呼び、量子ゲートを状態ベクトルにかけることによって、状態ベクトルに回転操作をすることができます。

|ψ=U|ψ (15)

この行列 U は、状態ベクトルにUをかけた後のベクトルも量子ビットでなければなりませんので、任意のα,β についてϕ|UU|ϕ=1 がなりたつ必要があり、そのためには、UU=UU=I である必要があります。このU は、Uの随伴行列で、行列U に対して、U の転置と成分の複素共役(実部はそのままで虚部の符号を反転する)をとったものです。このような行列 U は、ユニタリ行列と呼ばれます。以下で説明する各量子ビットゲートは、ユニタリ行列になっており、特に意識する必要はありません。

1量子ビットゲート

1量子ビットゲートには、パウリゲート、アダマールゲート、Sゲート、Tゲート、位相ゲート、回転ゲートなどがあります。

パウリゲート

ブロッホ球のX軸、Y軸、Z軸で、180°回転させるゲートで、Xゲート、Yゲート、Zゲートと呼ばれます。

X=(0110),Y=(0ii0),Z=(1001) (16)

図3 Xゲート、Yゲート、Zゲート

アダマールゲート

Z軸とX軸にたいして45度傾く軸で180°させるゲートで、Hゲートと呼ばれます。アダマールゲートを使うことにより、量子ビット |0,|1 の重ね合わせ状態を作ることができます。

H=12(1111) (17)

|0 に、アダマールゲートを作用させたときは、以下のよう操作になります。

図4 アダマールゲート

S, Tゲート

位相を回転させるゲートです。

S=(100i),S=(100i),T=(100eiπ4),T=(100eiπ4) (17)

S ゲートは π2T ゲートは π4 位相を回転します。 S,T は位相を逆に回転します。

図5 sゲート、Tゲート

位相ゲート

量子ビットを任意の位相だけ回転させるゲートです。

P(ϕ)=(100eiϕ) (18)

図6 位相ゲート

回転ゲート

各軸にたいして量子ビットを回転させるゲートです。

Rx(θ)=(cos(θ2)isin(θ2)isin(θ2)cos(θ2))(19) Ry(θ)=(cos(θ2)sin(θ2)sin(θ2)cos(θ2))(20)Rz(θ)=(eiθ200eiθ2)(21)

図7 回転ゲート

2量子ビットゲート

2量子ビットゲートには、CNOTゲート、制御ユニタリゲート、SWAPゲートなどがあります。SWAPゲートを除く、2量子ビットゲートは制御タイプです。制御2量子ビットゲートは 最初の量子ビットが |1⟩ の時に、2番目の量子ビットに対して単独の量子ビットゲートを適用します。このとき最初の量子ビットを制御量子ビットと呼び、2番目の量子ビットをターゲット量子ビットと呼びます。

基底ベクトル表記の順番

通常、状態をケットであらわすときに、「1番目」の量子ビット、「2番目」の量子ビットの状態に対応する0と1を左から順番に並べて表記されます。例えば、最初の qubit が |0⟩ 状態で、2番目のものが |1⟩ 状態の場合、その結合状態は |01⟩ です。ところが、今回、プログラミングにもちいるQiskit では、古典コンピューター上でのビット列表現と同じ順序同様にし、測定が実行された後のビット文字列から整数への変換を容易にするという理由から、 最上位ビット (Most Significant Bit - MSB) を左にとり、最下位ビット (Least Significant Bit - LSB) が右にとられます。つまり、「1番目」の量子ビット、「2番目」の量子ビットの状態に対応する0と1を右から順番に並べて表記されます。上の例でいえば、最初の qubit が |0⟩ 状態で、2番目のものが |1⟩ 状態の場合、その結合状態は |10⟩ となります。この点は、注意が必要です。 今回は、Qiskitをもちいたプログラミングを紹介しますので、以下では、Qiskitの基底ベクトル表記を用います。

CNOTゲート

制御Xゲートとも呼ばれます。制御量子ビットが、|1 のとき、対象となる量子ビットを反転、つまりXゲートを作用させます。MSBを制御ビットとしたときは、以下のようになります。Qiskitでは、 cx(q[1],q[0])

CX=(1000010000010010)(22)

LSBを制御にした場合は、以下のようになります。Qiskitではcx(q[0],q[1])

CX=(1000000100100100)(23)
制御ユニタリゲート

CNOTでは、ターゲット量子ビットに、Xゲートを作用させましたが、その他の量子ゲート U を作用させることができます。

制御Zゲート

制御量子ビットが |1⟩ である場合には、Z ゲートがターゲット量子ビットの位相を反転させます。 この行列は、制御量子ビットが、MSBでも、LSBでも、同じになります。

CZ=(1000010000100001)(24)
制御アダマールゲート

制御量子ビットが |1⟩ のとき、ターゲット量子ビットに H ゲートを作用させます。制御がLSB量子ビットの時は、以下のようになります。

CH=(10000120120010012012)(25)
SWAPゲート

SWAPゲートは2量子ビットの値を交換します。

SWAP=(1000001001000001)(26)

主な量子ゲートまとめ

ゲート回路行列
パウリXゲートimage-20211206135707260(0110)
パウリZゲートimage-20211206135839572(1001)
アダマールゲートimage-2021120614105062912(1111)
Tゲートimage-20211206141308744(100eiπ4)
CNOTゲート(1000010000010010)

図8 主な量子ゲートのまとめ

量子コンピュータはどのように計算をするのか

これまで、量子ビットとはなにか、量子ゲートにはどのようなものがあるかを見てきました。では、量子コンピュータは、量子ビット、量子ゲートを用いて、どのように計算をするのでしょうか。

量子コンピュータでは、まず、すべての状態の重ね合わせを準備します。この状態に、量子ビット間を干渉させるための操作つまり量子ゲートによる操作を順次施します。状態ベクトルつまり量子ビットは、波の性格をもつため干渉するというのがポイントです。量子ビットの間の干渉の結果を測定することによって計算が行われます。複数の量子ビットの状態を同時に操作できるのも量子コンピュータの大きな特徴の一つです。

図9 量子コンピュータの基本

量子ビットの操作は具体的にどうするのか

これまで、量子ビットや量子ゲートを、ベクトルや行列で説明してきましたが、量子コンピュータでは、具体的に、どのように量子ビットを操作しているのかでしょうか。代表的な量子ビットである超電導量子ビットの場合で、見てみたいとおもいます。

超電導量子ビットは、図10に示すように、2つの超電導電極を薄い絶縁膜でつないだものです。

図10 超電導量子ビットの構造

これは、非線形インダクタとコンデンサによるLC共振回路とみなせます。量子状態 |0|1 を持ち、2つの状態の間のエネルギー差のマイクロ波(典型的には4~6GHz)を印加することによって、量子状態を、 |0 から |1 に変化させることができます。

図11 超電導量子ビットの操作 (12)

重ね合わせ状態をつくるには、|0 から|1への操作を途中でやめます。様々な量子ゲート操作を行うには、それにしたがったパルス操作を行います。ゲート操作を順次繰り返し、最後に測定をすることによって、計算が行われます。また、量子もつれ操作を行うため、量子ビットの間が共振器で結ばれます。

図12 超電導量子チップの構造 (13)

出所: https://www.ibm.com/blogs/research/2017/11/qubit-explained/

ゲート操作の例

図13の上の縦軸は電磁波の強度を表しています。実線が1量子ビットの操作で、破線が2量子ビットの操作です。まず、初期状態を準備し、量子回路を通した後、計測を行います。このように、マイクロ波や交流パルスを、順次、印加することによって、量子ビットを操作し、計算を行っていきます。図13の下に対応するゲートからなる量子回路をしめしています。

図13 量子ビットゲート操作の例 (14)

出所: https://journals.aps.org/prx/pdf/10.1103/PhysRevX.6.031007

量子コンピュータは万能

古典コンピュータが、NANDゲートをくみあわせれば任意の計算が可能なように、CNOT、アダマールゲート、Tゲートがあれば任意の計算が可能なことがわかっています。ただし、ノイズの影響により正しい計算ができるかどうか、その計算が早いかどうかは別問題だということに注意が必要です。

図14 古典コンピュータと量子コンピュータ

量子コンピュータの制約事項・課題

理想的な量子コンピュータは万能であり、古典コンピュータを凌ぐ能力があることはわかっています。ただし、まだまだ、多くの制約事項や課題をかかえています。

このように、現時点のハードウェアでは、演算中に発生するエラーで正しい計算を行うことが困難なことに加えて、コヒーレンス時間の制約から、深い量子回路の計算も困難です。誤り訂正ありの量子コンピュータが実現されて初めて、実用的な計算を行うことができると言われています。

量子コンピュータの現在

誤り訂正ありの量子コンピュータの実現は、まだまだ先のことです。現在実現されているハードウェアは、エラーの原因となるノイズがある中規模量子デバイス、Noisy Intermediate-Scale Quantumです。今後は、NISQと呼びます。現時点では、性能・機能に制約が多いNISQのうまい使い方の研究開発が進められていたり、誤り訂正ありの量子コンピュータの応用研究がすすめられている段階です。また、現在のNISQで解ける問題の規模は限られており、古典コンピュータで十分高速に解くことができます。

規模が大きくなると古典コンピュータで解くことが困難な問題の一つに、巡回セールスマン問題などの組み合わせ最適化問題があります。セールスマン巡回問題とは、セールスマンが所定の複数の都市を1回だけ巡回する最短経路を計算するというものです。都市数が増加すると計算量が急速に増加しますので、都市数が多くなると現実的な時間で計算が終わりません。このような問題を現実的な時間で解くことが、量子コンピュータに期待されていますが、残念ながら、現状では、量子コンピュータで扱える都市数が少ないとともに、古典コンピュータに勝る計算速度が実現されているわけではありません。今後の量子コンピュータの発展が期待されています。

量子アルゴリズムの種類

量子コンピュータでは、すべての状態の重ね合わせを準備し、順次、量子ゲートの操作を加えていき、量子ビット間の干渉を起こさせ、回答が高確率で得られるような特別なアルゴリズムが必要です。これは古典コンピュータで、様々なアルゴリズムが作られているのと同じです。量子アルゴリズムは、大きく2つに分類されます。

FTQCアルゴリズム

FTQCアルゴリズムの代表的なものには、以下のようなものがあります。

NISQアルゴリズム

NISQアルゴリズムには、以下のものがあります。

Python と IBM Quantum, Qiskit でプログラミング

現在利用可能なNISQを用いる前提で、どのような問題が解けるのか、アルゴリズムは実際どのようなものなのかを知るために、現在利用できるフレームワークを用いたプログラムを見てみましょう。

量子コンピューティングのフレームワークとしては、以下のように多くのものがあります。この中で、資料が充実していて、実機も無料で使えることなどを総合的に判断して、今回は、IBM Qiskit とPythonをもちいて量子コンピュータのプログラミングを解説していきます。

IBM Quantum実行環境

IBM Quantumのアカウント作成

まず、IBM Quantum URL: https://quantum-computing.ibm.com/ にアクセスして、Create an IBMid account で、IBMidを取得してください。

image-20211209104634063

IBM Quantum サインイン画面

取得したIBMidで、サインインするとIBM Quantum Welcome 画面が表示されます。API tokenは、IBM QuantumのAPIにアクセスするときに、必要になります。

IBM Quantum Welcome 画面

ここで、Launch Composer をクリックすると、下のようにGUIで量子回路の作成ができます。ここでは、Pythonを用いたプログラミングを扱いますので、詳細は割愛します。

Welcome画面で、Launch Lab をクリックすると、Jupyter Lab が起動します。標準のJupyter Lab とは、デザインが異なりますが、基本的な使い方は、同じです。Jupyter Labの使い方のは省略します。

Notebookの下のアイコンをクリックすると、Jupyter Lab が立ち上がります。その後、プログラミングを行うという流れです。

image-20211214101358706

IBM Quantum ローカル実行環境

以下のようにローカルにもインストールできますが、各種モジュールのバージョン依存関係などによりエラーが発生する可能性少なからずあります。IBM Quantum lab を使うことを、推奨します。

Anacondaのインストールと環境設定

Qiskitは、Python3.6以降がサポートされており、データサイエンス用のプラットフォームAnacondaが推奨されています。Anacondaのインストールについては、ネット上にも様々な情報がありますので、ここでは省略します。

Anacondaのconda コマンドを使ってQiskit専用の仮想環境を作成することをお勧めします。Anaconda プロンプトを使って以下のように環境を作成します。環境名である ENV_NAME は、各自選んだ適当な名前に変更してください。

新しい環境をアクティブにします。

pip をアップグレードします。

Qiskitパッケージをインストールします。

可視化機能やJupyter notebookを使うために、 visualization 機能を追加してインストールします。

Qiskit フレームワークの全体像

The Qiskit framework.

Terra

量子プログラムを実行する基盤です。いろいろなモジュールから成り立っています。以下、代表的な機能です。

Aer

Aer は、Terraでコンパイルされた回路を実行するためのC++言語で記述された 量子回路のシミュレーターです。Aerは実機で発生するエラーのノイズ・シミュレーションも含みます。3つのシミュレーターがあります。

  1. Qasm シミュレーター 量子回路を、ノイズがなし、またはノイズありで複数回実行し、結果を返します。
  2. 状態ベクトル(state vector)シミュレーター 量子回路をノイズなしで一回実行し状態ベクトルを返します。実機では、状態ベクトルは直接観測できず計測をしないといけませんが、状態ベクトルシミュレーターでは実行結果の状態ベクトルを知ることができます。あくまでシミュレーションであることに注意が必要です。
  3. ユニタリー・シミュレーター。 量子回路をノイズなしで、一回実行し、結果のユニタリー行列を返します。測定やリセット操作を含めることはできません。

Ignis

研究者を対象とした、エラー特定、ゲートの改良、ノイズ存在下での計算などを行うものです。

Aqua

化学や最適化、金融、AI などのアプリケーション用アルゴリズムを実装した量子計算のハイレベルAPIです。量子ゲートの操作などを意識することなく量子化学計算、量子機械学習、最適化、金融への応用などの量子コンピューティングのアプリケーションを作ることができます。

Qiskit とPython を用いた量子コンピュータのプログラミング

Qiskitのプログラムの基本的なステップ

ビルド:問題を解くための量子回路を作成します。

コンパイル:量子コンピュータの実機やシミュレーターで動作させるために回路をコンパイルします。

実行:コンパイルされた回路の演算を実行します。

分析:実行結果の統計処理を行い、実行結果を可視化します。

ビルドとコンパイルは、クラウドのIBM Quantum lab でも、ローカルにQiskit をインストールした環境でも、かまいません。ローカル環境から、実機を用いる場合は、APIを経由して、実機で計算が実行します。

プログラミングの実例

IBM Quantum にサインインして、Launch Lab をクリックし、Qiskit ノートブックを立ち上げます。セルに順次プログラムを入力し、セルを選択して、シフトキーとリターンキーを押すと、セルに入力したプログラムが実行されます。

ステップ 1 : パッケージをインポートする。

必要なパッケージをインポートし、使用するシュミレータを指定します。ここでは、Qasmシュミレータを用います。

ステップ 2 : 量子回路を定義する。

2つの量子ビットと2つの古典ビットからなる回路を作成します。おのおのビットはゼロに初期化されます。

ステップ 3 : ゲートを追加する。

ステップ4で可視化される回路を参照するとこのプログラムの意味が、よく理解できると思います。

circuit.h(0) : 初期化された量子ビット0を、アダマールゲートで重ね合わせ状態をつくります。

circuit.cx(0, 1) : 量子ビット0を制御ゲート、1をターゲットゲートとしたCNOTゲートで、量子ビット0と量子ビット1を、エンタングル状態にします。|ψ=(|00+|11)/2

circuit.measure([0,1], [0,1]) : 測定をします。 measure(qubit, cbit) qubit: 計測する量子ビット、cbit: 計測結果を保存する古典ビット

ステップ 4: 回路を可視化する

draw()を用いて、回路を可視化します。

 

image-20211214100258709

ステップ 5: 演算のシミュレーション

シュミレータ Qiskit Aer を用いてシミュレーションを行います。シミュレーションには、qasm_simulator を使います。

シミュレーション結果

ノイズを含むqusm_simulotorを使って、1000回シミュレーションを繰り返して、11となるのが483回、00となるのが、517回という結果になりました。状態ベクトルは、|ψ=(|00+|11)/2 で、演算結果が0になる確率 p0=|α|2=1/2 、1になる確率は、 p1=|β|2=1/2 ですので、0になる確率が、517/1000=0.517 と期待どおりの結果となりました。0.5にならないのは、ノイズの影響です。

ステップ6: 演算結果の可視化

Qiskit には、多くの可視化のやり方が含まれていますが、ここでは、plot_histogramという関数を用いて可視化を行います。

実機で実行

上では計算の実行にシュミレータを用いましたが、実機を用いて計算を実行させるには、ここまでのプログラムに、以下のプログラムを追加します。

まず、アカウント設定します。 MY_API_TOKEN には、ログイン時に表示されるAPI token をコビー&ペーストします。

 

Welcome画面

次に、設定したアカウントで使用可能な実機のリストを取得します。量子ビット数が1ビットのものがあり、1ビットの実機では、このプログラムは動作しませんので、稼働している実機のうち、量子ビット数が5以上のものをリストアップするようにしています。backendというのは、プログラムを実行する環境のことで、実機とシミュレーターがあります。

稼働している実機のリストが表示されます。実機の稼働状況は変わりますので、リストは取得時点により変わります。

次に、一番空いている実機を選択します。

実機でプログラムを実行します。

結果

image-20211214114951391

この結果を見ると、理論上は得られない|01|10が表れています。これは、実機の演算プロセスで発生したエラーによるものです。量子コンピュータの実機では、このようなエラーがあることが分かります。

汎用量子計算

現在、稼働していて我々が使うことのできる量子コンピュータは、量子ビット数が限られ、量子ビット間の接続にも制限があり、エラー率も高いので、NISQでの実行は難しいと考えられています。したがって、ここでは、汎用量子計算の代表的なアルゴリズムの紹介にとどめます。

量子フーリエ変換(Quantum Fourier Transform, QFT)

離散フーリエ変換を量子コンピュータで実行するアルゴリズムです。離散フーリエ変換は、式(27)に従って、ベクトル (x0,,xN1) をベクトル (y0,,yN1) に変換します。xN1 をAD変換された時間信号とすると、yN1 は周波数スペクトルになります。古典コテンコピュータで、この変換を高速に行うのが、高速フーリエ変換 (fast Fourier transform, FFT) です。古典コンピュータのFFTをさらに高速に実行しようとするのが、量子フーリエ変換です。量子フーリエ変換は、いろいろな量子アルゴリズムの構成要素として用いられます。回路が複雑で、入力状態をどう準備するのかの問題があります。

 

yk=1Nj=0N1xjωNjk,  ωNjk=e2πijkN(27)

量子フーリ工変換は、式(28)に従って、量子状態 i=0N1xi|i を、 量子状態 i=0N1yi|i に変換します。 |i は、整数 i の進数での表示 i1in(im=0,1) に対応する量子状態 |i1in を表します。(例えば、|2=|0010,|5=|00101 などです。)

yk=1Nj=0N1xjωNjk(28)

ケットベクトルを用いて、式(29)のように表すこともできます。

|x1Ny=0N1ωNxy|y(29)

ユニタリ行列として表現すると、式(30)のようになります。QFTは、まとめてユニタリ行列として、扱われることがあります。

UQFT=1Nx=0N1y=0N1ωNxy|yx|(30)

回路図は以下のようになります。

QFT

量子フーリエ変換回路図

Rl は、式 (31) の角度 2π/2l の一般位相ゲートです。

Rl=(100ei2π2l) (31)

量子位相推定(Quantum Phase Estimation, QPE)

ユニタリ行列の固有値を求めるアルゴリズムです。多くの量子アルゴリズムの構成要素として用いられます。ユ二タリ行列 Uが、U|ψ=e2πiθ|ψ であたえられた場合に、θ を推定するアルゴリズムです。ここで、 |ψ は、固有ベクトルで、e2πiθ は、固有ベクトルに対応する固有値です。固有ベクトルが重ね合わせられた|ψから固有値を推定するものだと言うこともできます。

量子位相推定、QPEの応用としては、以下のようなものがあります。

  1. 素因数分解問題が解ける。 位数という数を推定し、素因数分解をすることができる。
  2. 量子系のエネルギー計算ができる。 エネルギーはハミルトニアンと呼ばれる行列の固有値によって与えらます。基底状態のエネルギーは最小の固有値、状態ベクトルは固有ベクトルで与えらます。ハミルトニアン自体はユニタリー行列ではありませんが、工夫を加えることによって、量子位相推定でエネルギーを計算することができます。
  3. 連立一次方程式 Ax=b を解くことができる。 固有値・固有ベクトルが求められるということは、連立一次方程式が解けるということです。また、機械学習への応用も期待されています。

Shorのアルゴリズム

素因数分解を高速にとく量子アルゴリズムです。素因数分解は、自然数 N(1,2,3,) に対して、N=pq となる素数、p,q を求めるというものです。この問題が、古典コンピュータでは高速に解けないことが、RSAなど暗号の基礎となっています。

この素因数問題の解き方は、N を偶数として、以下のようになります。

  1. 1 から N1 までの数 x を1つ選びます。
  2. xN の最大公約数を計算します。 最大公約数が1でなければ、その最大公約数が素因数です。 最大公約数が1の場合、次に進みます。
  3. xr を、Nで割った余りが1になる r を求めます。数式で書くと xr mod N=1 です。 r が偶数で、 (xr/2+1) mod N0 の条件を満たせば、xr/21Nの最大公約数が素因数となります。条件が満たされないなら、1.に戻ります。

この中で、xr mod N=1 を求める問題を量子アルゴリズムを用いて高速に解くというのがShorのアルゴリズムです。

回路は、量子位相推定と似たものですが、ここでは割愛します。

Shorのアルゴリズムを用いても、現在の量子コンピュータでは、エラーがあることと、量子ビットの数が限られていることから、すぐさま暗号が解読されるレベルの素因数分解の解を求めることはできません。

量子古典ハイブリッドアルゴリズム

量子アルゴリズムだけのプログラムは、現時点では、エラーが多く発生し、また量子ビット数が限らることから、正しく動作しません。そこで、現在も利用可能で、量子ビット数が着実に増えているNISQ(Noisy Intermediate-Scale Quantum technology、小・中規模でノイズを含む量子コンピュータ)の活用方法の開発が盛んに行われています。その多くが、量子コンピュータでは、ビット数の少ないパラメータ付き量子回路を動作させ、古典コンピュータで、そのパラメータを探索・最適化する量子古典ハイブリッドアルゴリズムです。

量子古典ハイブリッドアルゴリズムの基本

回転角度をパラメータ θ にする回転ゲートなどを用いてパラメータ付き量子回路 Un をつくり連結した回路を準備します。その回路に、初期状態を入力し、計測結果からコストを計算した後、コストが最低になるようにパラメータ付き量子回路のパラメータを最適化します。この量子回路は、深層学習におけるモデルと似ています。機械学習、深層学習においては、モデルのパラメータをコストを下げるように、繰り返し、学習を進行させます。深層学習のレイヤーが、各パラメータ付き量子回路 Un に相当します。同様の手法を用いるのが、量子古典ハイブリッドアルゴリズムです。コストが小さくなるようにパラメータを調節するのが、オプティマイザの役割です。コスト関数は、以下にの具体例で述べるように、問題を定式化(値が小さくなるほど望ましい数式で表すこと)したものを用います。最低のコストが求まれば、問題が解けたことになります。

古典コンピュータの深層学習モデルより、量子回路は少ない量子ビット数でも、高い表現力を持つところから、NISQでも実行可能な実用的な計算ができることが期待されています。量子化学計算、組み合わせ最適化問題、機械学習などへの応用が進められています。

ハミルトニアンと期待値

量子状態にハミルトニアンを掛けるとエネルギーになりますので、ハミルトニアンは、量子状態をエネルギーに変換する行列だということができます。量子状態 |ψ に対するエネルギーの期待値は、ψ|H|ψ と書けます。量子は、通常、エネルギーが一番低い状態となっていることが多く、それは、どのような状態なのかが問題になります。また、最適化問題は、問題をエネルギーの形で書き表して、エネルギーの期待値を最小化するという問題と理解することができます。

量子変分アルゴリズム VQE

Variational Quantum Eigen solver(変分量子固有値ソルバー、VQEと略されます)は、量子状態を用いてエネルギーが最小になる基底状態を探索するアルゴリズムです。

分子の性質は、電子の状態によって決まり、その電子の状態は、シュレディンガー方程式 H|ψ=E|ψ を解くことによって、明らかになります。ハミルトニアンは、分子の構造などで決まります。 シュレディンガー方程式を解くということは、ハミルトニアン H の固有値 Ei と対応する固有ベクトル |ϕiを求めることと同じです。このとき固有値 Ei は、固有状態 |ϕiのエネルギーとなります。この問題をとくことは、量子化学計算と呼ばれています。電子の数が増加すると指数的に難しくなるため、厳密に解くことは実質不可能になります。そこで、いかに解を近似するかが課題になります。

式(32)に示すように、VQEは、様々な量子状態 |ψ についてそのエネルギーを計算すると、その期待値が基底エネルギー E0よりも高くなるという原理に基づいています。

ψ|H|ψE0 (32)

網羅的に様々な状態にたいするエネルギーを計算するのは、効率が悪いため、パラメータ付きの量子状態 |ψ(θ)を用いて、ψ(θ)|H|ψ(θ) を最小化する θ を発見的に見つけようというのがVQEです。

  1. 量子コンピュータ上で量子状態 |ψ(θ) を生成します。
  2. H(θ)=ψ(θ)|H|ψ(θ) を測定します。
  3. 測定結果をもとに、古典コンピュータによって ψ(θ)|H|ψ(θ) が小さくなるように θ を更新し、1.に戻ります。

これを ψ(θ)|H|ψ(θ) が収束するまで繰り返します。

Qiskit プログラム例

ここではH-He+(水素化ヘリウムイオン)の基底エネルギーを求めてみましょう。量子コンピュータの実機では、測定を行うためにパラメータ量子状態に、ハミルトニアンを対角化するためのゲートを追加する必要がありますが、ここでは、簡単のため計算途中の量子状態を得ることができる量子状態シミュレータのプログラムを示します。 以下はdojo.qulacs.orgに掲載されたコードをQiskitで書き直したものです。

まず、必要なモジュールをインポートします。

ハミルトニアンを準備します。H-He間の距離が0.9オングストロームの時のハミルトニアンです。このハミルトニアンの固有状態を計算することによって、HHe+分子の性質がわかります。

パラメータ付き量子回路を作成する関数を準備します。

出来上がった量子回路を、パラメータを、θ0θ5 として、次のプログラムで表示すると以下のようになります。

 

image-20211226171313045

パラメータ θ に対する期待値 ψ(θ)|H|ψ(θ) を計算する関数を定義します。