L'algorithme de Grover est utilisé, entre autres, pour rechercher un élément 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.
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
La liste de longueur est .
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:
Cependant, l'entrée de l'algorithme de Grover n'est pas un état de qubits.
(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.
L'entrée de est maintenant un qubit vector , qui doit être une superposition de tous les éléments dans l'espace de recherche .
Nous savons
- correspond à ;
- correspond à ;
- correspond à ;
- correspond à qui est l'élément recherché;
- etc...
Dans ce cas, nous avons
Mais dans ce cas, notre oracle devrait implémenter la fonction
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?
la source
Réponses:
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
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
la source
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 xx x correspond à, 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.x x
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.x y=f(x) y=1 x f(x) x0
la source
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.
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.
la source
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:
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.
la source