Aller au contenu principal

Recherche non structurée

Résumé

Nous commencerons par une description du problème que résout l'algorithme de Grover. Comme d'habitude, nous noterons Σ={0,1}\Sigma = \{0,1\} l'alphabet binaire tout au long de cette discussion.

Supposons que

f:ΣnΣf:\Sigma^n \rightarrow \Sigma

soit une fonction de chaînes binaires de longueur nn vers des bits. Nous supposerons que nous pouvons calculer cette fonction efficacement, mais qu'elle est par ailleurs arbitraire et que nous ne pouvons pas compter sur le fait qu'elle possède une structure particulière ou une implémentation spécifique qui nous convient.

Ce que fait l'algorithme de Grover, c'est rechercher une chaîne xΣnx\in\Sigma^n pour laquelle f(x)=1.f(x) = 1. Nous appellerons de telles chaînes des solutions au problème de recherche. S'il y a plusieurs solutions, l'une quelconque d'entre elles est considérée comme une sortie correcte, et s'il n'y a pas de solutions, une réponse correcte nécessite que nous signalions qu'il n'y a pas de solutions.

Cette tâche est décrite comme un problème de recherche non structurée car on ne peut pas compter sur le fait que ff possède une structure particulière pour la faciliter. Nous ne recherchons pas dans une liste ordonnée, ni dans une structure de données spécifiquement conçue pour faciliter la recherche ; nous cherchons essentiellement une aiguille dans une botte de foin.

Intuitivement, nous pouvons imaginer que nous avons un circuit booléen extrêmement complexe qui calcule f,f, et que nous pouvons facilement exécuter ce circuit sur une chaîne d'entrée sélectionnée si nous le choisissons. Mais parce que le circuit est si complexe, nous n'avons aucun espoir de comprendre le circuit en l'examinant (au-delà d'avoir la capacité de l'évaluer sur des chaînes d'entrée sélectionnées).

Une façon d'effectuer cette tâche de recherche classiquement est de simplement itérer sur toutes les chaînes xΣn,x\in\Sigma^n, en évaluant ff sur chacune pour vérifier si c'est une solution ou non. Désormais, écrivons

N=2nN = 2^n

par commodité. Il y a NN chaînes dans Σn,\Sigma^n, donc itérer sur toutes nécessite NN évaluations de f.f. En supposant que nous sommes limités à évaluer ff sur des entrées choisies, c'est le mieux que nous puissions faire avec un algorithme déterministe si nous voulons garantir le succès. Avec un algorithme probabiliste, nous pourrions espérer gagner du temps en choisissant aléatoirement des chaînes d'entrée pour f,f, mais nous aurons quand même besoin de O(N)O(N) évaluations de ff si nous voulons que cette méthode réussisse avec haute probabilité.

L'algorithme de Grover résout ce problème de recherche avec haute probabilité avec seulement O(N)O(\sqrt{N}) évaluations de f.f. Pour être clair, ces évaluations de fonctions doivent se produire en superposition, de façon similaire aux algorithmes de requêtes discutés dans la leçon Algorithmes de requêtes quantiques, notamment l'algorithme de Deutsch, l'algorithme de Deutsch-Jozsa et l'algorithme de Simon. Contrairement à ces algorithmes, l'algorithme de Grover adopte une approche itérative : il évalue ff sur des superpositions de chaînes d'entrée et entremêle ces évaluations avec d'autres opérations qui ont pour effet de créer des patterns d'interférence, menant à une solution avec haute probabilité (si elle existe) après O(N)O(\sqrt{N}) itérations.

Énoncé formel du problème

Nous allons formaliser le problème que résout l'algorithme de Grover en utilisant le modèle de calcul par requêtes. C'est-à-dire que nous supposerons avoir accès à la fonction f:ΣnΣf:\Sigma^n\rightarrow\Sigma par l'intermédiaire d'une porte de requête définie de la manière habituelle :

Uf(ax)=af(x)xU_f \bigl( \vert a\rangle \vert x\rangle \bigr) = \vert a \oplus f(x) \rangle \vert x \rangle

pour tout xΣnx\in\Sigma^n et aΣ.a\in\Sigma. C'est l'action de UfU_f sur les états de base standard, et son action en général est déterminée par linéarité.

Comme il a été discuté dans la leçon Fondements algorithmiques quantiques, si nous avons un circuit booléen pour calculer f,f, nous pouvons transformer cette description de circuit booléen en un circuit quantique implémentant UfU_f (en utilisant un certain nombre de qubits d'espace de travail qui commencent et terminent le calcul dans l'état 0\vert 0\rangle). Ainsi, bien que nous utilisions le modèle de requêtes pour formaliser le problème que résout l'algorithme de Grover, il n'est pas limité à ce modèle ; nous pouvons exécuter l'algorithme de Grover sur toute fonction ff pour laquelle nous avons un circuit booléen.

Voici un énoncé précis du problème, nommé Recherche car nous cherchons une solution, c'est-à-dire une chaîne xx qui fait que ff s'évalue à 1.1.

Recherche

Entrée : une fonction f:ΣnΣf:\Sigma^n\rightarrow\Sigma
Sortie : une chaîne xΣnx\in\Sigma^n satisfaisant f(x)=1,f(x) = 1, ou « aucune solution » si aucune telle chaîne xx n'existe

Remarque que ce n'est pas un problème de promesse — la fonction ff est arbitraire. Il sera toutefois utile de considérer la variante de promesse suivante du problème, où il est garanti qu'il y a exactement une solution. Ce problème est apparu comme exemple de problème de promesse dans la leçon Algorithmes de requêtes quantiques.

Recherche unique

Entrée : une fonction de la forme f:ΣnΣf:\Sigma^n \rightarrow \Sigma
Promesse : il y a exactement une chaîne zΣnz\in\Sigma^n pour laquelle f(z)=1,f(z) = 1, avec f(x)=0f(x) = 0 pour toutes les chaînes xzx\neq z
Sortie : la chaîne zz

Remarque également que le problème Ou mentionné dans la même leçon est étroitement lié à Recherche. Pour ce problème, l'objectif est simplement de déterminer si une solution existe ou non, par opposition à trouver effectivement une solution.