On circonscrit la puissance des algorithmes, et certains problèmes sont démontrés indécidables : aucun algorithme n’existe pour les résoudre. En 1970, Julia Robinson et Youri Matiiassevitch résolvent finalement le dixième problème de Hilbert : la résolution des équations diophantiennes est un problème indécidable !
Au cours des années 1970, on établit des hiérarchies de problèmes en fonction du temps et de l’espace qu’un algorithme requiert pour les résoudre : c’est la théorie de la complexité.
Comment se présente un algorithme ?
Les algorithmes sont souvent comparés à des recettes de cuisine : une suite d’instructions précises permettant d’obtenir un résultat en un nombre fini d’étapes.
Cette image est juste, mais occulte sans doute un aspect fondamental, le fait qu’un algorithme reçoit des données à traiter (nombres, texte, relations), et certaines instructions sont conditionnelles : les étapes suivies dépendent de ces données, et les exécutions peuvent suivre un cours difficilement prévisible. On peut donner ces instructions sous différentes formes bien définies (organigramme, langage de description), ou même, avec les précautions de rigueur, en langage naturel.
Nous avons tous appris l’algorithme de multiplication de deux nombres à l’école primaire, sans l’aide d’un formalisme avancé. Les algorithmes sont en principe destinés à être mis en œuvre sous forme de programme, dans un langage de programmation compréhensible par un ordinateur. Mais l’algorithme existe indépendamment de cette traduction.
Pour cerner la portée des algorithmes dans nos vies modernes, il faut distinguer leurs familles
Pour mieux comprendre les enjeux et les défis actuels autour des algorithmes, il est important de cerner leur portée et les propriétés que nous sommes à même de garantir sur leurs résultats et leurs comportements. Une typologie des algorithmes est indispensable à cette compréhension.
On peut d’abord distinguer une famille d’algorithmes tellement omniprésents dans notre quotidien qu’ils y sont presque devenus invisibles. Il s’agit d’algorithmes exacts pour des tâches parfaitement bien définies, dont le résultat est facilement vérifiable : multiplier deux nombres, trier une liste de noms par ordre alphabétique, stocker et retrouver efficacement une information, effectuer la conversion d’un signal analogique vers un signal numérique, interpréter un programme.
l s’agit là des algorithmes fondamentaux étudiés depuis les balbutiements des sciences informatiques. Ils ne font pas moins pour autant l’objet de recherches actuelles, tant des mystères subsistent autour de la complexité de certaines opérations fondamentales. La complexité exacte du problème de multiplication de deux nombres entiers, par exemple, est d’un point de vue théorique encore ouverte : nous sommes actuellement incapables de démontrer que la multiplication prend nécessairement plus de temps que l’addition ! Le meilleur algorithme de multiplication connu n’a été publié que très récemment.