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
[modifier | modifier le code]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[1]. À 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[2], 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 « Zum Hilbertschen Aufbau der reellen Zahlen »[3]. 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
[modifier | modifier le code]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[3] :
Elle satisfait aux égalités suivantes :
et, plus généralement[3], si est définie par
est la bième itérée de en
Table de valeurs
[modifier | modifier le code]m\n | 0 | 1 | 2 | 3 | 4 | n |
---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | n + 1 |
1 | 2 | 3 | 4 | 5 | 6 | n + 2 |
2 | 3 | 5 | 7 | 9 | 11 | 2n + 3 |
3 | 5 | 13 | 29 | 61 | 125 | 2n + 3 − 3 |
4 | 13 | 65533 | 265536 − 3 | A(3, 265536 − 3) | A(3, A(4, 3)) | 22...2 − 3 (n + 3 termes) |
5 | 65533 | A(4, 65533) | A(4, A(5, 1)) | A(4, A(5, 2)) | A(4, A(5, 3)) | A(4, A(5, n-1)) |
6 | A(5, 1) | A(5, A(5, 1)) | A(5, A(6, 1)) | A(5, A(6, 2)) | A(5, A(6, 3)) | A(5, A(6, n-1)) |
Importance épistémologique
[modifier | modifier le code]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à 19 729 chiffres 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.
D'un point de vue historique, les premiers programmeurs qui utilisaient Fortran affirmaient sans preuve[réf. nécessaire] 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[4].
Réciproque
[modifier | modifier le code]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 [5]. 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[5]. 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é)[5],[6].
Applications pratiques
[modifier | modifier le code]La fonction d'Ackermann demande 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'évaluation partielle[7].
Références
[modifier | modifier le code]- (en) Cristian Calude, Solomon Marcus et Ionel Tevy, « The first example of a recursive function which is not primitive recursive », Historia Mathematica, vol. 6, no 4, 1979, p. 380-384.
- (de) David Hilbert, « Über das Unendliche », Mathematische Annalen, vol. 95, , p. 161-190 (lire en ligne), trad. : (en) On the infinite et « Sur l'infini », Acta Mathematica, vol. 48, nos 1-2, , p. 91-122 (DOI 10.1007/BF02629757).
- (de) Wilhelm Ackermann, « Zum Hilbertschen Aufbau der reellen Zahlen », Mathematische Annalen, vol. 99, , p. 118-133 (lire en ligne), p. 120
- (en) H. G. Rice, « Recursion and Iteration », Com. A.C.M., vol. 8, 1965, p. 114-115 lire en ligne.
- Gabriel Nivasch, « Inverse Ackermann without pain », .
- Raimund Seidel, « Understanding the inverse Ackermann function », sur 22nd European Workshop on Computational Geometry, .
- (en) Yanhong A. Liu et Scott D. Stoller, « Optimizing Ackermann's Function by Incrementalization » [PDF], Workshop on Partial Evaluation and Semantics Based Program Manipulation, 2003.
Voir aussi
[modifier | modifier le code]Articles connexes
[modifier | modifier le code]Liens externes
[modifier | modifier le code]- 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.