Chapitre 3 Analyse que quelques algorithmes - IMJ-PRG

publicité
Chapitre 3
Analyse que quelques algorithmes
arithmétiques
3.1
Puissance rapide et applications.
Proposition 3.1.1 Soit (G, ∗) un groupe commutatif dont on note la loi multiplicativement. On
peut calculer an en O(log(n)) opérations ∗.
Remarque 3.1.2 On distinguera deux situations assez différentes selon que le coût de x ∗ y est
indépendant des éléments x, y de G ou pas. Donnez 2 exemples de G dans chaque situation.
Entrée: Un élément g de G et un naturel n.
Sortie: Un élément de G : g n
Fonction puiss(g, n) ;
u ← 1; v ← g ; //u,v : 2 variables locales ;
tantque n > 1 faire
si n pair alors
v ← v ∗ v ; n ← n/2;
sinon
u ← u ∗ v; v ← v ∗ v; n ← (n − 1)/2;
fsi
ftantque
retourner u ∗ v;
Algorithme 1: Puissance rapide.
Exercice 3.1.3 Programmez en python et en xcas une fonction de puissance rapide : puis(u,n,loi)
et testez la.
3.1.1
RSA.
Proposition 3.1.4 On considère un entier n = p.q où p et q sont des nombres premiers impairs
distincts. Pour tout entier e premier avec φ(n) = (p − 1)(q − 1), la fonction ψe : (Z/ /nZ/ )× →
(Z/ /nZ/ )× , x 7→ xe [n] est bijective, et la connaissance de p et q permet de trouver sa réciproque en
temps polynomial (en log n).
Remarque 3.1.5 On ne connait pas d’algorithme polynomial (en log n) pour trouver les facteurs
premiers d’un entier. De plus la donnée de (n, φ(n)) est équivalente (en temps polynomial) à la
donnée de (p, q)
Exercice 3.1.6 Dans la documentation officielle de Python, en étudiant les ”builtin functions”,
trouver comment obtenir un caractère à partir d’un code ascii, et vice versa. Trouver dans xcas
comment convertir une chaine en la liste des codes ascii de ses caractères.
1
Un exemple de programme python pour encoder une chaine vers un entier.
thonverb
(python)
def c h a i n e 2 e n t i e r s (L ) :
”””On encode une c h a i n e de c a r a c t e r e par l ’ e n t i e r somme s u r i d e s
c i . 2 5 6 ˆ i ou c i e s t l e code a s c i i du ieme c a r a c t e r e de l a c h a i n e ”””
a =1; s=0 # s e s t l a somme p a r t i e l l e , e t a l a p u i s s a n c e de 256 c o u r a n t e
fo r i in L :
s=s+a∗ ord ( i )
a=a ∗256
return s
print c h a i n e 2 e n t i e r s ( ’ a b c d e f t u t u ’ )
Exercice 3.1.7 Avec xcas, trouver p, q avec nextprime tels que n:=p*q;ifactor(n); ne semble
pas répondre. Choisissez un entier e, trouvez son inverse modulo φ(n) avec xcas, (ou si vous avez
le temps avec une fonction Python bezout que vous auriez programmé). Puis créez une fonction
python qui encode un message d’au plus 20 caractères en un entier, et une fonction qui décode cet
entier.
3.1.2
Algorithmes probabilistes : Monte Carlo & Las Vegas.
Il existe deux types d’algorithmes probabilistes.
- Las Vegas : La réponse est fixe, mais pas le temps d’exécution. Il continue d’utiliser une
donnée aléatoire jusqu’à ce qu’il trouve la réponse voulue. (il joue jusqu’à gagner)
- Monte Carlo : Ici le temps d’exécution est fixe, mais pas la réponse. Autrement dit, on
produit une réponse à partir d’un nombre fixé de tirages aléatoires. Ex une valeur approchée
d’intégrale.
S’il est clair que dans le protocole RSA la donnée de n, φ(n) permet de trouver l’inverse de ψe il
n’est pas tout à fait vrai qu’il faut connaı̂tre φ(n) pour trouver cet inverse en temps polynômial.
En effet, il suffit de connaı̂tre un multiple x de (p − 1) ∨ (q − 1).
Remarque 3.1.8 x est un multiple de (p − 1) ∨ (q − 1) si et seulement si, pour tout a premier
avec p.q on a ax = 1 [p.q]
Nous donnons donc ici un algorithme probabiliste qui donne les nombres premiers p, q à partir d’un
multiple de (p − 1) ∨ (q − 1).
Tout d’abord, un algorithme de type Monte Carlo (qui n’utilise pas la connaissance de p et q,
uniquement celle de n = p.q
Entrée: Un multiple x de (p − 1) ∨ (q − 1) où p, q sont premiers impairs. Une probabilité π.
Sortie: Une réponse sûre : x/2 n’est pas multiple de (p − 1) ∨ (q − 1).
ou bien;
une rép. prob : x/2 est probablement un multiple de (p − 1) ∨ (q − 1).
t ← 1;
tantque t > (1 − π) faire
a recoit une valeur aléatoire entre 0 et n − 1 telle que a ∧ n = 1;
si ax/2 6= 1 [n] alors
t ← 0;
sinon
t ← t/2 //la probabilité de perdre est de 1/2;
fsi
ftantque
si t = 0 alors
retourner x/2 non multiple;
sinon
retourner x/2 probablement multiple;
fsi
Algorithme 2: Test x/2
2
On peut maintenant utiliser cet algorithme de type Las Vegas pour trouver (p, q) avec une
probabilité de type pile ou face.
Entrée: Un multiple x de (p − 1) ∨ (q − 1) où p, q sont premiers impairs, tel que x/2 n’ait
pas la même propriété;
Sortie: (p, q);
p ← 1;
tantque p = 1 ou p = n faire
a recoit une valeur aléatoire entre 0 et n − 1 telle que a ∧ n = 1;
p = (ax/2 − 1) ∧ n;
ftantque
sinon
retourner (p, n/p);
fsi
Algorithme 3: Trouve p,q
3.2
3.2.1
Primalité
Liste ou tests
Entrée: un entier N
Sortie: la liste des premiers inférieurs à N ;
Fonction Premiers(N );
liste ← [2 : N ] ; //la liste est indexée de 0 à N − 1;
i ← 0;
tantque i < longueur(liste) faire
p ← liste[i] ; m ← 2p;
tantque m ≤ N faire
si m est dans la liste alors
Enlever m de la liste;
fsi
m ← m + p;
ftantque
i ← i + 1;
ftantque
retourner liste;
Algorithme 4: Crible d’Eratostène
Exercice 3.2.1 Progammez en Python le crible d’Eratostène, et donnez un ordre de grandeur de
N pour qu’il mette plus de 1 à 2 minutes pour répondre.
Théorème 3.2.2 (Petit théorème de Fermat) Si p est un nombre premier, alors pour tout a
premier avec p, on a
ap−1 ≡ 1 (mod p) .
On dit qu’un entier a, 1 < a < n, est témoin de la non primalité de n si an−1 6≡ 1 (mod n), sinon
on dit que n passe le test de Fermat pour a. Si a n’est pas témoin alors que n n’est pas premier,
on dit que n est faux témoin.
3
Entrée: Un entier N ;
Sortie: La liste des entiers inférieurs à N , N ≥ 5, qui passent le test de Fermat pour 2 et 3;
Fonction TestFermat(N );
liste← [2, 3];
pour n entre 5 et N faire
si 2n−1 ≡ 1 (mod n) alors
si 3n−1 ≡ 1 (mod n) alors
Ajouter n à la liste;
fsi
fsi
fpour
retourner liste;
Algorithme 5: test de fermat
Exercice 3.2.3 Ecrire les fonctions correspondantes en Python, et trouver les intrus dans la liste
obtenue avec TestFermat(3000).
3.2.2
Le test de Miller-Rabin
Entrée: entier impair n à tester, entier t donnant le nombre de témoins.
Sortie: un réponse sure n est non premier, ou bien une réponse probabiliste : n est
probablement premier
b ← 0 ;r ← n − 1;
tantque r est pair faire
b ← b + 1 ; r ← r/2 ; // n − 1 = 2b r, r impair ;
ftantque
pour j de 1 à t faire
choisir au hasard d entre 2 et n − 2;
d ← (dr mod n) ; // positif si d vaut 1 ou n − 1;
si d 6= 1 et d 6= n − 1 alors
k ← 1;
tantque k < b et d 6= n − 1 faire
d ← (d2 mod n) ; k ← k + 1 ; // calcul des carrés successifs;
si d = 1 alors
retourner (“non premier”) ; // plus d’espoir de trouver −1 : négatif;
fsi
ftantque
si d 6= n − 1 alors
Sortie(“non premier”);
fsi
fsi
fpour
retourner (“très probablement premier”) ;
Algorithme 6: Test de Miller-Rabin
Exercice 3.2.4 1. En s’appuyant sur le théorème suivant, justifier le test de Miller-Rabin.
2. On admet que dans le test de Miller-Rabin le nombre de faux témoins pour un entier n non
premier est au plus n/4. Combien de témoins suffisent pour que la réponse positive soit exacte avec
une probabilité supérieure à 1 − (A.N. = 10−6 ).
Théorème 3.2.5 Si p est premier impair, et si n − 1 = 2b r, avec r impair, alors pour tout a
premier avec n :
soit ar ≡ 1 (mod n),
k
soit il existe k , 0 ≤ k < b, tel que : ar2 ≡ −1 (mod n).
Exercice 3.2.6 Etudier la preuve du théorème et la majoration du nombre de faux témoins.
4
Téléchargement