§ この記事の目的
私達が普段から行っている数値の計算(以降、古典計算と呼びます)を量子コンピュータ上で都合よく計算するのはどうすれば良いでしょうか。ここでは、古典計算において計算で使用したい値を量子コンピュータ上で表現する方法の一つである、振幅エンコーディングについて説明します。
§ 量子ビットと確率振幅
私達が普段から使っているコンピュータ(以降、古典コンピュータと呼びます)は、0と1を計算のもとの値(基底)として使用しています。これをビットと言います。
このビットは、原理的には電圧の高い・低いで区別され、0または1の値は入れ替わったり変化したりはしません。もし変化することがあるとすれば、それは計算結果も変動することになり計算機としての信頼性が無いことになります。
ところが量子コンピュータでは、全く事情が異なります。量子コンピュータは量子力学の原理に基づいて動作するコンピュータです。古典コンピュータと同様に計算のもとの値はビットを使用しますが、このビットの値が0を指したり1を指したりします。これは確率的に変動します。
量子コンピュータでは、1ビットのことを1量子ビットと呼びます。
1量子ビットは以下のような書き方をします。
1量子ビット=∣0>または∣1>
先に、0と1の値は確率的に変動すると書きました。
変動したときに「どのような確率を取るか」を決めておく必要がありますので、以下のように定義します。
ここで、αまたはβは実数または複素数とします。
1量子ビット=α∣0⟩+β∣1⟩...(式.1)
α及びβは確率的に決まりますので、以下の確率原則が成立します。
∣α∣2+∣β∣2=1
α及びβを確率振幅と呼びます。
§ 基底エンコーディング
1量子ビットは(式.1)のように表現しました。
それでは、2量子ビットはどう表現したら良いでしょうか。2量子ビットも同様に確率振幅を使用して表記します。
2量子ビット=α∣00〉+β∣01〉+γ∣10〉+δ∣11〉...(式.2)
もちろん、確率原則が働くことにも注意が必要です。
∣α∣2+∣β∣2+∣γ∣2+∣δ∣2=1
量子ビットの数をどんどん大きくすると、例えば|001〉、|0101〉、|10010〉…と増えていきます。これでは0や1を書くことが大変になります。
そこで、以下のように10進数を利用し、量子ビットを表現します。
∣0⟩=∣0⟩∣1⟩=∣1⟩∣2⟩=∣10⟩∣3⟩=∣11⟩∣4⟩=∣100⟩⋮∣n⟩=∣...⟩
さらに上記に確率振幅を付与し、量子ビットは以下のように表現します。
確率振幅をaとすると
量子ビット=a0∣0⟩+a1∣1⟩+a2∣2⟩+...+an−1∣n−1⟩=i=0∑n−1ai∣i〉
確率原則からaは以下のようになります。
i=0∑n−1∣ai∣2=1
このように、古典のnビット1,2,3,...を量子ビットに書き換えることを基底エンコーディングと言います。
§ 振幅エンコーディング
古典コンピュータで使用するデータを確率振幅にエンコード(割り当て)する方法を振幅エンコーディングと言います。
例えば、古典データx0,x1,x2...xn−1のn次元のベクトルがあるとき、これを振幅エンコードすると以下のようになります。
x=x0x1⋮xn−1→振幅エンコード→i=0∑n−1xi∣i〉
ここで、確率原則からxは以下を満たします。(規格化と言います)
i=0∑n−1∣xi∣2=1
またベクトルだけではなく、要素をaijとし、m行 x n列の行列Aを用いて振幅エンコーディングすることもできます。
A=a00a10⋮am0a01a11⋮am1......⋱...a0na1n⋮amn→振幅エンコード→i=0∑m−1j=0∑n−1aij∣i〉∣j〉
ただし、規格化条件は以下となります。
i=0∑m−1j=0∑n−1∣aij∣2=1
§ 振幅エンコーディングの応用
振幅エンコーディングを応用することで、古典計算を行うのと同じように、計算に使用したい値を特定して(固定して)量子ビットに割り当て、計算を行うことができます。
どのように行うのかと言うと、上記の特定の値を確率振幅に取り込むという方法を取ります。
ただし、確率原則を守る必要があるため、その他の確率振幅には確率原則が有効な値を設定することになります。