Le coût spatial de chacune de ces fonctions est un
Θ
(1). Le coût temporel de l’algorithme de Floyd est un
Θ
(
i
), où
i
est le
plus petit multiple de
λ
qui soit supérieur ou égal à
µ
. Ce dernier est compris entre
µ
et
µ
+
λ
donc le coût temporel de
l’algorithme de Floyd est un O(
λ
+
µ
) et un
Ω
(
µ
). À ce coût s’ajoute un
Θ
(
λ
) pour le calcul de la période et un
Θ
(
µ
) pour la
pré-période donc le coût total de ces deux fonctions est un Θ(λ+µ).
Question 3.
def brent(f, x0):
i,j=0,1
xi, xj = x0, f(x0)
while xi != xj:
if j == 2 *i + 1:
i, xi = j, xj
j, xj = j + 1, f(xj)
return (i, j)
On constate sans peine que les valeurs prises par
i
sont les entiers de la forme
i
= 2
n−
1 et que pour un tel entier
j
prend
toutes les valeurs de l’intervalle ~2n,2n+1 −1.
Mais
xi
=
xj⇐⇒
(
i>µet λdivise j−i
), avec 1
6j−i6
2
n
. Notons donc
n0
le plus petit entier vérifiant 2
n−
1
>µ
et
2n>λ. L’algorithme de Brent se termine lorsque i= 2n0−1 et j=λ+i.
On a 2n0−16µ62n0−1 donc 2n0−162µ−1 et ainsi j6λ+ 2µ−1.Le coût de cet algorithme est donc un Θ(λ+µ).
Il y a deux avantages à appliquer l’algorithme de Brent plutôt que celui de Floyd : il n’est nécessaire que de faire un seul
parcours pour obtenir la valeur de
λ
, et à chaque étape un seul calcul de
f
est effectué, contre trois pour l’algorithme
précédent.
Question 4. On calcule bien entendu le pgcd à l’aide de l’algorithme d’Euclide :
def pgcd(a, b):
while b > 0:
a,b=b,a%b
return a
Il reste alors à définir :
def pollard(n, c):
def f(x):
return (x *x+c)%n
i,j=0,1
xi, xj = 2, f(2)
while xi != xj:
d = pgcd(n, abs(xj −xi))
if d > 1:
return d
if j == 2 *i + 1:
i, xi = j, xj
j, xj = j + 1, f(xj)
return None
À l’aide de cette fonction on obtient instantanément le diviseur 274177 de F6= 226+ 1 = 18446744073709551617.
Considérons v1,...,vkdes valeurs prises aléatoirement dans ~0,n −1et pour deux de ces valeurs viet vjnotons
Xij =
1 si vi=vj
0 sinon
La probabilité pour que vi=vjest égale à 1
ndonc E[Xij ] = 1
n.
Notons
X
la variable aléatoire qui compte le nombre de paires de valeurs égales :
X =
k
X
i=1
k
X
j=i+1
Xij
. Par linéarité de
l’espérance nous avons :
E[X] =
k
X
i=1
k
X
j=i+1
E[Xij ] = k(k−1)
2n.
Ainsi, dès lors que k(k−1) >2nau moins une collision a probablement eu lieu, c’est-à-dire pour :
k>1 + √1 + 8n
2≈√2n.
page 2