Travaux pratiques du module I32.
Algorithmique arithmétique,
 décembre 2001.


Le test de primalité de Fermat.

    L'objectif de ces travaux pratiques est d'explorer numériquement la primalité des nombres de la forme n! + 1,  où  n!  désigne la factorielle de n i.e. le produit des n premiers entiers non nuls.
Dans vos implantations, les nombres seront représentés dans une base arbitraire. Vous utiliserez les définitions et déclarations suivantes :
#define  MAX 100
typedef  unsigned  int CHIFFRE;
typedef  unsigned int NOMBRE[MAX];
unsigned int BASE;
PREMIERE PARTIE
[ 0 ] Ecrire la procédure  INC( NOMBRE z) pour incrémenter le nombre z dans la base choisie.

[ 1 ] Ecrire la procédure CMUL( NOMBRE z, CHIFFRE c)  qui calcule  le produit du nombre z par le chiffre c dans la base choisie.

[ 2 ] Ecrire la procédure BMUL( NOMBRE z)  qui calcule  le produit du nombre z par la base.

[ 3 ] Estimer le nombre de chiffres en base n du nombre  n! + 1.

[ 4 ] Calculer 100! + 1 en base 100.

DEUXIEME PARTIE

[ 5 ] Ecrire la procédure  MIX( NOMBRE z, NOMBRE x, CHIFFRE c) qui effectue le calcul  z := z + x * c.

[ 6 ] Ecrire la procédure REDUCTION( NOMBRE z, NOMBRE r) qui calcule z modulo r sachant que la taille de z est au plus celle de r augmentée de 1.

[ 7 ] Déduire des deux questions précédentes  une procédure pour calculer x*y modulo r lorsque  x< r  et y<r . Quelle est a complexité ?




TROISIEME PARTIE

[ 8  Ecrire une procédure EXP( NOMBRE z, CHIFFRE c, NOMBRE r) pour calculer z^c modulo r.
 

Le petit théorème de Fermat affirme qu'un entier n > 1 est premier si et seulement si a^(n-1) = 1 modulo n pour tout entier a compris entre 0 et n.
[ 9 ] Faire une démonstration.
 On dit qu'un residu a modulo n est un témoin de la non primalité de n si a^(n-1) est différent de 1 modulo n.
[ A ]  Ecrire la fonction TEMOIN(CHIFFRE a, CHIFFRE n)   qui calcule  R := n! + 1 puis a^(n!) modulo R et qui  renvoie VRAI si a est un témoin de non primalité de R et FAUX  sinon.

[ B ] Evaluer la complexité de la fonction TEMOIN(a, n) en fonction de n.

[ C ] Faire une expérience numérique pour n aussi grand que possible.  Donner une formule pour le  temps d'exécution de cette  fonction.