informatique commune Travaux pratiques Détection de cycles À partir d’un ensemble fini E, d’une fonction f : E → E et d’un élément x0 ∈ E on appelle suite des itérés de x0 la suite des valeurs (xn )n∈N définie par la relation de récurrence : xn+1 = f (xn ). Puisque E est supposé fini, cette suite va atteindre deux fois la même valeur : il existe i < j tel que xi = xj . Une fois que cette collision est obtenue, la suite des valeurs va répéter le cycle des valeurs de xi à xj−1 . Nous allons nous intéresser au problème de la recherche de ce cycle, autrement dit déterminer les valeurs µ = i de la pré-période et λ = j − i de la période du cycle minimal. xµ−1 xµ xµ+λ xµ+1 xµ+λ−1 x2 x1 x0 Par exemple, pour f : x 7→ (x2 + 92) mod 32069 et x0 = 33 on trouve λ = 8 et µ = 313. Ces valeurs pourront être utilisées pour tester les fonctions que vous écrirez si vous travaillez sur machine. Question 1. L’algorithme naïf a. Rédiger une fonction itere d’arguments la fonction f et la valeur x0 , qui calcule la liste [x0 , x1 , . . . , xµ , . . . , xλ+µ−1 ] des valeurs de la suite des itérés jusqu’à la première des collisions et qui retourne le couple (λ, µ). b. Évaluer en fonction de λ et de µ le coût temporel et spatial de cet algorithme. Question 2. L’algorithme de Floyd On considère la suite (yn )n∈N définie par y0 = x0 et yn+1 = f f (yn ) , ainsi que le plus petit entier i > 0 vérifiant xi = yi . a. Rédiger une fonction floyd1 qui prend en arguments la fonction f et la valeur x0 et qui retourne la valeur de xi . Modifier cette fonction pour obtenir une fonction floyd2 qui retourne cette fois la valeur de l’entier i. Expliquer pourquoi ces algorithmes se terminent et caractériser la valeur de i en fonction de λ et de µ. b. Quel entier obtient-on si on applique la fonction floyd2 à f et à xi ? En déduire une fonction periode qui retourne la période λ de la suite des itérés de x0 . c. Observer enfin que xi+µ = xµ et en déduire une fonction pre_periode qui calcule la pré-periode de la suite des itérés de x0 . d. Exprimer en fonction de λ et de µ le coût temporel et spatial du calcul de la période et de la pré-période. Question 3. Algorithme de Brent L’algorithme de Floyd permet de trouver une valeur de xi dans le cycle et ensuite les valeurs de la période et de la pré-période en considérant la suite d’indices (i, 2i) et en testant l’égalité xi = x2i . L’algorithme de Brent utilise la suite (i, j) et teste l’égalité xi = xj en partant de (i, j) = (0, 1) et en poursuivant avec : (i, j + 1) si j 6 2i (j, j + 1) si j = 2i + 1 a. Rédiger une fonction brent qui prend en arguments la fonction f et la valeur de x0 et qui retourne le couple (i, j) trouvé par cet algorithme. b. Démontrer la terminaison de cet algorithme et prouver que si (i, j) est la valeur retournée par cet algorithme alors λ = j − i. Quel est le coût de cette fonction ? c. Quel(s) avantage(s) voyez-vous à utiliser l’algorithme de Brent plutôt que celui de Floyd ? page 1 Question 4. Heuristique rho de Pollard La méthode ρ de Pollard est un algorithme de décomposition en produit de facteurs premiers d’un entier naturel. S’agissant d’une heuristique, son succès n’est pas assuré mais dans la pratique, cette méthode se révèle très efficace pour des entiers possédant des facteurs premiers « pas trop grands ». Pour trouver un diviseur non trivial d’un entier n on génère à l’aide de l’algorithme de Brent la suite des itérés définie par une fonction f : x 7→ (x2 + c) mod n avec c < {0, −2} et la valeur x0 = 2. Pour chaque couple (xi , xj ) obtenu on calcule d = pgcd(n, |xj − xi |). Si d > 1 on a obtenu un facteur non trivial de n ; si d = 1 on poursuit la recherche avec le couple suivant. Si la collision se produit sans qu’un diviseur non trivial de n ait été trouvé, on recommence avec une autre valeur de c. a. Rédiger une fonction pgcd calculant le plus grand diviseur commun de deux entiers, puis une fonction pollard qui prend en arguments les entiers n et c et retourne un diviseur non trivial de n si l’heuristique ρ de Pollard se trouve vérifiée, et la valeur None dans le cas contraire. Remarque. En guise d’illustration vous pouvez utiliser cette fonction pour prouver que le sixième nombre de Fermat 6 F6 = 22 + 1 n’est pas premier (en posant par exemple c = 1). Pour estimer le coût de cette méthode, nous allons supposer que la fonction f se comporte comme une fonction « aléatoire » et que chaque xi est choisi indépendamment du précédent dans Z/nZ 1 . b. Dans un premier temps, nous nous intéressons au temps d’attente moyen avant la première collision. En s’inspirant √ du paradoxe des anniversaires, montrer que le nombre moyen d’étapes avant celle-ci est un Θ( n). Considérons maintenant un diviseur non trivial p de n et posons xi0 = xi mod p. √ c. Justifier que le temps d’attente avant la première collision entre xi0 et xj0 est en moyenne un Θ( p). d. Expliquer pourquoi cette collision donne en général lieu à l’obtention d’un diviseur non trivial de n. Dans quel cas la méthode échoue-t-elle ? √ Remarque. C’est cette capacité à trouver un petit facteur p de n avec un nombre d’opérations attendu en Θ( p) qui est le principal attrait de cette méthode de factorisation. 1. Ce n’est bien entendu pas le cas, mais cette hypothèse aboutit à des résultats qui sont cohérents avec le comportement observé dans la pratique. page 2