Exercices7.5Exercices supplémentaires : primalité et factorisation
Dans le cryptosystème RSA, il est important de pouvoir trouver facilement de grands nombres premiers. De plus, ce cryptosystème n’est pas sécurisé si l’on peut factoriser un nombre composé qui est le produit de deux grands nombres premiers. Les solutions à ces deux problèmes sont assez simples. Pour savoir si un nombre \(n\) est premier ou pour factoriser \(n\text{,}\) on peut utiliser la division par essai. On divise simplement \(n\) par \(d = 2, 3, \ldots, \sqrt{n}\text{.}\) Soit une factorisation sera obtenue, soit \(n\) est premier si aucun \(d\) ne divise \(n\text{.}\) Le problème est qu’un tel calcul est prohibitivement long si \(n\) est très grand.
Par conséquent, un entier positif impair peut être factorisé exactement lorsque nous pouvons trouver des entiers \(x\) et \(y\) tels que \(n = x^2 - y^2\text{.}\)
Écrire un programme pour implémenter l’algorithme de factorisation suivant, basé sur l’observation de la partie (a). L’expression ceiling(sqrt(n)) désigne le plus petit entier supérieur ou égal à la racine carrée de \(n\text{.}\) Écrire un autre programme pour effectuer la factorisation par division par essai et comparer la vitesse des deux algorithmes. Quel algorithme est le plus rapide et pourquoi ?
x := ceiling(sqrt(n))
y := 1
1 : while x^2 - y^2 > n do
y := y + 1
if x^2 - y^2 < n then
x := x + 1
y := 1
goto 1
else if x^2 - y^2 = 0 then
a := x - y
b := x + y
write n = a * b
Rappelons le petit théorème de Fermat du Chapitre 6. Soit \(p\) premier avec \(\gcd(a, p) = 1\text{.}\) Alors \(a^{p-1} \equiv 1 \pmod{p}\text{.}\) Nous pouvons utiliser le petit théorème de Fermat comme test de détection préliminaire des nombres premiers. Par exemple, \(15\) ne peut pas être premier puisque
Soit \(n\) un entier composé impair et \(b\) un entier positif tel que \(\gcd(b, n) = 1\text{.}\) Si \(b^{n-1} \equiv 1 \pmod{n}\text{,}\) alors \(n\) est un pseudo-premier en base \(b\text{.}\) Montrer que \(341\) est un pseudo-premier en base \(2\) mais pas un pseudo-premier en base \(3\text{.}\)
Écrire un programme pour déterminer tous les nombres premiers inférieurs à \(2000\) par division par essai. Écrire un second programme qui déterminera tous les nombres inférieurs à \(2000\) qui sont soit premiers, soit pseudo-premiers. Comparer la vitesse des deux programmes. Combien y a-t-il de pseudo-premiers inférieurs à \(2000\) ?
Il existe des nombres composés qui sont des pseudo-premiers pour toutes les bases avec lesquelles ils sont premiers entre eux. Ces nombres sont appelés nombres de Carmichael. Le premier nombre de Carmichael est \(561 = 3 \cdot 11 \cdot 17\text{.}\) En 1992, Alford, Granville et Pomerance ont prouvé qu’il existe une infinité de nombres de Carmichael [4]. Cependant, les nombres de Carmichael sont très rares. Il n’y a que 2163 nombres de Carmichael inférieurs à \(25 \times 10^9\text{.}\) Pour des tests de primalité plus sophistiqués, voir [1], [6] ou [7].