Fonction d'Ackermann

De testwiki
Version datée du 21 novembre 2024 à 15:57 par imported>VVLLAACC (Applications pratiques : Catégorie:Page utilisant Lien pour un article existant)
(diff) ← Version précédente | Version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

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[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 « Modèle:Lang »[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

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

A(m,n)={n+1si m=0A(m1,1)si m>0 et n=0A(m1,A(m,n1))si m>0 et n>0.

Autrement dit :

A(0,n)=n+1
A(m+1,0)=A(m,1)
A(m+1,n+1)=A(m,A(m+1,n))

On montre alors que :

A(1,n)=2+(n+3)3
A(2,n)=2×(n+3)3
A(3,n)=2n+33
A(4,n)=22223 avec (n + 3) deux empilés, noté également 2(n+3)3 en utilisant la notation des puissances itérées de Knuth.
A(5,n)=2(2(2(2)))3 avec (n + 3) deux, également noté 2(n+3)3.

et plus généralement :

A(m,n)=2(m2)(n+3)3

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

{ϕ(m,n,0)=m+nϕ(m,0,p+1)=α(m,p)={0,si p=01,si p=1m,si p2ϕ(m,n+1,p+1)=ϕ(m,ϕ(m,n,p+1),p)

Elle satisfait aux égalités suivantes :

ϕ(a,b,0)=a+b
ϕ(a,b,1)=ab
ϕ(a,b,2)=ab

et, plus généralement[3], si fn est définie par

fn(c)=ϕ(a,c,n)

ϕ(a,b,n+1) est la Modèle:Math itérée de fn en α(a,n)

Table de valeurs

Valeurs de A(mn)
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

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à Modèle:Unité 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.

Modèle:Refnec 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

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 Modèle:Nowrap 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]Modèle:,[6].

Applications pratiques

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

Modèle:Références

Voir aussi

Articles connexes

Liens externes

Modèle:Portail

  1. Modèle:En Cristian Calude, Solomon Marcus et Ionel Tevy, « The first example of a recursive function which is not primitive recursive », Historia Mathematica, Modèle:Vol., Modèle:Numéro, 1979, Modèle:P..
  2. Modèle:Article, trad. : Modèle:En On the infinite et Modèle:Article.
  3. 3,0 3,1 et 3,2 Modèle:Article, p. 120
  4. Modèle:En H. G. Rice, « Recursion and Iteration », Com. A.C.M., vol. 8, 1965, p. 114-115 lire en ligne.
  5. 5,0 et 5,1 Erreur de référence : Balise <ref> incorrecte : aucun texte n’a été fourni pour les références nommées invack
  6. Modèle:Lien web.
  7. Modèle:En Yanhong A. Liu et Scott D. Stoller, « Optimizing Ackermann's Function by Incrementalization » Modèle:Pdf, Workshop on Partial Evaluation and Semantics Based Program Manipulation, 2003.