Algorithme de Grover: où est la liste?


15

L'algorithme de Grover est utilisé, entre autres, pour rechercher un élément y dans une liste non ordonnée d'éléments de longueur . Même s'il y a beaucoup de questions ici concernant ce sujet, je manque toujours le point.[x0,x1,...,xn1]n

Recherche dans une liste, la manière classique

Normalement, je conçois une fonction de recherche de cette façon Je donne donc la liste et l'élément voulu en entrée, et je reçois la position de l'élément dans la liste en tant que sortie. Je pense avoir compris que les informations sur sont intégrées dans l'algorithme via la porte oracle , donc notre fonction devient Faisons un exemple pratique. Pensez à chercher l'as de pique de pique

search([x0,x1,...,xn1],y)=iNsuch that xi=y
yO
searchy([x1,x2,...,xn])=iNsuch that xi=y
1dans une séquence de 8 cartes d'un jeu standard de 52 cartes :

pont mélangé

La liste de longueur est .8[x0=J, x1=10, x2=4, x3=Q, x4=3, x5=1, x6=6, x7=6]

L'élément recherché est . Je devrais obtenir . Chaque carte peut être encodée avec bits, la liste a éléments donc nous avons besoin de bits pour encoder la liste. Dans ce cas, l'oracle implémentera la fonction: x5search(cards)=5log252=686×8=48O

f(x)={1,x=10,otherwise

Cependant, l'entrée de l'algorithme de Grover n'est pas un état de qubits.48

(NB: l'image du jeu mélangé est prise à partir d' ici )

Grover et son oracle

Plusieurs sources (par exemple ici - expliquées graphiquement) disent que l'entrée de l'algorithme est différente: l'entrée est un état pris dans l'espace de recherche où est le nombre d'éléments de la liste. Chaque numéro correspond à la position d'un élément dans la liste.S={0,1,2,...,N}={0,1,2,...,7}N

L'entrée de est maintenant un qubit vector , qui doit être une superposition de tous les éléments dans l'espace de recherche .search()log28=3|ψS

Nous savons

  • |03qubits=|000 correspond à ;J
  • |13qubits=|001 correspond à ;10
  • |23qubits=|010 correspond à ;4
  • |53qubits=|101 correspond à qui est l'élément recherché;1
  • etc...

Dans ce cas, nous avons Mais dans ce cas, notre oracle devrait implémenter la fonction

search(|ψ)=|53qubits
f(|ψ)={1,|ψ=|53qubits0,otherwise

La construction de l'oracle nécessite que nous sachions que est en position 5. Quel est l'intérêt d'exécuter l'algorithme si nous avons déjà recherché l'élément afin de construire l'oracle?


J'ai également du mal à comprendre l'avantage de l'algorithme de Grover. Supposons que j'ai N éléments dans la liste. A chaque appel à l'Oracle, a-t-il évalué toutes les N possibilités? Même si l'évaluation est très rapide mais si nous devons encore itérer sur toutes les configurations, alors la complexité de l'évaluation Oracle est O (N). Donc, l'algorithme de Grover ne semble pas être plus rapide que la recherche stupide. Est-ce correct?
Sanparith Marukatat

@SanparithMarukatat Ce n'est pas correct. Les éléments de votre liste sont les termes de la superposition de l'état impliqué dans la recherche. Lorsque Oracle fonctionne sur cet état, il compte comme une seule opération. La capacité de l'Oracle à marquer le terme recherché de votre superposition est une partie fondamentale de la vision de Grover. Pour comprendre l'algorithme de Grover, je vous recommande d'abord de comprendre comment ce marquage de l'état souhaité se produit. Ensuite, assurez-vous de comprendre le rôle de l'État dans l'Oracle. |
R. Chopin

Si vous comprenez cela, alors vous devriez étudier l'opérateur qui est capable d'augmenter l'amplitude du terme souhaité dans la superposition tout en diminuant l'amplitude des termes indésirables de la superposition. Pour moi, la façon la plus simple d'approcher Grover est de regarder l'opérateur inverse de la moyenne. (Certaines personnes prennent la vue géométrique, mais je ne la trouve pas aussi claire.)
R. Chopin

Réponses:


10

Si vous avez 8 éléments dans la liste (comme dans l'exemple de votre carte), alors l'entrée de l'oracle est de 3 (qu) bits. Le nombre de cartes dans le jeu (52) n'a pas d'importance, vous n'avez besoin que de 3 bits pour encoder 8 cartes.

Vous pouvez penser que 3 bits codent la position dans la liste de la carte que vous recherchez; alors vous ne connaissez pas la position, mais l'oracle sait. Donc, si vous recherchez l'as de pique, l'oracle sait que l'as de pique est la 6e carte (ou le 5e compte à partir de zéro) et implémente la fonction

f(x)={1,if x = 5, or binary '101'0,otherwise

PS: Il vaut mieux penser différemment à l'algorithme de Grover: vous avez un oracle implémentant une fonction booléenne qui génère pour une seule combinaison de bits d'entrée, sinon génère zéro, et votre tâche consiste à trouver la combinaison. Le problème a la même complexité que la recherche dans une liste ou une base de données non triée, c'est pourquoi l'algorithme de Grover est généralement décrit comme une recherche dans une base de données non triée. Mais l'application de l'algorithme à une recherche dans une base de données réelle soulève en effet des questions qui dépassent l'algorithme lui-même. L'algorithme de Grover cherche simplement ce que l'oracle sait.1


Oui désolé, que 6
provenait

2
Merci pour votre réponse. J'ai corrigé l'erreur. Quel est l'intérêt d'exécuter l'algorithme si pour construire l'oracle j'ai besoin de connaître la position de l'élément recherché?
incud

1
@incud En effet, cela n'a pas de sens. J'ai mis à jour la réponse.
kludg

" L'algorithme de Grover cherche simplement ce que l'oracle sait ": pas nécessairement. L'oracle peut rechercher uniquement certaines propriétés spécifiques de l'entrée, de sorte que le résultat obtenu à la fin contienne plus d'informations que celles encodées dans l'oracle itsef. Un exemple typique est la recherche dans un annuaire téléphonique. L'oracle "demande" un enregistrement attaché à un nom spécifique, mais une fois que l'enregistrement correct est trouvé, on obtient également les informations supplémentaires du numéro de téléphone attaché à cet enregistrement, qui n'était pas du tout codé dans l'oracle
glS

4

Bien qu'il soit peut-être plus facile pour nous de penser à la fonction de l'oracle comme ayant déjà calculé toutes ces valeurs, ce n'est pas ce qu'il fait. Dans le cas que vous avez décrit, l'oracle a 8 entrées possibles (c'est-à-dire encodées en 3 (qu) bits), et l'oracle effectue tous les calculs dont vous avez besoin à la volée . Donc, au moment où vous essayez d'évaluer l'oracle pour une valeur , l'oracle recherche (dans ce cas) la carte que la valeur de xxxcorrespond à, puis vérifie si cette carte est la carte marquée. L'idée étant que chaque fois que vous appelez l'oracle, il passe par ce processus une fois. Dans l'ensemble, vous évaluez la fonction un nombre de fois égal au nombre de fois que vous appelez l'oracle. Le but de tout algorithme de recherche est d'appeler cet oracle le moins de fois possible.

Dans le cas où cela semble un peu circulaire (étant donné une entrée , trouvez la carte qui correspond), rappelez-vous que votre table de recherche pour ce x correspond à quelle carte peut être commandée, ce qui est une question de recherche différente, plus simple et beaucoup plus rapide.xx

Les principales différences dans votre exemple par rapport à un scénario d'utilisation plus réaliste sont les suivantes:

  • L'espace de recherche est généralement immense. Il n'y a aucune perspective réaliste de précalculer toutes les valeurs. En effet, c'est exactement ce que nous essayons d'éviter.

  • Habituellement, nous ne disons pas réellement «trouver l'as de pique». Au lieu de cela, il y a un qui n'est pas trivial à évaluer pour tester si x est l'élément «marqué» ou non. Le fait que l'oracle puisse prendre assez de temps à évaluer, même pour une seule entrée, est ce qui fait de l'oracle la partie coûteuse à mettre en œuvre (et toutes les autres portes sont données gratuitement) et pourquoi vous devez minimiser le nombre d'appels .f(x)x

Donc, vraiment, la façon dont une recherche classique fonctionnerait sur votre problème est la suivante: choisissez un au hasard. Évaluez y = f ( x ) . Si y = 1 , retournez x , sinon répétez. Alors que l' effet net de f ( x ) est «est l'entrée x 0 , l'entrée marquée?», Ce n'est pas le calcul réel qu'il fait.xy=f(x)y=1xf(x)x0


2

La question est finalement: "Quel est l'intérêt d'exécuter l'algorithme si nous avons déjà recherché l'élément pour construire l'oracle?"

Alors que quelqu'un a construit l'oracle, ce n'est peut-être pas la personne qui utilise l'oracle.

size of list

Nous demandons à l'oracle: quelle est la réponse qu'il a déjà à la question qu'il a déjà? Même Mateus et Omar demanderaient le "symbole oracle-pour-un-alphabet particulier" pendant l'exécution, quelles sont les positions de son symbole dans la chaîne qu'il a déjà compilée? L'oracle donnera la réponse à notre requête après une seule consultation, mais dans cette histoire, il ne peut par exemple pas simplement écrire la réponse sous forme de chaîne binaire et nous l'envoyer via un canal de communication classique. Il cachera sa réponse dans une superposition pour que nous puissions la tirer.

Je laisse la fantaisie ou la métaphore s'enfuir dans ce morceau suivant: nous n'entendons pas tout à fait la réponse la première fois, et nous devons demander à l'oracle de répéter la même réponse encore et encore jusqu'à ce que nous soyons sûrs de ce que l'oracle a dit, sauf que nous commençons à halluciner de la désinformation dans le processus de diffusion si nous demandons trop de fois.


2

Compte tenu de l'oracle que vous avez fourni, la recherche est en effet inutile. Cependant, cet oracle manque le point de l'algorithme de Grover, car la recherche d'une carte dans un jeu de cartes n'est pas une recherche non structurée car, comme vous l'avez dit, vous connaissez déjà l'ordre. Ergo, votre recherche est structurée. La raison pour laquelle cet oracle est utilisé est qu'il démontre comment Grover peut être appliqué sans avoir à discuter d'un oracle qui rendrait Grover utile parce qu'un tel oracle serait plus compliqué que précieux. Par conséquent, un meilleur oracle pour démontrer l'utilité de Grover pourrait être quelque chose comme:

f(x)={1,x[0,,3]+x[4,,7]=10100,otherwise

Ce que cet oracle implique, c'est que vous avez une recherche à 8 qubits où vous prenez les quatre premiers qubits et les ajoutez aux quatre seconds qubits et retournez M si l'addition fait 10 (1010 en binaire). La différence entre cet oracle et celui que vous avez fourni est que cet oracle teste un modèle (les opérandes s'ajoutent-ils à 10) tandis que le vôtre teste l'égalité (est-ce l'indice 5). Cet oracle est beaucoup plus difficile à construire, mais il exploite la véritable puissance de Grover, qui est, par essence, une recherche par force brute où votre oracle définit l'espace de recherche.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.