ATLAS Ouvrir dans l'atlas →

Proposition 2Fonctions primitives récursives

Codage des suites finies

Comme au point (iii) de l'extension par témoins, on code une suite finie (k0,…,km−1)(k_0, \dots, k_{m-1}) d'entiers, vue comme un mot dont les lettres sont des entiers, par l'entier ⟨k0,…,km−1⟩,\langle k_0, \dots, k_{m-1} \rangle, défini par récurrence sur mm : la suite vide a pour code ⟨ ⟩=0\langle\, \rangle = 0, et ⟨k0,…,km⟩=2⟨k0,…,km−1⟩ (2km+1).\langle k_0, \dots, k_m \rangle = 2^{\langle k_0, \dots, k_{m-1} \rangle}\, (2k_m + 1).

On note p0=2p_0 = 2, p1=3p_1 = 3, p2=5p_2 = 5, … les nombres premiers rangés par ordre croissant, et, pour x⩾1x \geqslant 1, (x)i(x)_i l'exposant de pip_i dans la décomposition de xx (Nombres premiers) ; on convient que (0)i=0(0)_i = 0.

Énoncé

(i) La fonction i↦pii \mapsto p_i est primitive récursive, ainsi que (x,i)↦(x)i(x, i) \mapsto (x)_i.

(ii) Tout entier est le code d'une unique suite finie.

(iii) Les fonctions suivantes sont primitives récursives : l'ajout aj(N,k)=2N(2k+1)\mathrm{aj}(N, k) = 2^N(2k + 1), qui ajoute la lettre kk à la fin de la suite de code NN ; pour N⩾1N \geqslant 1, le code dbt(N)\mathrm{dbt}(N) de la suite privée de son dernier terme et ce dernier terme dr(N)\mathrm{dr}(N), prolongés par dbt(0)=dr(0)=0\mathrm{dbt}(0) = \mathrm{dr}(0) = 0 ; la longueur lg(N)\mathrm{lg}(N) de la suite de code NN ; son terme de rang jj, noté (N)j(N)^j pour j<lg(N)j < \mathrm{lg}(N) ; et la concaténation conc(M,N)\mathrm{conc}(M, N), code de la suite de code MM suivie de la suite de code NN.

Démonstration

(i) Soit vv un nombre premier et N=v!+1N = v! + 1. Par le point (ii) de Nombres premiers, NN a un diviseur premier q⩽Nq \leqslant N. Si l'on avait q⩽vq \leqslant v, qq diviserait v!v!, donc N−v!=1N - v! = 1, ce qui est absurde ; ainsi v<q⩽v!+1v < q \leqslant v! + 1.

Le nombre premier qui suit vv est donc μz<v!+2 (z>v∧z premier),\mu z < v! + 2\ \big(z > v \wedge z \text{ premier}\big), fonction primitive récursive de vv par les points (iii) à (v) de Clôture. Comme p0=2p_0 = 2 et pi+1p_{i+1} est le premier qui suit pip_i, la fonction i↦pii \mapsto p_i s'obtient par récurrence primitive.

Si x⩾1x \geqslant 1 et pik∣xp_i^k \mid x, alors k<2k⩽pik⩽xk < 2^k \leqslant p_i^k \leqslant x ; l'exposant de pip_i est donc le plus petit k<xk < x tel que pik+1p_i^{k+1} ne divise pas xx, ce qui s'écrit (x)i=μk<x ¬(pik+1∣x),(x)_i = \mu k < x\ \neg\big(p_i^{k+1} \mid x\big), formule qui vaut aussi 00 pour x=0x = 0.

(ii) L'injectivité est celle du point (iii) de Témoins de Henkin. Pour la surjectivité, raisonnons par récurrence forte sur NN. L'entier 00 code la suite vide. Tout N⩾1N \geqslant 1 s'écrit 2n(2k+1)2^n(2k + 1) avec n<Nn < N ; si nn code la suite ss, alors NN code la suite ss suivie de kk.

(iii) L'ajout est primitif récursif par les exemples de Primitives récursives. Pour N=2n(2k+1)⩾1N = 2^n(2k + 1) \geqslant 1, le code nn de la suite privée de son dernier terme et ce dernier terme kk valent dbt(N)=(N)0,dr(N)=q(q(N,2(N)0)−˙1, 2),\begin{aligned} \mathrm{dbt}(N) &= (N)_0, \\ \mathrm{dr}(N) &= q\big(q(N, 2^{(N)_0}) \mathbin{\dot{-}} 1,\ 2\big), \end{aligned} et ces formules donnent dbt(0)=dr(0)=0\mathrm{dbt}(0) = \mathrm{dr}(0) = 0 ; on a dbt(N)<N\mathrm{dbt}(N) < N si N⩾1N \geqslant 1.

Les itérés D(N,0)=ND(N, 0) = N et D(N,i+1)=dbt(D(N,i))D(N, i + 1) = \mathrm{dbt}(D(N, i)) s'obtiennent par récurrence primitive. Si NN code une suite de longueur mm, D(N,i)D(N, i) code, pour i⩽mi \leqslant m, la suite privée de ses ii derniers termes, et vaut donc 00 exactement à partir de i=mi = m ; comme D(N,i)⩽N−˙iD(N, i) \leqslant N \mathbin{\dot{-}} i tant qu'il est non nul, on a m⩽Nm \leqslant N, et lg(N)=μi<N+1 (D(N,i)=0).\mathrm{lg}(N) = \mu i < N + 1\ \big(D(N, i) = 0\big).

Le terme de rang jj est le dernier terme de la suite privée de ses m−1−jm - 1 - j derniers termes, d'où (N)j=dr(D(N,lg(N)−˙(j+1))).(N)^j = \mathrm{dr}\big(D(N, \mathrm{lg}(N) \mathbin{\dot{-}} (j + 1))\big).

Enfin conc(M,N)=C(M,N,lg(N))\mathrm{conc}(M, N) = C(M, N, \mathrm{lg}(N)), où C(M,N,0)=MC(M, N, 0) = M et C(M,N,t+1)=aj(C(M,N,t),(N)t)C(M, N, t + 1) = \mathrm{aj}\big(C(M, N, t), (N)^t\big) : on ajoute un à un les termes de la seconde suite.

□
Remarque

Ces codes sont gigantesques : ⟨1,1⟩=23⋅3=24\langle 1, 1 \rangle = 2^3 \cdot 3 = 24, mais une suite de six termes a un code qui s'écrit comme une tour d'exposants. Cela n'a aucune importance ici, où l'on ne demande aux codes que d'exister et d'être manipulés par des fonctions primitives récursives ; l'efficacité des calculs est l'objet d'une autre théorie, la complexité.

Remarque

Deux codages servent dans la suite, chacun là où il est le plus simple. Le code des mots, repris de la démonstration du théorème de complétude, convient aux suites que l'on lit et que l'on prolonge, comme les programmes et les formules. Le codage par exposants, x=∏pi(x)ix = \prod p_i^{(x)_i}, convient aux suites dont on modifie un terme quelconque, comme le contenu des registres d'une machine : multiplier ou diviser par pip_i change le seul terme de rang ii.

Repose sur

Sert à

Aucune fiche de ce graphe ne l'utilise encore.
Ouvrir dans l'atlas interactif →