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