2012-2013/TD_maple/test_primalité/test_primalité.tex

110 lines
5.0 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\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{MillerRabin 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}