Jean-Jacques BOURDIN
Récurrences
L‘informaticien commencera souvent par valider la propriété par un petit programme.
Voici un exemple. La suite U est donnée par :U(0) == 1 U(n+1) == U(n) + 2*n + 3On veut vérifier que U(n)=(n+1)^2.
#include<stdio.h> #include<stdlib.h> #include<assert.h> typedef struct vect { int nb; int * v; } vect_t; void creevec (vect_t * v, int nbelements) { v->nb = nbelements; v->v = malloc(nbelements * sizeof(int)); assert(v->v); } void remplitsuite (vect_t * v) { int n, i; n = v->nb; v->v[0] = 1; for (i = 1; i < n; i++) { v->v[i] = v->v[i - 1] + 3 +((i-1)<<1); } return; } void voirsuite (vect_t v) { int n, i; n = v.nb; printf("La suite :\n"); for (i = 0; i < n; i++) { printf("%2d %5d\n", i, v.v[i]); } return; } void comparsuite(vect_t v) { int i, nb, carre, wrong; nb = v.nb; carre = 0; wrong = 0; for (i = 0; i < nb; i++) { carre += 1 + (i << 1); if (carre != v.v[i]) { printf("%d != %d\n", carre, v.v[i]); wrong ++; } } if (! wrong) printf("\nidentiques\n"); } int main (int argc, char ** argv) { vect_t w; int nb; if (argc == 2) { nb = atoi(argv[1]); } else nb = 10; creevec(&w, nb); remplitsuite(&w); voirsuite (w); comparsuite(w); } |
La propriété étant vraisemblablement juste il faut maintenant la prouver.
P(n) => P(n+1)
P(n) <=> U(n) = (n+1)^2 P(n+1) <=> U(n+1) = (n+2)^2 Or U(n+1) = U(n) + 2n + 3 = (n + 1)^2 + 2n + 3 = n^2 + 2n + 1 + 2n + 3 = n^2 + 4n + 4 = (n + 2) ^2 CQFD
.