Erweiterter euklidischer Algorithmus
Der erweiterte euklidische Algorithmus ist ein Algorithmus aus dem mathematischen Teilgebiet der Zahlentheorie. Er berechnet neben dem größten gemeinsamen Teiler zweier natürlicher Zahlen und noch zwei ganze Zahlen und die die folgende Gleichung erfüllen
Wie der Name schon aussagt ist dieser Algorithmus eine Erweiterung des bereits in der Antike bekannten euklidischen Algorithmus zur Berechnung des größten gemeinsamen Teilers. Die Erweiterung liefert einen konstruktiven Beweis für das Lemma von Bézout.
Die Darstellung als Linearkombination (selten auch Vielfachsummendarstellung genannt) liefert das multiplikative Inverse von a modulo b, falls a und b teilerfremd sind, d. h. . In diesem Fall ist s das multiplikative Inverse.
Funktionsweise
Zur Berechnung werden die Variablen m, n, s, t, u und v verwendet. Diese werden wie folgt initialisiert:
- Setze m = a, n = b, s = 1, t = 0, u = 0, v = 1
- Wiederhole solange n ≠ 0
- Berechne q und r mit m = q * n + r (Division mit Rest)
- Setze m = n, n = r, u' = s - q * u, v' = t - q * v
- Setze s = u, t = v, u = u', v = v'
Nach Beendigung ist .
Man kann dieses Vorgehen in der folgenden Form übersichtlich darstellen:
Dabei ist q der ganzzahlige Anteil von m/n.
Man zieht also immer von der vorletzten Zeile die mit q multiplizierte letzte Zeile ab, um die nächste Zeile zu erhalten. Wenn die Abbruchbedingung n=0 erfüllt ist, gilt m = r = ggT(a,b) und folglich
Rekursive Variante
Für den erweiterte euklidische Algorithmus existiert auch eine rekursive Variante, die durch den folgenden Pseudocode gegeben ist:[1]
a,b: zwei Zahlen für die der erweiterte euklidische Algorithmus durchgeführt wird
extended_euclid(a,b)
1 wenn b = 0
2 dann return (a,1,0)
3 (d',s',t') extended_euclid(b, a mod b)
4 (d,s,t) (d',y',x' - floor(a/b)y')
5 return (d,s,t)
Beziehung zu Kettenbrüchen
Die Folge der auftretenden Zahlen liefert die Kettenbruchdarstellung von . Z. B. ergibt sich für und :
Also ist und
Quelltext
Unter MATLAB könnte der Algorithmus wie folgt implementiert werden:
function a=eeuklid(a,b) m=a; n=b; s=1; t=0; u=0; v=1; while n>0 q=floor(m/n); % Der Quotient wird abgerundet r=m-q*n; m=n; n=r; tmp=u; u=s-q*u; s=tmp; tmp=v; v=t-q*v; t=tmp; end a=[m,s,t];
Anwendungsbeispiele
Weblinks
Umfangreiche Arbeit u.a. zum euklidischen Algorithmus
Ein kleines Script findet sich unter http://www.mirsky.de/ggt.php. Jeder Schritt wird genau erklärt. Außerdem gibt es noch ein ausführliches Skript mit Quelltext unter [1].
- ↑ Thomas H. Cormen, Charles Leiserson, Ronald L. Rivest: Introduction to Algorithms. MIT Press, 2001, ISBN 0262531968