Maths, Informatique, Jeux
Site Web réalisé par Frédéric et François WANG
Répertoire principalMathsNos DemosDémonstrations et algorithmes : infiniment longs ou impossibles ?
TIPE 2005-2006 : le temps
DELISLE Jean-Baptiste - WANG Frédéric - FRETON Loïc

Démonstrations et algorithmes : infiniment longs ou impossibles ?

Introduction

De nombreux énoncés mathématiques et problèmes algorithmiques ont mis longtemps à être résolus tandis que certains formulés depuis un certain temps attendent encore une solution. Les efforts de formalisme du siècle dernier ont permis de mieux comprendre ce phénomène en montrant notamment l'existence de propositions indécidables au sein d'une théorie assez forte pour formaliser l'arithmétique. Par la suite, de nombreux résultats d'indépendance ont alors été obtenus. En outre, on sait que certains algorithmes ne peuvent exister. Tout cela amène à la question suivante pour tout problème mathématique : la démonstration (respectivement l'existence ou la preuve de la terminaison) de cette conjecture ou de sa négation (respectivement de cet algorithme) est elle possible ?

1. Un cadre de travail

Avant d'étudier des exemples d'impossibilités dans des problèmes mathématiques, il faut se fixer un cadre de travail. Étudions brièvement deux aspects : l'impossibilité de prouver une proposition d'une part, et celle de résoudre un problème via un algorithme d'autre part.

1.1. Logique

1.1.1. Présentation de la logique du premier ordre

De façon générale, une logique comporte une notion de prouvabilité (ensemble d'axiomes et de règles de déduction) et de validité (interprétation d'une formule dans un contexte). Celle qui nous intéresse plus particulièrement est la logique du premier ordre non seulement parce qu'elle permet de formaliser la théorie des ensembles pouvant elle-même traiter de la majorité des autres théories mathématiques, mais aussi parce qu'elle dispose d'une correspondance entre prouvabilité et validité.
Les formules de la logique du premier ordre comportent les symboles de logiques usuels, auquels on peut ajouter, selon la structure étudiée, des symboles de constantes, de relations, d'opérations.
On dispose aussi d'un nombre dénombrable de termes x1, x2... que l'on peut mettre dans les formules, et qui représentent uniquement les éléments d'une certaine collection d'objets mathématiques. Autrement dit, on ne peut a priori pas utiliser de terme pour représenter un "ensemble d'éléments".
Exemple 1.1.1.1
∀ x1 ∀ x2 ∃ x3 (x3 < 0 ∧ x1 + x3 < x2)
Ici, la formule comporte :
Fixant un ensembles d'axiomes et de règles de déduction on peut engendrer de nouvelles formules dites "prouvables". La plupart de ces manipulations possibles sur les formules prouvables constituent des procédés connus mais on cite tout de même pour la suite le théorème suivant :
Théorème 1.1.1.2 (théorème de déduction)
Soient T un ensemble de formules du premier ordre et F, G des formules du premier ordre avec F sans variable libre. Alors T prouve F ⇒ G si et seulement si T ⋃ {F} prouve G.
Les formules seules sont dépourvues de sens. Néanmoins, disposant d'un domaine muni de relations et d'opérations, on peut interpréter les formules : ainsi celle de l'exemple 1.1.1.1 est interprétable dans les structures (ℝ, 0, +, <) et (ℕ, 0, +, <) où elle est respectivement vraie et fausse. Une formule vraie dans toutes les structures où elle est interprétable est dite valide. On a alors le résultat fondamental de la logique du premier ordre qui justifie son emploi :
Théorème 1.1.1.3
Une formule du premier ordre est prouvable si et seulement si elle est valide.
Comme pour un choix de signature (constantes, opérations et relations) donné, les structures où les formules sont interprétables sont très variées et n'ont a priori pas du tout les même propriétés, il doit exister des formules non valides donc non prouvables. C'est ce que l'on a constaté pour la formule précédente et cela est normal puisque les axiomes de la logique sont très généraux : si on se donne une structure quelconque ils ne sont pas a priori adaptés...
Par contre on peut se donner une théorie T, c'est-à-dire un ensemble de formules sans variable libre que l'on pose comme vraies dans cette structure (appelée alors modèle de T), qui permettrait de prouver d'autres propositions. Par exemple les sytèmes de Peano et ZFC formalisent respectivement l'arithmétique et la théorie des ensembles. L'espoir est donc de trouver un système T assez fort pour pouvoir trouver toutes les formules vraies (et exprimables au premier ordre) dans la structure considérée. Une autre propriété importante est la suivante :
Définition 1.1.1.4 (consistant)
Un ensemble T de formules du premier ordre est consistant si et seulement si il n'existe pas de formule F telle que T prouve à la fois F et ¬F.
Il va sans dire que toute théorie mathématique étant censée représenter une structure ayant des propriétés bien déterminées, elle se doit d'être consistante. Ceci constitue donc une autre condition pour notre théorie « idéale ».

1.1.2 Les théorèmes de Gödel

Dans cette partie, nous allons présenter brièvement les théorèmes de Gödel qui mettent fin aux espoirs exprimés dans le paragraphe précédent. Nous ne détaillerons pas les démonstrations qui sont techniques mais nous nous contenterons de donner le schéma général. Pour un exposé plus complet, nous renvoyons à (2) dont nous avons tiré les idées principales.
L'idée est d'utiliser ce que l'on appelle un argument diagonal (autoréférence et négation) pour faire dire à une proposition qu'elle n'est pas prouvable dans notre théorie. Si la proposition était prouvable on arriverait à une contradiction et donc elle est effectivement indémontrable : elle est donc à la fois vraie mais non prouvable dans notre système. En allant plus loin, on montre que la théorie ne peut prouver sa propre consistance car sinon elle prouverait la proposition précédente.
Pour exprimer tout ceci, on utilise l'arithmétique, plus précisément un système faible de l'arithmétique formalisé au premier ordre que l'on notera ici PA- sans la décrire explicitement. La signature utilisée contient donc les symboles de l'arithmétique, en particulier l'opération successeur noté S : on note Sn 0 le terme S(S(S(...S(0)...))) où S apparait n fois. On montre qu'un tel système peut coder les notions syntaxiques en attribuant à chaque objet un numéro (que l'on notera ici avec des crochets) :
Une fois une telle numérotation mise en place, on montre que la syntaxe de la logique du premier ordre peut être exprimée à l'aide d'applications d'un ensemble ℕp dans ℕ particulières appelées fonctions récursives. On montre ainsi l'existence des fonctions récursives suivantes de ℕ2 dans ℕ (T désigne une théorie contenant PA-) :
En outre, on montre que toute fonction récursive est représentable dans une théorie T formalisant l'arithmétique par des formules du premier ordre particulières dites de complexité Σ1. Pour les fonctions f précédente, on entend par représentable le fait qu'il existe une formule à trois variables libres F telle que pour tous n1, n2 dans ℕ, si m = f(n1, n2), T prouve les deux énoncés suivant :
On notera avec une majuscule Subst, PreuveT et Oppose les formules Σ1 correspondantes. Par ailleurs, on en déduit deux nouvelles formules :
L'intérêt de la représentabilité par les formules Σ1 est qu'une condition suffisante pour qu'une formule de complexité Σ1 sans variable libre soit prouvable par PA- est qu'elle soit vraie dans ℕ. On admettra toute cette partie technique et on revient maintenant à la démonstration des théorèmes de Gödel.
Lemme 1.1.2.1 (lemme diagonal)
Pour toute formule F, il existe une formule ΔF telle que PA- prouve ΔF ⇔ F(S[¬ΔF] 0)
Démonstration
On pose G(x) la formule (∃ z)(Subst(x, x, z) ∧ F(z)), n = [¬G] et ΔF la formule G(Sn 0). On rappelle qu'en vertu du théorème 1.1.1.3 pour montrer que PA- prouve l'équivalence, il suffit de montrer que celle-ci est satisfaite dans tous ses modèles.
Par construction, subst(n,n) = [¬ G(Sn 0)] = [¬ ΔF]. Cette formule étant représentée par la formule Subst de complexité Σ1, on sait que PA- prouve :
  1. Subst(Sn 0, Sn 0, S[¬ ΔF] 0)
  2. ∀x, Subst(Sn 0, Sn 0, x) ⇒ x = S[¬ ΔF] 0
Soit M un modèle de PA- satisfaisant ΔF. Alors il existe dans son domaine un élément c tel que Subst(Sn 0, Sn 0, c) et F(c). Par le théorème 1.1.1.3, la deuxième formule que PA- prouve est satisfaite par M, ce qui signifie que c n'est autre que l'interprétation dans M de S[¬ ΔF] 0. D'où la première implication puisque M satisfait aussi F(c).
Réciproquement soit M un modèle de PA- satisfaisant F(S[¬ΔF] 0). Une nouvelle fois par le théorème 1.1.1.3, la première formule que PA- prouve est satisfaite par M. Soit alors c l'interprétation dans M de S[¬ ΔF] 0. M satisfait Subst(Sn 0, Sn 0, c) et F(c) donc a fortiori la formule (∃ z)(Subst(Sn 0, Sn 0, z) ∧ F(z)), c'est-à-dire ΔF.
Théorème 1.1.2.2 (Gödel, premier théorème d'incomplètude)
Pour tout ensemble de formules du premier ordre consistant T contenant PA-, il existe une formule vraie dans ℕ mais non prouvable par T.
Démonstration
On note E la formule ΔProuvableT (on admet ici que ProuvableT étant Σ1, E l'est aussi). Supposons que T prouve ¬E. Dans ce cas, soit m le numéro d'une suite de formules constituant une preuve de ¬E à partir de T. Cela signifie que preuve([¬E], m) = 1, c'est-à-dire Preuve([¬E], m, 1 ) est vraie dans ℕ donc par le théorème 1.1.1.3, PA- prouve Preuve(S[¬E] 0, Sm 0, S(0)) donc a fortiori ∃y PreuveT(S[¬E] 0, y, S(0)) c'est-à-dire ProuvableT(S[¬E] 0). Par le lemme diagonal cela signifie que PA- prouve E. Du coup T (contenant PA-) prouverait à la fois E et ¬E et serait inconsistante.
Si ℕ satisfait l'énoncé E, celui-ci étant de complexité Σ1, il est prouvable par PA-. Par le lemme diagonal, PA- prouve alors ProuvableT(S[¬E] 0) puis par le théorème 1.1.1.3, ℕ satisfait ProuvableT([¬E]) c'est-à-dire qu'il existe m dans ℕ tel que PreuveT([¬E], m) soit vrai. Cela signifie que la suite de formules de numéro m constitue une preuve de ¬E à partir de T. Ainsi T prouve ¬E d'où par le théorème 1.1.1.3, ℕ satisfait ¬E, ce qui est contradictoire.
Finalement ℕ ne peut que satisfaire la formule ¬E qui n'est pas prouvable par T.
Théorème 1.1.2.3 (Gödel, second théorème d'incomplètude)
Aucune théorie "assez forte" ne peut prouver sa consistance.
Démonstration
Par assez forte on entend formalisant au moins l'arithmétique (c'est-à-dire contenant PA-) mais aussi prouvant les implications F ⇒ ProuvableT(S[F] 0) pour F une formule sans variable libre de complexité Σ1 donc en particulier pour F = E. On montre en particulier que l'arithmétique du premier ordre PA1 est une telle théorie.
Soit donc T une théorie satisfaisant les conditions précédentes, alors par le théorème de déduction, T ⋃ {E} prouve ProuvableT(S[E] 0). Cependant par le lemme diagonal, on a aussi PA-, donc à fortiori T, qui prouve E ⇒ ProuvableT(S[¬E] 0) puis une nouvelle fois par le théorème de déduction, T ⋃ {E} prouve ProuvableT(S[¬E] 0) . De surcroît, oppose([E], [¬E]) = 1 c'est-à-dire ℕ satisfait l'énoncé Oppose([E], [¬E], 1) qui étant de complexité Σ1 entraine la prouvabilité par PA-, donc par T, de Oppose(S[E] 0, S[¬E] 0, S(0)).
On a finalement T ⋃ {E} qui prouve ¬ConsT. Donc par le théorème de déduction T prouve l'implication E ⇒ ¬ConsT ainsi que sa contraposée ConsT ⇒ ¬E. Donc si T prouvait ConsT, c'est-à-dire sa consistance, elle prouverait aussi ¬E, contredisant la démonstration du théorème 1.1.2.2.
Si on y réfléchit bien le second théorème exprime une idée naturelle à savoir qu'un système ne peut juger de sa propre non-contradiction... sans risquer de se contredire. Il n'intervient donc pas vraiment en pratique, d'autant plus qu'au premier ordre on montre que la consistance d'une théorie équivaut à l'existence d'un modèle pour celle-ci. Ainsi croire à la non contradiction d'un système revient à croire en l'existence des objets mathématiques dont elle traite.
Quant au premier théorème il indique que l'on ne peut pas trouver de théorie assez forte pour décrire entièrement toutes les propriétés d'une structure. Cependant, vue la formule utilisée en guise de contre-exemple, on pourrait penser qu'une telle situation ne pourrait se produire pour des énoncés mathématiques "classiques". Toutefois on montrera dans la partie 2 que des énoncés aussi simple que la convergence d'une suite peuvent poser ce problème.

1.2 Algorithmique

1.2.1 Présentation du modèle de machine de Turing

Pour définir la notion d'algorithme on utilise habituellement un modèle théorique appelé « maching de Turing » simulant le comportant d'un programme. En résumé, une maching de Turing se compose d'une liste infinie de cases mémoire (dont les états initiaux représentent les paramètres reçus par le programme) qui sont modifiées selon la configuration de la machine (c'est-à-dire selon des règles de transformation fixées pour représenter le programme). Si l'algorithme représenté termine, alors la machine de Turing s'arrête sur un état final qui correspond aux valeurs retournées par le programme.
Nous ne rentrerons pas dans les détails d'une machine de Turing et nous traiterons le sujet en se ramenant à l'idée d'un programme informatique. L'important est simplement de noter que le modèle des machines de Turing constitue une bonne formalisation de la notion d'algorithme puisqu'à ce jour la thèse de Church, affirmant que tout algorithme peut être implémenté par une machine de Turing, n'a pas été contredite.

1.2.2 Problèmes indécidables par un algorithme

Problème de l'arrêt : Il n'existe pas d'algorithme permettant de savoir si un programme donné s'arrête.
[Cette partie n'a pas été développée...]
Un autre problème dont on aura besoin dans la partie 3 est celui d'ensemble calculable par une machine de Turing. L'idée est de demander à un programme si un élément appartient à un ensemble fixé.
Définition 1.2.2.1 (semi-calculable, calculable)
Un ensemble est dit semi-calculable si et seulement si il existe un programme qui retourne « oui » lorsqu'on lui envoie un élément de l'ensemble comme paramètre. Si de plus il retourne « non » lorsqu'on lui envoie un élément qui n'appartient pas à l'ensemble, alors l'ensemble est dit calculable.
Théorème 1.2.2.2
Il existe un ensemble semi-calculable mais non calculable.
Démonstration (idée)
Il existe plusieurs démonstrations mais nous donnerons ici le schéma de (4), où sont considérés des programmes reçevant un entier naturel comme paramètre.
Un programme se composant d'un nombre fini d'instructions, elles-même écrites dans un langage comportant un nombre fini de symboles, l'ensemble des programmes est dénombrable. Ceux-ci forment donc une liste P0, P1, P2, ... Posons E = {n | Pn retourne « Oui » quand il prend pour paramètre n}. Alors E est semi-calculable en considérant le programme qui prend n en paramètre, appelle Pn puis retourne le résultat de ce dernier.
Supposons (absurde) que E est calculable. Alors on peut écrire ∁E = {n | Pn termine par « Non » quand il prend pour paramètre n} donc celui-ci serait semi-calculable en considérant le programme qui prend n en paramètre, appelle Pn puis retourne le contraire du résultat de ce dernier. Soit k tel que Pk soit le programme décrit précédemment qui vérifie qu'un élément appartient à ∁E. Si k appartient à ∁E, alors si on lui applique le programme Pk il termine par « oui » et appartient donc à E. Inversement, si k appartient à E, alors par définition de E lorsqu'on le passe en paramètre au programme Pk, ce dernier retourne « oui », ce qui signifie que k appartient à ∁E. On aboutit donc à une contradiction.
L'ensemble E est donc semi-calculable mais non calculable. CQFD.

2. Preuve de convergence de suites arithmétiques

Dans cette section nous nous intéressons à deux suites arithmétiques très particulières. La première croît très vite et atteint des valeurs énormes avant de retomber à zéro, sans que la preuve de cette convergence ne puisse être établie dans le cadre de l'arithmétique. La seconde paraît aussi converger vers zéro mais aucune preuve n'a été trouvée à ce jour.

2.1 Les suites de Goodstein

2.1.1 Présentation

Nous reprenons ici les définitions de (2) en apportant quelques précisions et regardons les premières propriétés des suites de Goodstein
Définition 2.1.1.1 (base b itérée)
Pour tout entier naturel n non nul et toute base b ≥ 2, n est écrit en base b itérée ssi n est de la forme i=0kaini où les ai, non nuls, sont les chiffres de n en base b, et les exposants i sont-eux même en base b itérée. Pour n = 0, l'écriture en base b ≥ 2 est 0.
Exemple 2.1.1.2
Proposition 2.1.1.3
Tout nombre possède une unique écriture en base b itérée (à une permutation des facteurs et termes près).
Démonstration
Par induction sur n. Les cas de bases sont n = 0 dont l'unique écriture est 0 et pour n ∈ |[1 ; b - 1]|, l'unique écriture est n × b0. Pour un entier n ≥ b, si tous les nombres strictement inférieurs possède une écriture en base b itérée, alors écrivant l'unique décomposition de ce nombre en base b et en remplaçant les exposants par leur écriture en base b itérée on obtient ce que l'on souhaite. Les exposants sont bien strictement inférieurs à n, car si c est un tel exposant et a le chiffre non nul correspondant, comme b ≥ 2, a ≥ 1 et n ≥ 1, on a c ≥ n entraine a × bc > n ce qui est impossible car les autres termes de la somme étant positifs, on aurait n < n.
Même si par la suite, on s'autorisera à ne pas toujours respecter exactement cette écriture, l'unicité de la décomposition est tout de même essentielle pour la définition suivante :
Définition 2.1.1.4 (fonction de remplacement)
Pour toute base b1, b2 on définit la fonction de remplacement Rb1,b2 qui a tout entier n, associe l'entier obtenu en remplaçant b1 par b2 dans la décomposition en base b1 itérée de n.
Exemple 2.1.1.5
R2,57(256) = R2,57(22221) = 575757571
Définition 2.1.1.6 (suites de Goodstein)
Pour tout entier a on définit la suite de Goodstein de rang initial a par
Lorsqu'il n'y a pas d'ambiguïté on écrira gn à la place de gn(a).
Pour tout entier, on appelera algorithme de Goodstein appliqué à N partir du rang n l'algorithme précédent où l'on part de gn = N et où on calcul gn + 1, gn + 2...
Exemple 2.1.1.7
Pour a = 2 ; 3 on constate une convergence rapide des suites qui s'annulent respectivement au rang 5 et 7.
Rang na = 2a = 3
22 = 213 = 21 + 1
331 - 1 = 2×3031 + 1 - 1 = 31
42×40 - 1 = 141 - 1 = 3
51×50 - 1 = 03×50 - 1 = 2
602×60 - 1 = 1
701×70 - 1 = 0
.........
Par contre pour des valeurs de a supérieures, le calcul des termes initiaux est insuffisant pour vérifier la convergence :
Rang na = 4a = 5a = 6
2 4 = 221 5 = 221 + 1 6 = 221 + 21
3 331 - 1 = 2×32 + 2×31 + 2 = 26 331 = 27 331 + 31 - 1 = 331 + 2 = 29
4 2×42 + 2×41 + 1 = 41 441 - 1 = 3×43 + 3×42 + 3×4 + 3 = 255 441 + 1 = 257
5 2×52 + 2×51 = 60 3×53 + 3×52 + 3×5 + 2 = 467 551 = 3125
6 2×62 + 2×61 - 1 = 2×62 + 61 + 5 = 83 3×63 + 3×62 + 3×6 + 1 = 775 661 - 1 = 5×65 + 5×64 + 5×63 + 5×62 + 5×61 + 5 = 46655
7 2×72 + 71 + 4 = 109 3×73 + 3×72 + 3×7 = 1197 5×75 + 5×74 + 5×73 + 5×72 + 5×71 + 4 = 98039

2.1.2 Étude des suites et algorithme de calculs

Nous présentons maintenant les résultats que nous avons obtenus sur une méthode de calcul des termes de la suite, en prouvant quelques formules pour des cas simples où les exposants ne sont pas en base b itérée. En effet comme nous l'avons vu dans les exemples précédents, seule la base augmente tandis que le "-1" diminue peu à peu les termes d'exposants les plus bas. L'idée est donc d'introduire une application f, qui compte combien d'étapes sont nécessaire pour se débarasser d'un terme a × bc.
Proposition 2.1.2.1
L'application suivante est bien définie :
f : E = {(a, b, c) ∈ ℕ3 / b ≥ 2 ∧ a < b ∧ c < b } → ℕ
(a, b, c) ↦ nombre d'étapes pour que l'algorithme de Goodstein appliqué à a × bc à partir du rang b atteigne zéro.
Démonstration
Montrons par induction sur l'ensemble des couples (c, a), en considérant l'ordre lexicographique, que pour tout b tel que (a, b, c) ∈ E, f(a, b, c) est définie.
Le plus petit élément est (0, 0). Pour tout b ∈ ℕ \ {0,1} la propriété est vérifiée car 0 × b 0 = 0 donc l'algorithme termine en zéro étape.
Prenons (c, a) ∈ E en supposant la propriété vérifiée pour tout élément strictement inférieur à (c, a). Alors l'algorithme appliqué à partir du rang b à a × b c donne :
Rang nRésultat
ba × n c
b + 1a × n c - 1 = (a - 1)nc + nc - 1 = (a - 1)nc + (n - 1)(nc - 1 + nc - 2 + ... + 1) = (a - 1)nc + b(nc - 1 + nc - 2 + ... + 1)
b + 1 + f(b, b + 1, 0)(a - 1)nc + b(nc - 1 + nc - 2 + ... + n)
b + 1 + f(b, b + 1, 0) + f(b, b + 1 + f(b, b + 1, 0), 1)(a - 1)nc + b(nc - 1 + nc - 2 + ... + n2)
b + 1 + f(b, ..., 0) + f(b, ..., 1) + f(b, ..., 2)(a - 1)nc + b(nc - 1 + nc - 2 + ... + n3)
......
b + 1 + f(b, ..., 0) + f(b, ..., 1) + f(b, ..., 2) + ... + f(b, ..., c - 1)(a - 1)nc
b + 1 + f(b, ..., 0) + f(b, ..., 1) + f(b, ..., 2) + ... + f(b, ..., c - 1) + f(a - 1, ..., c)0
L'utilisation d'images de f est ici possible car on ne fait appel qu'à des paramètres a', b', c' tels que (c', a') < (c, a) donc où f est définie par hypothèse d'induction. Ainsi, f(a, b, c) est définie. CQFD.
Corollaire 2.1.2.2
f est définie inductivement par où u0 = b + 1 et ∀ n ∈ |[0 ; c - 1]|, un + 1 = f(b, k=0nuk, n).
Démonstration
Il suffit de reprendre les étapes du calcul précédent où les uk + 1 représentent le nombre d'étapes à effectuer pour éliminer les coefficients d'exposant k.
Corollaire 2.1.2.3
Toute suite de Goodstein atteignant un rang n où l'écriture en base n de gn ne comporte que des exposants strictement inférieurs à cette base converge vers 0.
En particulier, les « suites de Goodstein faibles » où l'on utilise le même algorithme, mais où l'on ne remplaçe pas les bases dans les exposants, sont convergentes.
Démonstration
Supposons qu'à un certain rang n0, gn0 s'écrive :
gn0 = i=0k ain0i avec k < n0. Alors en appliquant l'algorithme de Goodstein on obtient :
Rang nRésultat
n1 = n0 + f(a0, n0, 0) i=1k ain1i
n2 = n1 + f(a1, n1, 1) i=2k ain2i
......
nj = nj - 1 + f(aj - 1, nj - 1, j - 1) i=jk ainji
......
nk + 1 = nk + f(ak, nk, k) i=k+1k aink+1i = 0
Quant aux « suites de Goodstein faibles » , le terme initial s'écrit g2 = i=0k ai2i , avec k un entier naturel. Du coup, au rang k + 1, on arrive à gk + 1 = i=0k bi(k+1)i , où pour tout i de |[0 ; k]| bi est inférieur à ai puisque les exposants n'augmentent pas et seuls les coefficients peuvent diminuer via le "-1". Par ce qui précède, (gn) converge car k < k + 1 et l'algorithme devient le même que pour les suites fortes.
Exemple 2.1.2.4
On a déjà vu que dans l'exemple 2.1.1.7 que gn(2) et gn(3) convergent vers 0, ce qui est normal puisque leurs termes initiaux sont g2(2) = 21 et g2(3) = 3 = 21 + 1. Pour gn(4), gn(5) et gn(6), on sait respectivement dès le rang 3, 4 et 6 qu'elles convergent, même si on ne sait pas à partir de quel rang elles vont s'annuler.
Proposition 2.1.2.5
Pour tout (a, b, c) de E, on a :
Démonstration
Le premier point est trivial, car on a alors a×bc = a qui nécessite a étapes pour être éliminé. Pour le second, reprenons la définition du corollaire 2.1.2.2 : f(a, b, 1) = 1 + f(b, b + 1, 0) + f(a - 1, b + 1 + f(b, b + 1, 0), 1). Par ce qui précède, f(b, b + 1, 0) = b et donc f(a, b, 1) = 1 + b + f(a - 1, 2b + 1, 1). Définissons alors la suite (uk)n ∈ |[1 ; a]| par :
On a alors f(a, b, 1) = n=1a1+un, mais (un) étant arithmético-géométrique on montre facilement que pour tout n ∈ |[1 ; a]|, un = -1 + 2n - 1(b + 1), ce qui reporté dans l'expression de f(a, b, 1) nous permet d'obtenir :
f(a, b, 1) = (b + 1) n=1a2n1 = (b + 1) × 1 × 2a121 = (b + 1)(2a - 1)
Exemple 2.1.2.6
Pour des valeurs de a supérieures, on a besoin du résultat suivant :
Proposition 2.1.2.7
Pour tout (a, b, 2) de E, on a :
f(a, b, 2) = 2ua + 1 × (ua + 1) - (b + 1) avec En particulier, pour a = 1, f(1, b, 2) = (2b + 1 - 1) × (b + 1).
Démonstration
On se sert une nouvelle fois des formules du corollaire 2.1.2.2 et de la proposition 2.1.2.5: f(a, b, 2) = 1 + f(b, x, 0) + f(b, y, 1) + f(a - 1, z, 2) avec :
Enfin, en reportant dans f(a, b, 2) on arrive à f(a, b, 2) = 1 + b + 2(b + 1)(2b - 1) + f(a - 1, 2b + 1(b + 1) - 1, 2) = (2b + 1 - 1)(b + 1) + f(a - 1, 2b + 1(b + 1) - 1, 2)
En répétant l'opération a - 1 fois, c'est-à-dire définissant comme dans l'énoncé une suite u censée représenter b, on obtient alors :
f(a, b, 2) = k=1a (2uk + 1 - 1)(uk + 1)
f(a, b, 2) = (2b + 1 - 1)(b + 1) + k=2a 2uk + 1(uk + 1) - (uk + 1)
f(a, b, 2) = (2b + 1 - 1)(b + 1) + k=2a 2uk + 1(uk + 1) - k=1a1 2uk + 1(uk + 1)
f(a, b, 2) = (2b + 1 - 1)(b + 1) + 2ua + 1(ua + 1) - 2b + 1(b + 1)
f(a, b, 2) = 2ua + 1(ua + 1) - (b + 1).
Exemple 2.1.2.8
Rang nRésultat
2 4 = 221
2 + 1 = 3 331 - 1 = 2×32 + 2×31 + 2 = 26
3 + f(2, 3, 0) = 3 + 2 = 5 2×52 + 2×51 = 60
5 + f(2, 5, 1) = 5 + (5 + 1)(22 - 1) = 5 + 18 = 23 2×232 = 1058
n0 = 23 + f(2, 23, 2) 0
n0 est le plus petit entier n tel que gn(4) = 0. Il est considérablement grand, mais les formules de la proposition 2.1.2.7 permettent d'en donner une écriture assez simple :

2.1.3 Théorème de Goodstein et de Kirby-Paris

Nous revenons maintenant au sujet principal à savoir que la convergence des suites de Goodstein ne peut être établie dans l'arithmétique mais peut l'être dans une théorie plus forte.
Théorème 2.1.3.1 (de Kirby-Paris)
L'arithmétique ne prouve pas la convergence des suites de Goodstein.
La démonstration du théorème 2.1.3.1 n'est pas si facile et nous n'en parlerons pas ici, nous renvoyons le lecteur à (3) pour une présentation des grandes lignes de celle-ci. Nous nous intéressons plutôt au
Théorème 2.1.3.2 (de Goodstein)
Toute suite de Goodstein est nulle à partir d'un certain rang.
Comme le théorème 2.1.3.1 affirme que ce résultat ne peut être prouvé dans le cadre de l'arithmétique, la preuve passe par une théorie plus forte. Nous allons reprendre ici la démonstration de (2) dont le cadre est la théorie des ensembles citée dans la partie 1.1.1. On admet ici l'existence d'un élément ω strictement plus grand que tout entier et d'un prolongement des opérations d'addition, de multiplication et d'exponentiation des entiers compatibles avec (un prolongement de) l'ordre canonique des entiers naturels. En particulier, on admet que le principe de descente infinie de Fermat est encore vérifié pour le prolongement. Notre domaine n'est alors plus ℕ mais un ensemble plus grand, à savoir la clôture de ℕ ⋃ {ω} par ces opérations. Tout d'abord, on prolonge la fonction de remplaçement :
Définition 2.1.3.3 (prolongement de la fonction de remplacement)
Pour toute base b, on définit la fonction Rb,ω qui a tout entier n, associe l'ordinal obtenu en remplaçant b par ω dans la décomposition en base b itérée de n.
Lemme 2.1.3.4
Pour toute base b et tout entier n, Rb,ω(n) < Rb,ω(n + 1)
Démonstration
Soit b une base. Montrons par récurrence forte que pout tout entier n, Rb,ω(n) < Rb,ω(n + 1).
Pour n = 0, les décompositions de n et n + 1 en base b itérée sont respectivement 0 et 1, et on a donc donc 0 = Rb,ω(0) < Rb,ω(1) = 1.
Soit n > 0 tel que l'inégalité soit vérifiée pour tout entier strictement inférieur, et écrivons n en base b.
n = i = 0 n 1 c i b i
On a déjà montré dans la proposition 2.1.1.3 que les exposants sont alors strictement inférieurs à n, ce qui justifie le choix de i variant de 0 à n - 1. Les ci sont des chiffres en base b, donc variant de 0 à b - 1. Posons m le plus petit entier tel que cm n'est pas égal à b - 1 (c'est-à-dire que dans la somme n + 1 effectuée en base b, les "retenues" sont à placer à tous les ci tel que i soit inférieur à m. Les c'i correspondant dans n + 1 sont alors nuls sauf c'm = cm + 1. les autres demeurent inchangés : ∀ i > m, c'i = ci). Notant pour tout entier i ∈ |[0 ; m]|, δi = Rb,ω(i), on a alors :
R b , ω ( n ) = i = 0 n 1 ω δ i c i = i = m n 1 ω δ i c i + i = 0 m 1 ω δ i c i et R b , ω ( n + 1 ) = i = m n 1 ω δ i c i + ω δ m
Sachant que par hypothèse de récurrence forte, on a δm > δm - 1 > ... > δ1 > δ0, il nous faut montrer, pour k = m - 1 : i = 0 k ω δ i c i < ω δ k + 1
On effectue une récurrence finie sur k ∈ |[0 ; m - 1]|.
Finalement, on a Rb,ω(n) < Rb,ω(n + 1). CQFD.
Démonstration du théorème 2.1.3.2
Pour entier n ≥ 2 et tout entier a, on pose hn(a) = Rn, ω(gn(a)). Soit donc a un entier. Supposons (absurde) que pour tout entier n, gn(a) est non nul. Alors (hn(a))n ∈ ℕ est strictement décroissante :
hn + 1(a) = Rn + 1, ω(gn + 1(a))
hn + 1(a) = Rn + 1, ω(Rn, n + 1(gn(a)) - 1) (deuxième cas de la définition 2.1.1.6 car par hypothèse gn(a) est non nul)
hn + 1(a) < Rn + 1, ω(Rn, n + 1(gn(a))) (lemme 2.1.3.4)
hn + 1(a) < Rn, ω(gn(a)) (car remplacer n par n + 1, puis n + 1 par ω c'est directement remplacer n par ω)
hn + 1(a) < hn(a)
L'existence d'une telle suite strictement décroissante contredit le principe de descente infinie. gn(a) est donc nulle à partir d'un certain rang. CQFD.

2.2 Les suites de Syracuse

[Cette partie n'a pas été développée...]

3. Existence et programmation d'algorithmes

3.1 Résolution d'équation diophantienne

Une équation diophantienne est une équation polynomiale à coefficients entiers, dont on recherche généralement les solutions entières. Nous allons nous intéresser à la recherche d'un algorithme permettant de savoir si une équation diophantienne possède ou non une solution. On commence par une proposition que nous avons démontré pour un cas simple d'équation diophantienne :

Proposition 3.1.1

Soit P(x)=i=0naixi un polynôme à coefficients entiers de degré n > 0. Alors il existe un algorithme permettant de savoir si l'équation P(x) = 0 possède ou non une solution entière.

Démonstration

La proposition est triviale si ∀ i ∈ |[0 ; n - 1]|, ai = 0, c'est-à-dire P(x) = an xn car dans ce cas la seule solution est x = 0.
Dans le cas contraire, m=n×maxi∣[0,n1]∣ai est un entier strictement positif donc supérieur ou égal à 1. Il en est de même de |an|. Considérons alors x tel que |x| > m ≥ 1. On a alors maxi∣[0,n1]∣aix<1n. On peut alors mettre an xn en facteur dans P(x) et on obtient P(x)=anxn(1+i=0n1aianxni), qui est non nul comme produit de facteurs non nuls. Il suffit pour voir ça de noter que i=0n1aianxnii=0n1aianxnii=0n1maxi∣[0,n1]∣aix<i=0n11n=1. Pour la seconde inégalité, on s'est servi du fait que chaque |ai| est inférieur à leur maximum et que |an| ≥ 1, n - i ∈ |[1 ; n]|, et x > 1 entraine 1|an|1 et 1xni1x.
Finalement |x| > m implique P(x) ≠ 0, et par contraposée si P(x) = 0 alors x ∈ |[−m ; m]|. Un algorithme vérifiant si P(x) = 0 possède une solution consiste alors à calculer m puis à parcourir l'intervalle |[−m ; m]| à la recherche d'une solution. Cet algorithme termine car le nombre de valeurs à vérifier est fini. CQFD.
Nous allons maintenant nous intéresser au 10e problème d'Hilbert, à savoir la recherche d'un algorithme général de résolution d'équations diophantienne. Nous présentons ici les grandes lignes en s'inspirant de (1) et (4).

Définition 3.1.2 (ensemble diophantien)

Un ensemble D est diophantien si et seulement si il existe n,p ∈ ℕ et un polynôme P à coefficients entiers de n + p variables tels que D ⊂ ℕn et a ∈ D ⇔ ∃ x ∈ ℕp, P(a, x) = 0
On énonce alors sans démonstration le théorème suivant :

Théorème 3.1.3 (Matiyasevich)

Tout ensemble semi-calculable est diophantien

Corollaire 3.1.4 (indécidabilité du 10e problème d'Hilbert)

Il n'existe pas d'algorithme applicable à toute équation diophantienne permettant de savoir si elle possède une solution.

Démonstration

Par le théorème 1.2.2.2, il existe un ensemble E semi-calculable mais non calculable. Donc par le théorème 3.1.3, E est diophantien et il existe un polynôme P le caractérisant. S'il existait un algorithme pour résoudre n'importe quelle équation diophantienne, alors pour tout entier naturel a, on applique cet algorithme à l'équation P(a, x) = 0 pour savoir s'il appartient ou non à E qui serait donc calculable. Contradiction.

3.2 Programmation de l'algorithme de Goodstein

Nous exposons ici les diverses méthodes que nous avons imaginées pour programmer la recherche du plus petit rang où la suite s'annule, en s'appuyant sur l'algorithme de calcul et les formules en découlant trouvées dans le paragraphe précédent. On verra que l'élévation rapide des termes ne permet pas d'espérer un programme de calcul rapide et économe en mémoire. Toutefois si notre idée a peu de chance d'être mise en pratique, elle présente au moins l'avantage de donner une méthode théorique.

3.2.1 Décomposition en base b itérée

La décomposition en base b d'un nombre est un algorithme classique utilisant une succession de division euclidienne. Le point essentiel est de généraliser ceci à une base b itérée. Il est alors naturel de considérer une approche récursive en redécomposant les exposants tant qu'ils sont supérieurs à b. La preuve de la terminaison d'un tel algorithme est similaire à la démonstration de la proposition 2.1.1.4. Pour implémenter un nombre en base b itérée nous avons utilisée une approche récursive en créant le type appelé ici fwd :
Notons tout de suite que nmax et l'évalutation de !gn sont de type entier. Or le type entier de Caml prend des valeurs de -230 à 230 - 1, ce qui ne fait espérer trouver une valeur d'annulation simplement pour b = 2 ou b = 3. On rappelle en effet que le premier rang où gn(4) s'annulait était 3×2402653211 - 1. En outre, gn peut prendre des valeurs élevées et l'algorithme de décomposition devient alors très lent...

3.2.2 Stockage du rang et du terme

On peut améliorer l'algorithme en notant que la valeur exacte du terme gn ne nous intéresse pas particulièrement, seule sa "forme de décomposition" intervient dans le calcul, forme qui est la même quelle que soit la base. On peut donc s'affranchir du type entier et le gérer sous sa forme iteree en décomposant le terme de rang 2 en base 2 iteree puis en modifiant directement gn à chaque décrémentation.
Quant au stockage du rang, on a dit qu'il devenait impossible par une méthode classique dès le rang 4. Nous avons tout d'abord imaginé un type "très grand entier" composé d'une liste d'entiers Caml avec chacun un poids différent et des fonctions d'implémentations appropriées mais les calculs restent complexes. En effet, quoi que l'on fasse, pour stocker n0 = 3×2402653211 - 1 > 2×2402653211 = 2402653212, il faudrait au moins 402653212 bits, soit environ 48 mo !
Nous avons ensuite imaginé une amélioration inspirée de la méthode de stockage des "matrices creuses". En effet le rang n ne prend pas toutes les valeurs possibles car les méthodes du paragraphe 2.1.2 nous permet de sauter des étapes dans le calcul. On cherche alors à implémenter par un type fwd2 l'entier n comme une somme de nombre de la forme ai×2i en ne s'interressant qu'aux i où ai est non nul. Les coefficients ai sont entiers mais les exposants i peuvent eux-même être un fwd2. On imagine bien les fonctions effectuant la somme, produit et l'exponentiation de base 2 avec le type fwd2. Pour gn(4), le rang d'annulation est 3×23×227 + 27 - 1 qui nécessite très peu de mémoire pour être stocké en fwd2.

3.2.3 Simulation du calcul pour gn(5)

On montre ici que malgré les améliorations apportées dans le paragraphe 3.2.2, la recherche d'un rang d'annulation pour gn(b) avec b strictement supérieur à 4 demeure difficile à mettre en pratique. Pour se faire, on imagine le calcul pour b = 5 avec des rangs codés en fwd2, et on s'autorise à sauter les étapes grâce aux formules de la partie 2.1.2. Le calcul nécessiterait alors 17 étapes :
Rang nRésultat
n0 = 2 5 = 22 + 1
n1 = 3 33
n2 = 4 44 - 1 = 3(43 + 42 + 4 + 1)
n3 = 4 + f(3, 4, 0) = 7 = 23 - 1 3(n3 + n2 + n)
n4 = n3 + f(3, n3, 1) = 23 - 1 + 23(23 - 1) = 26 - 1 3(n3 + n2)
n5 = n4 + f(3, n4, 2) 3n3
n6 = n5 + 1 3n3 - 1 = 2n3 + n5(n2 + n + 1)
n7 = n6 + f(n5, n6, 0) = n6 + n5 2n3 + n5(n2 + n)
n8 = n7 + f(n5, n7, 1) 2n3 + n5×n2
n9 = n8 + f(n5, n8, 2) 2n3
n10 = n9 + 1 2n3 - 1 = n3 + n9(n2 + n + 1)
n11 = n10 + f(n9, n10, 0) = n10 + n9 n3 + n9(n2 + n)
n12 = n11 + f(n9, n11, 1) n3 + n9×n2
n13 = n12 + f(n9, n12, 2) n3
n14 = n13 + 1 n3 - 1 = n13(n2 + n + 1)
n15 = n14 + n13 n13(n2 + n)
n16 n13×n2
n17 0
Interessons nous maintenant au calcul des ni (on utilise les algorithmes de calcul développés dans le paragraphe 2.1.2) :
On constate ici l'avantage du type fwd2 qui permet le stockage de n8, qui est considérablement grand ! Néanmoins, on ne peut espérer aller plus loin car le calcul de n9 nécessite un calcul du type de celui de n5 où s'accumulent les étages d'exposants. Mais la suite (un) ne devrait plus être calculée jusqu'au rang 3 mais jusqu'au rang n5 qui est déjà énorme. Ainsi, même si la forme de n9 est "imaginable", il est très difficile de l'écrire à la main et donc de le stocker en fwd2... Cela est évidemment encore pire pour le calcul de n17...
cf annexe pour les programmes Caml

4. Nouveaux axiomes

4.1 Schéma de recherche d'axiomes

Nous avons vu avec le théorème de Goodstein une proposition indécidable dans l'arithmétique mais qui est pourtant un énoncé mathématique "classique" à savoir la preuve de convergence d'une suite et non un énoncé construit spécialement pour être indécidable tel le théorème de Gödel. Toutefois, on a vu qu'une théorie plus forte permettait d'en donner une démonstration assez simple. Il est alors légitime de reformuler le problème de la partie 1 en la recherche d'une théorie très puissante, c'est-à-dire formalisant la totalité des mathématiques et prouvant tous les théorèmes "classiques". Rappelons que par le théorème de Gödel, une telle théorie ne peut prouver sa consistance, que l'on est contraint d'admettre.
Parmi les théories possibles, nous allons nous intéresser plus particulièrement à la théorie des ensembles. En effet, le système ZF formalisant la théorie des ensembles se compose d'un certain nombre d'axiomes qui permettent de traiter de la majorité des mathématiques. Malgré tout, certaines propositions demeurent indécidables et on voudrait lui adjoindre des axiomes pour l'améliorer. L'idée n'est biensûr pas de rajouter pour axiomes les propositions que l'on ne parvient pas à démontrer, mais de chercher des énoncés mathématiques "naturels". Là encore on ne peut prouver la consistance de la nouvelle théorie mais on peut tout au moins s'assurer que l'ajout d'axiomes ne viendra pas provoquer de contradiction...

4.2 L'axiome du choix

On étudie ici un énoncé indécidable dans ZF : l'axiome du choix. Celui-ci illustre bien le schéma de recherche précédent à savoir que l'on est en présence d'un énoncé par forcément intuitif, puisqu'il a été contredit dans le passé par de nombreux mathématiciens, et dont on a du décider s'il devait être poser comme axiome.

Définition 4.2.1 (fonction de choix, axiome du choix)

Soit E un ensemble d'ensembles. On appelle fonction de choix sur E une application f : E \ {∅} → xEx tel que pour tout élément x de E non vide, f(x) ∈ x. Autrement dit une fonction de choix choisit un élément dans chaque ensemble non vide appartenant à E. L'axiome du choix est l'énoncé « tout ensemble possède une fonction de choix ».
Nous allons étudier deux exemples d'applications où intervient l'axiome du choix en rapport avec le cours de math sup. Un premier théorème tiré du cours est le suivant :

Exemple 4.2.2 (théorème de caractérisation séquentielle d'une limite)

Soient I un intervalle de ℝ, f : I → ℝ, x0¯ un point ou une borne de I et L ∈ ¯.
fx0L ⇔ Pour toute suite (un) ∈ I, u n n x 0 f ( u n ) n L .
Dans le cours, pour établir l'implication réciproque on a procèdé par contraposée : on suppose ¬(fx0L) et on veut montrer l'existence d'une suite (un) qui tend vers x0 quand n tend vers l'infini, mais telle que f(un) ne tend pas vers L quand n tend vers l'infini. La construction d'une telle suite utilise implicitement l'axiome du choix. On considère le cas x0 fini et L = +∞. Le fait que ¬(fx0L) signifie :
¬(∀ M ∈ ℝ ∃ δ > 0 ∀ x ∈ I |x - x0| ≤ δ ⇒ f(x) ≥ M)
∃ M ∈ ℝ ∀ δ > 0 ∃ x ∈ I |x - x0| ≤ δ ∧ f(x) < M
Soit donc M un tel réel. D'après l'axiome du choix, il existe une fonction de choix g sur ℘(I). On défini alors une suite (un) en posant pour tout entier naturel n :
u n = g ( { x I / x x 0 1 n + 1 f ( x ) < M } )
Ceci est possible car d'après la formule précédente, le sous-ensemble de I mis en jeu est non vide. Par construction, on a pour tout n ∈ ℕ, x x 0 1 n + 1 donc un tend vers x0 quand n tend vers l'infini par le théorème des gendarmes. Cependant on a aussi f(un) < M, donc f(un) ne tend pas vers L quand n tend vers l'infini. CQFD.
Un autre sujet de math sup est la démonstration de l'existence de base dans les espaces vectoriels. Cela est fait dans le cours dans le cas des espaces vectoriels de dimension fini, mais l'axiome du choix permet de généraliser ce résultat :

Exemple 4.2.3 (existence de base dans les espaces vectoriels)

L'axiome du choix permet de montrer que tout espace vectoriel possède une base. L'idée est pour un espace vectoriel E, de construire une famille libre d'éléments de E en se servant du prolongement des entiers naturels dont on a parlé pour la démonstration du théorème de Goodstein.
On commence par choisir un vecteur u0 non nul de E, formant ainsi une famille (u0) libre. On continue en formant une suite (u1, u2...) en choisissant à chaque fois un vecteur de E de sorte que l'adjonction du dernier vecteur laisse la famille libre. On s'arrête lorsque l'on ne peut plus ajouter de vecteur sans obtenir une famille liée : on a alors obtenu une base.
L'argument présenté ici ne fonctionne que pour un espace vectoriel de dimension finie. Pour respecter le cas général de construction d'une suite ordinale, il faut préciser le cas des ordinaux limites comme ω. Cela se fait en prenant la réunion des familles s'arrêtant aux ordinaux strictement inférieurs à l'ordinal limite considéré et on montre que la réunion de ces familles libres croissantes pour l'inclusion est encore une famille libre. Lorsque E n'est pas de dimension infini, on s'arrêtait forcément après un nombre fini d'étapes et l'emploi de l'axiome du choix est inutile. Par contre ici, même si on sait que la suite des ordinaux est assez longue pour venir à bout de n'importe quel ensemble, on passe par une infinité de choix et il faut pour notre démonstration utiliser une fonction de choix sur ℘(E) donc se servir de l'axiome du choix.
Nous nous sommes ici contenté de deux énoncés où intervient l'axiome du choix mais celui-ci s'est révélé nécessaire dans de nombreux domaines mathématiques ce qui fait qu'on l'ajoute généralement à ZF pour former le système ZFC. Nous ne nous étendrons pas sur le sujet qui est vaste mais notons seulement que la théorie des ensembles dispose d'outils puissants pour prouver l'indépendance de nombreux autres énoncés mathématiques constituant de nouveaux axiomes potentiels...

Conclusion

Références

  1. Encyclopédie Wikipédia, portail mathématiques (http://fr.wikipedia.org/wiki/Portail:Mathématiques)
  2. Patrick Dehornoy (http://www.math.unicaen.fr/~dehornoy/) : Logique et théorie des ensembles; Notes de cours, FIMFA ENS, version 2005-2006;
  3. Justin T. Miller (http://www.u.arizona.edu/~miller/thesis/) On the Independence of Goodstein's Theorem
  4. W. et F. Ellison : Abrégé d'histoire des mathématiques ; chapitre V : Théorie des nombres ; §IX : Équations diophantiennes.

Annexe

			(* !!! Fonctions utiles !!! *)

(* ****** Fonction d'exponentiation des entiers et opérateur expo ****** *)
let rec exponentiation a b =
	if b = 0 then 1
		else (
			if b mod 2 = 0 then let c = exponentiation a (b/2) in c*c
					else a * (exponentiation a (b-1)));;
#infix "expo";;
let prefix expo a b = exponentiation a b;;

(* ****** Accès aux différentes parties d'un fwd ****** *)
let prm = function
  |O-> 0
  |Somme((a,_),_) -> a;;
  
let sec = function
  |O -> O
  |Somme((_,a),_) -> a;;
  
let tri = function
  |O-> O
  |Somme((_,_),a) -> a;;

(* ****** Définition du type pile et fonctions associées ****** *)
type 'a pile = {cont : 'a vect ; mutable ind : int ; taille : int};;

let est_vide p =
  p.ind=(-1);;

let est_pleine p =
  p.ind=p.taille;;

let cree_pile x n =
  let tab = make_vect n x in
    let p={cont = tab;ind = -1;taille = n} in
      p;;

let empile e p = 
  if est_pleine p
    then failwith "pile pleine" 
    else (p.ind <- p.ind +1;
         p.cont.(p.ind) <- e);;

let depile p=
  if est_vide p 
    then 
      failwith "pile vide"
    else
      p.ind <- p.ind -1;
      p.cont.(p.ind+1);;



			(* !!! Le type fwd !!! *)

(* ****** Création du type fwd et du signe de concaténation %% ****** *)
type fwd = O|Somme of (int*fwd)*fwd;;
#infix "%%";;
let prefix %% = fun x y -> Somme(x,y);;

(* ****** Afficher un nombre de type fwd en base b (programme peu intéressant) ****** *)
let rec afficher_fwd b = function
	|O -> print_int 0
	|Somme ((coef,puiss),rest) -> if coef<>0 then 
		(	print_int coef;
			if puiss <> O then 
			   ( print_char `*`; print_int b;
			     if puiss <> (1,O)%%O then (print_string "^("; afficher_fwd b puiss;print_char `)`)
			   );
			if rest<>O then print_string " + "
		);
		if rest<>O then afficher_fwd b rest;;

(* ****** Décomposition d'un entier n en base b itérée ****** *)
let rec decomposer b n =
	let r = ref 0
	and q = ref n
	and puiss = ref 0
	and result = ref O in
		while !q<>0 do
		r:= (!q)mod b;
		q:= (!q)/b;
		if !r<>0 then result := (!r,decomposer b !puiss)%%(!result);
		puiss:= !puiss + 1
		done;
	!result;;

decomposer 3 15;;
afficher_fwd 3 (decomposer 3 15);;

(* ****** Fonction d'évaluation d'un entier écrit en base b itérée sous le format fwd (réciproque de decomposer) ****** *)
let rec evaluer b = function
	|O -> 0
	|Somme ((coef,puiss),rest) -> coef * (b expo (evaluer b puiss)) + (evaluer b rest);;
	
evaluer 3 (decomposer 3 2568);;

(* ****** Décrémenter un nombre n en base b itérée ****** *)
let decrementer b n = 
  decomposer b ((evaluer b n) - 1);;



			(* !!! Recherche du premier terme nul !!! *)

(* ****** Fonction de recherche d'un terme nul pour gn(b) pour n variant de 2 à nmax ****** *)
let recherche b nmax =
  let n = ref 2 and gn = ref (decomposer 2 b) in
    while (!n < nmax) && not(!gn = O) do
      gn := decrementer (!n+1) !gn;
      n := !n + 1;
    done;
   if !gn = O then print_int !n else print_string "Aucun terme nul trouvé.";; 

recherche 2 10;;
recherche 3 10;;
(* recherche 4 (2 expo 29);; : N'aboutit pas, même après quelques heures
ce qui était évidement prévisible*)



			(* !!! Le type fwd2 !!! *)

(* ****** Création du type fwd2 et du signe de concaténation @@ ****** *)
type fwd2 = N|Somme2 of (int*fwd2)*fwd2;;
#infix "@@";;
let prefix @@ = fun x y -> Somme2(x,y);;

(* ****** Affichage d'un fwd2 ****** *)
let rec afficher_fwd2 = function
	|N -> print_int 0
	|Somme2 ((coef,puiss),rest) -> if coef<>0 then 
		(	print_int coef;
			if puiss <> N then 
			   ( print_char `*`; print_int 2;
			     if puiss <> (1,N)@@N then (print_string "^("; afficher_fwd2 puiss; print_char `)`)
			   );
			if rest<>N then print_string " + "
		);
		if rest<>N then afficher_fwd2 rest;;

(* ****** Calcul le nombre d'étage (toujours à gauche dans l'écriture) ****** *)
let rec etage = function
	|N -> 0
	|Somme2((a,b),c) -> 1 + etage b;;

(* ****** Fonction de somme de deux fwd2 (plus ou moins ordonnés) et opérateur ++ ****** *)
let rec somfwd2 = fun
	|N a -> a
	|a N -> a
	|(Somme2((a1,b1),c1)) (Somme2((a2,b2),c2)) -> if b1 = b2 then ((a1+a2),b1)@@(somfwd2 c1 c2)
						else ( if etage b1 > etage b2 then ( (a1,b1)@@(somfwd2 c1 ((a2,b2)@@c2) ) )
							else ( (a2,b2)@@(somfwd2 ((a1,b1)@@c1) c2) ));;
#infix "++";;
let prefix ++ = somfwd2;;

(* ****** Calcul de l'opposé, Soustraction et opérateur -- ****** *)
let rec oppfwd2 = function
	|N -> N
	|Somme2 ((a,b),c) -> (-a,b)@@(oppfwd2 c);;

let moinsfwd2 = fun a b -> a++(oppfwd2 b);;
#infix "--";;
let prefix -- = moinsfwd2;;

(* ****** Fonction de produit et opérateur ** ****** *)
let rec prodfwd2 = fun
	|N a -> N
	|a N -> N
	|(Somme2((a1,b1),N)) (Somme2((a2,b2),c2)) -> (((a1*a2),b1++b2)@@N)++(prodfwd2 ((a1,b1)@@N) c2)
	|(Somme2((a1,b1),c1)) (Somme2((a2,b2),c2)) -> (prodfwd2 ((a1,b1)@@N) ((a2,b2)@@c2))++(prodfwd2 c1 ((a2,b2)@@c2));;
#infix "**";;
let prefix ** = prodfwd2;;

(* ****** Fonction d'exponentiation de 2 à la puissance un fwd2 ****** *)
let exp2 = function a -> ((1,a)@@N);;

(* ****** Evaluation d'un fwd2 ****** *)
let rec evaluer2 = function
	|N -> 0
	|Somme2 ((a,b),c) -> a*(2 expo (evaluer2 b)) + (evaluer2 c);;



			(* !!! Calcul du plus petit rang pour lequel la suite s'annule !!! *)

(* ****** Fonction auxiliaire calculant les termes de la suite (un) (cf étude antérieure) ****** *)
let rec u b = function
	|1 -> b
	|k -> let x = (u b (k-1))++((1,N)@@N) in
		((exp2 x)**x)++((-1,N)@@N);;

(* ****** Fonction f (cf étude antérieure) ****** *)
let rec f = fun
	|a _ 0 -> a
	|a b 1 -> (b++((1,N)@@N))**((exp2 a)++((-1,N)@@N))
	|a b 2 -> let x = (u b (evaluer2 a))++((1,N)@@N) in
			((exp2 x)**x)--(b++((1,N)@@N))
	|_ _ _ -> failwith "c est trop important";;

(* ****** Fonction permettant de créer le schéma de calcul des rangs successifs (cf tableau) ****** *)
(* Une première phase (tant que sec (sec x) <> O) permet le calcul du premier rang pour lequel les exposants sont inférieurs aux rang de la suite.
Les calculs se font à l'aide du type fwd pour les termes de la suite, et du type fwd2 pour les rangs.
A la fin de cette phase, on procède à un changement de format du dernier terme calculé.
Celui-ci est transféré dans une pile en tant qu'ensemble de couple d'un coefficient (au format fwd2) et d'un exposant (entier).
L'élément au dessus de la pile est l'élément de plus faible exposant.
On procède ensuite (par le biais de schemb) aux calculs à l'aide de la fonction f si l'exposant minimal le permet.
Sinon on calcule simplement le terme suivant dans la suite (en utilisant ab^c = (a-1)b^c + Som(i=0 c-1)[(b-1)b^i]).
Ceci implique alors une évaluation de a-1 pour savoir s'il est nul (ce que l'on ne peut pas faire en fwd2). *)

let rec schema n x =
	if sec (sec x) = O then
		(
		let y = cree_pile (N,1) (1 + evaluer (evaluer2 n) (sec x)) in
			let rec pass1_2 = function
					|O -> ()
					|Somme((coef,puiss),rest) -> (empile (((coef,N)@@N), prm puiss) y; (pass1_2 rest))
			in pass1_2 x;
		let rec schemb r =
			if est_vide y then r
				else (
					let petit = depile y in
					let puisp = snd petit and coefp = fst petit in
					if puisp <= 2 then schemb (r ++ (f coefp r puisp))
						else (let s = r++((1,N)@@N) in
							(if evaluer2 coefp > 1 then empile ((coefp--((1,N)@@N)),puisp) y);
							for i = puisp-1 downto 0 do
							empile (r,i) y done;
							schemb s)
					)
		in schemb n
		)
		else (	let m = (n++((1,N)@@N)) in
				schema m (decrementer (evaluer2 m) x)
			)
	;;
schema ((2,N)@@N) (decomposer 2 4);;
afficher_fwd2 (schema ((2,N)@@N) (decomposer 2 4));;

Cette page est conforme aux normes du W3C - Auteur : Frédéric WANG - Dernière mise à jour : lundi 7 août 2006
Valid XHTML 1.1 Valid MathML 2.0 Valid SVG Valid CSS Amaya, the W3C browser/editor Déclaration qualité Opquast Foxkeh banners for Firefox 2