Etape 3 Partie 2
This commit is contained in:
45
etape3.c
45
etape3.c
@@ -2,24 +2,41 @@
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
long long int calculmodulo(long long int nb, long long int d, long long int n) {
|
||||
long long int resultat = 1;
|
||||
/* Cette fonction utilise la methode d'exponentiation rapide
|
||||
afin de calculer des grands nombres de maniere recursive*/
|
||||
long long int exponentiation(long long int nb, long long int d, long long int n) {
|
||||
|
||||
/* Si on arrive a la puissance 0*/
|
||||
if (d == 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Si la puissance est paire, on la divise par 2
|
||||
et on peut ainsi mette notre nombre au carre */
|
||||
else if (d % 2 == 0) {
|
||||
nb = exponentiation(nb, d / 2, n);
|
||||
return (nb * nb) % n;
|
||||
}
|
||||
|
||||
/* Sinon la puissance est impaire, on la transforme en puissance paire en enlevant 1
|
||||
a la puissance d lors de l'appel recursif de la fonction et en multipliant le resultat par nb */
|
||||
else {
|
||||
return (nb * exponentiation(nb, d - 1, n)) % n;
|
||||
}
|
||||
|
||||
/*Utilisation de l'algorithme d'exponentiation rapide pour gerer les grands nombres */
|
||||
/* Version iterative
|
||||
while (d > 0) {
|
||||
/* Si le bit de droite de d est 1 (d est impair) */
|
||||
if (d % 2 == 1) {
|
||||
resultat = (resultat * nb) % n; /* Multiplier le resultat par nb et prendre le modulo n */
|
||||
resultat = (resultat * nb) % n;
|
||||
}
|
||||
|
||||
d = d / 2; /* Diviser d par 2 (decalage d'octets vers la droite) */
|
||||
nb = (nb * nb) % n; /* elever nb au carre et prendre le modulo n */
|
||||
|
||||
/* Lignes ajoutées pour illustrer le processus */
|
||||
printf("d = %lld, nb = %lld, resultat = %lld\n", d, nb, resultat);
|
||||
d = d / 2;
|
||||
printf("\nCle : %d Nombre : %d", d, nb);
|
||||
nb = (nb * nb) % n;
|
||||
}
|
||||
|
||||
return resultat;
|
||||
*/
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
@@ -30,12 +47,12 @@ int main(void) {
|
||||
|
||||
FILE* stream = fopen("Etape4.bin","r");
|
||||
|
||||
/*Variable pour caracteres*/
|
||||
/* Variable pour les caracteres chiffres */
|
||||
long long int nb;
|
||||
/*Tant que la fin du fichier n'est pas atteinte, dechiffrer chaque caractere*/
|
||||
/*en calculant le modulo de la valeur numerique de chacun*/
|
||||
/* Tant que la fin du fichier n'est pas atteinte, dechiffrer chaque caractere
|
||||
en calculant le modulo de la valeur numerique de chacun */
|
||||
while (fread(&nb, sizeof(long long int), 1, stream) != 0) {
|
||||
long long int dechiffre = calculmodulo(nb, d, n);
|
||||
long long int dechiffre = exponentiation(nb, d, n);
|
||||
printf("%c", (char)dechiffre);
|
||||
}
|
||||
fclose(stream);
|
||||
|
Reference in New Issue
Block a user