Fonction d'Ackermann

Dans la théorie de la récursivité, la fonction d'Ackermann (aussi appelée fonction d'Ackermann-Péter) est un exemple simple de fonction récursive non récursive primitive, trouvée en 1926 par Wilhelm Ackermann. Elle est souvent présentée sous la forme qu'en a proposée la mathématicienne Rózsa Péter, comme une fonction à deux paramètres entiers naturels comme arguments et qui retourne un entier naturel comme valeur, noté en général A(m, n).

Histoire 

Dans les années 1920, Wilhelm Ackermann et Gabriel Sudan, alors étudiants sous la direction de David Hilbert, étudient les fondements de la calculabilité. Sudan est le premier à donner un exemple de fonction récursive mais non récursive primitive, appelée alors fonction de Sudan. Peu après et indépendamment, en 1928, Ackermann publie son propre exemple de fonction récursive mais non récursive primitive. À l'origine, Ackermann considère une fonction ϕ(m, n, p) dépendant de trois variables.

Ackermann démontre que sa fonction ϕ est bien récursive, c'est-à-dire une fonction qu'un ordinateur idéalisé peut calculer. Dans Sur l'infini, David Hilbert conjecture que la fonction d'Ackermann n'est pas récursive primitive. Cette conjecture est établie par Ackermann lui-même dans son article «  ». Sur l'infini est l'article le plus important de Hilbert sur les fondements des mathématiques, servant de cœur à son programme pour fixer la base des nombres transfinis.

Une fonction de seulement deux variables est donnée plus tard par Rózsa Péter et Raphael Robinson ; c'est cette dernière qui est connue aujourd'hui sous le nom de fonction d'Ackermann.

Définition 

La fonction d'Ackermann-Péter est définie récursivement comme suit :

 

Autrement dit :

On montre alors que :

 avec (n + 3) deux empilés, noté également  en utilisant la notation des puissances itérées de Knuth. 
 avec (n + 3) deux, également noté .
et plus généralement :
 

Ackermann a initialement proposé cette fonction  à trois paramètres :

Elle satisfait aux égalités suivantes :

et, plus généralement, si  est définie par 

 est la  itérée de  en

Table de valeurs

Importance épistémologique 

La seule opération effectuée lors du déroulement de la fonction d'Ackermann est l'ajout de 1 (lorsque m est nul). Malgré cela, cette fonction croît extrêmement rapidement : A(4,2) a déjà  et représente bien plus que le nombre d'atomes estimé dans l'Univers. Cette extrême croissance peut être exploitée pour montrer que la fonction f définie par f(n) = A(n, n) croît plus rapidement que n'importe quelle fonction récursive primitive et ainsi que A n'en est pas une.

Cette fonction est néanmoins définissable par récursion primitive d'ordre supérieur (système T de Gödel et ses extensions). Elle est aussi calculable par une machine de Turing. La fonction d'Ackermann constitue donc un exemple de fonction récursive, mais non récursive primitive. C'est peut-être l'exemple le plus cité d'une telle fonction (en particulier chez Knuth).

La fonction d'Ackermann montre que la notion de calculabilité introduite par les seules fonctions récursives primitives ne correspond pas à la notion de calculabilité la plus générale, celle de la thèse de Church. En effet, la fonction d'Ackermann est calculable au sens de Turing et de Church, mais pas par une fonction récursive primitive.

 qu'il avait la complexité des fonctions récursives. Pour y apporter une preuve, le logicien Rice a proposé en 1965 un programme en Fortran (bien sûr non récursif) qui calculait la fonction d'Ackermann.

Réciproque 

L'inverse de la fonction d'Ackermann est aussi utilisée. Puisque la fonction f définie par f(n) = A(n,n) considérée précédemment croît réellement très vite, sa réciproque croît vraiment très lentement.
Elle apparaît notamment en algorithmique, pour exprimer des complexités. Dans ce domaine elle est souvent notée  On la trouve par exemple dans l'analyse de certaines structures de données comme l'Union-Find, dans un algorithme de calcul de l'arbre couvrant de poids minimal et en géométrie algorithmique. Elle peut être définie simplement sans faire appel à la fonction d'Ackermann, en définissant la hiérarchie inverse d'Ackermann (qui fait aussi apparaître le logarithme itéré).

Applications pratiques 

La fonction d'Ackermann demandant beaucoup de calculs même pour de petites entrées. Elle est parfois utilisée comme programme de test d'une implémentation d'un langage de programmation ; en particulier, elle utilise de façon très exigeante la récursivité, de même que ses consœurs fib (suite de Fibonacci) et tak (fonction de Takeuchi).

En plus de tester directement les performances d'un langage de programmation, la fonction d'Ackermann a été utilisée comme exemple pour étudier des transformations de programme et des optimisations, en particulier dans le domaine de la spécialisation de programmes et de l'.

Références

Voir aussi

Articles connexes 
 Explosion combinatoire
 Hyperopération
 Hiérarchie de croissance rapide

Liens externes 
 Implémentation dans divers langages de programmation sur rosettacode.org
 La course aux grands nombres de Scott Aaronson, traduit sur le blog smwhr, et sa version originale : Who can name the biggest number? (1999), un essai sur la notion de grand nombre.

Calculabilité
Ackermann
Grand nombre