Nobisuke
Dekisugi
RAG
Privacy policy
2021/02/11 15:37
現在の量子コンピュータは中規模エラーありのNISQと呼ばれるマシンとして知られています。このNISQは本来の量子ゲートマシンのようなShorのアルゴリズムや量子フーリエ変換の実行が難しくなっています。そのため代替の素因数分解アルゴリズムが考えられます。今回は最小値問題として解くものを紹介します。
物理のイジングモデルで数式を作り、素因数分解を最小値問題に落とし込んで解きます。
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
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の素因数分解をまずします。
まず二進数の乗算を考えます。二進数の乗算と加算を学ぶ必要がありますが、乗算は筆算では10進数とほとんど同じです。
これは、m=p*qを考えますが、pを二進数で考えて、一番下と一番上の位は1になることはわかっています。一番上が1は自明で、素数なので一番下の位は0ではない(偶数ではない)です。pとqを二進数で表すと上記のようになります。
まずはこれを単純にかけます。の位から10進数のようにかけて、ずらして足し合わせてきます。途中carriesというのは桁上がりになります。二進数で1+1をすると桁が上がるので、はの位からの位に上がると言う意味です。
ここで上から見ていくと、、、まずにおいて、1が確定しているため、とはどちらかが1であるため、2の位はでてこないため、がわかる。
同様に、はまず、上記よりとはどちらかが1でどちらかが0であるため、がわかる。また、だったため、となる。ここで、前述と同様1が確定しているため、がわかる。
また、は、より、となる。まず桁数が合わないのでとなり、ここで、左辺に1があるため、は0でないので1が確定する。
これらを進めていってまとめると、下記の式が残る。
この3つの連立方程式を最小値問題に落とすためには、各方程式を二乗すると必ず0の時に最小になるので、連立方程式から下記のハミルトニアンを得られる。
これを総当たりでコスト計算してみると、バイナリ値でからまでで、
となる。との時にとなるので、先に対応する、とが答えとなり、
とが答えとなる。
今は答え合せをしたが、これを実際のゲートシミュレーションにかけてみて答えが出るかどうかを確認する。まず、Blueqatを呼び出し、ハミルトニアン準備して、QAOAにかける。step数は場合に応じて調整するが、今回は2とか4とか短めでもOK
Copy 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