title: Algorithme de Bernstein-Vazirani
text: # Algorithme de Bernstein-Vazirani
  
  L'algorithme de Bernstein–Vazirani, qui résout le problème de Bernstein–Vazirani est un algorithme quantique inventé par Ethan Bernstein et Umesh Vazirani en 1992.
  
  C'est une version restreinte de l'algorithme de Deutsch-Jozsa dans laquelle, au lieu de distinguer deux classes de fonctions, on essaie de retrouver une chaîne secrète encodée dans une fonction. Il a été conçu pour prouver la distinction entre les classes de complexité BQP et BPP.
  
  ## Enoncé du problème
  
  Soit un oracle qui implémente une fonction $f\colon \{0,1\}^{n}\rightarrow \{0,1\}$ dans laquelle $f(x)$ est un produit scalaire entre $x$ et une chaîne secrète $s\in \{0,1\}^{n}$ modulo 2, $f(x)=x\cdot s=x_{1}s_{1}\oplus x_{2}s_{2}\oplus \cdots \oplus x_{n}s_{n}$. Quelle est la valeur de $s$ ?
  
  ## Algorithme
  
  En informatique "classique", la méthode la plus efficace pour retrouver la chaîne secrète consiste à évaluer la fonction $n$ fois avec comme valeurs d'entrée $x=2^{i}$ pour tout $i\in \{0,1,...,n-1\}$ :
  
  ${\begin{aligned}f(1000\cdots 0_{n})&=s_{1}\\f(0100\cdots 0_{n})&=s_{2}\\f(0010\cdots 0_{n})&=s_{3}\\&\,\,\,\vdots \\f(0000\cdots 1_{n})&=s_{n}\\\end{aligned}}$
  
  Avec un calculateur quantique, une seule requête sera suffisante :
  
  Appliquer une transformée de Hadamard aux $n$ qubits $|0\rangle ^{\otimes n}$ pour obtenir :
  
  ${\frac {1}{\sqrt {2^{n}}}}\sum _{x=0}^{2^{n}-1}|x\rangle .$
  
  Ensuite, appliquer l'oracle $U_{f}$ qui transforme $|x\rangle \to (-1)^{f(x)}|x\rangle$. Cela peut être simulé au moyen de l'oracle standard qui transforme $|b\rangle |x\rangle \to |b\oplus f(x)\rangle |x\rangle$ en appliquant l'oracle à ${\frac {|0\rangle -|1\rangle }{\sqrt {2}}}|x\rangle$ ($\oplus$ représente une addition modulo 2).
  
  Cela transforme la superposition en :
  
  ${\frac {1}{\sqrt {2^{n}}}}\sum _{x=0}^{2^{n}-1}(-1)^{f(x)}|x\rangle .$
  
  Une nouvelle transformée de Hadamard est appliquée à chaque qubit, de telle sorte que :
  
  * pour les qubits où $s_{i}=1$, l'état est converti de $|-\rangle$ à $|1\rangle$
  * pour les qubits où $s_{i}=0$, l'état est converti de $|+\rangle$ à $|0\rangle$
  
  Pour obtenir $s$, une mesure selon la base standard ($\{|0\rangle ,|1\rangle \}$) est effectuée sur les qubits.
  
  L'algorithme peut donc être représenté ainsi, où $H^{\otimes n}$ représente la transformée de Hadamard sur $n$ qubits :
  
      $|0\rangle ^{n}\xrightarrow {H^{\otimes n}} {\frac {1}{\sqrt {2^{n}}}}\sum _{x\in \{0,1\}^{n}}|x\rangle \xrightarrow {U_{f}} {\frac {1}{\sqrt {2^{n}}}}\sum _{x\in \{0,1\}^{n}}(-1)^{f(x)}|x\rangle \xrightarrow {H^{\otimes n}} {\frac {1}{2^{n}}}\sum _{x,y\in \{0,1\}^{n}}(-1)^{f(x)+x\cdot y}|y\rangle =|s\rangle$
  
  La raison pour laquelle l'état final est $|s\rangle$ est que, pour un $y$ donné :
  
  ${\frac {1}{2^{n}}}\sum _{x\in \{0,1\}^{n}}(-1)^{f(x)+x\cdot y}={\frac {1}{2^{n}}}\sum _{x\in \{0,1\}^{n}}(-1)^{x\cdot s+x\cdot y}={\frac {1}{2^{n}}}\sum _{x\in \{0,1\}^{n}}(-1)^{x\cdot (s\oplus y)}=1{\text{ si }}s\oplus y={\vec {0}},\,0{\text{ sinon}}.$
  
  Puisque $s\oplus y={\vec {0}}$ est vrai seulement quand $s=y$, cela signifie que la seule amplitude non nulle correspond à $|s\rangle$.
  
  