common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

Sign in
Sign up
common.title

量子ゲートのNISQ向け素因数分解アルゴリズム

Yuichiro Minato

2021/02/11 15:37

#量子ゲート

はじめに

現在の量子コンピュータは中規模エラーありのNISQと呼ばれるマシンとして知られています。このNISQは本来の量子ゲートマシンのようなShorのアルゴリズムや量子フーリエ変換の実行が難しくなっています。そのため代替の素因数分解アルゴリズムが考えられます。今回は最小値問題として解くものを紹介します。

イジングハミルトニアン

物理のイジングモデルで数式を作り、素因数分解を最小値問題に落とし込んで解きます。

参考

Quantum factorization of 56153 with only 4 qubits

Nikesh S. Dattani,1,2,∗ Nathaniel Bryans3,† 1Quantum Chemistry Laboratory, Kyoto University, 606-8502, Kyoto, Japan, 2Physical & Theoretical Chemistry Laboratory, Oxford University, OX1 3QZ, Oxford, UK, 3University of Calgary, T2N 4N1, Calgary, Canada. ∗ dattani.nike@gmail.com , † nbryans1@gmail.com

https://arxiv.org/pdf/1411.6758.pdf

Variational Quantum Factoring

Eric R. Anschuetz, Jonathan P. Olson, Alán Aspuru-Guzik, Yudong Cao (Submitted on 27 Aug 2018)
https://arxiv.org/abs/1808.08927

Prime Factorization Using Quantum Annealing and Algebraic Geometry https://1qbit.com/wp-content/uploads/2016/09/1QBit-Research-Paper-%E2%80%93-Prime-Factorization-Using-Quantum-Annealing-and-Algebraic-Geometry.pdf

具体的手順

手順はとてもシンプルです。これまでゲート方式はShorのアルゴリズムを使って問題を解いていましたが、そうではなくて最小値問題に落とし込みます。効率的な落とし込みかたがあり、前処理をいれて143の素因数分解は4量子ビットだけで解けます。

1、量子ビットを使って二進数で乗算を考える

2、桁数の特性を生かしてイジング問題を簡略化する

3、単純化されたイジング問題をQAOAアルゴリズムにかけて最小基底状態を求める。

となっています。ちなみにQAOAは量子ゲートマシンで組合せ最適化問題を解くためのアルゴリズムです。まぁ、結局やることはアニーリングとほとんど同じですが、少し優位性がありそうです。早速例題を見てみます。143の素因数分解をまずします。

1、量子ビットを使って二進数の乗算(143の素因数分解)

まず二進数の乗算を考えます。二進数の乗算と加算を学ぶ必要がありますが、乗算は筆算では10進数とほとんど同じです。

11.png

これは、m=p*qを考えますが、pを二進数で考えて、一番下と一番上の位は1になることはわかっています。一番上が1は自明で、素数なので一番下の位は0ではない(偶数ではない)です。pとqを二進数で表すと上記のようになります。

まずはこれを単純にかけます。202^0の位から10進数のようにかけて、ずらして足し合わせてきます。途中carriesというのは桁上がりになります。二進数で1+1をすると桁が上がるので、Z12Z_{12}212^1の位から222^2の位に上がると言う意味です。

2、桁数の特性を生かしてイジング問題を簡略化する次に各位を足し合わせます。足し合わせると連立方程式は、

\begin{eqnarray}p_1+q_1 &=& 1+2z_{12}\\ p_2+p_1q_1+q_2+z_{12} &=& 1+2z_{23}+4z_{24}\\ 1+p_2q_1+p_1q_2+1+z_{23} &=& 1+2z_{34}+4z_{35}\\ … q_2+p_2+z_{45}+z_{35} &=& 0+2z_{56}+4z_{57}\\ 1+z_{56}+z_{46} &=& 0+2z_{67}\\ z_{67}+z_{57} &=& 1\end{eqnarray}

ここで上から見ていくと、、、まずp1+q1=1+2z12p_1+q_1=1+2z_{12}において、1が確定しているため、p1p_1q1q_1はどちらかが1であるため、2の位はでてこないため、z12=0z_{12}=0がわかる。

同様に、p2+p1q1+q2+z12=1+2z23+4z24p_2+p_1q_1+q_2+z_{12} = 1+2z_{23}+4z_{24}はまず、上記よりp1p_1q1q_1はどちらかが1でどちらかが0であるため、p1q1=0p_1q_1=0がわかる。また、z12=0z_{12}=0だったため、p2+q2=1+2z23+4z24p_2+q_2 = 1+2z_{23}+4z_{24}となる。ここで、前述と同様1が確定しているため、z23=0,z24=0z_{23}=0,z_{24}=0がわかる。

また、1+p2q1+p1q2+1+z23=1+2z34+4z351+p_2q_1+p_1q_2+1+z_{23} = 1+2z_{34}+4z_{35}は、z23=0z_{23}=0より、1+p2q1+p1q2=2z34+4z351+p_2q_1+p_1q_2 = 2z_{34}+4z_{35}となる。まず桁数が合わないのでz35=0z_{35}=0となり、1+p2q1+p1q2=2z341+p_2q_1+p_1q_2 = 2z_{34}ここで、左辺に1があるため、z34z_{34}は0でないので1が確定する。

これらを進めていってまとめると、下記の式が残る。

\begin{eqnarray}p_1+q_1-1 &=&0\\ p_2+q_2-1 &=& 0\\ p_2q_1+p_1q_2-1 &=&0 \end{eqnarray}

この3つの連立方程式を最小値問題に落とすためには、各方程式を二乗すると必ず0の時に最小になるので、連立方程式から下記のハミルトニアンを得られる。

H=(p1+q11)2+(p2+q21)2+(p2q1+p1q21)2=53p1p2q1+2p1q13p2q1+2p1p2q13q2+p1q2+2p2q2+2p2q1q2H=(p_1+q_1-1)^2 + (p_2+q_2-1)^2+(p_2q_1+p_1q_2-1)^2\\=5-3p_1-p_2-q_1+2p_1q_1-3p_2q_1+2p_1p_2q_1-3q_2+p_1q_2+2p_2q_2+2p_2q_1q_2

これを総当たりでコスト計算してみると、バイナリ値で0000\mid 0000 \rangleから1111\mid 1111\rangleまでで、

5,2,4,1,4,3,0,1,2,0,3,1,1,1,1,35,2,4,1,4,3,0,1,2,0,3,1,1,1,1,3

となる。6\mid 6 \rangle9\mid 9 \rangleの時にH=0H=0となるので、先に対応する、0110\mid 0110 \rangle1001\mid 1001 \rangleが答えとなり、

p=13,q=11p=13,q=11p=11,q=13p=11,q=13が答えとなる。

3、単純化されたイジング問題をQAOAアルゴリズムにかけて最小基底状態を求める。

今は答え合せをしたが、これを実際のゲートシミュレーションにかけてみて答えが出るかどうかを確認する。まず、Blueqatを呼び出し、ハミルトニアン準備して、QAOAにかける。step数は場合に応じて調整するが、今回は2とか4とか短めでもOK

from blueqat import vqe from blueqat.pauli import qubo_bit as q hamiltonian = -3*q(0)-q(1)-q(2)+2*q(0)*q(2)-3*q(1)*q(2)+2*q(0)*q(1)*q(2)-3*q(3)+q(0)*q(3)+2*q(1)*q(3)+2*q(1)*q(2)*q(3) step = 4 result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step)).run() print(result.most_common(5)) #=> (((0, 1, 1, 0), 0.38282701807018904), ((1, 0, 0, 1), 0.17092057836615537), ((1, 1, 1, 0), 0.08073422675654193), ((0, 1, 1, 1), 0.08073422675654193), ((1, 0, 1, 1), 0.045786141364148956))
(((0, 1, 1, 0), 0.3845439630296796), ((1, 0, 0, 1), 0.18859194621329145), ((1, 1, 1, 0), 0.06978817939665743), ((0, 1, 1, 1), 0.06978817939665743), ((0, 0, 0, 0), 0.04335938358902308))

ここで、きちんと答えがえら得ていて、0110と1001が十分な確率振幅で得られている。このため量子ゲート方式で基底状態が求まり、素因数分解ができた。

より大きな数

同様に、56153も4量子ビットで解くことができ、291311も6量子ビットで解ける。このように汎用量子ゲートマシンを使って素因数分解ができた。

ちなみに量子アニーリング方式でも解くことができるが、この場合には上記にある3量子ビットの多体問題の2体問題への分解が必要となる。量子ゲートでは3量子ビットの相互作用をハミルトニアンに入れたまま計算できるので、量子ゲートの方が前処理がとても簡単に済むと言う利点がある。

© 2024, blueqat Inc. All rights reserved