Witam,
Korzystam z tej biblioteki//www.informatik.hs-mannheim.de/gmp/gmp_13.html#SEC70
mpz_class fast_exp(mpz_class a, mpz_class exp, const mpz_class m)
{
mpz_class result = 1;
mpz_class x = a % m;
for(int i = 1; i <= exp; i <<= 1) {
x %= m;
if( (exp & i) != 0 ) {
result *= x;
result %= m;
}
x *= x;
}
return result;
}
Zastanawia mnie czemu ten kod nie zawsze działa (tylko dla małych wykładników exp). Podejrzewam, że problem tkwi w wykonywaniu operacji bitowych dla typu abstrakcyjnego, który tylko w szczególnym przypadku można zanalizować bit po bicie (dla bardzo małych liczb).
- Czy moje podejrzenia są słuszne?
- W jaki najwydajniejszy sposób (by nie używać naiwnego potęgowania) można zrealizować ten algorytm (zależy mi na samodzielnej implementacji).
Mój pomysł jest następujący:
- liczbę exp metodą kartkową przekonwertować na tablicę bitów, a dla tak przygotowanej już tablicy wykonywać ten algorytm.
Nie wiem tylko czy to najlepsze wyjście i będę wdzieczny za rady / sugestie.
Pozdrawiam,