はじめに
量子コンピュータで素因数分解します。ただ、今回使うのは量子アニーリングのイジング型のマシンで、みなさんが思っているゲートのshorを使った解法とは違うものになります。
大事な知識
今回イジングマシンで素因数分解をする時には多体問題への対応が必要となります。ブール代数やグレブナー基底が出てきます。
早速ときます
今回は例題はなんでもいいですが、例題なのであまり大きすぎない適度な数字で。
ちなみに1Qbitという会社では200099までD-Waveに実装できているようですが今回はお手柔らかに、、、
15 = 3*5
くらいでやり方を見ていきます。
量子ビットを用意する
まずは量子ビットを用意します。表現したいのは5と3です。
求めたい素因数分解の解を下記の通りおいてみて、pとqを求めます。
15 = p*q
答えを知ってしまっているので、それぞれの数字を2進数で表現できるように変形します。
また、素因数分解ですので基本的に偶数がでませんので、最初の1は必ず使います。
そうすることによって3量子ビットを使って解くことができます。
定式化
量子アニーリング、イジングモデルの場合には問題を最小値問題に落とし込みます。
今回素因数分解を最小値問題に落とし込むには、左辺から右辺を引いて二乗します。
解くべき数式のハミルトニアンは下記のようになります。
これを最小の0にできたとき、素因数分解が完了します。基本的にはどんな素因数分解も上記のように解くことができます。
早速展開してみる
先ほどの式を展開してみます。まずは、pとqに先ほどの量子ビット表記した形を代入して、
こちらを展開します。展開した式は面倒ですが、、、
ここで、バイナリ値なので
これをまとめて、綺麗な形にできます。
三体問題の分解を使う
今回三体問題は
と表現します。その時に、
となりました。
得られたハミルトニアンをQUBOmatrixに
見やすくするために縦横4量子ビットずつのQUBOmatrixに配置して見ます。
次にこちらをイジングに直します
通常はソフトウェアが自動変換してくれます。
D-Waveにかける
このままではD-Waveのパラメータ設定のレンジをはみ出るので、全体を数分の一します。
これをかけていきますが、これは4量子ビットの完全結合ですので、D-Waveのキメラグラフに実装するには分解する必要があります。4量子ビットの完全結合は6量子ビットあれば表現できます。
今回は下記のようにエクセルでガンマの値や全体の倍率を決めてみました(D-Waveにかけるときに-1から1の間にパラメータが落ち着かないといけないので)。
これを入れてみると、できました!
複数の解が出てきましたが、一番エネルギーの低いのが基底状態のようです。確認してみます。
D-Waveで暗号を解くのはとても大変な苦労です。。。
つづいてQAOA
QAOAは量子ゲートマシンで量子断熱計算を使って組合せ最適化問題を解くようなアルゴリズムです。イジングハミルトニアンもしくはQUBOをつくって計算します。以前作った式を使って、
QAOAをQUBOを使ってハミルトニアンを作成
イジングモデルは量子ゲートモデルでは、パウリZオペレーターでハミルトニアンを書きますが、今回はイジングではなく01バイナリ値のQUBOで問題を書いてますので、自動変換が必要です。blueqatからpauli演算子に直してくれるツールを使います。
from blueqat.pauli import qubo_bit as q
from blueqat.pauli import *
hamiltonian = 128*q(0)*q(1)*q(2)+16*q(0)*q(1)-56*q(0)*q(2)-52*q(0)+48*q(1)*Z(2)-96*q(1)-52*q(2)
これで準備が整いました。
QAOA+VQEを実行
次にVQEを実行します。こちらもBlueqatに入ってます。
from blueqat import vqe
step = 2
result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step)).run()
print(result.most_common(5))
(((1, 0, 1), 0.5016550552468441), ((0, 1, 1), 0.17148299431308803), ((0, 0, 1), 0.08740672548230058), ((1, 1, 1), 0.08029439531924541), ((0, 1, 0), 0.07843866417857855))
(((0, 1, 1), 0.41587841359182315), ((1, 1, 1), 0.22999518869583413), ((1, 1, 0), 0.09621729455616015), ((0, 0, 1), 0.09274077321094935), ((1, 0, 1), 0.08165837751142796))
一番最初に011が出てきました。これは5x3に対応していますので合っています。これによって15=5x3ができました。以上です。
まとめ
量子アニーリングと量子ゲートのおける組合せ最適化の暗号解読は同じ方法が取れますが、多体相互作用が活用できる分量子ゲートの方がやりやすいですが、実機となると結合数の問題もあり今後どうなるかわかりません。