\documentclass[10pt,a4paper]{article} \usepackage{/media/documents/Cours/Prof/TD_maple/2012_2013/style} \title{Tests de primalité} \author{} \date{} \begin{document} \maketitle \thispagestyle{fancy} Le but de cet exercice est de comprendre comment tester la primalité d'un entier. Avant de s'attaquer au problème, on lira attentivement la page d'aide «mod (modulo)» de Maple» et on s'attachera à comprendre ce que fait l'expression \verb|i &^ n mod m| qui y est décrite. \begin{enumerate} \item Étudier le programme suivant et comprendre ce qu'il est censé faire et pourquoi il est incorrect. Le corriger. \begin{verbatim} estpremier := proc(n) local i; if n=2 then return true; fi; if n<=1 then return false; fi; if irem(n,2) = 0 then return false; fi; i := 3; while i*i < n and irem(n,i) <> 0 do # ici n n'est pas divisible par i ni par aucun nombre impair # inférieur à i, ni par deux. # on essaie le suivant i := i + 2; od; if i*i < n then return false; else return true; fi; end; \end{verbatim} \item Essayez de trouver un entier premier $n$ aussi grand que possible de façon à ce que Maple mette moins de 10s à tester sa primalité avec le programme corrigé. \item Le but est de trouver une méthode plus efficace pour tester la primalité d'un entier. On s'intéressera ici au test de Fermat. Soit $n$ un entier. On sait que si $n$ est premier, alors pour tout entier $a\in ]0,n[$, on a $a^{n-1} \equiv 1 [n]$. Donc par contraposée, si $a^{n-1}\not\equiv 1 [n]$, alors $n$ n'est pas premier. On dit alors que $a$ est un témoin de non-primalité du test de Fermat pour $n$. Si $a^{n-1}\equiv 1 [n]$ mais que $n$ n'est pas premier, on dit que $n$ est un pseudo-premier de Fermat de base $a$. Y a t-il des entiers compris entre 1 et 1000 qui soient des pseudo-premiers de Fermat de base $2$ (on les appelle aussi nombres de Poulet)~? Lesquels ? Y a t-il des entiers $n$ compris entre 1 et 1000 qui soient des pseudo-premiers de Fermat de base $a$ pour tout $a$~? Pour presque tous~? \item Le logiciel de chiffrement PGP utilise des tests de Fermat (avec les bases 2, 3, 5 et 7) pour trouver un nombre premier.\footnote{Le risque de choisir accidentellement un nombre non-premier est apparemment très faible pour les plages de nombres testées par PGP.} Essayez d'avoir une idée de la taille du plus grand nombre que vous puissiez trouver avec ce test de façon à ce que Maple mette moins de 10s à tester la primalité d'un entier. Jusqu'à combien pouvez-vous aller ? \item On propose maintenant un autre test, appelé test de Miller-Rabin. Il fonctionne de la façon suivante. Pour tester si un entier $n$ est premier, on commence par écrire $n-1$ sous la forme $2^{s} \times m$, où $m$ est impair. Soit $a\in \ii{1,n-1}$. Le test repose sur le résultat suivant~: si $n$ est premier, alors ou bien $a^{m}\equiv 1[n]$, ou bien il existe $d\in\ii{0,s-1}$ vérifiant $a^{2^d.m}\equiv -1[n]$. On peut démontrer ce résultat en utilisant le petit théorème de Fermat, le fait que si $n$ est premier $\Z/n\Z$ est un corps et le fait que dans tout anneau intègre, l'équation $x^{2} = 1$ a au plus deux solutions% \footnote{Dans certains anneaux intègres, il n'y en a qu'une, par exemple dans $\Z/2\Z$, où $-1=1$.} ($1$ et $-1$). On dira que $a$ est un menteur fort s'il vérifie les conditions ci-dessus et que $n$ n'est pas premier. On peut montrer qu'au plus un quart des valeurs de $\ii{1,n-1}$ sont des menteurs forts.\footnote{Voir sur Wikipédia en anglais l'article \textit{Miller–Rabin primality test} et notamment Schoof, René, \textit{Four primality testing algorithms}, Algorithmic Number Theory: Lattices, Number Fields, Curves and Cryptography, Cambridge University Press, ISBN 0521808545, \url{http://tinyurl.com/schoof-miller-rabin}.} Le test de Miller-Rabin s'effectue donc en pratique de la façon suivante~: prendre une valeur $a$ au hasard comprise entre $1$ et $n-1$ et effectuer le test avec cette base $a$. Si $a$ respecte les conditions données ci-dessus, $n$ est probablement premier, dans ce cas, on recommence avec un nouveau $a$ pris au hasard. Si au bout de $40$ essais, on n'a pas trouvé de $a$ violant les conditions données plus haut, on considérera que le nombre donné était premier. Pour effectuer le test aussi vite que possible, on calcule $a^{m}$ dans $\Z/n\Z$ et on effectue ensuite des mises au carré successives pour calculer $a^{2 m}$, $a^{4 m}$,\ldots{},$a^{2^{s-1} m}$. De plus, on n'est pas obligé de calculer toutes ces valeurs~: on s'arrête dès le début si $a^{m}\equiv 1[n]$, on s'arrête également dès qu'on trouve la valeur $-1$, et enfin on peut aussi s'arrêter si l'on trouve la valeur $1$ (pourquoi ?). Mettre en œuvre ce test pour vérifier si les grands nombres que vous avez trouvés avec le test de Fermat sont bien premiers. \end{enumerate} \end{document}