Witam wszystkich :) Mam problem z procedurką służącą do potęgowania modularnego. Oto kod:
long double modularExponentiation(long long int a, long long int b, long long int c){
long double x = static_cast<long double>(1);
long double y = static_cast<long double>(a);
while(b!=0){
if(b%static_cast<long long int>(2) == 0){
b /= static_cast<long long int>(2);
y = fmod(y*y,static_cast<long double>(c));
}else{
b--;
x = fmod(x*y,static_cast<long double>(c));
}
}
return x;
}
Procedurę wywołuję tak (od razu wypisuję wynik):
cout<<modularExponentiation(179,12,13)<<endl;
cout<<modularExponentiation(2,500000003,1000000007);
Dla obu wywołań funkcja powinna zwrócić wartość 1. Testowałem kod przy użyciu standardowego kompilatora z Microsoft Visual Studio 2005 Pro i gcc z Dev-C++ 4.9.9.2. W obu przypadkach kod kompiluje się i program działa. Niestety kod skompilowany visualem zwraca błędną wartość dla drugiego wywołania. Zamiast 1 zwraca mi:
9.35599*10^08
No i teraz pytanie - dlaczego tak jest?
Konfiguracja projektu to debug, ale próbowałem też release (i również błędny wynik). Standardowy projekt Win 32 Console Application. Procesor (jeżeli ma to znaczenie) Core 2 Duo 4500.
Pozdrawiam :)
PS: Tutaj link do opisu algorytmu:
http://myyn.org/m/article/algorithm-for-modular-exponentiation/