Groverio algoritmas

Iš testwiki.
Pereiti į navigaciją Jump to search

Groverio algoritmas (Šablonas:En) yra kvantinis algoritmas skirtas ieškojimui nestrukturizuotoje (nesutvarkytoje) duomenų bazėje su N kintamųjų per O(N) laiką ir užimantis O(log2N)=O(n) saugojimo vietos. Algoritmas buvo sugalvotas L. Groverio (Lov Grover) 1996 m.

Klasiškai, ieškant nesutvarkytoje duomenų bazėje reikia linijinio ieškojimo per O(N/2) laiką. Groverio algoritmas kuris užima O(N1/2) laiko, yra greičiausias įmanomas algoritmas skirtas ieškojimui nesutvarkytoje duomenų bazėje. Jis suteikia tik kvadratinį pagreitėjimą, skirtingai nuo kitų kvantinių algoritmų, kurie gali suteikti eksponentinį paspartėjimą, nei jų klasikiniai atitikmenys. Tikimybė, kad atsakymas bus klaidingas yra 1/N, kur N yra duomenų bazę sudarančių elementų sveikas skaičius. N=2n, kur n kubitų skaičius.

Groverio Iteracija

|O=|0|0...|0=|00...0.
|ψ=H|0H|0H|0H|0...H|0H|0=Hn|O.

Vartai M, kurie naudojami po Hadamardo vartų:

M=12|tt|;
M|ψ=(12|tt|)|ψ=|ψ22n|t=|ψ2N|t,
t|ψ=12n

kur t yra ieškomas elementas, o n yra kubitų skaičius.

Per vartus B pereina visi kubitai išskyrus paskutinį.

B=2|ψψ|1,
B(|ψ2N|t)=(2|ψψ|1)(|ψ2N|t)=2|ψψ|ψ|ψ4N|ψψ|t+2N|t=.
=2|ψ|ψ4N1N|ψ+2N|t=|ψ4N|ψ+2N|t=N4N|ψ+2N|t,

kur ψ|ψ=1,

ψ|t=12n.

Pavyzdžiui, t=|1001>:

1001|ψ=124.
t|t=1001|1001=1.
t|x=1001|1000=0.
B=H(2|OO|1)H=(2H|OO|H)H=2H|OO|HHH=2|ψψ|1.

Groverio iteracija G:

G=BM=(2|ψψ|1)(12|tt|).

Operatorius M ir B reikia kartoti tiek kartų kiek reikia Groverio iteracijų, kol bus gautas teisingas atsakymas.

HH=1; MM=1; BB=1;
(2|OO|1)(2|OO|1)=4|OO|OO|2|OO|2|OO|+1=4|OO|4|OO|+1=1.

Groverio Iteracija su 5 kubitais (N=16)

Tarkime turime ant įėjimo 5 kubitus. Pirmi 4 kubitai yra 0 būsenoje, o penktas kubitas yra 1 busenoje. Pirmi keturi kubitai yra skaičius n, kuris praėjes pro H tampa 2n. Visus 5 kubitus praleidžiame pro Hadamardo vartus.

t=1, |ψH|1=H|0H|0H|0H|0H|1=14(|0+|1)(|0+|1)(|0+|1)(|0+|1)12(|0|1)=
=14(|0000+|0010+|0001+|0011+|1000+|1010+|1001+|1011+

+|0100+|0110+|0101+|0111+|1100+|1110+|1101+|1111)12(|0|1)=|ψ12(|0|1). Orakulas M:

M=12|tt|=12|10011001|.
M|ψ=|ψ22n|t=|ψ224|1001,

kur t yra ieškoma būsena. Tarkime, mes ieškome |1001> busenos. Tada perėjus per orakulą M |1001> busena bus pažymėta ženklu minus, jos amplitudė pasidarys neigiama:

t=2,

M|ψ12(|0|1)=(12|10011001|)|ψ12(|0|1)=(|ψ2|10011001|ψ)12(|0|1)=

=(|ψ224|1001)12(|0|1)=(|ψ12|1001)12(|0|1)=
=(14(|0000+|0010+|0001+|0011+|1000+|1010+|1001+|1011+
+|0100+|0110+|0101+|0111+|1100+|1110+|1101+|1111))12|1001)12(|0|1)=
=14(|0000+|0010+|0001+|0011+|1000+|1010|1001+|1011+
+|0100+|0110+|0101+|0111+|1100+|1110+|1101+|1111)12(|0|1).

Toliau Praleidžiame tik pirmus 4 kubitus pro B vartus:

t=3, B(|ψ12|1001)=(2|ψψ|1)(|ψ12|1001)=2|ψψ|ψ|ψ22|ψψ|1001+12|1001=
=2|ψ|ψ|ψ124+12|1001=|ψ14|ψ+12|1001=34|ψ+12|1001=
=116(3|0000+3|0010+3|0001+3|0011+3|1000+3|1010+3|1001+3|1011+
+3|0100+3|0110+3|0101+3|0111+3|1100+3|1110+3|1101+3|1111)+12|1001=
=116(3|0000+3|0010+3|0001+3|0011+3|1000+3|1010+11|1001+3|1011+
+3|0100+3|0110+3|0101+3|0111+3|1100+3|1110+3|1101+3|1111).

Kaip matome po perėjimo per B vartus, ieškomo elemento amplitudė pakilo ir sudaro 1116, o visų kitų elementų amplitudės yra 316.

15(316)2+(1116)2=1.

Tai reiškia, kad tikimybė išmatuoti |1001> yra (11/16)²=0.47265625 arba ~47 %.

Toliau vėl praleidžiame visus 5 kubitus pro orakulą M (penktas kubitas neparodytas, nes skaičiavimuose jis nieko nekeičia):

t=4, M(34|ψ+12|1001)=(12|10011001|)(34|ψ+12|1001)=
=34|ψ64|10011001|ψ+12|100122|10011001|1001=
=34|ψ32|1001124+12|1001|1001=34|ψ32|10011412|1001=
=34|ψ38|100112|1001=34|ψ78|1001=
=116(3|0000+3|0010+3|0001+3|0011+3|1000+3|101011|1001+3|1011+
+3|0100+3|0110+3|0101+3|0111+3|1100+3|1110+3|1101+3|1111).
15(3414)2+(31678)2=1.

Toliau pirmus 4 kubitus praleidžiame pro B vartus:

t=5,

B(34|ψ78|1001)=(2|ψψ|1)(34|ψ78|1001)=32|ψψ|ψ34|ψ74|ψψ|1001+78|1001=

=32|ψ34|ψ74|ψ124+78|1001=34|ψ74|ψ14+78|1001=34|ψ716|ψ+78|1001=
=516|ψ+78|1001

Tikimybė dabar išmatuoti |1001> yra (51614+78)2=(564+78)2=(5+7864)2=(6164)20.91 arba ~91 %.

15(51614)2+(6164)2=1.

Kadangi n=4, o N=2n=24=16, tai pagal idėja reikia padaryti 16=4 Groverio Iteracijas G. O dabar kol kas padarytos tik dvi groverio iteracijos. Taigi, toliau praleidžiame visus kubitus pro M vartus:

t=6, M(516|ψ+78|1001)=(12|10011001|)(516|ψ+78|1001)=
=516|ψ58|10011001|ψ+78|100174|10011001|1001=
=516|ψ58|100114+78|100174|1001=516|ψ532|100178|1001=
=516|ψ+57432|1001=516|ψ3332|1001.

Toliau praleidžiame pirmus keturis kubitus pro B vartus:

t=7, B(516|ψ3332|1001)=(2|ψψ|1)(516|ψ3332|1001)=
=58|ψψ|ψ516|ψ3316|ψψ|1001+3332|1001=58|ψ516|ψ3316|ψ14+3332|1001=
=516|ψ3364|ψ+3332|1001=543364|ψ+3332|1001=1364|ψ+3332|1001.

Tikimybė išmatuoti |1001> yra (136414+3332)2=(13256+3332)2=(13+338256)2=(251256)2=63001655360.961 arba ~96.1 %.

Toliau praleidžiame visus kubitus pro M vartus:

t=8, M(1364|ψ+3332|1001)=(12|10011001|)(1364|ψ+3332|1001)=
=1364|ψ+1332|10011001|ψ+3332|10013316|10011001|1001=
=1364|ψ+1332|100114+3332|10013316|1001=1364|ψ+13128|10013332|1001=
=1364|ψ+13334128|1001=1364|ψ119128|1001.

Toliau praleidžiame pirmus keturis kubitus pro B vartus:

t=9, B(1364|ψ119128|1001)=(2|ψψ|1)(1364|ψ119128|1001)=

=1332|ψψ|ψ+1364|ψ11964|ψψ|1001+119128|1001=1332|ψ+1364|ψ11964|ψ14+119128|1001=

=1364|ψ119256|ψ+119128|1001=134119256|ψ+119128|1001=171256|ψ+119128|1001.

Tikimybė išmatuoti |1001> yra (17125614+119128)2=(1711024+119128)2=(171+11981024)2=(7811024)2=60996110485760.582 arba ~58.2 %. Kaip matome po ketvirtos groverio iteracijos G=MB, ieškomo elemento (|1001>) aplitudė sumažėjo. Išvada, kad groverio iteracijas reikia nustoti daryti kada visos elementų amplitudės pasidaro neigiamos (-). Na ir bendra amplitude kaip visada lygi 1: 15(1711024)2+(7811024)2=1.

Groverio algoritmas kai N=8

Turime 4 kubitus, tris pirmi kubitai yra nuliai, o ketvirtas vienetas. Praleidžiame juos visus pro Hadamardo vartus:

t=1, |ψH|1=H|0H|0H|0H|1=123(|0+|1)(|0+|1)(|0+|1)12(|0|1)=
=122(|000+|001+|011+|111+|100+|110+|101+|010)12(|0|1).

Toliau visus 4 kubitus praleidžiame pro M vartus. Ketvirto kubito nerašome nes jis lieka nepakitęs. Tarkime mes ieškome |110>.

t=2,

M|ψ=M122(|000+|001+|011+|111+|100+|110+|101+|010)=(12|110110|)|ψ=

=|ψ2|110110|ψ=|ψ2|110123=|ψ2|110122=|ψ12|110=
=122(|000+|001+|011+|111+|100|110+|101+|010).

Toliau praleidžiame tik pirmus 3 kubitus pro B vartus:

t=3, B(|ψ12|110)=(2|ψψ|1)(|ψ12|110)=
=2|ψψ|ψ|ψ22|ψψ|110+12|110=
=2|ψ|ψ22|ψ122+12|110=
=|ψ24|ψ+12|110=
=12|ψ+12|110.
=12122(|000+|001+|011+|111+|100+|110+|101+|010)+12|110.
=142(|000+|001+|011+|111+|100+5|110+|101+|010).


Tikimybė išmatuoti |110> yra (542)2=2532=0.78125 arba apytiksliai 78 %.

7(142)2+2532=7(132)+2532=1.

Po dar vienos groverio iteracijos G=MB, tikimybė išmatuoti |110> bus ~0.945 arba 94.5 %.

Toliau vėl praleisime visus kubitus pro M vartus:

t=4, M(12|ψ+12|110)=(12|110110|)(12|ψ+12|110)=

=12|ψ22|110110|ψ+12|11022|110110|110=12|ψ122|110+12|11022|110=

=12|ψ+|110+2|1104|11022=12|ψ3|11022.

Toliau praleisime tris pirmus kubitus pro B vartus:

t=5, B(12|ψ3|11022)=(2|ψψ|1)(12|ψ3|11022)=
=|ψψ|ψ12|ψ32|ψψ|110+322|110=|ψ12|ψ32122|ψ+322|110=
=4|ψ2|ψ3|ψ4+322|110=14|ψ+322|110.

Tikimybė išmatuoti ieškomą buseną (|110>) yra:

(14122+322)2=(182+322)2=(1+3482)2=(1182)2=0.9453125 arba ~94.5 %.
7(182)2+(1182)2=7642+121128=7+121128=1.

Jeigu padarysime dar viena groverio iteracija G=MB, tai tikimybė išmatuoti |110> elementą bus (13162)20.330 arba ~33.0 %. Po M vartų visų elementų amplitudės pasidaro neigiamos (-), kas ir parodo, kad jau viršytas iteracijų G limitas.

Kiek Groverio iteracijų reikia?

Groverio algoritmui groverio iteracijų r reikia:

rπ2n42n
rπ2342.221441469
rπ244=π3.141592654

Bet iteracijos gali būti tik sveiki skaičiai. Bet kai kubitų labai daug, tai ieškomo elemento gavimo tikimybė yra labai aukšta ir pakanka to, kad iteracijos atliekamos sveikais skaičiais.


Skaičiuojant groverio iteracijas pagal formule:

rπ2n4

Rodyklė užsisuka už 90 laipsnių reikšmės, bet už tai gaunamas truputi tikslesnis atsakymas (visada?). O jeigu norima, kad rodyklė neužsisuktų už 90 laipsnių stataus kampo, tai tada reikės viena groverio iteracija r mažiau, bet atsakymas bus truputi mažiau tikslus:

r=arccos1N:(2arccosN1N)=π:(4arcsin1N)0.5

Laikoma, kad tokiu budu gautas iteracijų skaičius yra tikslus, nors gaunamas mažesnis teisigno atsakymo tikslumas. N=2n, kur n kubitų skaičius.

Teisingo atsakymo gavimo tikimybė

Reikia žinoti kampą:

θ=2arccos(112n)=2arcsin12n,

kur n yra kubitų skaičius. Tada galima surasti ieškomo elemento |t> amplitudę:

sin(2r+12θ)|t,

kur t yra ieškomas elementas, r yra groverio iteracijų skaičius. O tikimybė išmatuoti ieškomą elementą yra:

p=sin2(2r+12θ).

Visų likusių elementų amplitudė kartu sudėjus yra:

cos(2r+12θ)(|ψ12n|t).

O tikimybė išmatuoti klaidingą atsakymą (būseną) yra:

p=cos2(2r+12θ).


Pavyzdžiui, kai n=3:

θ=2arccos(1123)=2arccos0.8750.722734247.

Tikimybė išmatuoti ieškomą elementą yra:

p=sin2(22+120.722734247)=sin2(2.50.722734247)0.9722718242=0.9453125.


Pavyzdys, kai n=4:

θ=2arcsin1240.50536051.

Tikimybė išmatuoti ieškomą elementą yra:

p=sin2(23+120.50536051)=sin2(3.50.50536051)0.9804687520.961318969.

Groverio Iteracija

Vaizdas:Groveriteration.PNG
Groverio Iteracija: iš pradžių ieškomas elementas pažymimas neigiama amplitude, o paskui jo amplitudė apsukama apie vidurkį.

Norint paprastai ir greitai suskaičiuoti teisingo atsakymo gavimo tikimybę po vienos groverio iteracijos G, galima naudotis šia formule:

p=(3N4NN)2,

Kur N=2n, o n kubitų skaičius. Pavyzdžiui, kai N=8:

p=(38488)2=0.78125.

Kai N=16:

p=(31641616)2=0.47265625.

Kai N=1024:

p=(31024410241024)20.008766189.

Apytiksliai sužinoti teisingo atsakymo tikimybę po betkiek Groverio iteracijų galima pagal formulę: p=r22n, kur n yra kubitų skaičius, o r yra iteracijų skaičius. Bet ši formulė takityna tik kai kubitų ir iteracijų skaičius yra didelis (daugiau nei 100).

Jeigu kubitų yra daugiau negu užduoties, kurią reikia išspresti, kintamųjų arba tiek pat (mn), tada Groverio iteracijų skaičių r galima apytiksliai apskaičiuoti pagal formulę:

rM=2m=2m2,

o tikimybę p, pagal formulę:

pr22m,r2<2m,

kur m yra užduoties kintamųjų skaičius, o n yra kubitų skaičius.

Jeigu kubitų n yra mažiau negu kintamųjų m (elementų doumenų bazėje yra 2m), m>n, tai teisingo atsakymo tikimybė p gaunama pagal formulę:

p=2n2m=2n2m=r22m,

kur r yra Groverio iteracijų skaičius, r2<2n.

Groverio algoritmas su 2 kubitais (N=4)

Atsakymas gaunamas su 100 % tikimybe, nes:

rπ2n4=π224=π21.570796327
θ=2arcsin12n=2arcsin1221.047197551

Tikimybė išmatuoti ieškomą elementą yra:

p=sin2(2r+12θ)=sin2(21+121.047197551)=sin2(1.51.047197551)=12=1.

Pagal šią formulę, iteracijų skaičius yra sveikas skaičius (kaip beje ir teisingo atsakymo tikimybė):

r=π:(4arcsin122)0.5=3.14159265440.5235987750.5=1.50.5=1

Pavyzdžiui, surasime |01>: |00122(|0+|1)(|0+|1)=|ψ=12(|00+|01+|10+|11)(12|0101|)|ψ= =|ψ222|01=|ψ|01=12(|00|01+|10+|11)(2|ψψ|1)(|ψ|01)= =2|ψψ|ψ2|ψψ|01|ψ+|01=2|ψ222|ψ|ψ+|01=|01.

Groverio algoritmas bendru atveju

Turime |0n|1 įėjimą, kurį praleidžiame pro n+1 Hadamardo vartų:

12n+1x12n|x(|0|1)=|ψ12(|0|1)=|ψ|.
Toliau praleidžiame per funkciją |x|y|x|yf(x):
12n+1x12n|x(|0f(x)|1f(x))=12n+1x12n(1)f(x)|x(|0|1),
taigi, jeigu f(x)=1, tai ir yra ieškomas elementas ir jis pažimimas minuso ženklu "".

Nuorodos