TD : complexité

publicité
TD : complexité
Christophe Ritzenthaler
October 20, 2008
Les nombres de Mersenne
1. Soit donc q > 2 impair et Mq = 2q − 1 On définit
½
L0 = 4
Li+1 = L2i − 2 mod (Mq )
Alors Mq est premier ssi Lq−2 ≡ 0 mod (Mq ). Programmer cette procédure.
Quelle est la complexité ?
2. Quelle est la complexité de l’algorithme effectuant le test des divisions successives
? La programmer. Evaluer le temps. Conclusion.
3. Calculer le temps mis par la fonction mersenne. Comparer avec la procédure
définie.
4. On aurait pu également penser au petit théorème de Fermat qui donne une condition nécessaire pour qu’un nombre soit premier. Mais on peut trouver des nombres
n, appelés nombre de a-pseudo-premier, non premiers et qui réussissent le test de
Fermat an−1 ≡ 1 mod (n) pour un a premier à n. Ecrire une procédure permettant d’en trouver s’il en existe un plus petit que 500 pour a = 2. Les nombres
a-pseudo-premiers pour tout a premier à n sont appelés nombres de Carmicael.
Vérifier que celui trouvé est de Carmicael.
Exponentiation rapide
Soit x un élément d’un anneau et n un entier. Comment calculer efficacement xn ?
• Essayer de calculer brutalement 340000000 (mod 123).
• Essayer avec &ˆ.
Nous proposons dans la suite deux méthodes d’exponentiation rapide.
Soit x un élément et n = (nl−1 , . . . , n0 )b écrit en base b. La première est basée sur
l’identité
³
´b
x(nl−1 ,...,ni )b = x(nl−1 ,...,ni+1 )b · xni .
1
• Ecrire l’algorithme correspondant (on pourra regarder la relation précédente comme
b
une récurrence descendante yi = yi+1
· xni ).
La seconde méthode est basée sur l’identité :
³ i−1 ´bni
x(ni ,...,n0 )b = xb
· x(ni −1,...,n0 )b .
• Ecrire l’algorithme correspondant.
• Quelle est le nombre de multiplications dans les deux méthodes ?
• Quels sont les avantages/inconvénients de chaque méthode ?
• Complexité du calcul de xc (mod m) où x, c, m sont de taille au plus n.
Algorithme d’Euclide
L’algorithme de division euclidienne et l’algorithme d’Euclide (étendu) sont incontournables en arithmétique. Nous allons montrer qu’ils sont polynomiaux. Mais d’abord
vérifions que nous savons utiliser les commandes de MAPLE.
• Calculer le reste de la division euclidienne du polynôme x5 + 1 par le polynôme
x3 + x + 1.
• Calculer le pgcd étendu de 123 et 156.
Division euclidienne
Voici deux algorithmes pour la division euclidienne de a > b > 0.
B := b;
R := a;
Q := 0;
while R ≥ B do
R := R − B;
Q := Q + 1;
end while;
• Pourquoi cet algorithme s’arrête-t-il ?
• Pourquoi donne-t-il le bon résultat ? On vérifiera qu’à chaque étape a = Qb + R.
En voici maintenant une version binaire. Soit n le plus petit entier tel que 2n b > a.
2
B := b;
R := a;
Q := 0;
N := n;
Aux := 2N B;
while N > 0 do
Aux := Aux/2;
N := N − 1;
if R < Aux then
Q := 2 ∗ Q;
else
Q := 2Q + 1;
R := R − Aux;
end if;
end while;
• Vérifier qu’à chaque étape on a a = Aux · Q + R et 0 ≤ R < Aux et que si N = 0
on a Aux = B.
• Comparer la complexité des deux algorithmes.
Algorithme d’Euclide
R0 := |a|;
R1 := |b|; (b 6= 0)
while R1 > 0 do
R := DivisionRemainder(R0, R1);
R0 := R1;
R1 := R;
end while;
• Montrer que lorsque R1 := 0 on a R0 := gcd(a, b).
Voici maitenant la version étendue de l’algorithme d’Euclide qui a la même complexité.
3
R0 := a, a ≥ 0;
R1 := b; (b > 0);
U 0 := 1; U 1 := 0;
V 0 := 0; V 1 := 1;
while R1 > 0 do
Q := DivisionQuotient(R0, R1);
R := DivisionRemainder(R0, R1);
U := U 0 − Q ∗ U 1;
V := V 0 − Q ∗ V 1;
R0 := R1; R1 := R;
U 0 := U 1; U 1 := U ;
V 0 := V 1;V 1 := V ;
end while;
• Montrer que, en sortie, R1 := 0, R0 := gcd(a, b) et
U 0a + V 0b = R0.
On pourra raisonner par récurrence sur les relations :
U 0a + V 0b = R0
U 1a + V 1b = R1
R1 ≥ 0
• Utiliser l’algorithme pour calculer les solutions de 42x ≡ 1 (mod 67).
Pour montrer que l’algorithme est polynômial, il est suffisant de montrer que le
nombre de boucles est polynômial en la taille de a car toutes les opérations à l’intérieur
de la boucle le sont.
√
Proposition 0.1. Soit a > b > 0 et Φ := (1 + 5)/2. Alors le nombre d’itérations est
au pire log(a)/ log(Φ) < 1.441 log2 (a).
Pour se faire, on note R0k (resp. R1k , Rk , Qk ) les valeurs de R0 (resp. R1, R, Q) à
la k-ième itérations, pour 0 ≤ k ≤ n.
• Quelles sont les valeurs initiales et finales ?
• Montrer par récurrence descendante que
R0k ≥ R0n Φn−k .
4
Téléchargement