Etape 3 Partie 2

This commit is contained in:
SombrAbsol
2024-01-24 14:42:34 +01:00
parent 90062b6d4d
commit a79fe2b5ee
4 changed files with 31 additions and 54 deletions

View File

@@ -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);