par syrac » 07 Déc 2015, 11:26
Non, en termes de coût le calcul du modulo 9 n'est bien sûr pas prohibitif. Mais tout bien réfléchi, où est le vrai problème ? Il réside dans la volonté de construire une suite impaire en partant de la fin et qui comptera un nombre arbitrairement choisi de termes, en l'occurrence N, ce qui entraîne l'obligation de trouver des prédécesseurs qui ne soient pas divisibles par 3, sauf le dernier, n0. Pour évacuer ce problème il suffit de tourner la phrase autrement ; au lieu de parler du "calcul d'une suite impaire de N termes" on parlera du "calcul d'une suite impaire comportant un maximum de N termes" ! Sinon tout ça pourrait s'emballer et produire une suite tellement longue qu'elle en deviendrait inexploitable et ne voudrait strictement plus rien dire.
Pour commencer je vais poser M = n (9 - n mod 6) et remplacer p0 = (M - 2)/6 par (M/2 - 1)/3, afin d'uniformiser les expressions de p0, p1, p2, etc. Ensuite on fait p1 = 4 p0+1 = 4 ((M/2 - 1)/3)+1 = (2M - 1)/3, puis p2 = 4 p1+1 = (8M - 1)/3, etc. Au final on obtient pour la suite p0, p1, p2, ... les expressions
(M/2 - 1)/3, (2M - 1)/3, (8M - 1)/3, (32M - 1)/3, etc., c'est-à-dire (M 2^u - 1)/3, où u est un entier relatif impair >= -1. Ce qui est intéressant dans cette forme c'est la division par 3. Puisque par exemple 2M - 1 est divisé par 3, ça veut dire que p1 est divisible par 3 si et seulement si 2M - 1 est divisible par 9. En calculant (3*suitePred(n,lg)) mod 9 on obtient la répartition des "mauvais prédécesseurs", ceux qui sont divisibles par 3. Exemple avec les 15 premiers prédécesseurs de n=5 :
0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6. Il existe donc 1/3 de mauvais prédécesseurs. Bien entendu, leur répartition varie selon la valeur de n. Avec (3*suitePred(11,15)) mod 9 on obtient 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6, 0.
Il est à mon avis possible de construire un algorithme qui tiendrait compte de cette répartition et qui renverrait une suite de prédécesseurs dans laquelle aucun ne serait divisible par 3. Mais son coût en termes de calculs serait probablement plus élevé que le simple suitePred(n,lg,1), qui renvoie déjà ce type de suite. D'où l'intérêt d'un algorithme de construction de suites aléatoires par la fin, qui s'arrête dès que le nombre maximal de termes est atteint OU lorsque le dernier terme calculé est divisible par 3, c'est-à-dire dans un cas sur trois.