• Aucun résultat trouvé

Test de primalit´ e

Dans le document Notes de programmation (C) et d'algorithmique (Page 132-135)

x < Z m 1 1 x dx = log m . Donc Σk=1,...,n1k ≤ 1 + log n et : E[X] ≤ 2 · (n − 1)(log n + 1)

soit E[X] est O(nlog n). 2

Exercice 20 Le probl`eme de la m´ediane est le suivant : on dispose d’un tableau non-ordonn´e de n ´el´ements et on souhaite d´eterminer le k-`eme ´el´ement du tableau tri´e o`u 1 ≤ k ≤ n. On peut r´esoudre ce probl`eme en O(n log n) en triant le tableau et en retournant le k-`eme ´

el´ement du tableau tri´e. Il est facile de voir que pour k = 1 ou k = n on a un algorithme en O(n) ; il s’agit de trouver le minimum ou le maximum du tableau, respectivement. Proposez un algorithme probabiliste pour le probl`eme de la m´ediane qui utilise la fonction de partition ; une variante de l’analyse du tri rapide permet de montrer qu’en moyenne l’algorithme qui en r´esulte a une complexit´e O(n).

17.3 Test de primalit´e

Dans le cas du tri rapide le nombre maximum de comparaisons est born´e par une valeur qui ne d´epend pas de la suite de bits al´eatoires ; l’algorithme termine. En g´en´eral, on peut concevoir des algorithmes probabilistes o`u cette propri´et´e n’est pas satisfaite. Dans ce cas on cherchera `a montrer que l’algorithme termine avec probabilit´e 1. Certains algorithmes

probabilistes (dits de Montecarlo) s’ils terminent peuvent fournir des r´eponses incorrectes. On cherche alors `a borner la probabilit´e d’une r´eponse incorrecte et dans certains cas favorables on peut montrer qu’en it´erant l’algorithme un certain nombre de fois sur la mˆeme entr´ee on obtient une r´eponse incorrecte avec une probabilit´e n´egligeable en pratique (par exemple une probabilit´e d’erreur inf´erieure `a 2−100). Parmi les algorithmes qui tombent dans cette cat´egorie, on ´etudie un test de primalit´e dans cette section et un test pour l’identit´e de deux polynˆomes dans la suivante.

Rappels d’arithm´etique

Pour n ≥ 2, on pose :

Zn = {0, 1, . . . , n − 1},

Zn = {a ∈ Zn| pgcd (a, n) = 1} .

L’ensemble Zn avec les op´erations d’addition et multiplication modulaire est un anneau et l’ensemble Zn avec l’op´eration de multiplication modulaire est un groupe (le groupe multipli-catif). Si n est premier alors Zn = {1, . . . , n − 1} et ]Zn = (n − 1). Le r´esultat suivant est connu comme petit th´eor`eme de Fermat.

Proposition 16 Si n est premier et a ∈ Zn alors (a(n−1)≡ 1) mod n.

Preuve. Soit k = min{i > 0 | (ai≡ 1) mod n} et soit : A = {a0, a1, . . . , ak−1} ,

o`u il est entendu que les exposants sont modulo n. Si k = (n − 1) on a termin´e. Sinon on, va montrer que (n − 1) est un multiple de k, disons (n − 1) = k · m, et par les propri´et´es de l’exposant on a :

an−1= (ak)m = 1m = 1 .

On montre d’abord que ]A = k. En effet, si 0 ≤ i < j ≤ (k − 1) alors ai 6= aj. Autrement, a(j−i)= 1 et (j − i) < k.

Si k < (n − 1) alors on peut trouver b1 ∈ (Z

n\A). On consid`ere l’ensemble : A1= {a0b1, a1b1, . . . , ak−1b1} .

`

A nouveau, ]A1 = k. Car si 0 ≤ i < j ≤ (k − 1) et aib1 = ajb1 alors ai = aj. D’autre part, A ∩ A1 = ∅. Car si ai = ajb1 alors b1 ∈ A. Si A ∪ A1 = Zn on a montr´e que (n − 1) = 2k. Sinon on choisit b2 ∈ Zn\(A ∪ A1) et on it`ere le mˆeme raisonnement. 2

Test de Fermat

La proposition 16 sugg`ere une m´ethode pour tester la primalit´e d’un nombre n ≥ 2. Choisir a ∈ {2, . . . , n − 1} et v´erifier :

(a(n−1)≡ 1) mod n . (17.1) Pour calculer l’exposant modulaire on utilise la m´ethode du carr´e it´er´e pr´esent´ee dans le chapitre 13.

Algorithmes probabilistes 133

Soit n un nombre qui n’est pas premier. Le probl`eme est maintenant d’estimer la proba-bilit´e qu’en choisissant un nombre a ∈ {2, . . . , n − 1} on obtient :

(a(n−1)6≡ 1) mod n . (17.2) On appelle un tel nombre a un t´emoin de la non-primalit´e de n.

Proposition 17 Soient n ≥ 2 et a ∈ {2, . . . , n − 1} 1. Si pgcd (a, n) 6= 1 alors (a(n−1)6≡ 1) mod n.

2. Si n n’est pas premier et si n admet un t´emoin a ∈ Zn alors au moins la moiti´e des ´

el´ements dans {2, . . . , n − 1} sont des t´emoins de la non-primalit´e de n.

Preuve. (1) On remarque : (i) si (an−1 ≡ 1) mod n alors pgcd (an−1, n) = 1 et (ii) si d divise a et n alors d divise an−1 et n.

(2) D’abord on observe que si a ∈ Zn est un t´emoin et d ∈ Zn ne l’est pas alors (ad) ∈ Zn est un t´emoin. En effet, on a :

((ad)n−1≡ an−1dn−1≡ an−16≡ 1) mod n . Ensuite, on montre que si a ∈ Zn est un t´emoin et d, d0 ∈ Z

n ne le sont pas alors ad et ad0 sont deux t´emoins diff´erents. Supposons 1 ≤ d < d0 < n. Alors (ad ≡ ad0) mod n implique ∃ c a(d0− d) = cn. Comme 1 ≤ (d0− d) < n, a doit contenir un facteur de n ce qui contredit a ∈ (Zn). Il suit que si a ∈ (Zn) est un t´emoin alors dans (Zn) il y a au moins autant de t´emoins que de non-t´emoins. Par ailleurs, par (1), tous les ´el´ements dans Zn\(Zn) sont des

t´emoins. 2

Limitations du test de Fermat

Un nombre de Carmichael est un nombre n qui n’est pas premier et qui n’a pas de t´emoin de non-primalit´e qui est premier avec n. On sait qu’il y a une infinit´e de nombres de Carmichael mais qu’ils sont rares. Le plus petit nombre de Carmichael est 561 = 3 · 11 · 17 et parmi les premiers 1015 nombres environ 105 sont des nombres de Carmichael. On sait aussi qu’en pratique le test de Fermat a une chance raisonnable de tomber sur un t´emoin de non-primalit´e pour un nombre de Carmichael (`a savoir sur un nombre qui n’est pas premier avec le nombre de Carmichael). On peut donc dire que le test de Fermat est un test simple et pratique avec une petite limitation th´eorique.

Avec un peu plus de travail, on peut concevoir des tests de primalit´e plus sophistiqu´es (par exemple, le test de Miller-Rabin [Mil76, Rab80]) qui sont encore plus efficaces que le test de Fermat et qui n’ont aucune difficult´e th´eorique avec les nombres de Carmichael. Par ailleurs, depuis [AKS04], on connaˆıt aussi un test de primalit´e d´eterministe et polynomial en temps mais en pratique les tests probabilistes sont plus efficaces.

Exercice 21 Les tests de primalit´e sont aussi utilis´es pour g´en´erer des grands nombres pre-miers (typiquement des nombres avec 103 chiffres). En effet, on sait que les nombres premiers ne sont pas rares : il y a environ log nn nombres premiers parmi les premiers n nombres. Il suffit donc de tirer un nombre (impair) au hasard un certain nombre de fois jusqu’`a tomber sur un nombre qui passe le test de primalit´e. Programmez une fonction probabiliste qui trouve un nombre premier de 512 bits avec une probabilit´e d’erreur inf´erieure `a 2−100 (en ignorant les difficult´es li´ees aux nombres de Carmichael). Estimez le nombre moyen de tirages qu’il faut effectuer avant de tomber sur un nombre (probablement) premier.

Dans le document Notes de programmation (C) et d'algorithmique (Page 132-135)