schnelles Potenzieren mit Square & Multiply

28.02.2008

Mit dem naiven Algorithmus zum Berechnen der Potenz a^c würde man c-mal a mit sich selbst multiplizieren.

Dies kann man beschleunigen, wenn man die Tatsache, dass a^{2n} = (a^n)^2 und a^{2n + 1} = (a^n)^2 \cdot a ist ausnutzt.

Damit ergibt sich folgende rekursive Berechnungsformel, die die Laufzeit O(log_2(n)) hat, da c in jedem Schritt halbiert wird.
<br />a^c = \left \{ (a^{c/2})^2  \text{        falls c gerade} \\<br />(a^{\lfloor{c/2}\rfloor})^2 \cdot a \text{   falls c ungerade}<br />

Mit dem Square & Multiply Algorithmus erreicht man also eine sehr gute Laufzeit im Vergleich zum naiven Algorithmus mit O(n).


Der C-Code demonstriert nochmals diesen Algorithmus.

CPP - Code:
int pot(int a, int c)
{
   int res;
 
   if (c == 0) {
      return 1;
   }
   
   res = pot (a, c/2)// a^n berechnen
   res = res * res;     // damit (a^n)^2 = a^2n bestimmen
 
   // c war ungerade?
   if (c % 2) {
      // also noch mit a multiplizieren
      res = res * a;
   }
 
   return res;
}

SAG ich nicht

27.05.2009
Author: SAG ich nicht

Zu kompliziert

N43

30.05.2009
Author: N43

Wenn du mir sagst, was du daran zu kompliziert findest, dann könnte ich die Erklärung auch verbessern.


N43

P.S.: Anstatt "SAG ich nicht" darfst du auch gerne einen Nickname verwenden.

Unbekannt

11.05.2011
Author: Unbekannt

Super erklärt!

Einen neuen Kommentar erstellen...