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