In der Kryptografie ist die Berechnung des größten gemeinsamen Teilers (ggt) eine häufige Aufgabe. Der euklidische Algorithmus löst diese Aufgabe effizient, allerdings erfordert er die Berechnung der mod-Funktion, also im Prinzip eine Division mit Rest. Mit dem steinschen Algorithmus [Stein 67] lässt sich der größte gemeinsame Teiler ohne Divisionen berechnen. Der steinsche Algorithmus benutzt lediglich Division durch 2; diese lässt sich durch eine Schiebeoperation effizient realisieren.
Der steinsche Algorithmus basiert auf folgenden Rekursionen:
ggt(a, b) = | ![]() |
|
Eine entsprechende Implementierung in der Programmiersprache Haskell ist die folgende:
In der Programmiersprache Python ergibt sich folgende Implementierung:
In einer iterativen Implementierung ergibt sich folgendes Programm. Divisionen durch 2 und Multiplikationen mit 2 sind durch Schiebeoperationen realisiert, Modulo-2-Operationen durch bitweises Und mit 1.
Wir analysieren die rekursive Implementation. Es gibt zwei Arten von rekursiven Aufrufen: Bei der einen Art wird eine Halbierung mindestens eines der Argumente durchgeführt. Bei der anderen Art wird eine Vertauschung der Argumente oder eine Subtraktion der Argumente durchgeführt.
Niemals aber werden mehrere Vertauschungen oder mehrere Subtraktionen hintereinander durchgeführt. Nach maximal einer Subtraktion und einer Vertauschung wird eine Halbierung mindestens eines Arguments durchgeführt.
Es sind also höchstens 3 · (log(a) + log(b)) rekursive Aufrufe erforderlich.
[Stein 67] J. Stein: Computational problems associated with Racah algebra. Journal of Computational Physics, Vol. 1, No. 3, 397–405 (1967)
Weiter mit: [up]