Import TD_maple
This commit is contained in:
BIN
TD_maple/test_primalité/test_primalité.pdf
Normal file
BIN
TD_maple/test_primalité/test_primalité.pdf
Normal file
Binary file not shown.
59
TD_maple/test_primalité/test_primalité.py
Normal file
59
TD_maple/test_primalité/test_primalité.py
Normal file
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env python
|
||||
#-*- coding:utf8-*-
|
||||
|
||||
# ------------------------------
|
||||
# Imports
|
||||
# ------------------------------
|
||||
|
||||
# ------------------------------
|
||||
# Classes
|
||||
# ------------------------------
|
||||
|
||||
# ------------------------------
|
||||
# Fonctions
|
||||
# ------------------------------
|
||||
|
||||
def estPremier(n):
|
||||
""" estPremier
|
||||
|
||||
Test si le nombre est un nombre premier
|
||||
|
||||
"""
|
||||
if n == 2:
|
||||
return True
|
||||
elif n <= 1:
|
||||
return False
|
||||
elif n % 2:
|
||||
return False
|
||||
|
||||
i = 3
|
||||
print("ici")
|
||||
while (i*i<=n) & (n%i != 0):
|
||||
i = i+2
|
||||
print("la " + str(i))
|
||||
|
||||
if n%i ==0 :
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
|
||||
|
||||
# ------------------------------
|
||||
# Bloc principal
|
||||
# ------------------------------
|
||||
|
||||
if __name__ == '__main__':
|
||||
for i in range(30):
|
||||
print("{i}, {prems}".format(i = i, prems = estPremier(i)))
|
||||
|
||||
|
||||
# ------------------------------
|
||||
# Fin du programme
|
||||
# ------------------------------
|
||||
|
||||
# -----------------------------
|
||||
# Reglages pour 'vim'
|
||||
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
|
||||
# cursor: 16 del
|
||||
|
||||
109
TD_maple/test_primalité/test_primalité.tex
Normal file
109
TD_maple/test_primalité/test_primalité.tex
Normal file
@@ -0,0 +1,109 @@
|
||||
\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}
|
||||
Reference in New Issue
Block a user