Witam,
bardzo mi zależy na podniesieniu x do potęgi y i zamianę(rzutowanie) na typ unsigned long. Niestety nie działa mi to. W tym przypadku chcę wykonać działanie:
((unsigned long)pow(c,k))%n
Rozumowanie mojego programu jest takie:
184^23%187=1.23257e+052%187=0%187=0
Rozumiem, że program ma problem z rzutowanie typu double na typ unsigned long. Ale skoro tak to jest pare możliwości:
-zamiast pow() używać innej metody, by dostawać long,
-zmiana typu unsigned long na double i obyć się bez rzutowania (program ma przetwarzać bardzo wysokie liczby, więc odpada).
A więc co robić?
Jakby ktoś chciał fragment kodu:
unsigned long crypt(unsigned long j, unsigned long e,unsigned long n){
return ((unsigned long)pow(n,e))%n;
}
unsigned long decrypt(unsigned long c, double k, unsigned long n){
return ((unsigned long)pow(c,k))%n;
}
double key(unsigned long p, unsigned long q, unsigned long e){
return ((p-1)*(q-1)+1)/e;
}
I wywołanie
decrypt(crypt(j,e,p*q),key(p,q,e), p*q) ma dać J.
Przykładowe dane: j=65 e=7 p=11 q=17.
Dla ciekawskich to jest szyfracja i deszyfracja RSA.