@yuichirominato 2019.02.18更新 134views

【論理回路】AND回路をQAOAで


はじめに

古典計算機のAND回路を単純に量子計算機で再現できないかと思い、最適化問題に落としてみました。

AND回路とは?

AND回路は2つのビットがあって、両方とも1の時に1を出力し、それ以外は0を出力します。

0 0 >>> 0
0 1 >>> 0
1 0 >>> 0
1 1 >>> 1

今回これを最小値問題に落とし込んでみます。

コスト関数

コスト関数を考えてみます。 3量子ビットを考えてみて、一般化したコスト関数を準備します。

E=aA+bB+cC+dAB+eBC+fCA+gABC

を考えた上で、ABに入力ビット。Cに出力ビットを割り当てます。ここで、上記のANDゲートの条件を満たした時だけコスト関数が低くなるように係数を探せばいいことになります。

A B C E(コスト関数)
0 0 0 0
0 1 0 0
1 0 0 0
1 1 1 0
-------
0 0 1 x
0 1 1 y
1 1 0 z
1 0 1 k

まず上から順番にどんどん代入していきます。

#[A,B,C] = [0,0,0]
E = 0

#[A,B,C] = [0,1,0]
E = b = 0

#[A,B,C] = [1,0,0]
E = a = 0

#[A,B,C] = [1,1,1]
E = c+d+e+f+g = 0

ここまでは正解組です。次からはコストがこれよりも高くなる条件を設定します。

#[A,B,C] = [0,0,1]
E = c = x > 0

#[A,B,C] = [0,1,1]
E = c + e = y >0

#[A,B,C] = [1,1,0]
E = d = z >0

#[A,B,C] = [1,0,1]
E = c + f = k >0

これを満たす条件を頑張って探すと、

c=1,e=1,d=1,f=1,g=-4

が見つかります。これを代入するとコスト関数が求まります。

E = C + AB + BC + CA - 4ABC

これがANDゲートのコスト関数です。早速これを使って解いてみましょう。

QAOAで求める

from blueqat import vqe
from blueqat.pauli import qubo_bit as q

hami = q(2)+q(0)*q(1)+q(1)*q(2)+q(2)*q(0)-4*q(0)*q(1)*q(2)

result = vqe.Vqe(vqe.QaoaAnsatz(hami,4)).run()
print(result.most_common(12))

#=>
(((0, 0, 0), 0.519727769221865), ((1, 1, 1), 0.23719281758252192), ((0, 1, 0), 0.11967601213486054), ((1, 0, 0), 0.1196760121348605), ((0, 0, 1), 0.0027571549552323237), ((1, 1, 0), 0.0006430030415655319), ((1, 0, 1), 0.00016361546454752971), ((0, 1, 1), 0.00016361546454752736))

きちんと求めたい値の000,111,010,100が出てきました。確率振幅も十分です。

解いてみる

1つだけやってみます。A=1,B=0で入力をしてCを求めてみるAND回路をしてみます。

この際には-1*q(0)+q(1)を加えてみます。これによってA=1,B=0に固定できます。

hami1 = -1*q(0)+q(1)
hami = q(2)+q(0)*q(1)+q(1)*q(2)+q(2)*q(0)-4*q(0)*q(1)*q(2)

result = vqe.Vqe(vqe.QaoaAnsatz(hami1+hami,4)).run()
print(result.most_common(12))

#=>
(((1, 0, 0), 0.9193795158893359), ((1, 1, 1), 0.03156160130462393), ((0, 0, 0), 0.02058110630291014), ((1, 1, 0), 0.006777171223222024), ((1, 0, 1), 0.006777171223222019), ((0, 1, 0), 0.006257773121487779), ((0, 0, 1), 0.006257773121487756), ((0, 1, 1), 0.0024078878137108292))

高い確率できちんと100が出てきました。これにより10の入力で、出力0を得ることができました。以上です。

Recommended


Wikiへ移動