Détection de cycles

publicité
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
Téléchargement