Algoritmo di Bernstein-Vazirani

Da testwiki.
Vai alla navigazione Vai alla ricerca
Circuito quantistico dell'algoritmo

L'algoritmo di Bernstein–Vazirani, che risolve il problema di Bernstein–Vazirani è un algoritmo quantistico inventato da Ethan Bernstein e Umesh Vazirani nel 1992.[1] Si tratta di un caso particolare dell'algoritmo di Deutsch-Jozsa dove invece di distinguere due diverse classi di funzioni, cerca di conoscere una stringa codificata in una funzione.[2] L'algoritmo di Bernstein–Vazirani fu ideato per dimostrare una separazione degli oracoli tra le classi di complessità BQP e BPP.

Enunciato del problema

Dato un oracolo che implementa una funzione f:{0,1}n{0,1} in cui f(x) è il prodotto scalare modulo 2 tra x e una stringa segreta s{0,1}n , f(x)=xs=x1s1+x2s2++xnsn, trovare s.

Algoritmo

Classicamente, il metodo più efficiente per trovare la stringa segreta è valutare la funzione n volte con i valori di input x=2i per ogni i{0,1,...,n1}:[2]

f(10000n)=s1f(01000n)=s2f(00100n)=s3f(00001n)=sn

In contrasto alla soluzione classica che necessita di almeno n chiamate alla funzione per trovare s, usando la computazione quantistica, solo una chiamata è necessaria. L'algoritmo quantistico è il seguente:[2]

Si comincia dallo stato a n qubit |0n, su cui si applica la porta di Hadamard per ottenere

12nx=02n1|x.

Dopo, si applica l'oracolo Uf che trasforma lo stato |x(1)f(x)|x. Questo effetto si ottiene dalla trasformazione |b|x|bf(x)|x ( denota la somma mod 2.) dove lo stato su cui si copia la funzione è

|b=|0|12.

Questo trasforma la sovrapposizione in

12nx=02n1(1)f(x)|x.

Si applica un'altra trasformata di Hadamard a ogni qubit. Essa, per i qubit dove si=1, trasforma lo stato da | a |1 e per i qubit dove si=0, trasforma lo stato da |+ a |0. Per ottenere s, viene fatta una misura nella base standard ({|0,|1}) sui qubit.

Graficamente, l'algoritmo può essere rappresentato dal seguente diagramma, dove Hn denota la porta di Hadamard su n qubit:

|0nHn12nx{0,1}n|xUf12nx{0,1}n(1)f(x)|xHn12nx,y{0,1}n(1)f(x)+xy|y=|s

Il motivo per cui l'ultimo stato è |s è perché, per una particolare y,

12nx{0,1}n(1)f(x)+xy=12nx{0,1}n(1)xs+xy=12nx{0,1}n(1)x(sy)=1 se sy=0,0 altrimenti.

Siccome sy=0 è vera solo per s=y, ciò significa che l'unica ampiezza non nulla è su |s. Quindi, misurando l'output del circuito nella base standard, si ottiene con certezza la stringa segreta s.

Note

Template:Portale